Commit e3e97e7c90f4a40a56ea05f3a34f267edf41c9ed
1 parent
47d02f6d
do not generate MP table if one CPU (no APIC in QEMU in this case) - added wbinv…
…d (ignored in QEMU but useful on real hardware) git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2191 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
46 additions
and
195 deletions
pc-bios/bios.bin
No preview for this file type
pc-bios/bios.diff
1 | -Index: BIOS-bochs-latest | |
2 | -=================================================================== | |
3 | -RCS file: /cvsroot/bochs/bochs/bios/BIOS-bochs-latest,v | |
4 | -retrieving revision 1.133 | |
5 | -diff -u -w -r1.133 BIOS-bochs-latest | |
6 | -Binary files /tmp/cvsrjjP5I and BIOS-bochs-latest differ | |
7 | -Index: rombios.c | |
8 | -=================================================================== | |
9 | -RCS file: /cvsroot/bochs/bochs/bios/rombios.c,v | |
10 | -retrieving revision 1.170 | |
11 | -diff -u -w -r1.170 rombios.c | |
12 | ---- rombios.c 30 Sep 2006 11:22:53 -0000 1.170 | |
13 | -+++ rombios.c 1 Oct 2006 16:03:53 -0000 | |
14 | -@@ -4115,7 +4115,7 @@ | |
15 | - case 3: | |
16 | - set_e820_range(ES, regs.u.r16.di, | |
17 | - 0x00100000L, | |
18 | -- extended_memory_size - 0x10000L, 1); | |
19 | -+ extended_memory_size - ACPI_DATA_SIZE, 1); | |
20 | - regs.u.r32.ebx = 4; | |
21 | - regs.u.r32.eax = 0x534D4150; | |
22 | - regs.u.r32.ecx = 0x14; | |
23 | -@@ -4124,7 +4124,7 @@ | |
24 | - break; | |
25 | - case 4: | |
26 | - set_e820_range(ES, regs.u.r16.di, | |
27 | -- extended_memory_size - 0x10000L, | |
28 | -+ extended_memory_size - ACPI_DATA_SIZE, | |
29 | - extended_memory_size, 3); // ACPI RAM | |
30 | - regs.u.r32.ebx = 5; | |
31 | - regs.u.r32.eax = 0x534D4150; | |
32 | -@@ -8723,7 +8723,7 @@ | |
33 | - | |
34 | - .align 16 | |
35 | - bios32_entry_point: | |
36 | -- pushf | |
37 | -+ pushfd | |
38 | - cmp eax, #0x49435024 ;; "$PCI" | |
39 | - jne unknown_service | |
40 | - mov eax, #0x80000000 | |
41 | -@@ -8750,12 +8750,12 @@ | |
42 | - #ifdef BX_QEMU | |
43 | - and dword ptr[esp+8],0xfffffffc ;; reset CS.RPL for kqemu | |
44 | - #endif | |
45 | -- popf | |
46 | -+ popfd | |
47 | - retf | |
48 | - | |
49 | - .align 16 | |
50 | - pcibios_protected: | |
51 | -- pushf | |
52 | -+ pushfd | |
53 | - cli | |
54 | - push esi | |
55 | - push edi | |
56 | -@@ -8864,7 +8864,7 @@ | |
57 | - #ifdef BX_QEMU | |
58 | - and dword ptr[esp+8],0xfffffffc ;; reset CS.RPL for kqemu | |
59 | - #endif | |
60 | -- popf | |
61 | -+ popfd | |
62 | - stc | |
63 | - retf | |
64 | - pci_pro_ok: | |
65 | -@@ -8874,7 +8874,7 @@ | |
66 | - #ifdef BX_QEMU | |
67 | - and dword ptr[esp+8],0xfffffffc ;; reset CS.RPL for kqemu | |
68 | - #endif | |
69 | -- popf | |
70 | -+ popfd | |
71 | - clc | |
72 | - retf | |
73 | - | |
74 | 1 | Index: rombios.h |
75 | 2 | =================================================================== |
76 | 3 | RCS file: /cvsroot/bochs/bochs/bios/rombios.h,v |
77 | -retrieving revision 1.1 | |
78 | -diff -u -w -r1.1 rombios.h | |
79 | ---- rombios.h 30 Sep 2006 11:22:53 -0000 1.1 | |
80 | -+++ rombios.h 1 Oct 2006 16:03:54 -0000 | |
4 | +retrieving revision 1.2 | |
5 | +diff -u -w -r1.2 rombios.h | |
6 | +--- rombios.h 1 Oct 2006 16:39:18 -0000 1.2 | |
7 | ++++ rombios.h 2 Oct 2006 18:31:41 -0000 | |
81 | 8 | @@ -19,7 +19,7 @@ |
82 | 9 | // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
83 | 10 | |
... | ... | @@ -87,132 +14,56 @@ diff -u -w -r1.1 rombios.h |
87 | 14 | |
88 | 15 | #define BX_ROMBIOS32 1 |
89 | 16 | #define DEBUG_ROMBIOS 0 |
90 | -@@ -48,3 +48,7 @@ | |
91 | - #endif | |
92 | - #define BX_INFO(format, p...) bios_printf(BIOS_PRINTF_INFO, format, ##p) | |
93 | - #define BX_PANIC(format, p...) bios_printf(BIOS_PRINTF_DEBHALT, format, ##p) | |
94 | -+ | |
95 | -+#define ACPI_DATA_SIZE 0x00010000L | |
96 | -+#define PM_IO_BASE 0xb000 | |
97 | -+#define CPU_COUNT_ADDR 0xf000 | |
98 | 17 | Index: rombios32.c |
99 | 18 | =================================================================== |
100 | 19 | RCS file: /cvsroot/bochs/bochs/bios/rombios32.c,v |
101 | -retrieving revision 1.4 | |
102 | -diff -u -w -r1.4 rombios32.c | |
103 | ---- rombios32.c 30 Sep 2006 11:22:53 -0000 1.4 | |
104 | -+++ rombios32.c 1 Oct 2006 16:03:54 -0000 | |
105 | -@@ -55,13 +55,10 @@ | |
20 | +retrieving revision 1.6 | |
21 | +diff -u -w -r1.6 rombios32.c | |
22 | +--- rombios32.c 2 Oct 2006 06:29:37 -0000 1.6 | |
23 | ++++ rombios32.c 2 Oct 2006 18:31:41 -0000 | |
24 | +@@ -45,6 +45,8 @@ | |
25 | + : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) \ | |
26 | + : "0" (index)) | |
106 | 27 | |
107 | - #define APIC_ENABLED 0x0100 | |
28 | ++#define wbinvd() asm volatile("wbinvd") | |
29 | ++ | |
30 | + #define CPUID_APIC (1 << 9) | |
108 | 31 | |
109 | --#define CPU_COUNT_ADDR 0xf000 | |
110 | - #define AP_BOOT_ADDR 0x10000 | |
32 | + #define APIC_BASE ((uint8_t *)0xfee00000) | |
33 | +@@ -591,6 +593,7 @@ | |
34 | + PCIDevice *d = &i440_pcidev; | |
35 | + int v; | |
111 | 36 | |
112 | - #define MPTABLE_MAX_SIZE 0x00002000 | |
113 | --#define ACPI_DATA_SIZE 0x00010000 | |
114 | - #define SMI_CMD_IO_ADDR 0xb2 | |
115 | --#define PM_IO_BASE 0xb000 | |
37 | ++ wbinvd(); | |
38 | + v = pci_config_readb(d, 0x59); | |
39 | + v = (v & 0x0f) | (0x10); | |
40 | + pci_config_writeb(d, 0x59, v); | |
41 | +@@ -645,7 +648,7 @@ | |
42 | + outb(0xb3, 0x01); | |
116 | 43 | |
117 | - #define BIOS_TMP_STORAGE 0x00030000 /* 64 KB used to copy the BIOS to shadow RAM */ | |
44 | + /* raise an SMI interrupt */ | |
45 | +- outb(0xb2, 0x01); | |
46 | ++ outb(0xb2, 0x00); | |
118 | 47 | |
119 | -@@ -354,12 +351,14 @@ | |
48 | + /* wait until SMM code executed */ | |
49 | + while (inb(0xb3) != 0x00); | |
50 | +@@ -656,6 +659,7 @@ | |
51 | + /* copy the SMM code */ | |
52 | + memcpy((void *)0xa8000, &smm_code_start, | |
53 | + &smm_code_end - &smm_code_start); | |
54 | ++ wbinvd(); | |
55 | + | |
56 | + /* close the SMM memory window and enable normal SMM */ | |
57 | + pci_config_writeb(&i440_pcidev, 0x72, 0x02 | 0x08); | |
58 | +@@ -848,6 +852,11 @@ | |
59 | + int ioapic_id, i, len; | |
60 | + int mp_config_table_size; | |
120 | 61 | |
121 | - void delay_ms(int n) | |
122 | - { | |
123 | -- int i, j, r1, r2; | |
124 | -+ int i, j; | |
125 | - for(i = 0; i < n; i++) { | |
126 | --#if BX_QEMU | |
127 | 62 | +#ifdef BX_QEMU |
128 | - /* approximative ! */ | |
129 | - for(j = 0; j < 1000000; j++); | |
130 | - #else | |
131 | -+ { | |
132 | -+ int r1, r2; | |
133 | - j = 66; | |
134 | - r1 = inb(0x61) & 0x10; | |
135 | - do { | |
136 | -@@ -369,6 +368,7 @@ | |
137 | - r1 = r2; | |
138 | - } | |
139 | - } while (j > 0); | |
140 | -+ } | |
141 | - #endif | |
142 | - } | |
143 | - } | |
144 | -Index: rombios32start.S | |
145 | -=================================================================== | |
146 | -RCS file: /cvsroot/bochs/bochs/bios/rombios32start.S,v | |
147 | -retrieving revision 1.1 | |
148 | -diff -u -w -r1.1 rombios32start.S | |
149 | ---- rombios32start.S 28 Sep 2006 18:56:20 -0000 1.1 | |
150 | -+++ rombios32start.S 1 Oct 2006 16:03:54 -0000 | |
151 | -@@ -1,3 +1,25 @@ | |
152 | -+///////////////////////////////////////////////////////////////////////// | |
153 | -+// $Id: bios.diff,v 1.15 2006-10-01 16:08:15 bellard Exp $ | |
154 | -+///////////////////////////////////////////////////////////////////////// | |
155 | -+// | |
156 | -+// 32 bit Bochs BIOS init code | |
157 | -+// Copyright (C) 2006 Fabrice Bellard | |
158 | -+// | |
159 | -+// This library is free software; you can redistribute it and/or | |
160 | -+// modify it under the terms of the GNU Lesser General Public | |
161 | -+// License as published by the Free Software Foundation; either | |
162 | -+// version 2 of the License, or (at your option) any later version. | |
163 | -+// | |
164 | -+// This library is distributed in the hope that it will be useful, | |
165 | -+// but WITHOUT ANY WARRANTY; without even the implied warranty of | |
166 | -+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
167 | -+// Lesser General Public License for more details. | |
168 | -+// | |
169 | -+// You should have received a copy of the GNU Lesser General Public | |
170 | -+// License along with this library; if not, write to the Free Software | |
171 | -+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
172 | -+#include "rombios.h" | |
63 | ++ if (smp_cpus <= 1) | |
64 | ++ return; | |
65 | ++#endif | |
173 | 66 | + |
174 | - .globl _start | |
175 | - .globl smp_ap_boot_code_start | |
176 | - .globl smp_ap_boot_code_end | |
177 | -@@ -6,8 +28,6 @@ | |
178 | - .global smm_code_start | |
179 | - .global smm_code_end | |
180 | - | |
181 | --#define PM_IO_BASE 0xb000 | |
182 | -- | |
183 | - _start: | |
184 | - /* clear bss section */ | |
185 | - xor %eax, %eax | |
186 | -@@ -18,13 +38,11 @@ | |
187 | - | |
188 | - jmp rombios32_init | |
189 | - | |
190 | --#define CPU_COUNT 0xf000 | |
191 | -- | |
192 | - .code16 | |
193 | - smp_ap_boot_code_start: | |
194 | - xor %ax, %ax | |
195 | - mov %ax, %ds | |
196 | -- incw CPU_COUNT | |
197 | -+ incw CPU_COUNT_ADDR | |
198 | - 1: | |
199 | - hlt | |
200 | - jmp 1b | |
201 | -@@ -33,7 +51,7 @@ | |
202 | - /* code to relocate SMBASE to 0xa0000 */ | |
203 | - smm_relocation_start: | |
204 | - mov $0x38000 + 0x7efc, %ebx | |
205 | -- mov (%ebx), %al /* revision ID to see if x86_64 or x86 */ | |
206 | -+ addr32 mov (%ebx), %al /* revision ID to see if x86_64 or x86 */ | |
207 | - cmp $0x64, %al | |
208 | - je 1f | |
209 | - mov $0x38000 + 0x7ef8, %ebx | |
210 | -@@ -42,7 +60,7 @@ | |
211 | - mov $0x38000 + 0x7f00, %ebx | |
212 | - 2: | |
213 | - movl $0xa0000, %eax | |
214 | -- movl %eax, (%ebx) | |
215 | -+ addr32 movl %eax, (%ebx) | |
216 | - rsm | |
217 | - smm_relocation_end: | |
218 | - | |
67 | + #ifdef BX_USE_EBDA_TABLES | |
68 | + mp_config_table = (uint8_t *)(ram_size - ACPI_DATA_SIZE - MPTABLE_MAX_SIZE); | |
69 | + #else | ... | ... |