Commit 107654552cb442b8b95c1f3ebc18dd64c6c0f0d5
1 parent
ceb5caaf
more correct e820 ranges for ACPI compatibility
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1901 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
138 additions
and
8 deletions
pc-bios/bios.bin
No preview for this file type
pc-bios/bios.diff
| @@ -4,7 +4,7 @@ RCS file: /cvsroot/bochs/bochs/bios/apmbios.S,v | @@ -4,7 +4,7 @@ RCS file: /cvsroot/bochs/bochs/bios/apmbios.S,v | ||
| 4 | retrieving revision 1.4 | 4 | retrieving revision 1.4 |
| 5 | diff -u -w -r1.4 apmbios.S | 5 | diff -u -w -r1.4 apmbios.S |
| 6 | --- apmbios.S 26 Dec 2005 10:35:51 -0000 1.4 | 6 | --- apmbios.S 26 Dec 2005 10:35:51 -0000 1.4 |
| 7 | -+++ apmbios.S 28 Apr 2006 22:41:19 -0000 | 7 | ++++ apmbios.S 3 May 2006 21:22:46 -0000 |
| 8 | @@ -225,6 +225,7 @@ | 8 | @@ -225,6 +225,7 @@ |
| 9 | APMSYM(05): | 9 | APMSYM(05): |
| 10 | cmp al, #0x05 | 10 | cmp al, #0x05 |
| @@ -19,7 +19,7 @@ RCS file: /cvsroot/bochs/bochs/bios/rombios.c,v | @@ -19,7 +19,7 @@ RCS file: /cvsroot/bochs/bochs/bios/rombios.c,v | ||
| 19 | retrieving revision 1.160 | 19 | retrieving revision 1.160 |
| 20 | diff -u -w -r1.160 rombios.c | 20 | diff -u -w -r1.160 rombios.c |
| 21 | --- rombios.c 25 Jan 2006 17:51:49 -0000 1.160 | 21 | --- rombios.c 25 Jan 2006 17:51:49 -0000 1.160 |
| 22 | -+++ rombios.c 28 Apr 2006 22:41:21 -0000 | 22 | ++++ rombios.c 3 May 2006 21:22:48 -0000 |
| 23 | @@ -1816,6 +1816,7 @@ | 23 | @@ -1816,6 +1816,7 @@ |
| 24 | { | 24 | { |
| 25 | printf(BX_APPNAME" BIOS - build: %s\n%s\nOptions: ", | 25 | printf(BX_APPNAME" BIOS - build: %s\n%s\nOptions: ", |
| @@ -38,7 +38,137 @@ diff -u -w -r1.160 rombios.c | @@ -38,7 +38,137 @@ diff -u -w -r1.160 rombios.c | ||
| 38 | } | 38 | } |
| 39 | 39 | ||
| 40 | //-------------------------------------------------------------------------- | 40 | //-------------------------------------------------------------------------- |
| 41 | -@@ -8713,6 +8717,7 @@ | 41 | +@@ -3999,6 +4003,29 @@ |
| 42 | + } | ||
| 43 | + #endif | ||
| 44 | + | ||
| 45 | ++ | ||
| 46 | ++void set_e820_range(ES, DI, start, end, type) | ||
| 47 | ++ Bit16u ES; | ||
| 48 | ++ Bit16u DI; | ||
| 49 | ++ Bit32u start; | ||
| 50 | ++ Bit32u end; | ||
| 51 | ++ Bit16u type; | ||
| 52 | ++{ | ||
| 53 | ++ write_word(ES, DI, start); | ||
| 54 | ++ write_word(ES, DI+2, start >> 16); | ||
| 55 | ++ write_word(ES, DI+4, 0x00); | ||
| 56 | ++ write_word(ES, DI+6, 0x00); | ||
| 57 | ++ | ||
| 58 | ++ end -= start; | ||
| 59 | ++ write_word(ES, DI+8, end); | ||
| 60 | ++ write_word(ES, DI+10, end >> 16); | ||
| 61 | ++ write_word(ES, DI+12, 0x0000); | ||
| 62 | ++ write_word(ES, DI+14, 0x0000); | ||
| 63 | ++ | ||
| 64 | ++ write_word(ES, DI+16, type); | ||
| 65 | ++ write_word(ES, DI+18, 0x0); | ||
| 66 | ++} | ||
| 67 | ++ | ||
| 68 | + void | ||
| 69 | + int15_function32(regs, ES, DS, FLAGS) | ||
| 70 | + pushad_regs_t regs; // REGS pushed via pushad | ||
| 71 | +@@ -4063,19 +4090,8 @@ | ||
| 72 | + switch(regs.u.r16.bx) | ||
| 73 | + { | ||
| 74 | + case 0: | ||
| 75 | +- write_word(ES, regs.u.r16.di, 0x00); | ||
| 76 | +- write_word(ES, regs.u.r16.di+2, 0x00); | ||
| 77 | +- write_word(ES, regs.u.r16.di+4, 0x00); | ||
| 78 | +- write_word(ES, regs.u.r16.di+6, 0x00); | ||
| 79 | +- | ||
| 80 | +- write_word(ES, regs.u.r16.di+8, 0xFC00); | ||
| 81 | +- write_word(ES, regs.u.r16.di+10, 0x0009); | ||
| 82 | +- write_word(ES, regs.u.r16.di+12, 0x0000); | ||
| 83 | +- write_word(ES, regs.u.r16.di+14, 0x0000); | ||
| 84 | +- | ||
| 85 | +- write_word(ES, regs.u.r16.di+16, 0x1); | ||
| 86 | +- write_word(ES, regs.u.r16.di+18, 0x0); | ||
| 87 | +- | ||
| 88 | ++ set_e820_range(ES, regs.u.r16.di, | ||
| 89 | ++ 0x0000000L, 0x0009fc00L, 1); | ||
| 90 | + regs.u.r32.ebx = 1; | ||
| 91 | + regs.u.r32.eax = 0x534D4150; | ||
| 92 | + regs.u.r32.ecx = 0x14; | ||
| 93 | +@@ -4083,6 +4099,24 @@ | ||
| 94 | + return; | ||
| 95 | + break; | ||
| 96 | + case 1: | ||
| 97 | ++ set_e820_range(ES, regs.u.r16.di, | ||
| 98 | ++ 0x0009fc00L, 0x000a0000L, 2); | ||
| 99 | ++ regs.u.r32.ebx = 2; | ||
| 100 | ++ regs.u.r32.eax = 0x534D4150; | ||
| 101 | ++ regs.u.r32.ecx = 0x14; | ||
| 102 | ++ CLEAR_CF(); | ||
| 103 | ++ return; | ||
| 104 | ++ break; | ||
| 105 | ++ case 2: | ||
| 106 | ++ set_e820_range(ES, regs.u.r16.di, | ||
| 107 | ++ 0x000e8000L, 0x00100000L, 2); | ||
| 108 | ++ regs.u.r32.ebx = 3; | ||
| 109 | ++ regs.u.r32.eax = 0x534D4150; | ||
| 110 | ++ regs.u.r32.ecx = 0x14; | ||
| 111 | ++ CLEAR_CF(); | ||
| 112 | ++ return; | ||
| 113 | ++ break; | ||
| 114 | ++ case 3: | ||
| 115 | + extended_memory_size = inb_cmos(0x35); | ||
| 116 | + extended_memory_size <<= 8; | ||
| 117 | + extended_memory_size |= inb_cmos(0x34); | ||
| 118 | +@@ -4092,9 +4126,9 @@ | ||
| 119 | + extended_memory_size = 0x3bc000; // everything after this is reserved memory until we get to 0x100000000 | ||
| 120 | + } | ||
| 121 | + extended_memory_size *= 1024; | ||
| 122 | +- extended_memory_size += 15728640; // make up for the 16mb of memory that is chopped off | ||
| 123 | ++ extended_memory_size += (16L * 1024 * 1024); | ||
| 124 | + | ||
| 125 | +- if(extended_memory_size <= 15728640) | ||
| 126 | ++ if(extended_memory_size <= (16L * 1024 * 1024)) | ||
| 127 | + { | ||
| 128 | + extended_memory_size = inb_cmos(0x31); | ||
| 129 | + extended_memory_size <<= 8; | ||
| 130 | +@@ -4102,28 +4136,23 @@ | ||
| 131 | + extended_memory_size *= 1024; | ||
| 132 | + } | ||
| 133 | + | ||
| 134 | +- write_word(ES, regs.u.r16.di, 0x0000); | ||
| 135 | +- write_word(ES, regs.u.r16.di+2, 0x0010); | ||
| 136 | +- write_word(ES, regs.u.r16.di+4, 0x0000); | ||
| 137 | +- write_word(ES, regs.u.r16.di+6, 0x0000); | ||
| 138 | +- | ||
| 139 | +- write_word(ES, regs.u.r16.di+8, extended_memory_size); | ||
| 140 | +- extended_memory_size >>= 16; | ||
| 141 | +- write_word(ES, regs.u.r16.di+10, extended_memory_size); | ||
| 142 | +- extended_memory_size >>= 16; | ||
| 143 | +- write_word(ES, regs.u.r16.di+12, extended_memory_size); | ||
| 144 | +- extended_memory_size >>= 16; | ||
| 145 | +- write_word(ES, regs.u.r16.di+14, extended_memory_size); | ||
| 146 | +- | ||
| 147 | +- write_word(ES, regs.u.r16.di+16, 0x1); | ||
| 148 | +- write_word(ES, regs.u.r16.di+18, 0x0); | ||
| 149 | +- | ||
| 150 | +- regs.u.r32.ebx = 0; | ||
| 151 | ++ set_e820_range(ES, regs.u.r16.di, | ||
| 152 | ++ 0x00100000L, extended_memory_size, 1); | ||
| 153 | ++ regs.u.r32.ebx = 4; | ||
| 154 | + regs.u.r32.eax = 0x534D4150; | ||
| 155 | + regs.u.r32.ecx = 0x14; | ||
| 156 | + CLEAR_CF(); | ||
| 157 | + return; | ||
| 158 | + break; | ||
| 159 | ++ case 4: | ||
| 160 | ++ /* 256KB BIOS area at the end of 4 GB */ | ||
| 161 | ++ set_e820_range(ES, regs.u.r16.di, | ||
| 162 | ++ 0xfffc0000L, 0x00000000L, 2); | ||
| 163 | ++ regs.u.r32.ebx = 0; | ||
| 164 | ++ regs.u.r32.eax = 0x534D4150; | ||
| 165 | ++ regs.u.r32.ecx = 0x14; | ||
| 166 | ++ CLEAR_CF(); | ||
| 167 | ++ return; | ||
| 168 | + default: /* AX=E820, DX=534D4150, BX unrecognized */ | ||
| 169 | + goto int15_unimplemented; | ||
| 170 | + break; | ||
| 171 | +@@ -8713,6 +8742,7 @@ | ||
| 42 | mov al, #0x80 | 172 | mov al, #0x80 |
| 43 | bios32_end: | 173 | bios32_end: |
| 44 | popf | 174 | popf |
| @@ -46,7 +176,7 @@ diff -u -w -r1.160 rombios.c | @@ -46,7 +176,7 @@ diff -u -w -r1.160 rombios.c | ||
| 46 | retf | 176 | retf |
| 47 | 177 | ||
| 48 | .align 16 | 178 | .align 16 |
| 49 | -@@ -8823,17 +8828,17 @@ | 179 | +@@ -8823,17 +8853,17 @@ |
| 50 | pci_pro_fail: | 180 | pci_pro_fail: |
| 51 | pop edi | 181 | pop edi |
| 52 | pop esi | 182 | pop esi |
| @@ -66,7 +196,7 @@ diff -u -w -r1.160 rombios.c | @@ -66,7 +196,7 @@ diff -u -w -r1.160 rombios.c | ||
| 66 | retf | 196 | retf |
| 67 | 197 | ||
| 68 | pci_pro_select_reg: | 198 | pci_pro_select_reg: |
| 69 | -@@ -8971,7 +8976,7 @@ | 199 | +@@ -8971,7 +9001,7 @@ |
| 70 | jmp pci_real_ok | 200 | jmp pci_real_ok |
| 71 | pci_real_f0d: ;; write configuration dword | 201 | pci_real_f0d: ;; write configuration dword |
| 72 | cmp al, #0x0d | 202 | cmp al, #0x0d |
| @@ -75,7 +205,7 @@ diff -u -w -r1.160 rombios.c | @@ -75,7 +205,7 @@ diff -u -w -r1.160 rombios.c | ||
| 75 | call pci_real_select_reg | 205 | call pci_real_select_reg |
| 76 | push dx | 206 | push dx |
| 77 | mov dx, #0x0cfc | 207 | mov dx, #0x0cfc |
| 78 | -@@ -8979,6 +8984,46 @@ | 208 | +@@ -8979,6 +9009,46 @@ |
| 79 | out dx, eax | 209 | out dx, eax |
| 80 | pop dx | 210 | pop dx |
| 81 | jmp pci_real_ok | 211 | jmp pci_real_ok |
| @@ -122,7 +252,7 @@ diff -u -w -r1.160 rombios.c | @@ -122,7 +252,7 @@ diff -u -w -r1.160 rombios.c | ||
| 122 | pci_real_unknown: | 252 | pci_real_unknown: |
| 123 | mov ah, #0x81 | 253 | mov ah, #0x81 |
| 124 | pci_real_fail: | 254 | pci_real_fail: |
| 125 | -@@ -9019,6 +9064,7 @@ | 255 | +@@ -9019,6 +9089,7 @@ |
| 126 | dw 0,0 ;; Miniport data | 256 | dw 0,0 ;; Miniport data |
| 127 | db 0,0,0,0,0,0,0,0,0,0,0 ;; reserved | 257 | db 0,0,0,0,0,0,0,0,0,0,0 ;; reserved |
| 128 | db 0x07 ;; checksum | 258 | db 0x07 ;; checksum |
| @@ -130,7 +260,7 @@ diff -u -w -r1.160 rombios.c | @@ -130,7 +260,7 @@ diff -u -w -r1.160 rombios.c | ||
| 130 | ;; first slot entry PCI-to-ISA (embedded) | 260 | ;; first slot entry PCI-to-ISA (embedded) |
| 131 | db 0 ;; pci bus number | 261 | db 0 ;; pci bus number |
| 132 | db 0x08 ;; pci device number (bit 7-3) | 262 | db 0x08 ;; pci device number (bit 7-3) |
| 133 | -@@ -9097,6 +9143,7 @@ | 263 | +@@ -9097,6 +9168,7 @@ |
| 134 | dw 0xdef8 ;; IRQ bitmap INTD# | 264 | dw 0xdef8 ;; IRQ bitmap INTD# |
| 135 | db 5 ;; physical slot (0 = embedded) | 265 | db 5 ;; physical slot (0 = embedded) |
| 136 | db 0 ;; reserved | 266 | db 0 ;; reserved |