Commit 107654552cb442b8b95c1f3ebc18dd64c6c0f0d5

Authored by bellard
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
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
... ...