RE: Alt SeaBIOS SSDT cpu hotplug
Kevin O'Connor wrote: On Tue, Aug 03, 2010 at 05:00:49PM +0800, Liu, Jinsong wrote: I just test your new patch with Windows 2008 DataCenter at my platform, it works OK! We can hot-add new cpus and they appear at Device Manager. (BTW, yesterday I test your new patch with linux 2.6.32 hvm, it works fine, we can add-remove-add-remove... cpus) Sorry for make you spend more time. It's our fault. Thanks. I'll go ahead and commit it then. I have one incremental patch (see below) which I will also commit. -Kevin --- ssdt-proc.dsl 2010-08-03 18:45:12.0 -0400 +++ src/ssdt-proc.dsl 2010-08-03 18:45:17.0 -0400 @@ -44,7 +44,7 @@ Return(CPST(ID)) } Method (_EJ0, 1, NotSerialized) { -Return(CPEJ(ID, Arg0)) +CPEJ(ID, Arg0) } } } Kevin, We find the root cause why your patch works fine at some platform but fail at other platform: 1). At platform A, success, use old qemu-kvm, commit is 3925c857a5740f62b30a5334f02477a23b61cc33 2). At platform B, fail, use new qemu-kvm, commit is 59d71ddb432db04b57ee2658ce50a3e35d7db97e so seabios is OK, but qemu-kvm has bug. I have fix it and send to kvm maillist. With the fix qemu-kvm patch, and latest seabios and latest qemu-kvm, we re-do test, now vcpu hotplug works fine with both linux2.6.32 and win2k8 datacenter. Thanks, Jinsong-- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
RE: Alt SeaBIOS SSDT cpu hotplug
Zheng, Shaohui wrote: In our experiences, windows 2008 datacenter is the only version to support CPU hotplug, and we did not find any official announce for other windows, so we tested windows 2008 data center only. Thanks for Kevin pointing out it, we will try windows7 hotplug feature. Thanks Regards, Shaohui -Original Message- From: Kevin O'Connor [mailto:ke...@koconnor.net] Sent: Tuesday, August 03, 2010 1:27 AM To: Avi Kivity Cc: Alexander Graf; Liu, Jinsong; seab...@seabios.org; kvm@vger.kernel.org; Jiang, Yunhong; Li, Xin; Zheng, Shaohui; Zhang, Jianwu; You, Yongkang Subject: Re: Alt SeaBIOS SSDT cpu hotplug On Mon, Aug 02, 2010 at 07:13:34PM +0300, Avi Kivity wrote: On 08/02/2010 06:55 PM, Kevin O'Connor wrote: On Mon, Aug 02, 2010 at 10:12:31AM +0200, Alexander Graf wrote: On 02.08.2010, at 07:49, Kevin O'Connor wrote: On Mon, Aug 02, 2010 at 10:41:39AM +0800, Liu, Jinsong wrote: It seems the Windows acpi interpreter is significantly different from the Linux one. The only guess I have is that Windows doesn't like one of the ASL constructs even though they all look valid. I'd try to debug this by commenting out parts of the ASL until I narrowed down the parts causing the problem. Unfortunately, I don't have Windows 2008 to do this directly. Any other ideas? Just grab yourself a free copy of the Hyper-V server 2008: http://arstechnica.com/microsoft/news/2009/08/microsoft-hyper-v-server-2008-r2-arrives-for-free.ars I downloaded and installed it, but I can't reproduce the crash. It seems like a really stripped down version of Windows, so I can't tell if it actually worked or not either. I thought only the Datacenter edition supported cpu hotplug. I just tried an old Win 7 Ultimate beta (build 7100) I had on my HD. It looks like it supports cpu hotplug. However, I don't see any failures - it seems to work fine. (After running cpu_set 1 online, the event pops up in the system event log as a UserPnP event, and the CPU appears in the system devices list.) -Kevin Kevin, I just test your new patch with Windows 2008 DataCenter at my platform, it works OK! We can hot-add new cpus and they appear at Device Manager. (BTW, yesterday I test your new patch with linux 2.6.32 hvm, it works fine, we can add-remove-add-remove... cpus) Sorry for make you spend more time. It's our fault. Thanks, Jinsong -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: Alt SeaBIOS SSDT cpu hotplug
On Tue, Aug 03, 2010 at 05:00:49PM +0800, Liu, Jinsong wrote: I just test your new patch with Windows 2008 DataCenter at my platform, it works OK! We can hot-add new cpus and they appear at Device Manager. (BTW, yesterday I test your new patch with linux 2.6.32 hvm, it works fine, we can add-remove-add-remove... cpus) Sorry for make you spend more time. It's our fault. Thanks. I'll go ahead and commit it then. I have one incremental patch (see below) which I will also commit. -Kevin --- ssdt-proc.dsl 2010-08-03 18:45:12.0 -0400 +++ src/ssdt-proc.dsl 2010-08-03 18:45:17.0 -0400 @@ -44,7 +44,7 @@ Return(CPST(ID)) } Method (_EJ0, 1, NotSerialized) { -Return(CPEJ(ID, Arg0)) +CPEJ(ID, Arg0) } } } -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: Alt SeaBIOS SSDT cpu hotplug
On 02.08.2010, at 07:49, Kevin O'Connor wrote: On Mon, Aug 02, 2010 at 10:41:39AM +0800, Liu, Jinsong wrote: Kevin, This patch still has issue, It can boot Windows 2008 DataCenter, however, when run cpu_set cpu online command, windows 2008 Datacenter system shutdown at once. Thanks for testing. I've inspected the generated DSDT and SSDT files, and I don't see anything wrong with them. (To inspect a generated SSDT, uncomment the call to hexdump(), cut and paste the hexdump output into SeaBIOS' tools/transdump.py, and then call iasl -d on the output.) It seems the Windows acpi interpreter is significantly different from the Linux one. The only guess I have is that Windows doesn't like one of the ASL constructs even though they all look valid. I'd try to debug this by commenting out parts of the ASL until I narrowed down the parts causing the problem. Unfortunately, I don't have Windows 2008 to do this directly. Any other ideas? Just grab yourself a free copy of the Hyper-V server 2008: http://arstechnica.com/microsoft/news/2009/08/microsoft-hyper-v-server-2008-r2-arrives-for-free.ars Alex -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: Alt SeaBIOS SSDT cpu hotplug
On Mon, Aug 02, 2010 at 10:12:31AM +0200, Alexander Graf wrote: On 02.08.2010, at 07:49, Kevin O'Connor wrote: On Mon, Aug 02, 2010 at 10:41:39AM +0800, Liu, Jinsong wrote: It seems the Windows acpi interpreter is significantly different from the Linux one. The only guess I have is that Windows doesn't like one of the ASL constructs even though they all look valid. I'd try to debug this by commenting out parts of the ASL until I narrowed down the parts causing the problem. Unfortunately, I don't have Windows 2008 to do this directly. Any other ideas? Just grab yourself a free copy of the Hyper-V server 2008: http://arstechnica.com/microsoft/news/2009/08/microsoft-hyper-v-server-2008-r2-arrives-for-free.ars I downloaded and installed it, but I can't reproduce the crash. It seems like a really stripped down version of Windows, so I can't tell if it actually worked or not either. -Kevin -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: Alt SeaBIOS SSDT cpu hotplug
On 02.08.2010, at 17:55, Kevin O'Connor wrote: On Mon, Aug 02, 2010 at 10:12:31AM +0200, Alexander Graf wrote: On 02.08.2010, at 07:49, Kevin O'Connor wrote: On Mon, Aug 02, 2010 at 10:41:39AM +0800, Liu, Jinsong wrote: It seems the Windows acpi interpreter is significantly different from the Linux one. The only guess I have is that Windows doesn't like one of the ASL constructs even though they all look valid. I'd try to debug this by commenting out parts of the ASL until I narrowed down the parts causing the problem. Unfortunately, I don't have Windows 2008 to do this directly. Any other ideas? Just grab yourself a free copy of the Hyper-V server 2008: http://arstechnica.com/microsoft/news/2009/08/microsoft-hyper-v-server-2008-r2-arrives-for-free.ars I downloaded and installed it, but I can't reproduce the crash. It seems like a really stripped down version of Windows, so I can't tell if it actually worked or not either. I haven't tried for a while now, but last time I used that stripped down version I could log in as administrator. Maybe it was through RDP only. But from there it was almost a fully functional copy of Windows that certainly sufficed to do simple functionality tests. Alex -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: Alt SeaBIOS SSDT cpu hotplug
On 02.08.2010, at 18:13, Avi Kivity wrote: On 08/02/2010 06:55 PM, Kevin O'Connor wrote: On Mon, Aug 02, 2010 at 10:12:31AM +0200, Alexander Graf wrote: On 02.08.2010, at 07:49, Kevin O'Connor wrote: On Mon, Aug 02, 2010 at 10:41:39AM +0800, Liu, Jinsong wrote: It seems the Windows acpi interpreter is significantly different from the Linux one. The only guess I have is that Windows doesn't like one of the ASL constructs even though they all look valid. I'd try to debug this by commenting out parts of the ASL until I narrowed down the parts causing the problem. Unfortunately, I don't have Windows 2008 to do this directly. Any other ideas? Just grab yourself a free copy of the Hyper-V server 2008: http://arstechnica.com/microsoft/news/2009/08/microsoft-hyper-v-server-2008-r2-arrives-for-free.ars I downloaded and installed it, but I can't reproduce the crash. It seems like a really stripped down version of Windows, so I can't tell if it actually worked or not either. I thought only the Datacenter edition supported cpu hotplug. That could be the reason for it not showing the breakage. Sorry for the fuss :(. Alex -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: Alt SeaBIOS SSDT cpu hotplug
On 08/02/2010 06:55 PM, Kevin O'Connor wrote: On Mon, Aug 02, 2010 at 10:12:31AM +0200, Alexander Graf wrote: On 02.08.2010, at 07:49, Kevin O'Connor wrote: On Mon, Aug 02, 2010 at 10:41:39AM +0800, Liu, Jinsong wrote: It seems the Windows acpi interpreter is significantly different from the Linux one. The only guess I have is that Windows doesn't like one of the ASL constructs even though they all look valid. I'd try to debug this by commenting out parts of the ASL until I narrowed down the parts causing the problem. Unfortunately, I don't have Windows 2008 to do this directly. Any other ideas? Just grab yourself a free copy of the Hyper-V server 2008: http://arstechnica.com/microsoft/news/2009/08/microsoft-hyper-v-server-2008-r2-arrives-for-free.ars I downloaded and installed it, but I can't reproduce the crash. It seems like a really stripped down version of Windows, so I can't tell if it actually worked or not either. I thought only the Datacenter edition supported cpu hotplug. -- error compiling committee.c: too many arguments to function -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
RE: Alt SeaBIOS SSDT cpu hotplug
In our experiences, windows 2008 datacenter is the only version to support CPU hotplug, and we did not find any official announce for other windows, so we tested windows 2008 data center only. Thanks for Kevin pointing out it, we will try windows7 hotplug feature. Thanks Regards, Shaohui -Original Message- From: Kevin O'Connor [mailto:ke...@koconnor.net] Sent: Tuesday, August 03, 2010 1:27 AM To: Avi Kivity Cc: Alexander Graf; Liu, Jinsong; seab...@seabios.org; kvm@vger.kernel.org; Jiang, Yunhong; Li, Xin; Zheng, Shaohui; Zhang, Jianwu; You, Yongkang Subject: Re: Alt SeaBIOS SSDT cpu hotplug On Mon, Aug 02, 2010 at 07:13:34PM +0300, Avi Kivity wrote: On 08/02/2010 06:55 PM, Kevin O'Connor wrote: On Mon, Aug 02, 2010 at 10:12:31AM +0200, Alexander Graf wrote: On 02.08.2010, at 07:49, Kevin O'Connor wrote: On Mon, Aug 02, 2010 at 10:41:39AM +0800, Liu, Jinsong wrote: It seems the Windows acpi interpreter is significantly different from the Linux one. The only guess I have is that Windows doesn't like one of the ASL constructs even though they all look valid. I'd try to debug this by commenting out parts of the ASL until I narrowed down the parts causing the problem. Unfortunately, I don't have Windows 2008 to do this directly. Any other ideas? Just grab yourself a free copy of the Hyper-V server 2008: http://arstechnica.com/microsoft/news/2009/08/microsoft-hyper-v-server-2008-r2-arrives-for-free.ars I downloaded and installed it, but I can't reproduce the crash. It seems like a really stripped down version of Windows, so I can't tell if it actually worked or not either. I thought only the Datacenter edition supported cpu hotplug. I just tried an old Win 7 Ultimate beta (build 7100) I had on my HD. It looks like it supports cpu hotplug. However, I don't see any failures - it seems to work fine. (After running cpu_set 1 online, the event pops up in the system event log as a UserPnP event, and the CPU appears in the system devices list.) -Kevin -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
RE: Alt SeaBIOS SSDT cpu hotplug
Kevin, This patch still has issue, It can boot Windows 2008 DataCenter, however, when run cpu_set cpu online command, windows 2008 Datacenter system shutdown at once. Thanks, Jinsong Sorry about that. It looks like I messed up the SSDT ScopeOp length. New patch attached below. I've tested it by adding/removing cpus on Linux, and I've now also boot tested winxp and winvista. (I don't have Windows 2008 DataCenter.) -Kevin diff --git a/src/acpi-dsdt.dsl b/src/acpi-dsdt.dsl index cc31112..640716c 100644 --- a/src/acpi-dsdt.dsl +++ b/src/acpi-dsdt.dsl @@ -648,6 +648,78 @@ DefinitionBlock ( Zero /* reserved */ }) +/* CPU hotplug */ +Scope(\_SB) { +/* Objects filled in by run-time generated SSDT */ +External(NTFY, MethodObj) +External(CPON, PkgObj) + +/* Methods called by run-time generated SSDT Processor objects */ +Method (CPMA, 1, NotSerialized) { +// _MAT method - create an madt apic buffer +// Local0 = CPON flag for this cpu +Store(DerefOf(Index(CPON, Arg0)), Local0) +// Local1 = Buffer (in madt apic form) to return +Store(Buffer(8) {0x00, 0x08, 0x00, 0x00, 0x00, 0, 0, 0}, Local1) +// Update the processor id, lapic id, and enable/disable status +Store(Arg0, Index(Local1, 2)) +Store(Arg0, Index(Local1, 3)) +Store(Local0, Index(Local1, 4)) +Return (Local1) +} +Method (CPST, 1, NotSerialized) { +// _STA method - return ON status of cpu +// Local0 = CPON flag for this cpu +Store(DerefOf(Index(CPON, Arg0)), Local0) +If (Local0) { Return(0xF) } Else { Return(0x0) } +} +Method (CPEJ, 2, NotSerialized) { +// _EJ0 method - eject callback +Sleep(200) +} + +/* CPU hotplug notify method */ +OperationRegion(PRST, SystemIO, 0xaf00, 32) +Field (PRST, ByteAcc, NoLock, Preserve) +{ +PRS, 256 +} +Method(PRSC, 0) { +// Local5 = active cpu bitmap +Store (PRS, Local5) +// Local2 = last read byte from bitmap +Store (Zero, Local2) +// Local0 = cpuid iterator +Store (Zero, Local0) +While (LLess(Local0, SizeOf(CPON))) { +// Local1 = CPON flag for this cpu +Store(DerefOf(Index(CPON, Local0)), Local1) +If (And(Local0, 0x07)) { +// Shift down previously read bitmap byte +ShiftRight(Local2, 1, Local2) +} Else { +// Read next byte from cpu bitmap +Store(DerefOf(Index(Local5, ShiftRight(Local0, 3))), Local2) +} +// Local3 = active state for this cpu +Store(And(Local2, 1), Local3) + +If (LNotEqual(Local1, Local3)) { +// State change - update CPON with new state +Store(Local3, Index(CPON, Local0)) +// Do CPU notify +If (LEqual(Local3, 1)) { +NTFY(Local0, 1) +} Else { +NTFY(Local0, 3) +} +} +Increment(Local0) +} +Return(One) +} +} + Scope (\_GPE) { Name(_HID, ACPI0006) @@ -701,7 +773,8 @@ DefinitionBlock ( } Method(_L02) { -Return(0x01) +// CPU hotplug event +Return(\_SB.PRSC()) } Method(_L03) { Return(0x01) diff --git a/src/acpi.c b/src/acpi.c index e91f8e0..3b49c4e 100644 --- a/src/acpi.c +++ b/src/acpi.c @@ -1,6 +1,6 @@ // Support for generating ACPI tables (on emulators) // -// Copyright (C) 2008,2009 Kevin O'Connor ke...@koconnor.net +// Copyright (C) 2008-2010 Kevin O'Connor ke...@koconnor.net // Copyright (C) 2006 Fabrice Bellard // // This file may be distributed under the terms of the GNU LGPLv3 license. @@ -329,64 +329,121 @@ build_madt(void) return madt; } +// Encode a hex value +static inline char getHex(u32 val) { +val = 0x0f; +return (val = 9) ? ('0' + val) : ('A' + val - 10); +} + +// Encode a length in an SSDT. +static u8 * +encodeLen(u8 *ssdt_ptr, int length, int bytes) +{ +switch (bytes) { +default: +case 4: ssdt_ptr[3] = ((length 20) 0xff); +case 3: ssdt_ptr[2] = ((length 12) 0xff); +case 2: ssdt_ptr[1] = ((length 4) 0xff); +ssdt_ptr[0] = (((bytes-1) 0x3) 6) | (length 0x0f); +break; +case 1: ssdt_ptr[0] = length 0x3f; +} +return ssdt_ptr + bytes; +} + +// AML Processor() object. See src/ssdt-proc.dsl for info.
Re: Alt SeaBIOS SSDT cpu hotplug
On Mon, Aug 02, 2010 at 10:41:39AM +0800, Liu, Jinsong wrote: Kevin, This patch still has issue, It can boot Windows 2008 DataCenter, however, when run cpu_set cpu online command, windows 2008 Datacenter system shutdown at once. Thanks for testing. I've inspected the generated DSDT and SSDT files, and I don't see anything wrong with them. (To inspect a generated SSDT, uncomment the call to hexdump(), cut and paste the hexdump output into SeaBIOS' tools/transdump.py, and then call iasl -d on the output.) It seems the Windows acpi interpreter is significantly different from the Linux one. The only guess I have is that Windows doesn't like one of the ASL constructs even though they all look valid. I'd try to debug this by commenting out parts of the ASL until I narrowed down the parts causing the problem. Unfortunately, I don't have Windows 2008 to do this directly. Any other ideas? -Kevin -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
RE: Alt SeaBIOS SSDT cpu hotplug
Liu, Jinsong wrote: Kevin O'Connor wrote: On Sat, Jul 10, 2010 at 12:41:18AM +0800, Liu, Jinsong wrote: Kevin O'Connor wrote: On Thu, Jul 08, 2010 at 09:19:13PM +0800, Liu, Jinsong wrote: Avi Kivity wrote: Very nice. I thought about doing this but abandoned it as unmaintainable. Using external functions and the ID variable, however, reduces the mess to tolerable proportions, and gains us a lot of flexibility. We can now have any combinations of sockets and installed cpus. Agree, only 1 concern will it bring debugable/ scalable issue by hardcode aml code? I've updated the patch (see below). This version documents how one can build a new version of the Processor() ssdt snippet. I've tested this under linux - there were a few bugs in the previous patch. I also had to replace the dynamically created CPUS array with a dynamically created NTFY method - which is a bit more complicated. Yeah, thanks Kevin. After you done patch and draft test, our QA may do nightly test. Hi Jinsong, Have you had any feedback from tests? Thanks, -Kevin Oh, I misunderstand. I originally thought our QA will test after your patch send to upstream, so we wait for it :) I will talk with our QA this week to arrange test for it. Thanks, Jinsong Kevin, We have done test for your patch, result are: 1. For linux 2.6.32 hvm guest, it works OK, for both vcpu add and vcpu remove, and re-add, re-remove, ... 2. For Window 2008 DataCenter hvm guest, it BSOD every time, QA feedback below: == [QA] We test it as following: 1 copy bios.bin to /usr/local/share/qemu/ (BTW, we also test as your method , copy bios.bin to qemu-kvm/pc-bios, then at qemu-kvm ./configure make make install) 2 create qemu img for Windows 2008 Datacenter qemu-img create -b /share/xvs/img/Windows/ia32e_win2k8_datacenter.img -f qow2 test.img 3 create guest qemu-system-x86_64 -hda test.img -m 1024 -smp 2,maxvcpus=16 4 blueScreen == BTW, attached is the latest patch I received from you. Do you have updated version? Thanks, Jinsong---BeginMessage--- On Thu, Jul 08, 2010 at 09:19:13PM +0800, Liu, Jinsong wrote: Avi Kivity wrote: Very nice. I thought about doing this but abandoned it as unmaintainable. Using external functions and the ID variable, however, reduces the mess to tolerable proportions, and gains us a lot of flexibility. We can now have any combinations of sockets and installed cpus. Agree, only 1 concern will it bring debugable/ scalable issue by hardcode aml code? I've updated the patch (see below). This version documents how one can build a new version of the Processor() ssdt snippet. I've tested this under linux - there were a few bugs in the previous patch. I also had to replace the dynamically created CPUS array with a dynamically created NTFY method - which is a bit more complicated. -Kevin diff --git a/src/acpi-dsdt.dsl b/src/acpi-dsdt.dsl index cc31112..24674fc 100644 --- a/src/acpi-dsdt.dsl +++ b/src/acpi-dsdt.dsl @@ -648,6 +648,78 @@ DefinitionBlock ( Zero /* reserved */ }) +/* CPU hotplug */ +Scope(\_SB) { +/* Objects filled in by run-time generated SSDT */ +External(NTFY, MethodObj) +External(CPON, PkgObj) + +/* Methods called by run-time generated SSDT Processor objects */ +Method (CPMA, 1, NotSerialized) { +// _MAT method - create an madt apic buffer +// Local0 = CPON flag for this cpu +Store(DerefOf(Index(CPON, Arg0)), Local0) +// Local1 = Buffer (in madt apic form) to return +Store(Buffer(8) {0x00, 0x08, 0x00, 0x00, 0x00, 0, 0, 0}, Local1) +// Update the processor id, lapic id, and enable/disable status +Store(Arg0, Index(Local1, 2)) +Store(Arg0, Index(Local1, 3)) +Store(Local0, Index(Local1, 4)) +Return (Local1) +} +Method (CPST, 1, NotSerialized) { +// _STA method - return ON status of cpu +// Local0 = CPON flag for this cpu +Store(DerefOf(Index(CPON, Arg0)), Local0) +If (Local0) { Return(0xF) } Else { Return(0x0) } +} +Method (CPEJ, 2, NotSerialized) { +// _EJ0 method - eject callback +Sleep (0xC8) +} + +/* CPU hotplug notify method */ +OperationRegion(PRST, SystemIO, 0xaf00, 32) +Field (PRST, ByteAcc, NoLock, Preserve) +{ +PRS, 256 +} +Method(PRSC, 0) { +// Local5 = active cpu bitmap +Store (PRS, Local5) +// Local2 = last read byte from bitmap +Store (Zero, Local2) +// Local0 = cpuid iterator +Store (Zero, Local0) +While (LLess(Local0, SizeOf(CPON))) { +// Local1 = CPON flag for this cpu +Store(DerefOf(Index(CPON, Local0)), Local1) +If
Re: Alt SeaBIOS SSDT cpu hotplug
On Sat, Jul 31, 2010 at 01:22:59AM +0800, Liu, Jinsong wrote: Liu, Jinsong wrote: Kevin O'Connor wrote: On Sat, Jul 10, 2010 at 12:41:18AM +0800, Liu, Jinsong wrote: Kevin O'Connor wrote: I've tested this under linux - there were a few bugs in the previous patch. I also had to replace the dynamically created CPUS array with a dynamically created NTFY method - which is a bit more complicated. Yeah, thanks Kevin. After you done patch and draft test, our QA may do nightly test. [...] Kevin, We have done test for your patch, result are: 1. For linux 2.6.32 hvm guest, it works OK, for both vcpu add and vcpu remove, and re-add, re-remove, ... 2. For Window 2008 DataCenter hvm guest, it BSOD every time, QA feedback below: Sorry about that. It looks like I messed up the SSDT ScopeOp length. New patch attached below. I've tested it by adding/removing cpus on Linux, and I've now also boot tested winxp and winvista. (I don't have Windows 2008 DataCenter.) -Kevin diff --git a/src/acpi-dsdt.dsl b/src/acpi-dsdt.dsl index cc31112..640716c 100644 --- a/src/acpi-dsdt.dsl +++ b/src/acpi-dsdt.dsl @@ -648,6 +648,78 @@ DefinitionBlock ( Zero /* reserved */ }) +/* CPU hotplug */ +Scope(\_SB) { +/* Objects filled in by run-time generated SSDT */ +External(NTFY, MethodObj) +External(CPON, PkgObj) + +/* Methods called by run-time generated SSDT Processor objects */ +Method (CPMA, 1, NotSerialized) { +// _MAT method - create an madt apic buffer +// Local0 = CPON flag for this cpu +Store(DerefOf(Index(CPON, Arg0)), Local0) +// Local1 = Buffer (in madt apic form) to return +Store(Buffer(8) {0x00, 0x08, 0x00, 0x00, 0x00, 0, 0, 0}, Local1) +// Update the processor id, lapic id, and enable/disable status +Store(Arg0, Index(Local1, 2)) +Store(Arg0, Index(Local1, 3)) +Store(Local0, Index(Local1, 4)) +Return (Local1) +} +Method (CPST, 1, NotSerialized) { +// _STA method - return ON status of cpu +// Local0 = CPON flag for this cpu +Store(DerefOf(Index(CPON, Arg0)), Local0) +If (Local0) { Return(0xF) } Else { Return(0x0) } +} +Method (CPEJ, 2, NotSerialized) { +// _EJ0 method - eject callback +Sleep(200) +} + +/* CPU hotplug notify method */ +OperationRegion(PRST, SystemIO, 0xaf00, 32) +Field (PRST, ByteAcc, NoLock, Preserve) +{ +PRS, 256 +} +Method(PRSC, 0) { +// Local5 = active cpu bitmap +Store (PRS, Local5) +// Local2 = last read byte from bitmap +Store (Zero, Local2) +// Local0 = cpuid iterator +Store (Zero, Local0) +While (LLess(Local0, SizeOf(CPON))) { +// Local1 = CPON flag for this cpu +Store(DerefOf(Index(CPON, Local0)), Local1) +If (And(Local0, 0x07)) { +// Shift down previously read bitmap byte +ShiftRight(Local2, 1, Local2) +} Else { +// Read next byte from cpu bitmap +Store(DerefOf(Index(Local5, ShiftRight(Local0, 3))), Local2) +} +// Local3 = active state for this cpu +Store(And(Local2, 1), Local3) + +If (LNotEqual(Local1, Local3)) { +// State change - update CPON with new state +Store(Local3, Index(CPON, Local0)) +// Do CPU notify +If (LEqual(Local3, 1)) { +NTFY(Local0, 1) +} Else { +NTFY(Local0, 3) +} +} +Increment(Local0) +} +Return(One) +} +} + Scope (\_GPE) { Name(_HID, ACPI0006) @@ -701,7 +773,8 @@ DefinitionBlock ( } Method(_L02) { -Return(0x01) +// CPU hotplug event +Return(\_SB.PRSC()) } Method(_L03) { Return(0x01) diff --git a/src/acpi.c b/src/acpi.c index e91f8e0..3b49c4e 100644 --- a/src/acpi.c +++ b/src/acpi.c @@ -1,6 +1,6 @@ // Support for generating ACPI tables (on emulators) // -// Copyright (C) 2008,2009 Kevin O'Connor ke...@koconnor.net +// Copyright (C) 2008-2010 Kevin O'Connor ke...@koconnor.net // Copyright (C) 2006 Fabrice Bellard // // This file may be distributed under the terms of the GNU LGPLv3 license. @@ -329,64 +329,121 @@ build_madt(void) return madt; } +// Encode a hex value +static inline char getHex(u32 val) { +val = 0x0f; +return (val = 9) ? ('0' + val) : ('A' + val - 10); +} + +// Encode a length in an SSDT. +static u8 * +encodeLen(u8 *ssdt_ptr, int
Re: Alt SeaBIOS SSDT cpu hotplug
On Sat, Jul 10, 2010 at 12:41:18AM +0800, Liu, Jinsong wrote: Kevin O'Connor wrote: On Thu, Jul 08, 2010 at 09:19:13PM +0800, Liu, Jinsong wrote: Avi Kivity wrote: Very nice. I thought about doing this but abandoned it as unmaintainable. Using external functions and the ID variable, however, reduces the mess to tolerable proportions, and gains us a lot of flexibility. We can now have any combinations of sockets and installed cpus. Agree, only 1 concern will it bring debugable/ scalable issue by hardcode aml code? I've updated the patch (see below). This version documents how one can build a new version of the Processor() ssdt snippet. I've tested this under linux - there were a few bugs in the previous patch. I also had to replace the dynamically created CPUS array with a dynamically created NTFY method - which is a bit more complicated. Yeah, thanks Kevin. After you done patch and draft test, our QA may do nightly test. Hi Jinsong, Have you had any feedback from tests? Thanks, -Kevin -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
RE: Alt SeaBIOS SSDT cpu hotplug
Kevin O'Connor wrote: On Sat, Jul 10, 2010 at 12:41:18AM +0800, Liu, Jinsong wrote: Kevin O'Connor wrote: On Thu, Jul 08, 2010 at 09:19:13PM +0800, Liu, Jinsong wrote: Avi Kivity wrote: Very nice. I thought about doing this but abandoned it as unmaintainable. Using external functions and the ID variable, however, reduces the mess to tolerable proportions, and gains us a lot of flexibility. We can now have any combinations of sockets and installed cpus. Agree, only 1 concern will it bring debugable/ scalable issue by hardcode aml code? I've updated the patch (see below). This version documents how one can build a new version of the Processor() ssdt snippet. I've tested this under linux - there were a few bugs in the previous patch. I also had to replace the dynamically created CPUS array with a dynamically created NTFY method - which is a bit more complicated. Yeah, thanks Kevin. After you done patch and draft test, our QA may do nightly test. Hi Jinsong, Have you had any feedback from tests? Thanks, -Kevin Oh, I misunderstand. I originally thought our QA will test after your patch send to upstream, so we wait for it :) I will talk with our QA this week to arrange test for it. Thanks, Jinsong-- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: Alt SeaBIOS SSDT cpu hotplug
On Sat, Jul 10, 2010 at 12:41:18AM +0800, Liu, Jinsong wrote: Kevin O'Connor wrote: I've tested this under linux - there were a few bugs in the previous patch. I also had to replace the dynamically created CPUS array with a dynamically created NTFY method - which is a bit more complicated. [...] Yeah, thanks Kevin. After you done patch and draft test, our QA may do nightly test. Thanks. I've tested it with a Fedora Core 13 guest using kvm. Basic add cpu and eject cpu appears to work. I'll wait to hear back on further testing, and for any other comments. -Kevin -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: Alt SeaBIOS SSDT cpu hotplug
On Thu, Jul 08, 2010 at 08:45:06PM -0400, Kevin O'Connor wrote: On Thu, Jul 08, 2010 at 03:54:10PM +0300, Gleb Natapov wrote: On Wed, Jul 07, 2010 at 07:26:07PM -0400, Kevin O'Connor wrote: On Wed, Jul 07, 2010 at 01:22:49PM +0300, Gleb Natapov wrote: On Wed, Jul 07, 2010 at 12:57:05AM -0400, Kevin O'Connor wrote: The CPUS package stores references to the Processor objects, and the CPON package stores the state of which cpus are active. With this info, hopefully there is no need to update the MADT tables. The way you wrote it acpi_id is always equal to lapic_id which is not alway true. By using MADT from memory we remove this dependency from DSDT code. The current code always sets the apic-processor_id equal to apic-local_apic_id in the madt apic table. If this changes, we could add a dynamically created mapping table to the ssdt. Something like: Name(CPLA, Package() { 0x00, 0x01, 0x02, 0x03, 0x04 }) Yeah, but if we can avoid it in the first place why not doing so. There is a cost to reading/writing the MADT tables. The hardcoding of 0x514 has a risk - it's not clear to me that an optionrom wont clobber that space. It also recently occurred to me that there may be a problem if a guest expects the MADT address to remain constant across a hibernate/restore cycle - the malloc_high() function doesn't guarentee stable addresses across reboots. That's definitely an issue. HW shouldn't change between hibernate and resume, so boot process should be the same and address should end up be the same too, but I wouldn't want to rely on this blindly. BTW how do you pass to DSDT what cpus are initially on? Previously this info was taken from memory copy of MADT too. The CPON array is dynamically generated with the status of the processors. (It is then kept up to date by the DSDT code.) The code for generating CPON is: // build Name(CPON, Package() { One, One, ..., Zero, Zero, ... }) *(ssdt_ptr++) = 0x08; // NameOp *(ssdt_ptr++) = 'C'; *(ssdt_ptr++) = 'P'; *(ssdt_ptr++) = 'O'; *(ssdt_ptr++) = 'N'; *(ssdt_ptr++) = 0x12; // PackageOp ssdt_ptr = encodeLen(ssdt_ptr, 2+1+(1*acpi_cpus), 2); *(ssdt_ptr++) = acpi_cpus; for (i=0; iacpi_cpus; i++) *(ssdt_ptr++) = (i CountCPUs) ? 0x01 : 0x00; See it now. Thanks. -- Gleb. -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
RE: Alt SeaBIOS SSDT cpu hotplug
Kevin O'Connor wrote: On Thu, Jul 08, 2010 at 09:19:13PM +0800, Liu, Jinsong wrote: Avi Kivity wrote: Very nice. I thought about doing this but abandoned it as unmaintainable. Using external functions and the ID variable, however, reduces the mess to tolerable proportions, and gains us a lot of flexibility. We can now have any combinations of sockets and installed cpus. Agree, only 1 concern will it bring debugable/ scalable issue by hardcode aml code? I've updated the patch (see below). This version documents how one can build a new version of the Processor() ssdt snippet. I've tested this under linux - there were a few bugs in the previous patch. I also had to replace the dynamically created CPUS array with a dynamically created NTFY method - which is a bit more complicated. -Kevin Yeah, thanks Kevin. After you done patch and draft test, our QA may do nightly test. Thanks, Jinsong diff --git a/src/acpi-dsdt.dsl b/src/acpi-dsdt.dsl index cc31112..24674fc 100644 --- a/src/acpi-dsdt.dsl +++ b/src/acpi-dsdt.dsl @@ -648,6 +648,78 @@ DefinitionBlock ( Zero /* reserved */ }) +/* CPU hotplug */ +Scope(\_SB) { +/* Objects filled in by run-time generated SSDT */ +External(NTFY, MethodObj) +External(CPON, PkgObj) + +/* Methods called by run-time generated SSDT Processor objects */ +Method (CPMA, 1, NotSerialized) { +// _MAT method - create an madt apic buffer +// Local0 = CPON flag for this cpu +Store(DerefOf(Index(CPON, Arg0)), Local0) +// Local1 = Buffer (in madt apic form) to return +Store(Buffer(8) {0x00, 0x08, 0x00, 0x00, 0x00, 0, 0, 0}, Local1) +// Update the processor id, lapic id, and enable/disable status +Store(Arg0, Index(Local1, 2)) +Store(Arg0, Index(Local1, 3)) +Store(Local0, Index(Local1, 4)) +Return (Local1) +} +Method (CPST, 1, NotSerialized) { +// _STA method - return ON status of cpu +// Local0 = CPON flag for this cpu +Store(DerefOf(Index(CPON, Arg0)), Local0) +If (Local0) { Return(0xF) } Else { Return(0x0) } +} +Method (CPEJ, 2, NotSerialized) { +// _EJ0 method - eject callback +Sleep (0xC8) +} + +/* CPU hotplug notify method */ +OperationRegion(PRST, SystemIO, 0xaf00, 32) +Field (PRST, ByteAcc, NoLock, Preserve) +{ +PRS, 256 +} +Method(PRSC, 0) { +// Local5 = active cpu bitmap +Store (PRS, Local5) +// Local2 = last read byte from bitmap +Store (Zero, Local2) +// Local0 = cpuid iterator +Store (Zero, Local0) +While (LLess(Local0, SizeOf(CPON))) { +// Local1 = CPON flag for this cpu +Store(DerefOf(Index(CPON, Local0)), Local1) +If (And(Local0, 0x07)) { +// Shift down previously read bitmap byte +ShiftRight(Local2, 1, Local2) +} Else { +// Read next byte from cpu bitmap +Store(DerefOf(Index(Local5, ShiftRight(Local0, 3))), Local2) +} +// Local3 = active state for this cpu +Store(And(Local2, 1), Local3) + +If (LNotEqual(Local1, Local3)) { +// State change - update CPON with new state +Store(Local3, Index(CPON, Local0)) +// Do CPU notify +If (LEqual(Local3, 1)) { +NTFY(Local0, 1) +} Else { +NTFY(Local0, 3) +} +} +Increment(Local0) +} +Return(One) +} +} + Scope (\_GPE) { Name(_HID, ACPI0006) @@ -701,7 +773,8 @@ DefinitionBlock ( } Method(_L02) { -Return(0x01) +// CPU hotplug event +Return(\_SB.PRSC()) } Method(_L03) { Return(0x01) diff --git a/src/acpi.c b/src/acpi.c index 0559443..082ef73 100644 --- a/src/acpi.c +++ b/src/acpi.c @@ -406,16 +406,56 @@ build_madt(void) return madt; } +// Encode a hex value +static inline char getHex(u32 val) { +val = 0x0f; +return (val = 9) ? ('0' + val) : ('A' + val - 10); +} + +// Encode a length in an SSDT. +static u8 * +encodeLen(u8 *ssdt_ptr, int length, int bytes) +{ +if (bytes = 1) { +*ssdt_ptr = length 0x3f; +return ssdt_ptr+1; +} +ssdt_ptr[0] = (((bytes-1) 0x3) 6) | (length 0x0f); +ssdt_ptr[1] = ((length 4) 0xff); +ssdt_ptr[2] = ((length 12) 0xff); +ssdt_ptr[3] = ((length
Re: Alt SeaBIOS SSDT cpu hotplug
On Wed, Jul 07, 2010 at 07:26:07PM -0400, Kevin O'Connor wrote: On Wed, Jul 07, 2010 at 01:22:49PM +0300, Gleb Natapov wrote: On Wed, Jul 07, 2010 at 12:57:05AM -0400, Kevin O'Connor wrote: The CPUS package stores references to the Processor objects, and the CPON package stores the state of which cpus are active. With this info, hopefully there is no need to update the MADT tables. The way you wrote it acpi_id is always equal to lapic_id which is not alway true. By using MADT from memory we remove this dependency from DSDT code. The current code always sets the apic-processor_id equal to apic-local_apic_id in the madt apic table. If this changes, we could add a dynamically created mapping table to the ssdt. Something like: Name(CPLA, Package() { 0x00, 0x01, 0x02, 0x03, 0x04 }) Yeah, but if we can avoid it in the first place why not doing so. BTW how do you pass to DSDT what cpus are initially on? Previously this info was taken from memory copy of MADT too. -- Gleb. -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
RE: Alt SeaBIOS SSDT cpu hotplug
Avi Kivity wrote: On 07/07/2010 07:57 AM, Kevin O'Connor wrote: Hi, I've been playing with the cpu hotplug SSDT changes. Attached is a proposal for an alternative method of adding ACPI support. The idea is to continue to build a dynamic SSDT based on CountCPUs and MaxCountCPUs. The dynamic SSDT entries just call methods in the main DSDT. This is completely untested. Hopefully the patch will demonstrate the idea though. The objective is to dynamically build an SSDT that looks something like: === { Scope (_SB) { External(CPMA, MethodObj) External(CPST, MethodObj) External(CPEJ, MethodObj) #define DefCPU(nr) \ Processor (CP##nr, 0x##nr, 0xb010, 0x06) { \ Name (_HID, ACPI0007) \ Name (ID, 0x##nr) \ Method(_MAT, 0) { \ Return(CPMA(ID))\ } \ Method (_STA) { \ Return(CPST(ID))\ } \ Method (_EJ0, 1, NotSerialized) { \ Return(CPEJ(ID, Arg0)) \ } \ } DefCPU(00) DefCPU(01) DefCPU(02) DefCPU(03) DefCPU(AA) Name(CPUS, Package() { CP00, CP01, CP02, CP03, CPAA, }) Name(CPON, Package() { One, One, One, Zero, Zero }) } } === with a dynamic number of cpus. The CPUS package stores references to the Processor objects, and the CPON package stores the state of which cpus are active. With this info, hopefully there is no need to update the MADT tables. Thoughts? Very nice. I thought about doing this but abandoned it as unmaintainable. Using external functions and the ID variable, however, reduces the mess to tolerable proportions, and gains us a lot of flexibility. We can now have any combinations of sockets and installed cpus. Agree, only 1 concern will it bring debugable/ scalable issue by hardcode aml code? Thanks, Jinsong-- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: Alt SeaBIOS SSDT cpu hotplug
On Thu, Jul 08, 2010 at 03:54:10PM +0300, Gleb Natapov wrote: On Wed, Jul 07, 2010 at 07:26:07PM -0400, Kevin O'Connor wrote: On Wed, Jul 07, 2010 at 01:22:49PM +0300, Gleb Natapov wrote: On Wed, Jul 07, 2010 at 12:57:05AM -0400, Kevin O'Connor wrote: The CPUS package stores references to the Processor objects, and the CPON package stores the state of which cpus are active. With this info, hopefully there is no need to update the MADT tables. The way you wrote it acpi_id is always equal to lapic_id which is not alway true. By using MADT from memory we remove this dependency from DSDT code. The current code always sets the apic-processor_id equal to apic-local_apic_id in the madt apic table. If this changes, we could add a dynamically created mapping table to the ssdt. Something like: Name(CPLA, Package() { 0x00, 0x01, 0x02, 0x03, 0x04 }) Yeah, but if we can avoid it in the first place why not doing so. There is a cost to reading/writing the MADT tables. The hardcoding of 0x514 has a risk - it's not clear to me that an optionrom wont clobber that space. It also recently occurred to me that there may be a problem if a guest expects the MADT address to remain constant across a hibernate/restore cycle - the malloc_high() function doesn't guarentee stable addresses across reboots. BTW how do you pass to DSDT what cpus are initially on? Previously this info was taken from memory copy of MADT too. The CPON array is dynamically generated with the status of the processors. (It is then kept up to date by the DSDT code.) The code for generating CPON is: // build Name(CPON, Package() { One, One, ..., Zero, Zero, ... }) *(ssdt_ptr++) = 0x08; // NameOp *(ssdt_ptr++) = 'C'; *(ssdt_ptr++) = 'P'; *(ssdt_ptr++) = 'O'; *(ssdt_ptr++) = 'N'; *(ssdt_ptr++) = 0x12; // PackageOp ssdt_ptr = encodeLen(ssdt_ptr, 2+1+(1*acpi_cpus), 2); *(ssdt_ptr++) = acpi_cpus; for (i=0; iacpi_cpus; i++) *(ssdt_ptr++) = (i CountCPUs) ? 0x01 : 0x00; -Kevin -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: Alt SeaBIOS SSDT cpu hotplug
On Thu, Jul 08, 2010 at 09:19:13PM +0800, Liu, Jinsong wrote: Avi Kivity wrote: Very nice. I thought about doing this but abandoned it as unmaintainable. Using external functions and the ID variable, however, reduces the mess to tolerable proportions, and gains us a lot of flexibility. We can now have any combinations of sockets and installed cpus. Agree, only 1 concern will it bring debugable/ scalable issue by hardcode aml code? I've updated the patch (see below). This version documents how one can build a new version of the Processor() ssdt snippet. I've tested this under linux - there were a few bugs in the previous patch. I also had to replace the dynamically created CPUS array with a dynamically created NTFY method - which is a bit more complicated. -Kevin diff --git a/src/acpi-dsdt.dsl b/src/acpi-dsdt.dsl index cc31112..24674fc 100644 --- a/src/acpi-dsdt.dsl +++ b/src/acpi-dsdt.dsl @@ -648,6 +648,78 @@ DefinitionBlock ( Zero /* reserved */ }) +/* CPU hotplug */ +Scope(\_SB) { +/* Objects filled in by run-time generated SSDT */ +External(NTFY, MethodObj) +External(CPON, PkgObj) + +/* Methods called by run-time generated SSDT Processor objects */ +Method (CPMA, 1, NotSerialized) { +// _MAT method - create an madt apic buffer +// Local0 = CPON flag for this cpu +Store(DerefOf(Index(CPON, Arg0)), Local0) +// Local1 = Buffer (in madt apic form) to return +Store(Buffer(8) {0x00, 0x08, 0x00, 0x00, 0x00, 0, 0, 0}, Local1) +// Update the processor id, lapic id, and enable/disable status +Store(Arg0, Index(Local1, 2)) +Store(Arg0, Index(Local1, 3)) +Store(Local0, Index(Local1, 4)) +Return (Local1) +} +Method (CPST, 1, NotSerialized) { +// _STA method - return ON status of cpu +// Local0 = CPON flag for this cpu +Store(DerefOf(Index(CPON, Arg0)), Local0) +If (Local0) { Return(0xF) } Else { Return(0x0) } +} +Method (CPEJ, 2, NotSerialized) { +// _EJ0 method - eject callback +Sleep (0xC8) +} + +/* CPU hotplug notify method */ +OperationRegion(PRST, SystemIO, 0xaf00, 32) +Field (PRST, ByteAcc, NoLock, Preserve) +{ +PRS, 256 +} +Method(PRSC, 0) { +// Local5 = active cpu bitmap +Store (PRS, Local5) +// Local2 = last read byte from bitmap +Store (Zero, Local2) +// Local0 = cpuid iterator +Store (Zero, Local0) +While (LLess(Local0, SizeOf(CPON))) { +// Local1 = CPON flag for this cpu +Store(DerefOf(Index(CPON, Local0)), Local1) +If (And(Local0, 0x07)) { +// Shift down previously read bitmap byte +ShiftRight(Local2, 1, Local2) +} Else { +// Read next byte from cpu bitmap +Store(DerefOf(Index(Local5, ShiftRight(Local0, 3))), Local2) +} +// Local3 = active state for this cpu +Store(And(Local2, 1), Local3) + +If (LNotEqual(Local1, Local3)) { +// State change - update CPON with new state +Store(Local3, Index(CPON, Local0)) +// Do CPU notify +If (LEqual(Local3, 1)) { +NTFY(Local0, 1) +} Else { +NTFY(Local0, 3) +} +} +Increment(Local0) +} +Return(One) +} +} + Scope (\_GPE) { Name(_HID, ACPI0006) @@ -701,7 +773,8 @@ DefinitionBlock ( } Method(_L02) { -Return(0x01) +// CPU hotplug event +Return(\_SB.PRSC()) } Method(_L03) { Return(0x01) diff --git a/src/acpi.c b/src/acpi.c index 0559443..082ef73 100644 --- a/src/acpi.c +++ b/src/acpi.c @@ -406,16 +406,56 @@ build_madt(void) return madt; } +// Encode a hex value +static inline char getHex(u32 val) { +val = 0x0f; +return (val = 9) ? ('0' + val) : ('A' + val - 10); +} + +// Encode a length in an SSDT. +static u8 * +encodeLen(u8 *ssdt_ptr, int length, int bytes) +{ +if (bytes = 1) { +*ssdt_ptr = length 0x3f; +return ssdt_ptr+1; +} +ssdt_ptr[0] = (((bytes-1) 0x3) 6) | (length 0x0f); +ssdt_ptr[1] = ((length 4) 0xff); +ssdt_ptr[2] = ((length 12) 0xff); +ssdt_ptr[3] = ((length 20) 0xff); +return ssdt_ptr + bytes; +} + +// AML Processor() object. See src/ssdt-proc.dsl for info. +static unsigned char ssdt_proc[] = { +0x5b,0x83,0x43,0x05,0x43,0x50,0x41,0x41, +0xaa,0x10,0xb0,0x00,0x00,0x06,0x08,0x49, +
Re: Alt SeaBIOS SSDT cpu hotplug
On 07/07/2010 07:57 AM, Kevin O'Connor wrote: Hi, I've been playing with the cpu hotplug SSDT changes. Attached is a proposal for an alternative method of adding ACPI support. The idea is to continue to build a dynamic SSDT based on CountCPUs and MaxCountCPUs. The dynamic SSDT entries just call methods in the main DSDT. This is completely untested. Hopefully the patch will demonstrate the idea though. The objective is to dynamically build an SSDT that looks something like: === { Scope (_SB) { External(CPMA, MethodObj) External(CPST, MethodObj) External(CPEJ, MethodObj) #define DefCPU(nr) \ Processor (CP##nr, 0x##nr, 0xb010, 0x06) { \ Name (_HID, ACPI0007) \ Name (ID, 0x##nr) \ Method(_MAT, 0) { \ Return(CPMA(ID))\ } \ Method (_STA) { \ Return(CPST(ID))\ } \ Method (_EJ0, 1, NotSerialized) { \ Return(CPEJ(ID, Arg0)) \ } \ } DefCPU(00) DefCPU(01) DefCPU(02) DefCPU(03) DefCPU(AA) Name(CPUS, Package() { CP00, CP01, CP02, CP03, CPAA, }) Name(CPON, Package() { One, One, One, Zero, Zero }) } } === with a dynamic number of cpus. The CPUS package stores references to the Processor objects, and the CPON package stores the state of which cpus are active. With this info, hopefully there is no need to update the MADT tables. Thoughts? Very nice. I thought about doing this but abandoned it as unmaintainable. Using external functions and the ID variable, however, reduces the mess to tolerable proportions, and gains us a lot of flexibility. We can now have any combinations of sockets and installed cpus. -- I have a truly marvellous patch that fixes the bug which this signature is too narrow to contain. -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: Alt SeaBIOS SSDT cpu hotplug
On Wed, Jul 07, 2010 at 12:57:05AM -0400, Kevin O'Connor wrote: Hi, I've been playing with the cpu hotplug SSDT changes. Attached is a proposal for an alternative method of adding ACPI support. The idea is to continue to build a dynamic SSDT based on CountCPUs and MaxCountCPUs. The dynamic SSDT entries just call methods in the main DSDT. If it is doable and remains to be debugable it is great. This is completely untested. Hopefully the patch will demonstrate the idea though. The objective is to dynamically build an SSDT that looks something like: === { Scope (_SB) { External(CPMA, MethodObj) External(CPST, MethodObj) External(CPEJ, MethodObj) #define DefCPU(nr) \ Processor (CP##nr, 0x##nr, 0xb010, 0x06) { \ Name (_HID, ACPI0007) \ Name (ID, 0x##nr) \ Method(_MAT, 0) { \ Return(CPMA(ID))\ } \ Method (_STA) { \ Return(CPST(ID))\ } \ Method (_EJ0, 1, NotSerialized) { \ Return(CPEJ(ID, Arg0)) \ } \ } DefCPU(00) DefCPU(01) DefCPU(02) DefCPU(03) DefCPU(AA) Name(CPUS, Package() { CP00, CP01, CP02, CP03, CPAA, }) Name(CPON, Package() { One, One, One, Zero, Zero }) } } === with a dynamic number of cpus. The CPUS package stores references to the Processor objects, and the CPON package stores the state of which cpus are active. With this info, hopefully there is no need to update the MADT tables. The way you wrote it acpi_id is always equal to lapic_id which is not alway true. By using MADT from memory we remove this dependency from DSDT code. -- Gleb. -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: Alt SeaBIOS SSDT cpu hotplug
On Wed, Jul 07, 2010 at 01:22:49PM +0300, Gleb Natapov wrote: On Wed, Jul 07, 2010 at 12:57:05AM -0400, Kevin O'Connor wrote: The CPUS package stores references to the Processor objects, and the CPON package stores the state of which cpus are active. With this info, hopefully there is no need to update the MADT tables. The way you wrote it acpi_id is always equal to lapic_id which is not alway true. By using MADT from memory we remove this dependency from DSDT code. The current code always sets the apic-processor_id equal to apic-local_apic_id in the madt apic table. If this changes, we could add a dynamically created mapping table to the ssdt. Something like: Name(CPLA, Package() { 0x00, 0x01, 0x02, 0x03, 0x04 }) -Kevin -- To unsubscribe from this list: send the line unsubscribe kvm in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html