From e3e97e7c90f4a40a56ea05f3a34f267edf41c9ed Mon Sep 17 00:00:00 2001 From: bellard Date: Mon, 2 Oct 2006 18:35:39 +0000 Subject: [PATCH] do not generate MP table if one CPU (no APIC in QEMU in this case) - added wbinvd (ignored in QEMU but useful on real hardware) git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2191 c046a42c-6fe2-441c-8c8c-71466251a162 --- pc-bios/bios.bin | Bin 131072 -> 131072 bytes pc-bios/bios.diff | 247 +++++++++------------------------------------- 2 files changed, 49 insertions(+), 198 deletions(-) diff --git a/pc-bios/bios.bin b/pc-bios/bios.bin index 1af4a4f0e55b34c1fda57a5f7db81e1f1efc0ef5..0161bde0f0c3aa503fe1ab5f7d3b329af7c1021e 100644 GIT binary patch delta 2153 zcmZo@;Am*z5H>upKS+axVP}U13xnp*&#PX#i%b+YV%xy5Ycs>UiLT0w3>(uIGcq2T z%+2JK57EgAtcFZcqML(RotPN2Cr@La&BP!!*_fkWjh{0sG9yNVh2e$G zzyJT6AMiIH;b}f05C9WR`uqR?$-|Rha4f2?6J=q@VtKLq*Z=>oXH5w0e7eJzfrTNs z`3;Az0s{*}Kn94+U}#`w=#J%hapBwl{}EAH5y3Bx{rUf&mw|zSsrd*`07&5D@Bjas zj|lAA%)r2~gOP!O;oYuH3=9m02i}2&I={VXIZ*mLFv}^c2;ww{KmY&lNXcbjVQ4;^KmY%C$No8axVMZUwDW0rSa9N|*mJ$m>j$e9X_zZsYr z82DQhm>3wK?EVdmAT}c-NL+GqDVGAz=U@N-N5%z%%v>{hA(u(L^`HO$8ReRf2)H-@ zXRDjh{DvdT79@Kg;`!DCrTLAuAKDri7)m&LQ@=#V#h*OfSo=n}kb$A}eRu}r1_p*K zhySG<$5~r6SQr>KFfhDG_yuwhPZncF0|Nut`R9K9{~sNfWdky}?f3uxk^f6M7N>w> zv!3PO|NqBX8#GuLKq1_GMBw$T<~JN30U)I&fBygH-`2pO01nUqi2i1<=>jj)|Ns9F zbD3X2#s@|Q21r0Hg*KhA-TpA|>@8Ma&>YCSW0fmw*0& z%zYzJz`#(tG9ZJY0qVgQ$HC#u0}*ioY1s-E5qKH<@BjY^jlUT<7#K>78-FwWXJFuO z^#GgmAzJ{%Sq@6HwQs~rxSDIiyz$41|dU6|&DeuXj&_ux$_G0hk6Fl~eA0~6~$}@UQ*5Ex-&(myM0t&}^ zctn9>Q{ca84Jf1!{r~?zGCE_HC<{Yx?1$h^*B6UH;-KUt{~w$O7=m9|{{R0!J|c@H z_{H~spoEge5d7lpKagz3d{GvL;1^&1ffQt{0CS$h)kyyT|KAmqSRoqYBNl>O(tJQD zAo#^Iu&N9Oh6n$GUwi}`1~T?M*d!3E7px$QA=vQti^j=w_>}77z^a0KLq7z)2m;B* zX9@P!eh7cz3JRYi011y}y5cWb2A|}fa_Cf?M$ORE(0J+Bb#h<^Eqxhxkm;VI?N^k53 zkOyY{1qaGjaG)&w3l2D@Zc$JW1b2qMc~J#c{J-=~@QZw~(k#K?7pV|+jKMFW!O|HF z3|DVhuz@rD^NPzW% zSbSgw!C^00!9xE_--NyR_2>Wp$cW%@=NBLTOx6=n53&CH|Nr+J-Jvf!oY=cdKWJWS ze#5a4lnk;27(WEOaQO?$xe^(BL|GWZI}gJX$dW%G-~KOs5&q&T*vKr#@E6r!!7P@^ zdj<4;B0!;U4-sJqe_;wz)$RHrUh_sk@Qc}hK(=-`b9I`i{4aeG-0k`yqd|;?LGwly z3nMGY`WFvA{r~^+;Gh5hd&?Lms|fmsAAARL3QuP>%Q0sThAg&>gP?@#%oXrrIYcIl zCF2BGNFdOdGQD$((U@@xC4s=0|P^b5eEZ9hJpe} z`o)XG5b6J=Pe2BIc+o$(NjQV?>EzeKGWM?^_1mlW|Np;e{P6$(3l9*n8$=xY@&7+K zI-8FOv>qsBI(hiT^q>F#ck_bE*VdDzoF`w(Pj(Ygsz1Zb!mx!%9L>zaAjU+z`eJ4l zhE622mm#sCb}})Xnfy{@_u>PhT$>b}AIcdjs3@qoB$lLFDHs_TnCTlD=o=U+7@Aob gTUr@fY)@olymgh)XuHjI#=RQsM*0S341cBq04!zYsQ>@~ delta 2092 zcmZo@;Am*z5H>upKS+axVP}U13xnp*&#PX(7M>_94v0>+=IB?;ip+@7U}1P+_wWDz<_G-EM|he~ z2n4`HQ~v({fAVnWx5*zk7S$_>vM^+^yx9Hg|NqysCWP*AXJBFIe5$L!z{1e{h9@8c z#K>T1U}ku6<=g-N%}024ZDL?xFg)-s%PFe}VoUj-|NnQSgESoB(FN%b$N-TU3=Lci zFXlmXWpTk&d;S60-dn~H+W9m*tUkE;jYt;P|5A<@8~^>JCFf>5@_JSR3F%Lw<38dvKD9Fu@2)s=E_y7Nd#@`Ga3=Ad4jlUWGGcfSC`uqbs zFk1k`Sq(~rwQs~rxSDIp4`VHrqu!wbt~a*tbOwztgGjj1k(O~@;M$;Ud~_8#K9Ey;_qYuUVFwDlLL6=8CfP5@E)lb$rAW)S_2BxYybcM zkBrW+6J=rOjr|bZ>H1Bogiy`<0BUm=W zS(Jq#_yq@8L52^Q^ZOqtb%509g4KXnAbs%>3rjRu7@7|V83qKu_yty#!NBm~U+@c7 zxWdQ(z*aE?zgP%Xki`&ec>BfF$v^m%>Wlt?92DFe`XT5=8b~%iOR%^0L->nGP}m$1 zXuZwfYRAOD07`z$;V+!Q%Ci{4UsysEvxU9Thl+*0P=$ywguRdki)An}F))O^aDxlm zfQ7Rd!d@6b#3r}$i`IiIcYYxNvCvu;HTo`WGBBOx>a&eZiffZ(j6)75^`N6a1nXtTan7_(df|9b@o|e6Vx|1H*xT z!M&v)UTCcU`~Sb;?dBr_o!^_^aP)?L$YKt9;RRA30dlGXSbY{l*knfmX{q3_7m{Fs z|D|ujUhsic1&2GoVEH?_OF+He|L_0*-*0q>zUXjb?=JnId9C>k$3jr-Gk(Yt2zU|k z7nC<7G7>~t7{WUbce;K6Cyf_7{($`Vzw|};i`hmH-tdaD_4fFZNGX6Ea}DG&x)-!lD6EV1D`t zGEOE-1r)}A--0+iSsWRKqAUzyF9abb!K`=V40!Qx@^c|2kt$HYy;urPD?C{xpyaS* zvaE2HW<5AHs6!HHSj`Ly|sKt>;=lCt~o|No1tAYu-P;Q#pl|BG8c{{II@a`O>T zxy*F(@Qc+y|Nrmi1(mCy>k@415M#Jqk*BSR}up8 0); -+ } - #endif - } - } -Index: rombios32start.S -=================================================================== -RCS file: /cvsroot/bochs/bochs/bios/rombios32start.S,v -retrieving revision 1.1 -diff -u -w -r1.1 rombios32start.S ---- rombios32start.S 28 Sep 2006 18:56:20 -0000 1.1 -+++ rombios32start.S 1 Oct 2006 16:03:54 -0000 -@@ -1,3 +1,25 @@ -+///////////////////////////////////////////////////////////////////////// -+// $Id: bios.diff,v 1.15 2006-10-01 16:08:15 bellard Exp $ -+///////////////////////////////////////////////////////////////////////// -+// -+// 32 bit Bochs BIOS init code -+// Copyright (C) 2006 Fabrice Bellard -+// -+// This library is free software; you can redistribute it and/or -+// modify it under the terms of the GNU Lesser General Public -+// License as published by the Free Software Foundation; either -+// version 2 of the License, or (at your option) any later version. -+// -+// This library is distributed in the hope that it will be useful, -+// but WITHOUT ANY WARRANTY; without even the implied warranty of -+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+// Lesser General Public License for more details. -+// -+// You should have received a copy of the GNU Lesser General Public -+// License along with this library; if not, write to the Free Software -+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+#include "rombios.h" ++#define wbinvd() asm volatile("wbinvd") + - .globl _start - .globl smp_ap_boot_code_start - .globl smp_ap_boot_code_end -@@ -6,8 +28,6 @@ - .global smm_code_start - .global smm_code_end + #define CPUID_APIC (1 << 9) --#define PM_IO_BASE 0xb000 -- - _start: - /* clear bss section */ - xor %eax, %eax -@@ -18,13 +38,11 @@ + #define APIC_BASE ((uint8_t *)0xfee00000) +@@ -591,6 +593,7 @@ + PCIDevice *d = &i440_pcidev; + int v; - jmp rombios32_init ++ wbinvd(); + v = pci_config_readb(d, 0x59); + v = (v & 0x0f) | (0x10); + pci_config_writeb(d, 0x59, v); +@@ -645,7 +648,7 @@ + outb(0xb3, 0x01); --#define CPU_COUNT 0xf000 -- - .code16 - smp_ap_boot_code_start: - xor %ax, %ax - mov %ax, %ds -- incw CPU_COUNT -+ incw CPU_COUNT_ADDR - 1: - hlt - jmp 1b -@@ -33,7 +51,7 @@ - /* code to relocate SMBASE to 0xa0000 */ - smm_relocation_start: - mov $0x38000 + 0x7efc, %ebx -- mov (%ebx), %al /* revision ID to see if x86_64 or x86 */ -+ addr32 mov (%ebx), %al /* revision ID to see if x86_64 or x86 */ - cmp $0x64, %al - je 1f - mov $0x38000 + 0x7ef8, %ebx -@@ -42,7 +60,7 @@ - mov $0x38000 + 0x7f00, %ebx - 2: - movl $0xa0000, %eax -- movl %eax, (%ebx) -+ addr32 movl %eax, (%ebx) - rsm - smm_relocation_end: - + /* raise an SMI interrupt */ +- outb(0xb2, 0x01); ++ outb(0xb2, 0x00); + + /* wait until SMM code executed */ + while (inb(0xb3) != 0x00); +@@ -656,6 +659,7 @@ + /* copy the SMM code */ + memcpy((void *)0xa8000, &smm_code_start, + &smm_code_end - &smm_code_start); ++ wbinvd(); + + /* close the SMM memory window and enable normal SMM */ + pci_config_writeb(&i440_pcidev, 0x72, 0x02 | 0x08); +@@ -848,6 +852,11 @@ + int ioapic_id, i, len; + int mp_config_table_size; + ++#ifdef BX_QEMU ++ if (smp_cpus <= 1) ++ return; ++#endif ++ + #ifdef BX_USE_EBDA_TABLES + mp_config_table = (uint8_t *)(ram_size - ACPI_DATA_SIZE - MPTABLE_MAX_SIZE); + #else