From: Avi Kivity <avi-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
To: "He, Qing" <qing.he-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
Subject: Re: [PATCH] passing smp cpu count from CMOS
Date: Mon, 10 Sep 2007 11:00:16 +0300 [thread overview]
Message-ID: <46E4F990.4070507@qumranet.com> (raw)
In-Reply-To: <37E52D09333DE2469A03574C88DBF40FA9C219-wq7ZOvIWXbM/UvCtAeCM4rfspsVTdybXVpNB7YpNyf8@public.gmane.org>
[-- Attachment #1: Type: text/plain, Size: 2240 bytes --]
He, Qing wrote:
> 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 <qing.he-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
> 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
>
This means there's no BIOS SIPI, which is a little sad as it doesn't
exercise the lapic machinery.
> 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;
>
This really shouldn't be done from within the rtc.
Alternative patch attached, but works only with -no-kvm-irqchip.
--
error compiling committee.c: too many arguments to function
[-- Attachment #2: bios-smp-init.patch --]
[-- Type: text/x-patch, Size: 2316 bytes --]
diff --git a/bios/BIOS-bochs-latest b/bios/BIOS-bochs-latest
index 4388ff2..c10ae62 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 a720312..131e62b 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 816e5cc..1917b1c 100755
--- a/bios/rombios32.c
+++ b/bios/rombios32.c
@@ -441,7 +441,12 @@ void smp_probe(void)
sipi_vector = AP_BOOT_ADDR >> 12;
writel(APIC_BASE + APIC_ICR_LOW, 0x000C4600 | sipi_vector);
+#ifndef BX_QEMU
delay_ms(10);
+#else
+ while (cmos_readb(0x5f) + 1 != readw((void *)CPU_COUNT_ADDR))
+ ;
+#endif
smp_cpus = readw((void *)CPU_COUNT_ADDR);
}
diff --git a/qemu/hw/pc.c b/qemu/hw/pc.c
index d3b8786..7c6ceb1 100644
--- a/qemu/hw/pc.c
+++ b/qemu/hw/pc.c
@@ -163,7 +163,7 @@ static void cmos_init_hd(int type_ofs, int info_ofs, BlockDriverState *hd)
}
/* hd_table must contain 4 block drivers */
-static void cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size, int boot_device, BlockDriverState **hd_table)
+static void cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size, int boot_device, BlockDriverState **hd_table, int smp_cpus)
{
RTCState *s = rtc_state;
int val;
@@ -190,6 +190,7 @@ static void cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size, int boo
rtc_set_memory(s, 0x5c, (unsigned int)above_4g_mem_size >> 24);
rtc_set_memory(s, 0x5d, above_4g_mem_size >> 32);
}
+ rtc_set_memory(s, 0x5f, smp_cpus - 1);
if (ram_size > (16 * 1024 * 1024))
val = (ram_size / 65536) - ((16 * 1024 * 1024) / 65536);
@@ -778,7 +779,7 @@ static void pc_init1(ram_addr_t ram_size, int vga_ram_size, int boot_device,
floppy_controller = fdctrl_init(6, 2, 0, 0x3f0, fd_table);
- cmos_init(ram_size, above_4g_mem_size, boot_device, bs_table);
+ cmos_init(ram_size, above_4g_mem_size, boot_device, bs_table, smp_cpus);
if (pci_enabled && usb_enabled) {
usb_uhci_init(pci_bus, piix3_devfn + 2);
diff --git a/qemu/pc-bios/bios.bin b/qemu/pc-bios/bios.bin
index 4388ff2..c10ae62 100644
Binary files a/qemu/pc-bios/bios.bin and b/qemu/pc-bios/bios.bin differ
[-- Attachment #3: Type: text/plain, Size: 228 bytes --]
-------------------------------------------------------------------------
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/
[-- Attachment #4: Type: text/plain, Size: 186 bytes --]
_______________________________________________
kvm-devel mailing list
kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
https://lists.sourceforge.net/lists/listinfo/kvm-devel
next prev parent reply other threads:[~2007-09-10 8:00 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-09-10 3:00 [PATCH] passing smp cpu count from CMOS He, Qing
[not found] ` <37E52D09333DE2469A03574C88DBF40FA9C219-wq7ZOvIWXbM/UvCtAeCM4rfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2007-09-10 8:00 ` Avi Kivity [this message]
[not found] ` <46E4F990.4070507-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-09-10 12:47 ` Avi Kivity
[not found] ` <46E53CFD.8070108-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-09-11 0:12 ` Dong, Eddie
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=46E4F990.4070507@qumranet.com \
--to=avi-atkuwr5tajbwk0htik3j/w@public.gmane.org \
--cc=kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org \
--cc=qing.he-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.