Re: [PATCH v2 4/9] acpi: set fadt.smi_cmd to zero when SMM is not supported

2021-02-09 Thread Igor Mammedov
On Mon,  8 Feb 2021 13:57:23 -0800
isaku.yamah...@gmail.com wrote:

> From: Isaku Yamahata 
> 
> From table 5.9 SMI_CMD of ACPI spec
> > This field is reserved and must be zero on system
> > that does not support System Management mode.  
> 
> When smm is not enabled, set it to zero to comform to the spec.
> When -machine smm=off is passed, the change to FACP is as follows.
> 
> @@ -1,46 +1,46 @@
>  /*
>   * Intel ACPI Component Architecture
>   * AML/ASL+ Disassembler version 20180105 (64-bit version)
>   * Copyright (c) 2000 - 2018 Intel Corporation
>   *
> - * Disassembly of tests/data/acpi/q35/FACP, Fri Feb  5 16:57:04 2021
> + * Disassembly of /tmp/aml-1OQYX0, Fri Feb  5 16:57:04 2021
>   *
>   * ACPI Data Table [FACP]
>   *
>   * Format: [HexOffset DecimalOffset ByteLength]  FieldName : FieldValue
>   */
> 
>  [000h    4]Signature : "FACP"[Fixed ACPI 
> Description Table (FADT)]
>  [004h 0004   4] Table Length : 00F4
>  [008h 0008   1] Revision : 03
> -[009h 0009   1] Checksum : 1F
> +[009h 0009   1] Checksum : D6
>  [00Ah 0010   6]   Oem ID : "BOCHS "
>  [010h 0016   8] Oem Table ID : "BXPCFACP"
>  [018h 0024   4] Oem Revision : 0001
>  [01Ch 0028   4]  Asl Compiler ID : "BXPC"
>  [020h 0032   4]Asl Compiler Revision : 0001
> 
>  [024h 0036   4] FACS Address : 
>  [028h 0040   4] DSDT Address : 
>  [02Ch 0044   1]Model : 01
>  [02Dh 0045   1]   PM Profile : 00 [Unspecified]
>  [02Eh 0046   2]SCI Interrupt : 0009
> -[030h 0048   4] SMI Command Port : 00B2
> -[034h 0052   1]ACPI Enable Value : 02
> -[035h 0053   1]   ACPI Disable Value : 03
> +[030h 0048   4] SMI Command Port : 
> +[034h 0052   1]ACPI Enable Value : 00
> +[035h 0053   1]   ACPI Disable Value : 00
>  [036h 0054   1]   S4BIOS Command : 00
>  [037h 0055   1]  P-State Control : 00
>  [038h 0056   4] PM1A Event Block Address : 0600
>  [03Ch 0060   4] PM1B Event Block Address : 
>  [040h 0064   4]   PM1A Control Block Address : 0604
>  [044h 0068   4]   PM1B Control Block Address : 
>  [048h 0072   4]PM2 Control Block Address : 
>  [04Ch 0076   4]   PM Timer Block Address : 0608
>  [050h 0080   4]   GPE0 Block Address : 0620
>  [054h 0084   4]   GPE1 Block Address : 
>  [058h 0088   1]   PM1 Event Block Length : 04
>  [059h 0089   1] PM1 Control Block Length : 02
>  [05Ah 0090   1] PM2 Control Block Length : 00
>  [05Bh 0091   1]PM Timer Block Length : 04
>  [05Ch 0092   1]GPE0 Block Length : 10
>  [05Dh 0093   1]GPE1 Block Length : 00
> 
> Signed-off-by: Isaku Yamahata 

when migrated to old QEMU, and VM after that is reset it
regenerate ACPI tables for old QEMU, so guest should be
able to turn on ACPI.

Reviewed-by: Igor Mammedov 

> ---
>  hw/i386/acpi-build.c | 12 +---
>  1 file changed, 9 insertions(+), 3 deletions(-)
> 
> diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
> index f56d699c7f..c2f11d95d8 100644
> --- a/hw/i386/acpi-build.c
> +++ b/hw/i386/acpi-build.c
> @@ -139,6 +139,8 @@ const struct AcpiGenericAddress x86_nvdimm_acpi_dsmio = {
>  static void init_common_fadt_data(MachineState *ms, Object *o,
>AcpiFadtData *data)
>  {
> +X86MachineState *x86ms = X86_MACHINE(ms);
> +bool smm_enabled = x86_machine_is_smm_enabled(x86ms);
>  uint32_t io = object_property_get_uint(o, ACPI_PM_PROP_PM_IO_BASE, NULL);
>  AmlAddressSpace as = AML_AS_SYSTEM_IO;
>  AcpiFadtData fadt = {
> @@ -159,12 +161,16 @@ static void init_common_fadt_data(MachineState *ms, 
> Object *o,
>  .rtc_century = RTC_CENTURY,
>  .plvl2_lat = 0xfff /* C2 state not supported */,
>  .plvl3_lat = 0xfff /* C3 state not supported */,
> -.smi_cmd = ACPI_PORT_SMI_CMD,
> +.smi_cmd = smm_enabled ? ACPI_PORT_SMI_CMD : 0,
>  .sci_int = object_property_get_uint(o, ACPI_PM_PROP_SCI_INT, NULL),
>  .acpi_enable_cmd =
> -object_property_get_uint(o, ACPI_PM_PROP_ACPI_ENABLE_CMD, NULL),
> +smm_enabled ?
> +object_property_get_uint(o, ACPI_PM_PROP_ACPI_ENABLE_CMD, NULL) :
> +0,
>  .acpi_disable_cmd =
> -object_property_get_uint(o, ACPI_PM_PROP_ACPI_DISABLE_CMD, NULL),
> +smm_enabled ?
> +object_property_get_uint(o, ACPI_PM_PROP_ACPI_DISABLE_CMD, NULL) 
> :
> +0,
>  .pm1a_evt = { .space_id = as, .bit_width = 4 * 8, .address = io },
>  .pm1a_cnt = { .space_id = as, .bit_width = 2 * 8,
>.address = io + 0x04 },




[PATCH v2 4/9] acpi: set fadt.smi_cmd to zero when SMM is not supported

2021-02-08 Thread isaku . yamahata
From: Isaku Yamahata 

>From table 5.9 SMI_CMD of ACPI spec
> This field is reserved and must be zero on system
> that does not support System Management mode.

When smm is not enabled, set it to zero to comform to the spec.
When -machine smm=off is passed, the change to FACP is as follows.

@@ -1,46 +1,46 @@
 /*
  * Intel ACPI Component Architecture
  * AML/ASL+ Disassembler version 20180105 (64-bit version)
  * Copyright (c) 2000 - 2018 Intel Corporation
  *
- * Disassembly of tests/data/acpi/q35/FACP, Fri Feb  5 16:57:04 2021
+ * Disassembly of /tmp/aml-1OQYX0, Fri Feb  5 16:57:04 2021
  *
  * ACPI Data Table [FACP]
  *
  * Format: [HexOffset DecimalOffset ByteLength]  FieldName : FieldValue
  */

 [000h    4]Signature : "FACP"[Fixed ACPI 
Description Table (FADT)]
 [004h 0004   4] Table Length : 00F4
 [008h 0008   1] Revision : 03
-[009h 0009   1] Checksum : 1F
+[009h 0009   1] Checksum : D6
 [00Ah 0010   6]   Oem ID : "BOCHS "
 [010h 0016   8] Oem Table ID : "BXPCFACP"
 [018h 0024   4] Oem Revision : 0001
 [01Ch 0028   4]  Asl Compiler ID : "BXPC"
 [020h 0032   4]Asl Compiler Revision : 0001

 [024h 0036   4] FACS Address : 
 [028h 0040   4] DSDT Address : 
 [02Ch 0044   1]Model : 01
 [02Dh 0045   1]   PM Profile : 00 [Unspecified]
 [02Eh 0046   2]SCI Interrupt : 0009
-[030h 0048   4] SMI Command Port : 00B2
-[034h 0052   1]ACPI Enable Value : 02
-[035h 0053   1]   ACPI Disable Value : 03
+[030h 0048   4] SMI Command Port : 
+[034h 0052   1]ACPI Enable Value : 00
+[035h 0053   1]   ACPI Disable Value : 00
 [036h 0054   1]   S4BIOS Command : 00
 [037h 0055   1]  P-State Control : 00
 [038h 0056   4] PM1A Event Block Address : 0600
 [03Ch 0060   4] PM1B Event Block Address : 
 [040h 0064   4]   PM1A Control Block Address : 0604
 [044h 0068   4]   PM1B Control Block Address : 
 [048h 0072   4]PM2 Control Block Address : 
 [04Ch 0076   4]   PM Timer Block Address : 0608
 [050h 0080   4]   GPE0 Block Address : 0620
 [054h 0084   4]   GPE1 Block Address : 
 [058h 0088   1]   PM1 Event Block Length : 04
 [059h 0089   1] PM1 Control Block Length : 02
 [05Ah 0090   1] PM2 Control Block Length : 00
 [05Bh 0091   1]PM Timer Block Length : 04
 [05Ch 0092   1]GPE0 Block Length : 10
 [05Dh 0093   1]GPE1 Block Length : 00

Signed-off-by: Isaku Yamahata 
---
 hw/i386/acpi-build.c | 12 +---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index f56d699c7f..c2f11d95d8 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -139,6 +139,8 @@ const struct AcpiGenericAddress x86_nvdimm_acpi_dsmio = {
 static void init_common_fadt_data(MachineState *ms, Object *o,
   AcpiFadtData *data)
 {
+X86MachineState *x86ms = X86_MACHINE(ms);
+bool smm_enabled = x86_machine_is_smm_enabled(x86ms);
 uint32_t io = object_property_get_uint(o, ACPI_PM_PROP_PM_IO_BASE, NULL);
 AmlAddressSpace as = AML_AS_SYSTEM_IO;
 AcpiFadtData fadt = {
@@ -159,12 +161,16 @@ static void init_common_fadt_data(MachineState *ms, 
Object *o,
 .rtc_century = RTC_CENTURY,
 .plvl2_lat = 0xfff /* C2 state not supported */,
 .plvl3_lat = 0xfff /* C3 state not supported */,
-.smi_cmd = ACPI_PORT_SMI_CMD,
+.smi_cmd = smm_enabled ? ACPI_PORT_SMI_CMD : 0,
 .sci_int = object_property_get_uint(o, ACPI_PM_PROP_SCI_INT, NULL),
 .acpi_enable_cmd =
-object_property_get_uint(o, ACPI_PM_PROP_ACPI_ENABLE_CMD, NULL),
+smm_enabled ?
+object_property_get_uint(o, ACPI_PM_PROP_ACPI_ENABLE_CMD, NULL) :
+0,
 .acpi_disable_cmd =
-object_property_get_uint(o, ACPI_PM_PROP_ACPI_DISABLE_CMD, NULL),
+smm_enabled ?
+object_property_get_uint(o, ACPI_PM_PROP_ACPI_DISABLE_CMD, NULL) :
+0,
 .pm1a_evt = { .space_id = as, .bit_width = 4 * 8, .address = io },
 .pm1a_cnt = { .space_id = as, .bit_width = 2 * 8,
   .address = io + 0x04 },
-- 
2.17.1