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 | 4 | retrieving revision 1.4 |
5 | 5 | diff -u -w -r1.4 apmbios.S |
6 | 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 | 8 | @@ -225,6 +225,7 @@ |
9 | 9 | APMSYM(05): |
10 | 10 | cmp al, #0x05 |
... | ... | @@ -19,7 +19,7 @@ RCS file: /cvsroot/bochs/bochs/bios/rombios.c,v |
19 | 19 | retrieving revision 1.160 |
20 | 20 | diff -u -w -r1.160 rombios.c |
21 | 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 | 23 | @@ -1816,6 +1816,7 @@ |
24 | 24 | { |
25 | 25 | printf(BX_APPNAME" BIOS - build: %s\n%s\nOptions: ", |
... | ... | @@ -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 | 172 | mov al, #0x80 |
43 | 173 | bios32_end: |
44 | 174 | popf |
... | ... | @@ -46,7 +176,7 @@ diff -u -w -r1.160 rombios.c |
46 | 176 | retf |
47 | 177 | |
48 | 178 | .align 16 |
49 | -@@ -8823,17 +8828,17 @@ | |
179 | +@@ -8823,17 +8853,17 @@ | |
50 | 180 | pci_pro_fail: |
51 | 181 | pop edi |
52 | 182 | pop esi |
... | ... | @@ -66,7 +196,7 @@ diff -u -w -r1.160 rombios.c |
66 | 196 | retf |
67 | 197 | |
68 | 198 | pci_pro_select_reg: |
69 | -@@ -8971,7 +8976,7 @@ | |
199 | +@@ -8971,7 +9001,7 @@ | |
70 | 200 | jmp pci_real_ok |
71 | 201 | pci_real_f0d: ;; write configuration dword |
72 | 202 | cmp al, #0x0d |
... | ... | @@ -75,7 +205,7 @@ diff -u -w -r1.160 rombios.c |
75 | 205 | call pci_real_select_reg |
76 | 206 | push dx |
77 | 207 | mov dx, #0x0cfc |
78 | -@@ -8979,6 +8984,46 @@ | |
208 | +@@ -8979,6 +9009,46 @@ | |
79 | 209 | out dx, eax |
80 | 210 | pop dx |
81 | 211 | jmp pci_real_ok |
... | ... | @@ -122,7 +252,7 @@ diff -u -w -r1.160 rombios.c |
122 | 252 | pci_real_unknown: |
123 | 253 | mov ah, #0x81 |
124 | 254 | pci_real_fail: |
125 | -@@ -9019,6 +9064,7 @@ | |
255 | +@@ -9019,6 +9089,7 @@ | |
126 | 256 | dw 0,0 ;; Miniport data |
127 | 257 | db 0,0,0,0,0,0,0,0,0,0,0 ;; reserved |
128 | 258 | db 0x07 ;; checksum |
... | ... | @@ -130,7 +260,7 @@ diff -u -w -r1.160 rombios.c |
130 | 260 | ;; first slot entry PCI-to-ISA (embedded) |
131 | 261 | db 0 ;; pci bus number |
132 | 262 | db 0x08 ;; pci device number (bit 7-3) |
133 | -@@ -9097,6 +9143,7 @@ | |
263 | +@@ -9097,6 +9168,7 @@ | |
134 | 264 | dw 0xdef8 ;; IRQ bitmap INTD# |
135 | 265 | db 5 ;; physical slot (0 = embedded) |
136 | 266 | db 0 ;; reserved | ... | ... |