Commit acb98efbbff1c51cd9a594af7daa4fe8b4560916
1 parent
4e14008f
bios: add support to memory above the pci hole
(Izik Eidus) git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4237 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
127 additions
and
3 deletions
pc-bios/bios.bin
No preview for this file type
pc-bios/bios.diff
1 | +Index: rombios.c | |
2 | +=================================================================== | |
3 | +RCS file: /cvsroot/bochs/bochs/bios/rombios.c,v | |
4 | +retrieving revision 1.205 | |
5 | +diff -u -d -p -r1.205 rombios.c | |
6 | +--- rombios.c 21 Mar 2008 19:06:31 -0000 1.205 | |
7 | ++++ rombios.c 10 Apr 2008 09:47:48 -0000 | |
8 | +@@ -4395,22 +4395,25 @@ BX_DEBUG_INT15("case default:\n"); | |
9 | + #endif // BX_USE_PS2_MOUSE | |
10 | + | |
11 | + | |
12 | +-void set_e820_range(ES, DI, start, end, type) | |
13 | ++void set_e820_range(ES, DI, start, end, extra_start, extra_end, type) | |
14 | + Bit16u ES; | |
15 | + Bit16u DI; | |
16 | + Bit32u start; | |
17 | + Bit32u end; | |
18 | ++ Bit8u extra_start; | |
19 | ++ Bit8u extra_end; | |
20 | + Bit16u type; | |
21 | + { | |
22 | + write_word(ES, DI, start); | |
23 | + write_word(ES, DI+2, start >> 16); | |
24 | +- write_word(ES, DI+4, 0x00); | |
25 | ++ write_word(ES, DI+4, extra_start); | |
26 | + write_word(ES, DI+6, 0x00); | |
27 | + | |
28 | + end -= start; | |
29 | ++ extra_end -= extra_start; | |
30 | + write_word(ES, DI+8, end); | |
31 | + write_word(ES, DI+10, end >> 16); | |
32 | +- write_word(ES, DI+12, 0x0000); | |
33 | ++ write_word(ES, DI+12, extra_end); | |
34 | + write_word(ES, DI+14, 0x0000); | |
35 | + | |
36 | + write_word(ES, DI+16, type); | |
37 | +@@ -4423,7 +4426,9 @@ int15_function32(regs, ES, DS, FLAGS) | |
38 | + Bit16u ES, DS, FLAGS; | |
39 | + { | |
40 | + Bit32u extended_memory_size=0; // 64bits long | |
41 | ++ Bit32u extra_lowbits_memory_size=0; | |
42 | + Bit16u CX,DX; | |
43 | ++ Bit8u extra_highbits_memory_size=0; | |
44 | + | |
45 | + BX_DEBUG_INT15("int15 AX=%04x\n",regs.u.r16.ax); | |
46 | + | |
47 | +@@ -4497,11 +4502,18 @@ ASM_END | |
48 | + extended_memory_size += (1L * 1024 * 1024); | |
49 | + } | |
50 | + | |
51 | ++ extra_lowbits_memory_size = inb_cmos(0x5c); | |
52 | ++ extra_lowbits_memory_size <<= 8; | |
53 | ++ extra_lowbits_memory_size |= inb_cmos(0x5b); | |
54 | ++ extra_lowbits_memory_size *= 64; | |
55 | ++ extra_lowbits_memory_size *= 1024; | |
56 | ++ extra_highbits_memory_size = inb_cmos(0x5d); | |
57 | ++ | |
58 | + switch(regs.u.r16.bx) | |
59 | + { | |
60 | + case 0: | |
61 | + set_e820_range(ES, regs.u.r16.di, | |
62 | +- 0x0000000L, 0x0009fc00L, 1); | |
63 | ++ 0x0000000L, 0x0009fc00L, 0, 0, 1); | |
64 | + regs.u.r32.ebx = 1; | |
65 | + regs.u.r32.eax = 0x534D4150; | |
66 | + regs.u.r32.ecx = 0x14; | |
67 | +@@ -4510,7 +4522,7 @@ ASM_END | |
68 | + break; | |
69 | + case 1: | |
70 | + set_e820_range(ES, regs.u.r16.di, | |
71 | +- 0x0009fc00L, 0x000a0000L, 2); | |
72 | ++ 0x0009fc00L, 0x000a0000L, 0, 0, 2); | |
73 | + regs.u.r32.ebx = 2; | |
74 | + regs.u.r32.eax = 0x534D4150; | |
75 | + regs.u.r32.ecx = 0x14; | |
76 | +@@ -4519,7 +4531,7 @@ ASM_END | |
77 | + break; | |
78 | + case 2: | |
79 | + set_e820_range(ES, regs.u.r16.di, | |
80 | +- 0x000e8000L, 0x00100000L, 2); | |
81 | ++ 0x000e8000L, 0x00100000L, 0, 0, 2); | |
82 | + regs.u.r32.ebx = 3; | |
83 | + regs.u.r32.eax = 0x534D4150; | |
84 | + regs.u.r32.ecx = 0x14; | |
85 | +@@ -4529,7 +4541,7 @@ ASM_END | |
86 | + case 3: | |
87 | + set_e820_range(ES, regs.u.r16.di, | |
88 | + 0x00100000L, | |
89 | +- extended_memory_size - ACPI_DATA_SIZE, 1); | |
90 | ++ extended_memory_size - ACPI_DATA_SIZE ,0, 0, 1); | |
91 | + regs.u.r32.ebx = 4; | |
92 | + regs.u.r32.eax = 0x534D4150; | |
93 | + regs.u.r32.ecx = 0x14; | |
94 | +@@ -4539,7 +4551,7 @@ ASM_END | |
95 | + case 4: | |
96 | + set_e820_range(ES, regs.u.r16.di, | |
97 | + extended_memory_size - ACPI_DATA_SIZE, | |
98 | +- extended_memory_size, 3); // ACPI RAM | |
99 | ++ extended_memory_size ,0, 0, 3); // ACPI RAM | |
100 | + regs.u.r32.ebx = 5; | |
101 | + regs.u.r32.eax = 0x534D4150; | |
102 | + regs.u.r32.ecx = 0x14; | |
103 | +@@ -4549,7 +4561,20 @@ ASM_END | |
104 | + case 5: | |
105 | + /* 256KB BIOS area at the end of 4 GB */ | |
106 | + set_e820_range(ES, regs.u.r16.di, | |
107 | +- 0xfffc0000L, 0x00000000L, 2); | |
108 | ++ 0xfffc0000L, 0x00000000L ,0, 0, 2); | |
109 | ++ if (extra_highbits_memory_size || extra_lowbits_memory_size) | |
110 | ++ regs.u.r32.ebx = 6; | |
111 | ++ else | |
112 | ++ regs.u.r32.ebx = 0; | |
113 | ++ regs.u.r32.eax = 0x534D4150; | |
114 | ++ regs.u.r32.ecx = 0x14; | |
115 | ++ CLEAR_CF(); | |
116 | ++ return; | |
117 | ++ case 6: | |
118 | ++ /* Maping of memory above 4 GB */ | |
119 | ++ set_e820_range(ES, regs.u.r16.di, 0x00000000L, | |
120 | ++ extra_lowbits_memory_size, 1, extra_highbits_memory_size | |
121 | ++ + 1, 1); | |
122 | + regs.u.r32.ebx = 0; | |
123 | + regs.u.r32.eax = 0x534D4150; | |
124 | + regs.u.r32.ecx = 0x14; | |
1 | 125 | Index: rombios.h |
2 | 126 | =================================================================== |
3 | 127 | RCS file: /cvsroot/bochs/bochs/bios/rombios.h,v |
4 | 128 | retrieving revision 1.6 |
5 | 129 | diff -u -d -p -r1.6 rombios.h |
6 | 130 | --- rombios.h 26 Jan 2008 09:15:27 -0000 1.6 |
7 | -+++ rombios.h 28 Mar 2008 10:22:04 -0000 | |
131 | ++++ rombios.h 10 Apr 2008 09:47:48 -0000 | |
8 | 132 | @@ -19,7 +19,7 @@ |
9 | 133 | // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
10 | 134 | |
... | ... | @@ -20,7 +144,7 @@ RCS file: /cvsroot/bochs/bochs/bios/rombios32.c,v |
20 | 144 | retrieving revision 1.24 |
21 | 145 | diff -u -d -p -r1.24 rombios32.c |
22 | 146 | --- rombios32.c 6 Mar 2008 20:18:20 -0000 1.24 |
23 | -+++ rombios32.c 28 Mar 2008 10:22:04 -0000 | |
147 | ++++ rombios32.c 10 Apr 2008 09:47:48 -0000 | |
24 | 148 | @@ -477,7 +477,12 @@ void smp_probe(void) |
25 | 149 | sipi_vector = AP_BOOT_ADDR >> 12; |
26 | 150 | writel(APIC_BASE + APIC_ICR_LOW, 0x000C4600 | sipi_vector); |
... | ... | @@ -40,7 +164,7 @@ RCS file: /cvsroot/bochs/bochs/bios/rombios32start.S,v |
40 | 164 | retrieving revision 1.4 |
41 | 165 | diff -u -d -p -r1.4 rombios32start.S |
42 | 166 | --- rombios32start.S 26 Jan 2008 09:15:27 -0000 1.4 |
43 | -+++ rombios32start.S 28 Mar 2008 10:22:04 -0000 | |
167 | ++++ rombios32start.S 10 Apr 2008 09:47:48 -0000 | |
44 | 168 | @@ -42,7 +42,7 @@ _start: |
45 | 169 | smp_ap_boot_code_start: |
46 | 170 | xor %ax, %ax | ... | ... |