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 | Index: rombios.h | 125 | Index: rombios.h |
2 | =================================================================== | 126 | =================================================================== |
3 | RCS file: /cvsroot/bochs/bochs/bios/rombios.h,v | 127 | RCS file: /cvsroot/bochs/bochs/bios/rombios.h,v |
4 | retrieving revision 1.6 | 128 | retrieving revision 1.6 |
5 | diff -u -d -p -r1.6 rombios.h | 129 | diff -u -d -p -r1.6 rombios.h |
6 | --- rombios.h 26 Jan 2008 09:15:27 -0000 1.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 | @@ -19,7 +19,7 @@ | 132 | @@ -19,7 +19,7 @@ |
9 | // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | 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,7 +144,7 @@ RCS file: /cvsroot/bochs/bochs/bios/rombios32.c,v | ||
20 | retrieving revision 1.24 | 144 | retrieving revision 1.24 |
21 | diff -u -d -p -r1.24 rombios32.c | 145 | diff -u -d -p -r1.24 rombios32.c |
22 | --- rombios32.c 6 Mar 2008 20:18:20 -0000 1.24 | 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 | @@ -477,7 +477,12 @@ void smp_probe(void) | 148 | @@ -477,7 +477,12 @@ void smp_probe(void) |
25 | sipi_vector = AP_BOOT_ADDR >> 12; | 149 | sipi_vector = AP_BOOT_ADDR >> 12; |
26 | writel(APIC_BASE + APIC_ICR_LOW, 0x000C4600 | sipi_vector); | 150 | writel(APIC_BASE + APIC_ICR_LOW, 0x000C4600 | sipi_vector); |
@@ -40,7 +164,7 @@ RCS file: /cvsroot/bochs/bochs/bios/rombios32start.S,v | @@ -40,7 +164,7 @@ RCS file: /cvsroot/bochs/bochs/bios/rombios32start.S,v | ||
40 | retrieving revision 1.4 | 164 | retrieving revision 1.4 |
41 | diff -u -d -p -r1.4 rombios32start.S | 165 | diff -u -d -p -r1.4 rombios32start.S |
42 | --- rombios32start.S 26 Jan 2008 09:15:27 -0000 1.4 | 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 | @@ -42,7 +42,7 @@ _start: | 168 | @@ -42,7 +42,7 @@ _start: |
45 | smp_ap_boot_code_start: | 169 | smp_ap_boot_code_start: |
46 | xor %ax, %ax | 170 | xor %ax, %ax |