As discussed previously, this patch directly passes SMP CPU count to the
guest BIOS from CMOS by qemu, instead of sending SIPI and wait. CMOS
offset 0x7f is used.

This is the last functional piece for in-kernel APIC merge in kvm-37.

Signed-off-by: Qing He <[EMAIL PROTECTED]>


bios/BIOS-bochs-latest |  Bin
 bios/BIOS-bochs-legacy |  Bin
 bios/rombios32.c       |    7 +++++++
 qemu/hw/mc146818rtc.c  |    6 ++++++
 qemu/pc-bios/bios.bin  |  Bin
 5 files changed, 13 insertions(+), 0 deletions(-)

diff --git a/bios/BIOS-bochs-latest b/bios/BIOS-bochs-latest
index eb76dc7..99b78bf 100644
Binary files a/bios/BIOS-bochs-latest and b/bios/BIOS-bochs-latest
differ
diff --git a/bios/BIOS-bochs-legacy b/bios/BIOS-bochs-legacy
index f5947f6..423ea50 100644
Binary files a/bios/BIOS-bochs-legacy and b/bios/BIOS-bochs-legacy
differ
diff --git a/bios/rombios32.c b/bios/rombios32.c
index faf771e..3bb5e00 100755
--- a/bios/rombios32.c
+++ b/bios/rombios32.c
@@ -41,6 +41,9 @@ typedef unsigned long long uint64_t;
 /* define it if the (emulated) hardware supports SMM mode */
 #define BX_USE_SMM
 
+/* read CPU count from CMOS directly instead of probing */
+#define BX_CMOS_CPU_COUNT
+
 #define cpuid(index, eax, ebx, ecx, edx) \
   asm volatile ("cpuid" \
                 : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) \
@@ -442,9 +445,13 @@ void smp_probe(void)
         sipi_vector = AP_BOOT_ADDR >> 12;
         writel(APIC_BASE + APIC_ICR_LOW, 0x000C4600 | sipi_vector);
         
+#ifdef BX_CMOS_CPU_COUNT
+        smp_cpus = cmos_readb(0x7f);
+#else
         delay_ms(10);
 
         smp_cpus = readw((void *)CPU_COUNT_ADDR);
+#endif
     }
     BX_INFO("Found %d cpu(s)\n", smp_cpus);
 }
diff --git a/qemu/hw/mc146818rtc.c b/qemu/hw/mc146818rtc.c
index bad4cbd..3c4c25d 100644
--- a/qemu/hw/mc146818rtc.c
+++ b/qemu/hw/mc146818rtc.c
@@ -33,6 +33,9 @@
 #define RTC_HOURS_ALARM         5
 #define RTC_ALARM_DONT_CARE    0xC0
 
+/* KVM specific extension: smp cpu count passing */
+#define RTC_CMOS_CPU_COUNT     0x7f
+
 #define RTC_DAY_OF_WEEK         6
 #define RTC_DAY_OF_MONTH        7
 #define RTC_MONTH               8
@@ -356,6 +359,9 @@ static uint32_t cmos_ioport_read(void *opaque,
uint32_t addr)
             pic_set_irq(s->irq, 0);
             s->cmos_data[RTC_REG_C] = 0x00; 
             break;
+        case RTC_CMOS_CPU_COUNT:
+            ret = smp_cpus;
+            break;
         default:
             ret = s->cmos_data[s->cmos_index];
             break;
diff --git a/qemu/pc-bios/bios.bin b/qemu/pc-bios/bios.bin
index eb76dc7..99b78bf 100644
Binary files a/qemu/pc-bios/bios.bin and b/qemu/pc-bios/bios.bin differ

Attachment: bios-cmos-cpus-passing.patch
Description: bios-cmos-cpus-passing.patch

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
kvm-devel mailing list
kvm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/kvm-devel

Reply via email to