Re: [Qemu-devel] [PATCH v3 0/2] hw/i386: Update FADT to Revision 3 (ACPI 2.0)

2017-04-21 Thread Paolo Bonzini


On 15/03/2017 15:17, Michael S. Tsirkin wrote:
> On Wed, Mar 15, 2017 at 07:20:25PM +1300, Phil Dennis-Jordan wrote:
>> This updates the FADT generated for x86/64 machine types from Revision 1 to 
>> 3. (Based on ACPI standard 2.0 instead of 1.0) As previously, the goal is to 
>> make running macOS/OS X guests smoother. With a Rev1 FADT, rebooting such a 
>> guest doesn't work, as the OS uses the reset register information from the 
>> FADT. Switching to a Rev3 (ACPI 2.0) FADT solves this problem.
>>
>> The previous discussion of this raised a bunch of points, which I'll 
>> address/clarify here as well:
>>
>>  1. No runtime option. The preference was expressed that we try to stay 
>> backwards-compatible with legacy guests as opposed to adding a runtime 
>> option for different APCI versions. ACPI 2.0/FADT Rev3 is the minimum 
>> version required for exposing the reset register, and it is also 
>> backwards-compatible with 1.0/Rev1, so that seemed a good version to target.
>>
>>  2. Legacy guest testing. I've tested this successfully (no apparent 
>> regressions) with:
>>* Windows XP x86 (both "pc" and "q35" machine types, the latter using 
>> -device piix4-ide)
>>* Windows 7, both 32-bit and 64-bit editions
>>* Windows 10 x64
>>* Fedora 7 x86 Live image
>>* Fedora 25 x86_64 Live image
>>* Ubuntu 10.04.4 AMD64 Live image
>> Any other specific OSes and versions I should check?
>>
>>
>>  3. 64-bit and 32-bit pointer fields.
>>
>> Only very recent versions of the ACPI spec (6.1 and various errata of 5.1 
>> and 6.0) are clear about mutual exclusion of the FADT's 32-bit and 64-bit 
>> variants of pointers to tables and registers. The 2.0 version simply states 
>> "This is a required field" for both PM1a_EVT_BLK and X_PM1a_EVT_BLK, for 
>> example, although it does also state for the former that "This field is 
>> superseded in ACPI 2.0 by the X_PM1a_EVT_BLK field." No requirement is 
>> specified explicitly for the DSDT and X_DSDT fields.
>>
>> In practice, I have found that Windows 10 will fail to boot with a Rev3 FADT 
>> unless BOTH the 32-bit and 64-bit variants are filled. The exception is 
>> X_FIRMWARE_CTRL, which is the first to be explicitly marked as mutually 
>> exclusive with FIRMWARE_CTRL in an ACPI spec - with a preference for 
>> FIRMWARE_CTRL if the pointer fits in a 32-bit field. Satisfying Windows 10 
>> in this way does not contradict the 2.0 specification, and it also complies 
>> with the 1.0 standard for the fields which Rev1 of the FADT already has, so 
>> that's what I've gone with in the implementation.
>>
>> The only problem is that upstream OVMF cannot deal with multiple pointers to 
>> the same table in the linker commands. This turns out to be a bug in 
>> OVMF/EDK2[1], and I am submitting a separate patch to EDK2 to fix that 
>> problem. The fix for a second issue where OVMF would rewrite the FADT so the 
>> DSDT is erroneously set to 0 has already been upstreamed.[2] I don't see a 
>> workaround to this other than fixing the OVMF code.
>>
>>  4. i440FX vs Q35
>>
>> Both machine types have the reset register, and it's at the same I/O port. 
>> To illustrate/document this, the second patch in the series adds a 
>> build-time assertion that this is indeed so.
>>
>> Changelog
>> =
>>
>> v2 -> v3:
>>  * I actually completed the changes to the BIOS tables test which were 
>> required as a result of the FADT struct change.
>>
>> v1 -> v2:
>>  * v1 Thread was "[PATCH RFC] acpi: add reset register to fadt"
>>  * Instead of just adding the reset register, set up a fully standards 
>> compliant Rev3 FADT. (ACPI 2.0)
>>  * A compile-time assertion has been added for the PC/Q35 reset register 
>> equivalence.
>>
>>
>> [1]: https://bugzilla.tianocore.org/show_bug.cgi?id=368
>> [2]: EDK2 commit range e0e1cfcbbb24..198a46d768fb
>>
>> Phil Dennis-Jordan (2):
>>   hw/i386: Use Rev3 FADT (ACPI 2.0) instead of Rev1 to improve guest OS
>> support.
>>   hw/i386: Build-time assertion on pc/q35 reset register being
>> identical.
>>
>>  hw/i386/acpi-build.c| 35 +++--
>>  hw/pci-host/piix.c  |  6 
>>  include/hw/acpi/acpi-defs.h | 77 
>> +
>>  include/hw/i386/pc.h|  6 
>>  tests/acpi-utils.h  | 10 ++
>>  tests/bios-tables-test.c| 23 +++---
>>  6 files changed, 102 insertions(+), 55 deletions(-)
>>
>> -- 
>> 2.3.2 (Apple Git-55)
> 
> 
> Looks good to me now. Pls remember to re-post after release
> so I can merge.

No need to, I still had it in my inbox so I queued it.  Fine by you?

Paolo



Re: [Qemu-devel] [PATCH v3 0/2] hw/i386: Update FADT to Revision 3 (ACPI 2.0)

2017-04-21 Thread Paolo Bonzini


On 15/03/2017 07:20, Phil Dennis-Jordan wrote:
> This updates the FADT generated for x86/64 machine types from
> Revision 1 to 3. (Based on ACPI standard 2.0 instead of 1.0) As
> previously, the goal is to make running macOS/OS X guests smoother.
> With a Rev1 FADT, rebooting such a guest doesn't work, as the OS uses
> the reset register information from the FADT. Switching to a Rev3
> (ACPI 2.0) FADT solves this problem.
> 
> The previous discussion of this raised a bunch of points, which I'll
> address/clarify here as well:
> 
> 1. No runtime option. The preference was expressed that we try to
> stay backwards-compatible with legacy guests as opposed to adding a
> runtime option for different APCI versions. ACPI 2.0/FADT Rev3 is the
> minimum version required for exposing the reset register, and it is
> also backwards-compatible with 1.0/Rev1, so that seemed a good
> version to target.
> 
>  2. Legacy guest testing. I've tested this successfully (no apparent 
> regressions) with:
>* Windows XP x86 (both "pc" and "q35" machine types, the latter using 
> -device piix4-ide)
>* Windows 7, both 32-bit and 64-bit editions
>* Windows 10 x64
>* Fedora 7 x86 Live image
>* Fedora 25 x86_64 Live image
>* Ubuntu 10.04.4 AMD64 Live image
> Any other specific OSes and versions I should check?
> 
> 
>  3. 64-bit and 32-bit pointer fields.
> 
> Only very recent versions of the ACPI spec (6.1 and various errata of
> 5.1 and 6.0) are clear about mutual exclusion of the FADT's 32-bit and
> 64-bit variants of pointers to tables and registers. The 2.0 version
> simply states "This is a required field" for both PM1a_EVT_BLK and
> X_PM1a_EVT_BLK, for example, although it does also state for the former
> that "This field is superseded in ACPI 2.0 by the X_PM1a_EVT_BLK field."
> No requirement is specified explicitly for the DSDT and X_DSDT fields.
> 
> In practice, I have found that Windows 10 will fail to boot with a
> Rev3 FADT unless BOTH the 32-bit and 64-bit variants are filled. The
> exception is X_FIRMWARE_CTRL, which is the first to be explicitly marked
> as mutually exclusive with FIRMWARE_CTRL in an ACPI spec - with a
> preference for FIRMWARE_CTRL if the pointer fits in a 32-bit field.
> Satisfying Windows 10 in this way does not contradict the 2.0
> specification, and it also complies with the 1.0 standard for the fields
> which Rev1 of the FADT already has, so that's what I've gone with in the
> implementation.
> 
> The only problem is that upstream OVMF cannot deal with multiple
> pointers to the same table in the linker commands. This turns out to be
> a bug in OVMF/EDK2[1], and I am submitting a separate patch to EDK2 to
> fix that problem. The fix for a second issue where OVMF would rewrite
> the FADT so the DSDT is erroneously set to 0 has already been
> upstreamed.[2] I don't see a workaround to this other than fixing the
> OVMF code.
> 
>  4. i440FX vs Q35
> 
> Both machine types have the reset register, and it's at the same I/O
> port. To illustrate/document this, the second patch in the series
> adds a build-time assertion that this is indeed so.

Queued for 2.10, thanks.

Paolo



Re: [Qemu-devel] [PATCH v3 0/2] hw/i386: Update FADT to Revision 3 (ACPI 2.0)

2017-03-16 Thread Michael S. Tsirkin
On Wed, Mar 15, 2017 at 07:20:25PM +1300, Phil Dennis-Jordan wrote:
> This updates the FADT generated for x86/64 machine types from Revision 1 to 
> 3. (Based on ACPI standard 2.0 instead of 1.0) As previously, the goal is to 
> make running macOS/OS X guests smoother. With a Rev1 FADT, rebooting such a 
> guest doesn't work, as the OS uses the reset register information from the 
> FADT. Switching to a Rev3 (ACPI 2.0) FADT solves this problem.
> 
> The previous discussion of this raised a bunch of points, which I'll 
> address/clarify here as well:
> 
>  1. No runtime option. The preference was expressed that we try to stay 
> backwards-compatible with legacy guests as opposed to adding a runtime option 
> for different APCI versions. ACPI 2.0/FADT Rev3 is the minimum version 
> required for exposing the reset register, and it is also backwards-compatible 
> with 1.0/Rev1, so that seemed a good version to target.
> 
>  2. Legacy guest testing. I've tested this successfully (no apparent 
> regressions) with:
>* Windows XP x86 (both "pc" and "q35" machine types, the latter using 
> -device piix4-ide)
>* Windows 7, both 32-bit and 64-bit editions
>* Windows 10 x64
>* Fedora 7 x86 Live image
>* Fedora 25 x86_64 Live image
>* Ubuntu 10.04.4 AMD64 Live image
> Any other specific OSes and versions I should check?
> 
> 
>  3. 64-bit and 32-bit pointer fields.
> 
> Only very recent versions of the ACPI spec (6.1 and various errata of 5.1 and 
> 6.0) are clear about mutual exclusion of the FADT's 32-bit and 64-bit 
> variants of pointers to tables and registers. The 2.0 version simply states 
> "This is a required field" for both PM1a_EVT_BLK and X_PM1a_EVT_BLK, for 
> example, although it does also state for the former that "This field is 
> superseded in ACPI 2.0 by the X_PM1a_EVT_BLK field." No requirement is 
> specified explicitly for the DSDT and X_DSDT fields.
> 
> In practice, I have found that Windows 10 will fail to boot with a Rev3 FADT 
> unless BOTH the 32-bit and 64-bit variants are filled. The exception is 
> X_FIRMWARE_CTRL, which is the first to be explicitly marked as mutually 
> exclusive with FIRMWARE_CTRL in an ACPI spec - with a preference for 
> FIRMWARE_CTRL if the pointer fits in a 32-bit field. Satisfying Windows 10 in 
> this way does not contradict the 2.0 specification, and it also complies with 
> the 1.0 standard for the fields which Rev1 of the FADT already has, so that's 
> what I've gone with in the implementation.
> 
> The only problem is that upstream OVMF cannot deal with multiple pointers to 
> the same table in the linker commands. This turns out to be a bug in 
> OVMF/EDK2[1], and I am submitting a separate patch to EDK2 to fix that 
> problem. The fix for a second issue where OVMF would rewrite the FADT so the 
> DSDT is erroneously set to 0 has already been upstreamed.[2] I don't see a 
> workaround to this other than fixing the OVMF code.
> 
>  4. i440FX vs Q35
> 
> Both machine types have the reset register, and it's at the same I/O port. To 
> illustrate/document this, the second patch in the series adds a build-time 
> assertion that this is indeed so.

So this looks good to me. Once 2.9 is out please repost and I'll merge.
When you do please include this:

Reviewed-by: Michael S. Tsirkin 




> Changelog
> =
> 
> v2 -> v3:
>  * I actually completed the changes to the BIOS tables test which were 
> required as a result of the FADT struct change.
> 
> v1 -> v2:
>  * v1 Thread was "[PATCH RFC] acpi: add reset register to fadt"
>  * Instead of just adding the reset register, set up a fully standards 
> compliant Rev3 FADT. (ACPI 2.0)
>  * A compile-time assertion has been added for the PC/Q35 reset register 
> equivalence.
> 
> 
> [1]: https://bugzilla.tianocore.org/show_bug.cgi?id=368
> [2]: EDK2 commit range e0e1cfcbbb24..198a46d768fb
> 
> Phil Dennis-Jordan (2):
>   hw/i386: Use Rev3 FADT (ACPI 2.0) instead of Rev1 to improve guest OS
> support.
>   hw/i386: Build-time assertion on pc/q35 reset register being
> identical.
> 
>  hw/i386/acpi-build.c| 35 +++--
>  hw/pci-host/piix.c  |  6 
>  include/hw/acpi/acpi-defs.h | 77 
> +
>  include/hw/i386/pc.h|  6 
>  tests/acpi-utils.h  | 10 ++
>  tests/bios-tables-test.c| 23 +++---
>  6 files changed, 102 insertions(+), 55 deletions(-)
> 
> -- 
> 2.3.2 (Apple Git-55)



Re: [Qemu-devel] [PATCH v3 0/2] hw/i386: Update FADT to Revision 3 (ACPI 2.0)

2017-03-16 Thread Laszlo Ersek
On 03/15/17 07:20, Phil Dennis-Jordan wrote:
> This updates the FADT generated for x86/64 machine types from Revision 1 to 
> 3. (Based on ACPI standard 2.0 instead of 1.0) As previously, the goal is to 
> make running macOS/OS X guests smoother. With a Rev1 FADT, rebooting such a 
> guest doesn't work, as the OS uses the reset register information from the 
> FADT. Switching to a Rev3 (ACPI 2.0) FADT solves this problem.
> 
> The previous discussion of this raised a bunch of points, which I'll 
> address/clarify here as well:
> 
>  1. No runtime option. The preference was expressed that we try to stay 
> backwards-compatible with legacy guests as opposed to adding a runtime option 
> for different APCI versions. ACPI 2.0/FADT Rev3 is the minimum version 
> required for exposing the reset register, and it is also backwards-compatible 
> with 1.0/Rev1, so that seemed a good version to target.
> 
>  2. Legacy guest testing. I've tested this successfully (no apparent 
> regressions) with:
>* Windows XP x86 (both "pc" and "q35" machine types, the latter using 
> -device piix4-ide)
>* Windows 7, both 32-bit and 64-bit editions
>* Windows 10 x64
>* Fedora 7 x86 Live image
>* Fedora 25 x86_64 Live image
>* Ubuntu 10.04.4 AMD64 Live image
> Any other specific OSes and versions I should check?
> 
> 
>  3. 64-bit and 32-bit pointer fields.
> 
> Only very recent versions of the ACPI spec (6.1 and various errata of 5.1 and 
> 6.0) are clear about mutual exclusion of the FADT's 32-bit and 64-bit 
> variants of pointers to tables and registers. The 2.0 version simply states 
> "This is a required field" for both PM1a_EVT_BLK and X_PM1a_EVT_BLK, for 
> example, although it does also state for the former that "This field is 
> superseded in ACPI 2.0 by the X_PM1a_EVT_BLK field." No requirement is 
> specified explicitly for the DSDT and X_DSDT fields.
> 
> In practice, I have found that Windows 10 will fail to boot with a Rev3 FADT 
> unless BOTH the 32-bit and 64-bit variants are filled. The exception is 
> X_FIRMWARE_CTRL, which is the first to be explicitly marked as mutually 
> exclusive with FIRMWARE_CTRL in an ACPI spec - with a preference for 
> FIRMWARE_CTRL if the pointer fits in a 32-bit field. Satisfying Windows 10 in 
> this way does not contradict the 2.0 specification, and it also complies with 
> the 1.0 standard for the fields which Rev1 of the FADT already has, so that's 
> what I've gone with in the implementation.
> 
> The only problem is that upstream OVMF cannot deal with multiple pointers to 
> the same table in the linker commands. This turns out to be a bug in 
> OVMF/EDK2[1], and I am submitting a separate patch to EDK2 to fix that 
> problem. The fix for a second issue where OVMF would rewrite the FADT so the 
> DSDT is erroneously set to 0 has already been upstreamed.[2] I don't see a 
> workaround to this other than fixing the OVMF code.
> 
>  4. i440FX vs Q35
> 
> Both machine types have the reset register, and it's at the same I/O port. To 
> illustrate/document this, the second patch in the series adds a build-time 
> assertion that this is indeed so.
> 
> Changelog
> =
> 
> v2 -> v3:
>  * I actually completed the changes to the BIOS tables test which were 
> required as a result of the FADT struct change.
> 
> v1 -> v2:
>  * v1 Thread was "[PATCH RFC] acpi: add reset register to fadt"
>  * Instead of just adding the reset register, set up a fully standards 
> compliant Rev3 FADT. (ACPI 2.0)
>  * A compile-time assertion has been added for the PC/Q35 reset register 
> equivalence.
> 
> 
> [1]: https://bugzilla.tianocore.org/show_bug.cgi?id=368
> [2]: EDK2 commit range e0e1cfcbbb24..198a46d768fb

* Please see also the recent patch
. (It
does not break this use case, noting it only as background info.)

* I think the commit messages on the patches should be rewrapped to a
line length of 74 characters.

* I can't do a detailed, field by field review of the patches, but they
look good to me generally.

One question: any particular reason for reset_value = 0xf? IIRC i440fx
defines bit1 and bit2, and ich9 defines bit3 in addition.

Acked-by: Laszlo Ersek 

Thanks
Laszlo


> 
> Phil Dennis-Jordan (2):
>   hw/i386: Use Rev3 FADT (ACPI 2.0) instead of Rev1 to improve guest OS
> support.
>   hw/i386: Build-time assertion on pc/q35 reset register being
> identical.
> 
>  hw/i386/acpi-build.c| 35 +++--
>  hw/pci-host/piix.c  |  6 
>  include/hw/acpi/acpi-defs.h | 77 
> +
>  include/hw/i386/pc.h|  6 
>  tests/acpi-utils.h  | 10 ++
>  tests/bios-tables-test.c| 23 +++---
>  6 files changed, 102 insertions(+), 55 deletions(-)
> 




Re: [Qemu-devel] [PATCH v3 0/2] hw/i386: Update FADT to Revision 3 (ACPI 2.0)

2017-03-15 Thread G 3


On Mar 15, 2017, at 10:25 AM, qemu-devel-requ...@nongnu.org wrote:


On Wed, Mar 15, 2017 at 07:20:25PM +1300, Phil Dennis-Jordan wrote:
This updates the FADT generated for x86/64 machine types from  
Revision 1 to 3. (Based on ACPI standard 2.0 instead of 1.0) As  
previously, the goal is to make running macOS/OS X guests  
smoother. With a Rev1 FADT, rebooting such a guest doesn't work,  
as the OS uses the reset register information from the FADT.  
Switching to a Rev3 (ACPI 2.0) FADT solves this problem.


The previous discussion of this raised a bunch of points, which  
I'll address/clarify here as well:


 1. No runtime option. The preference was expressed that we try to  
stay backwards-compatible with legacy guests as opposed to adding  
a runtime option for different APCI versions. ACPI 2.0/FADT Rev3  
is the minimum version required for exposing the reset register,  
and it is also backwards-compatible with 1.0/Rev1, so that seemed  
a good version to target.


 2. Legacy guest testing. I've tested this successfully (no  
apparent regressions) with:
   * Windows XP x86 (both "pc" and "q35" machine types, the latter  
using -device piix4-ide)

   * Windows 7, both 32-bit and 64-bit editions
   * Windows 10 x64
   * Fedora 7 x86 Live image
   * Fedora 25 x86_64 Live image
   * Ubuntu 10.04.4 AMD64 Live image
Any other specific OSes and versions I should check?


Windows 2000



Re: [Qemu-devel] [PATCH v3 0/2] hw/i386: Update FADT to Revision 3 (ACPI 2.0)

2017-03-15 Thread Michael S. Tsirkin
On Wed, Mar 15, 2017 at 07:20:25PM +1300, Phil Dennis-Jordan wrote:
> This updates the FADT generated for x86/64 machine types from Revision 1 to 
> 3. (Based on ACPI standard 2.0 instead of 1.0) As previously, the goal is to 
> make running macOS/OS X guests smoother. With a Rev1 FADT, rebooting such a 
> guest doesn't work, as the OS uses the reset register information from the 
> FADT. Switching to a Rev3 (ACPI 2.0) FADT solves this problem.
> 
> The previous discussion of this raised a bunch of points, which I'll 
> address/clarify here as well:
> 
>  1. No runtime option. The preference was expressed that we try to stay 
> backwards-compatible with legacy guests as opposed to adding a runtime option 
> for different APCI versions. ACPI 2.0/FADT Rev3 is the minimum version 
> required for exposing the reset register, and it is also backwards-compatible 
> with 1.0/Rev1, so that seemed a good version to target.
> 
>  2. Legacy guest testing. I've tested this successfully (no apparent 
> regressions) with:
>* Windows XP x86 (both "pc" and "q35" machine types, the latter using 
> -device piix4-ide)
>* Windows 7, both 32-bit and 64-bit editions
>* Windows 10 x64
>* Fedora 7 x86 Live image
>* Fedora 25 x86_64 Live image
>* Ubuntu 10.04.4 AMD64 Live image
> Any other specific OSes and versions I should check?
> 
> 
>  3. 64-bit and 32-bit pointer fields.
> 
> Only very recent versions of the ACPI spec (6.1 and various errata of 5.1 and 
> 6.0) are clear about mutual exclusion of the FADT's 32-bit and 64-bit 
> variants of pointers to tables and registers. The 2.0 version simply states 
> "This is a required field" for both PM1a_EVT_BLK and X_PM1a_EVT_BLK, for 
> example, although it does also state for the former that "This field is 
> superseded in ACPI 2.0 by the X_PM1a_EVT_BLK field." No requirement is 
> specified explicitly for the DSDT and X_DSDT fields.
> 
> In practice, I have found that Windows 10 will fail to boot with a Rev3 FADT 
> unless BOTH the 32-bit and 64-bit variants are filled. The exception is 
> X_FIRMWARE_CTRL, which is the first to be explicitly marked as mutually 
> exclusive with FIRMWARE_CTRL in an ACPI spec - with a preference for 
> FIRMWARE_CTRL if the pointer fits in a 32-bit field. Satisfying Windows 10 in 
> this way does not contradict the 2.0 specification, and it also complies with 
> the 1.0 standard for the fields which Rev1 of the FADT already has, so that's 
> what I've gone with in the implementation.
> 
> The only problem is that upstream OVMF cannot deal with multiple pointers to 
> the same table in the linker commands. This turns out to be a bug in 
> OVMF/EDK2[1], and I am submitting a separate patch to EDK2 to fix that 
> problem. The fix for a second issue where OVMF would rewrite the FADT so the 
> DSDT is erroneously set to 0 has already been upstreamed.[2] I don't see a 
> workaround to this other than fixing the OVMF code.
> 
>  4. i440FX vs Q35
> 
> Both machine types have the reset register, and it's at the same I/O port. To 
> illustrate/document this, the second patch in the series adds a build-time 
> assertion that this is indeed so.
> 
> Changelog
> =
> 
> v2 -> v3:
>  * I actually completed the changes to the BIOS tables test which were 
> required as a result of the FADT struct change.
> 
> v1 -> v2:
>  * v1 Thread was "[PATCH RFC] acpi: add reset register to fadt"
>  * Instead of just adding the reset register, set up a fully standards 
> compliant Rev3 FADT. (ACPI 2.0)
>  * A compile-time assertion has been added for the PC/Q35 reset register 
> equivalence.
> 
> 
> [1]: https://bugzilla.tianocore.org/show_bug.cgi?id=368
> [2]: EDK2 commit range e0e1cfcbbb24..198a46d768fb
> 
> Phil Dennis-Jordan (2):
>   hw/i386: Use Rev3 FADT (ACPI 2.0) instead of Rev1 to improve guest OS
> support.
>   hw/i386: Build-time assertion on pc/q35 reset register being
> identical.
> 
>  hw/i386/acpi-build.c| 35 +++--
>  hw/pci-host/piix.c  |  6 
>  include/hw/acpi/acpi-defs.h | 77 
> +
>  include/hw/i386/pc.h|  6 
>  tests/acpi-utils.h  | 10 ++
>  tests/bios-tables-test.c| 23 +++---
>  6 files changed, 102 insertions(+), 55 deletions(-)
> 
> -- 
> 2.3.2 (Apple Git-55)


Looks good to me now. Pls remember to re-post after release
so I can merge.

-- 
MST



[Qemu-devel] [PATCH v3 0/2] hw/i386: Update FADT to Revision 3 (ACPI 2.0)

2017-03-15 Thread Phil Dennis-Jordan
This updates the FADT generated for x86/64 machine types from Revision 1 to 3. 
(Based on ACPI standard 2.0 instead of 1.0) As previously, the goal is to make 
running macOS/OS X guests smoother. With a Rev1 FADT, rebooting such a guest 
doesn't work, as the OS uses the reset register information from the FADT. 
Switching to a Rev3 (ACPI 2.0) FADT solves this problem.

The previous discussion of this raised a bunch of points, which I'll 
address/clarify here as well:

 1. No runtime option. The preference was expressed that we try to stay 
backwards-compatible with legacy guests as opposed to adding a runtime option 
for different APCI versions. ACPI 2.0/FADT Rev3 is the minimum version required 
for exposing the reset register, and it is also backwards-compatible with 
1.0/Rev1, so that seemed a good version to target.

 2. Legacy guest testing. I've tested this successfully (no apparent 
regressions) with:
   * Windows XP x86 (both "pc" and "q35" machine types, the latter using 
-device piix4-ide)
   * Windows 7, both 32-bit and 64-bit editions
   * Windows 10 x64
   * Fedora 7 x86 Live image
   * Fedora 25 x86_64 Live image
   * Ubuntu 10.04.4 AMD64 Live image
Any other specific OSes and versions I should check?


 3. 64-bit and 32-bit pointer fields.

Only very recent versions of the ACPI spec (6.1 and various errata of 5.1 and 
6.0) are clear about mutual exclusion of the FADT's 32-bit and 64-bit variants 
of pointers to tables and registers. The 2.0 version simply states "This is a 
required field" for both PM1a_EVT_BLK and X_PM1a_EVT_BLK, for example, although 
it does also state for the former that "This field is superseded in ACPI 2.0 by 
the X_PM1a_EVT_BLK field." No requirement is specified explicitly for the DSDT 
and X_DSDT fields.

In practice, I have found that Windows 10 will fail to boot with a Rev3 FADT 
unless BOTH the 32-bit and 64-bit variants are filled. The exception is 
X_FIRMWARE_CTRL, which is the first to be explicitly marked as mutually 
exclusive with FIRMWARE_CTRL in an ACPI spec - with a preference for 
FIRMWARE_CTRL if the pointer fits in a 32-bit field. Satisfying Windows 10 in 
this way does not contradict the 2.0 specification, and it also complies with 
the 1.0 standard for the fields which Rev1 of the FADT already has, so that's 
what I've gone with in the implementation.

The only problem is that upstream OVMF cannot deal with multiple pointers to 
the same table in the linker commands. This turns out to be a bug in 
OVMF/EDK2[1], and I am submitting a separate patch to EDK2 to fix that problem. 
The fix for a second issue where OVMF would rewrite the FADT so the DSDT is 
erroneously set to 0 has already been upstreamed.[2] I don't see a workaround 
to this other than fixing the OVMF code.

 4. i440FX vs Q35

Both machine types have the reset register, and it's at the same I/O port. To 
illustrate/document this, the second patch in the series adds a build-time 
assertion that this is indeed so.

Changelog
=

v2 -> v3:
 * I actually completed the changes to the BIOS tables test which were required 
as a result of the FADT struct change.

v1 -> v2:
 * v1 Thread was "[PATCH RFC] acpi: add reset register to fadt"
 * Instead of just adding the reset register, set up a fully standards 
compliant Rev3 FADT. (ACPI 2.0)
 * A compile-time assertion has been added for the PC/Q35 reset register 
equivalence.


[1]: https://bugzilla.tianocore.org/show_bug.cgi?id=368
[2]: EDK2 commit range e0e1cfcbbb24..198a46d768fb

Phil Dennis-Jordan (2):
  hw/i386: Use Rev3 FADT (ACPI 2.0) instead of Rev1 to improve guest OS
support.
  hw/i386: Build-time assertion on pc/q35 reset register being
identical.

 hw/i386/acpi-build.c| 35 +++--
 hw/pci-host/piix.c  |  6 
 include/hw/acpi/acpi-defs.h | 77 +
 include/hw/i386/pc.h|  6 
 tests/acpi-utils.h  | 10 ++
 tests/bios-tables-test.c| 23 +++---
 6 files changed, 102 insertions(+), 55 deletions(-)

-- 
2.3.2 (Apple Git-55)