]>
Commit | Line | Data |
---|---|---|
43661a95 AJ |
1 | --- bochs-2.3.7.orig/bios/rombios.h |
2 | +++ bochs-2.3.7/bios/rombios.h | |
3 | @@ -19,7 +19,7 @@ | |
4 | // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
5 | ||
6 | /* define it to include QEMU specific code */ | |
7 | -//#define BX_QEMU | |
8 | +#define BX_QEMU | |
9 | ||
10 | #ifndef LEGACY | |
11 | # define BX_ROMBIOS32 1 | |
12 | --- bochs-2.3.7.orig/bios/rombios.c | |
13 | +++ bochs-2.3.7/bios/rombios.c | |
14 | @@ -4404,22 +4404,25 @@ | |
acb98efb | 15 | #endif // BX_USE_PS2_MOUSE |
e6e514c5 AJ |
16 | |
17 | ||
acb98efb AJ |
18 | -void set_e820_range(ES, DI, start, end, type) |
19 | +void set_e820_range(ES, DI, start, end, extra_start, extra_end, type) | |
20 | Bit16u ES; | |
21 | Bit16u DI; | |
22 | Bit32u start; | |
23 | Bit32u end; | |
24 | + Bit8u extra_start; | |
25 | + Bit8u extra_end; | |
26 | Bit16u type; | |
27 | { | |
28 | write_word(ES, DI, start); | |
29 | write_word(ES, DI+2, start >> 16); | |
30 | - write_word(ES, DI+4, 0x00); | |
31 | + write_word(ES, DI+4, extra_start); | |
32 | write_word(ES, DI+6, 0x00); | |
e6e514c5 | 33 | |
acb98efb AJ |
34 | end -= start; |
35 | + extra_end -= extra_start; | |
36 | write_word(ES, DI+8, end); | |
37 | write_word(ES, DI+10, end >> 16); | |
38 | - write_word(ES, DI+12, 0x0000); | |
39 | + write_word(ES, DI+12, extra_end); | |
40 | write_word(ES, DI+14, 0x0000); | |
e6e514c5 | 41 | |
acb98efb | 42 | write_word(ES, DI+16, type); |
43661a95 | 43 | @@ -4432,7 +4435,9 @@ |
acb98efb AJ |
44 | Bit16u ES, DS, FLAGS; |
45 | { | |
46 | Bit32u extended_memory_size=0; // 64bits long | |
47 | + Bit32u extra_lowbits_memory_size=0; | |
48 | Bit16u CX,DX; | |
49 | + Bit8u extra_highbits_memory_size=0; | |
e6e514c5 | 50 | |
acb98efb | 51 | BX_DEBUG_INT15("int15 AX=%04x\n",regs.u.r16.ax); |
e6e514c5 | 52 | |
43661a95 | 53 | @@ -4506,11 +4511,18 @@ |
acb98efb AJ |
54 | extended_memory_size += (1L * 1024 * 1024); |
55 | } | |
e6e514c5 | 56 | |
acb98efb AJ |
57 | + extra_lowbits_memory_size = inb_cmos(0x5c); |
58 | + extra_lowbits_memory_size <<= 8; | |
59 | + extra_lowbits_memory_size |= inb_cmos(0x5b); | |
60 | + extra_lowbits_memory_size *= 64; | |
61 | + extra_lowbits_memory_size *= 1024; | |
62 | + extra_highbits_memory_size = inb_cmos(0x5d); | |
63 | + | |
64 | switch(regs.u.r16.bx) | |
65 | { | |
66 | case 0: | |
67 | set_e820_range(ES, regs.u.r16.di, | |
68 | - 0x0000000L, 0x0009fc00L, 1); | |
69 | + 0x0000000L, 0x0009fc00L, 0, 0, 1); | |
70 | regs.u.r32.ebx = 1; | |
71 | regs.u.r32.eax = 0x534D4150; | |
72 | regs.u.r32.ecx = 0x14; | |
43661a95 | 73 | @@ -4519,7 +4531,7 @@ |
acb98efb AJ |
74 | break; |
75 | case 1: | |
76 | set_e820_range(ES, regs.u.r16.di, | |
77 | - 0x0009fc00L, 0x000a0000L, 2); | |
78 | + 0x0009fc00L, 0x000a0000L, 0, 0, 2); | |
79 | regs.u.r32.ebx = 2; | |
80 | regs.u.r32.eax = 0x534D4150; | |
81 | regs.u.r32.ecx = 0x14; | |
43661a95 | 82 | @@ -4528,7 +4540,7 @@ |
acb98efb AJ |
83 | break; |
84 | case 2: | |
85 | set_e820_range(ES, regs.u.r16.di, | |
86 | - 0x000e8000L, 0x00100000L, 2); | |
87 | + 0x000e8000L, 0x00100000L, 0, 0, 2); | |
88 | regs.u.r32.ebx = 3; | |
89 | regs.u.r32.eax = 0x534D4150; | |
90 | regs.u.r32.ecx = 0x14; | |
43661a95 | 91 | @@ -4539,7 +4551,7 @@ |
e6e514c5 | 92 | #if BX_ROMBIOS32 |
acb98efb AJ |
93 | set_e820_range(ES, regs.u.r16.di, |
94 | 0x00100000L, | |
95 | - extended_memory_size - ACPI_DATA_SIZE, 1); | |
96 | + extended_memory_size - ACPI_DATA_SIZE ,0, 0, 1); | |
97 | regs.u.r32.ebx = 4; | |
e6e514c5 AJ |
98 | #else |
99 | set_e820_range(ES, regs.u.r16.di, | |
43661a95 | 100 | @@ -4555,7 +4567,7 @@ |
acb98efb AJ |
101 | case 4: |
102 | set_e820_range(ES, regs.u.r16.di, | |
103 | extended_memory_size - ACPI_DATA_SIZE, | |
104 | - extended_memory_size, 3); // ACPI RAM | |
105 | + extended_memory_size ,0, 0, 3); // ACPI RAM | |
106 | regs.u.r32.ebx = 5; | |
107 | regs.u.r32.eax = 0x534D4150; | |
108 | regs.u.r32.ecx = 0x14; | |
43661a95 | 109 | @@ -4565,7 +4577,20 @@ |
acb98efb AJ |
110 | case 5: |
111 | /* 256KB BIOS area at the end of 4 GB */ | |
112 | set_e820_range(ES, regs.u.r16.di, | |
113 | - 0xfffc0000L, 0x00000000L, 2); | |
114 | + 0xfffc0000L, 0x00000000L ,0, 0, 2); | |
115 | + if (extra_highbits_memory_size || extra_lowbits_memory_size) | |
116 | + regs.u.r32.ebx = 6; | |
117 | + else | |
118 | + regs.u.r32.ebx = 0; | |
119 | + regs.u.r32.eax = 0x534D4150; | |
120 | + regs.u.r32.ecx = 0x14; | |
121 | + CLEAR_CF(); | |
122 | + return; | |
123 | + case 6: | |
124 | + /* Maping of memory above 4 GB */ | |
125 | + set_e820_range(ES, regs.u.r16.di, 0x00000000L, | |
126 | + extra_lowbits_memory_size, 1, extra_highbits_memory_size | |
127 | + + 1, 1); | |
128 | regs.u.r32.ebx = 0; | |
129 | regs.u.r32.eax = 0x534D4150; | |
130 | regs.u.r32.ecx = 0x14; | |
43661a95 AJ |
131 | --- bochs-2.3.7.orig/bios/rombios32.c |
132 | +++ bochs-2.3.7/bios/rombios32.c | |
133 | @@ -479,7 +479,12 @@ | |
6cc9215e AJ |
134 | sipi_vector = AP_BOOT_ADDR >> 12; |
135 | writel(APIC_BASE + APIC_ICR_LOW, 0x000C4600 | sipi_vector); | |
a7e6f8ba | 136 | |
6cc9215e AJ |
137 | +#ifndef BX_QEMU |
138 | delay_ms(10); | |
139 | +#else | |
140 | + while (cmos_readb(0x5f) + 1 != readw((void *)CPU_COUNT_ADDR)) | |
141 | + ; | |
e3e97e7c | 142 | +#endif |
6cc9215e AJ |
143 | |
144 | smp_cpus = readw((void *)CPU_COUNT_ADDR); | |
145 | } |