Paul Durrant
2011-Nov-18 10:35 UTC
[Xen-devel] [PATCH 0 of 2] Add configuration options to selectively disable S3 and S4 (V3)
This patch series adds the ability to selectively disable the S3 and S4 ACPI power states for HVM guests. Since there is a general move towards retiring the hvm_info_table structure, the first patch moves the acpi_enabled flag out of the hvm_info_table and into a xenstore key (platform/acpi). The second patch then introduces the acpi_s3 and acpi_s4 configuration parameters to the xl config file (default=1). These result in population of new platform/acpi_s3 and platform/acpi_s4 xenstore keys. hvmloader then reads these keys to determine whether or not to include SSDTs containing the _S3 and _S4 packages respectively. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Paul Durrant
2011-Nov-18 10:35 UTC
[Xen-devel] [PATCH 1 of 2] Move acpi_enabled out of hvm_info_table into xenstore
# HG changeset patch # User Paul Durrant <paul.durrant@citrix.com> # Date 1321612413 0 # Node ID 8a29891d6a98002b299d73253935c161ecf393a1 # Parent dbdc840f8f62db58321b5009e5e0f7833066386f Move acpi_enabled out of hvm_info_table into xenstore Since hvmloader has a xentore client, use a platform key in xenstore to indicate whether ACPI is enabled or not rather than the shared hvm_info_table structure. Signed-off-by: Paul Durrant <paul.durrant@citrix.com> diff -r dbdc840f8f62 -r 8a29891d6a98 tools/firmware/hvmloader/hvmloader.c --- a/tools/firmware/hvmloader/hvmloader.c Wed Nov 16 18:21:14 2011 +0000 +++ b/tools/firmware/hvmloader/hvmloader.c Fri Nov 18 10:33:33 2011 +0000 @@ -423,6 +423,7 @@ int main(void) const struct bios_config *bios; int option_rom_sz = 0, vgabios_sz = 0, etherboot_sz = 0; uint32_t etherboot_phys_addr = 0, option_rom_phys_addr = 0; + int acpi_enabled; /* Initialise hypercall stubs with RET, rendering them no-ops. */ memset((void *)HYPERCALL_PHYSICAL_ADDRESS, 0xc3 /* RET */, PAGE_SIZE); @@ -506,7 +507,9 @@ int main(void) option_rom_phys_addr); } - if ( hvm_info->acpi_enabled ) + acpi_enabled = !strncmp(xenstore_read("platform/acpi", "1"), "1", 1); + + if ( acpi_enabled ) { struct xen_hvm_param p = { .domid = DOMID_SELF, diff -r dbdc840f8f62 -r 8a29891d6a98 tools/libxc/xc_hvm_build.c --- a/tools/libxc/xc_hvm_build.c Wed Nov 16 18:21:14 2011 +0000 +++ b/tools/libxc/xc_hvm_build.c Fri Nov 18 10:33:33 2011 +0000 @@ -67,7 +67,6 @@ static void build_hvm_info(void *hvm_inf hvm_info->length = sizeof(struct hvm_info_table); /* Sensible defaults: these can be overridden by the caller. */ - hvm_info->acpi_enabled = 1; hvm_info->apic_mode = 1; hvm_info->nr_vcpus = 1; memset(hvm_info->vcpu_online, 0xff, sizeof(hvm_info->vcpu_online)); diff -r dbdc840f8f62 -r 8a29891d6a98 tools/libxl/libxl_create.c --- a/tools/libxl/libxl_create.c Wed Nov 16 18:21:14 2011 +0000 +++ b/tools/libxl/libxl_create.c Fri Nov 18 10:33:33 2011 +0000 @@ -188,6 +188,11 @@ int libxl__domain_build(libxl__gc *gc, vments[3] = "hvm"; vments[4] = "start_time"; vments[5] = libxl__sprintf(gc, "%lu.%02d", start_time.tv_sec,(int)start_time.tv_usec/10000); + + localents = libxl__calloc(gc, 3, sizeof(char *)); + localents[0] = "platform/acpi"; + localents[1] = (info->u.hvm.acpi) ? "1" : "0"; + break; case LIBXL_DOMAIN_TYPE_PV: ret = libxl__build_pv(gc, domid, info, state); diff -r dbdc840f8f62 -r 8a29891d6a98 tools/libxl/libxl_dom.c --- a/tools/libxl/libxl_dom.c Wed Nov 16 18:21:14 2011 +0000 +++ b/tools/libxl/libxl_dom.c Fri Nov 18 10:33:33 2011 +0000 @@ -248,7 +248,6 @@ static int hvm_build_set_params(xc_inter return -1; va_hvm = (struct hvm_info_table *)(va_map + HVM_INFO_OFFSET); - va_hvm->acpi_enabled = info->u.hvm.acpi; va_hvm->apic_mode = info->u.hvm.apic; va_hvm->nr_vcpus = info->max_vcpus; memcpy(va_hvm->vcpu_online, &info->cur_vcpus, sizeof(info->cur_vcpus)); diff -r dbdc840f8f62 -r 8a29891d6a98 tools/python/xen/lowlevel/xc/xc.c --- a/tools/python/xen/lowlevel/xc/xc.c Wed Nov 16 18:21:14 2011 +0000 +++ b/tools/python/xen/lowlevel/xc/xc.c Fri Nov 18 10:33:33 2011 +0000 @@ -996,7 +996,6 @@ static PyObject *pyxc_hvm_build(XcObject if ( va_map == NULL ) return PyErr_SetFromErrno(xc_error_obj); va_hvm = (struct hvm_info_table *)(va_map + HVM_INFO_OFFSET); - va_hvm->acpi_enabled = acpi; va_hvm->apic_mode = apic; va_hvm->nr_vcpus = vcpus; memcpy(va_hvm->vcpu_online, vcpu_avail, sizeof(vcpu_avail)); diff -r dbdc840f8f62 -r 8a29891d6a98 xen/include/public/hvm/hvm_info_table.h --- a/xen/include/public/hvm/hvm_info_table.h Wed Nov 16 18:21:14 2011 +0000 +++ b/xen/include/public/hvm/hvm_info_table.h Fri Nov 18 10:33:33 2011 +0000 @@ -37,9 +37,6 @@ struct hvm_info_table { uint32_t length; uint8_t checksum; - /* Should firmware build ACPI tables? */ - uint8_t acpi_enabled; - /* Should firmware build APIC descriptors (APIC MADT / MP BIOS)? */ uint8_t apic_mode; _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Paul Durrant
2011-Nov-18 10:35 UTC
[Xen-devel] [PATCH 2 of 2] Add configuration options to selectively disable S3 and S4 ACPI power states
# HG changeset patch # User Paul Durrant <paul.durrant@citrix.com> # Date 1321612462 0 # Node ID 3e977aa71278d30aad3d9eb3e5b6413cbcfc0f4e # Parent 8a29891d6a98002b299d73253935c161ecf393a1 Add configuration options to selectively disable S3 and S4 ACPI power states. Introduce acpi_s3 and acpi_s4 configuration options (default=1). The S3 and S4 packages are moved into separate SSDTs and their inclusion is controlled by the new configuration options. Signed-off-by: Paul Durrant <paul.durrant@citrix.com> diff -r 8a29891d6a98 -r 3e977aa71278 tools/firmware/hvmloader/acpi/Makefile --- a/tools/firmware/hvmloader/acpi/Makefile Fri Nov 18 10:33:33 2011 +0000 +++ b/tools/firmware/hvmloader/acpi/Makefile Fri Nov 18 10:34:22 2011 +0000 @@ -26,7 +26,7 @@ CFLAGS += $(CFLAGS_xeninclude) vpath iasl $(PATH) all: acpi.a -ssdt_pm.h ssdt_tpm.h: %.h: %.asl iasl +ssdt_s3.h ssdt_s4.h ssdt_pm.h ssdt_tpm.h: %.h: %.asl iasl iasl -vs -p $* -tc $< sed -e ''s/AmlCode/$*/g'' $*.hex >$@ rm -f $*.hex $*.aml @@ -57,7 +57,7 @@ iasl: @echo @exit 1 -build.o: ssdt_pm.h ssdt_tpm.h +build.o: ssdt_s3.h ssdt_s4.h ssdt_pm.h ssdt_tpm.h acpi.a: $(OBJS) $(AR) rc $@ $(OBJS) diff -r 8a29891d6a98 -r 3e977aa71278 tools/firmware/hvmloader/acpi/acpi2_0.h --- a/tools/firmware/hvmloader/acpi/acpi2_0.h Fri Nov 18 10:33:33 2011 +0000 +++ b/tools/firmware/hvmloader/acpi/acpi2_0.h Fri Nov 18 10:34:22 2011 +0000 @@ -396,6 +396,8 @@ struct acpi_config { int dsdt_anycpu_len; unsigned char *dsdt_15cpu; int dsdt_15cpu_len; + int ssdt_s3_enabled; + int ssdt_s4_enabled; }; void acpi_build_tables(struct acpi_config *config, unsigned int physical); diff -r 8a29891d6a98 -r 3e977aa71278 tools/firmware/hvmloader/acpi/build.c --- a/tools/firmware/hvmloader/acpi/build.c Fri Nov 18 10:33:33 2011 +0000 +++ b/tools/firmware/hvmloader/acpi/build.c Fri Nov 18 10:34:22 2011 +0000 @@ -17,6 +17,8 @@ */ #include "acpi2_0.h" +#include "ssdt_s3.h" +#include "ssdt_s4.h" #include "ssdt_tpm.h" #include "ssdt_pm.h" #include "../config.h" @@ -196,7 +198,8 @@ static struct acpi_20_waet *construct_wa } static int construct_secondary_tables(unsigned long *table_ptrs, - struct acpi_info *info) + struct acpi_info *info, + struct acpi_config *config) { int nr_tables = 0; struct acpi_20_madt *madt; @@ -235,6 +238,22 @@ static int construct_secondary_tables(un table_ptrs[nr_tables++] = (unsigned long)ssdt; } + if ( config->ssdt_s3_enabled ) + { + ssdt = mem_alloc(sizeof(ssdt_s3), 16); + if (!ssdt) return -1; + memcpy(ssdt, ssdt_s3, sizeof(ssdt_s3)); + table_ptrs[nr_tables++] = (unsigned long)ssdt; + } + + if ( config->ssdt_s4_enabled ) + { + ssdt = mem_alloc(sizeof(ssdt_s4), 16); + if (!ssdt) return -1; + memcpy(ssdt, ssdt_s4, sizeof(ssdt_s4)); + table_ptrs[nr_tables++] = (unsigned long)ssdt; + } + /* TPM TCPA and SSDT. */ tis_hdr = (uint16_t *)0xFED40F00; if ( (tis_hdr[0] == tis_signature[0]) && @@ -353,7 +372,8 @@ void acpi_build_tables(struct acpi_confi offsetof(struct acpi_header, checksum), sizeof(struct acpi_20_fadt)); - nr_secondaries = construct_secondary_tables(secondary_tables, acpi_info); + nr_secondaries = construct_secondary_tables(secondary_tables, acpi_info, + config); if ( nr_secondaries < 0 ) goto oom; diff -r 8a29891d6a98 -r 3e977aa71278 tools/firmware/hvmloader/acpi/dsdt.asl --- a/tools/firmware/hvmloader/acpi/dsdt.asl Fri Nov 18 10:33:33 2011 +0000 +++ b/tools/firmware/hvmloader/acpi/dsdt.asl Fri Nov 18 10:34:22 2011 +0000 @@ -27,24 +27,7 @@ DefinitionBlock ("DSDT.aml", "DSDT", 2, Name (\APCL, 0x00010000) Name (\PUID, 0x00) - /* - * S3 (suspend-to-ram), S4 (suspend-to-disc) and S5 (power-off) type codes: - * must match piix4 emulation. - */ - Name (\_S3, Package (0x04) - { - 0x01, /* PM1a_CNT.SLP_TYP */ - 0x01, /* PM1b_CNT.SLP_TYP */ - 0x0, /* reserved */ - 0x0 /* reserved */ - }) - Name (\_S4, Package (0x04) - { - 0x00, /* PM1a_CNT.SLP_TYP */ - 0x00, /* PM1b_CNT.SLP_TYP */ - 0x00, /* reserved */ - 0x00 /* reserved */ - }) + /* _S3 and _S4 are in separate SSDTs */ Name (\_S5, Package (0x04) { 0x00, /* PM1a_CNT.SLP_TYP */ diff -r 8a29891d6a98 -r 3e977aa71278 tools/firmware/hvmloader/acpi/ssdt_s3.asl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/firmware/hvmloader/acpi/ssdt_s3.asl Fri Nov 18 10:34:22 2011 +0000 @@ -0,0 +1,32 @@ +/* + * ssdt_s3.asl + * + * Copyright (c) 2011 Citrix Systems, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +DefinitionBlock ("SSDT_S3.aml", "SSDT", 2, "Xen", "HVM", 0) +{ + /* Must match piix emulation */ + Name (\_S3, Package (0x04) + { + 0x01, /* PM1a_CNT.SLP_TYP */ + 0x01, /* PM1b_CNT.SLP_TYP */ + 0x0, /* reserved */ + 0x0 /* reserved */ + }) +} + diff -r 8a29891d6a98 -r 3e977aa71278 tools/firmware/hvmloader/acpi/ssdt_s4.asl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/firmware/hvmloader/acpi/ssdt_s4.asl Fri Nov 18 10:34:22 2011 +0000 @@ -0,0 +1,32 @@ +/* + * ssdt_s4.asl + * + * Copyright (c) 2011 Citrix Systems, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +DefinitionBlock ("SSDT_S4.aml", "SSDT", 2, "Xen", "HVM", 0) +{ + /* Must match piix emulation */ + Name (\_S4, Package (0x04) + { + 0x00, /* PM1a_CNT.SLP_TYP */ + 0x00, /* PM1b_CNT.SLP_TYP */ + 0x00, /* reserved */ + 0x00 /* reserved */ + }) +} + diff -r 8a29891d6a98 -r 3e977aa71278 tools/firmware/hvmloader/config.h --- a/tools/firmware/hvmloader/config.h Fri Nov 18 10:33:33 2011 +0000 +++ b/tools/firmware/hvmloader/config.h Fri Nov 18 10:34:22 2011 +0000 @@ -27,7 +27,7 @@ struct bios_config { void (*e820_setup)(void); - void (*acpi_build_tables)(void); + void (*acpi_build_tables)(int, int); void (*create_mp_tables)(void); void (*create_smbios_tables)(void); void (*create_pir_tables)(void); diff -r 8a29891d6a98 -r 3e977aa71278 tools/firmware/hvmloader/hvmloader.c --- a/tools/firmware/hvmloader/hvmloader.c Fri Nov 18 10:33:33 2011 +0000 +++ b/tools/firmware/hvmloader/hvmloader.c Fri Nov 18 10:34:22 2011 +0000 @@ -516,11 +516,17 @@ int main(void) .index = HVM_PARAM_ACPI_IOPORTS_LOCATION, .value = 1, }; + int s3_enabled, s4_enabled; + + s3_enabled = !strncmp(xenstore_read("platform/acpi_s3", "1"), "1", 1); + s4_enabled = !strncmp(xenstore_read("platform/acpi_s4", "1"), "1", 1); if ( bios->acpi_build_tables ) { - printf("Loading ACPI ...\n"); - bios->acpi_build_tables(); + printf("Loading ACPI (S3=%s S4=%s) ...\n", + (s3_enabled) ? "ON" : "OFF", + (s4_enabled) ? "ON" : "OFF"); + bios->acpi_build_tables(s3_enabled, s4_enabled); } acpi_enable_sci(); diff -r 8a29891d6a98 -r 3e977aa71278 tools/firmware/hvmloader/rombios.c --- a/tools/firmware/hvmloader/rombios.c Fri Nov 18 10:33:33 2011 +0000 +++ b/tools/firmware/hvmloader/rombios.c Fri Nov 18 10:34:22 2011 +0000 @@ -112,13 +112,15 @@ static void reset_bios_checksum(void) *((uint8_t *)(ROMBIOS_BEGIN + ROMBIOS_MAXOFFSET)) = -checksum; } -static void rombios_acpi_build_tables(void) +static void rombios_acpi_build_tables(int s3_enabled, int s4_enabled) { struct acpi_config config = { .dsdt_anycpu = dsdt_anycpu, .dsdt_anycpu_len = dsdt_anycpu_len, .dsdt_15cpu = dsdt_15cpu, .dsdt_15cpu_len = dsdt_15cpu_len, + .ssdt_s3_enabled = s3_enabled, + .ssdt_s4_enabled = s4_enabled, }; acpi_build_tables(&config, ACPI_PHYSICAL_ADDRESS); diff -r 8a29891d6a98 -r 3e977aa71278 tools/firmware/hvmloader/seabios.c --- a/tools/firmware/hvmloader/seabios.c Fri Nov 18 10:33:33 2011 +0000 +++ b/tools/firmware/hvmloader/seabios.c Fri Nov 18 10:34:22 2011 +0000 @@ -91,7 +91,7 @@ static void add_table(uint32_t t) info->tables_nr++; } -static void seabios_acpi_build_tables(void) +static void seabios_acpi_build_tables(int s3_enabled, int s4_enabled) { uint32_t rsdp = (uint32_t)scratch_alloc(sizeof(struct acpi_20_rsdp), 0); struct acpi_config config = { @@ -99,6 +99,8 @@ static void seabios_acpi_build_tables(vo .dsdt_anycpu_len = dsdt_anycpu_qemu_xen_len, .dsdt_15cpu = NULL, .dsdt_15cpu_len = 0, + .ssdt_s3_enabled = s3_enabled, + .ssdt_s4_enabled = s4_enabled, }; acpi_build_tables(&config, rsdp); diff -r 8a29891d6a98 -r 3e977aa71278 tools/libxl/libxl_create.c --- a/tools/libxl/libxl_create.c Fri Nov 18 10:33:33 2011 +0000 +++ b/tools/libxl/libxl_create.c Fri Nov 18 10:34:22 2011 +0000 @@ -93,6 +93,8 @@ int libxl_init_build_info(libxl_ctx *ctx b_info->u.hvm.pae = 1; b_info->u.hvm.apic = 1; b_info->u.hvm.acpi = 1; + b_info->u.hvm.acpi_s3 = 1; + b_info->u.hvm.acpi_s4 = 1; b_info->u.hvm.nx = 1; b_info->u.hvm.viridian = 0; b_info->u.hvm.hpet = 1; @@ -189,9 +191,13 @@ int libxl__domain_build(libxl__gc *gc, vments[4] = "start_time"; vments[5] = libxl__sprintf(gc, "%lu.%02d", start_time.tv_sec,(int)start_time.tv_usec/10000); - localents = libxl__calloc(gc, 3, sizeof(char *)); + localents = libxl__calloc(gc, 7, sizeof(char *)); localents[0] = "platform/acpi"; localents[1] = (info->u.hvm.acpi) ? "1" : "0"; + localents[2] = "platform/acpi_s3"; + localents[3] = (info->u.hvm.acpi_s3) ? "1" : "0"; + localents[4] = "platform/acpi_s4"; + localents[5] = (info->u.hvm.acpi_s4) ? "1" : "0"; break; case LIBXL_DOMAIN_TYPE_PV: diff -r 8a29891d6a98 -r 3e977aa71278 tools/libxl/libxl_types.idl --- a/tools/libxl/libxl_types.idl Fri Nov 18 10:33:33 2011 +0000 +++ b/tools/libxl/libxl_types.idl Fri Nov 18 10:34:22 2011 +0000 @@ -167,6 +167,8 @@ libxl_domain_build_info = Struct("domain ("pae", bool), ("apic", bool), ("acpi", bool), + ("acpi_s3", bool), + ("acpi_s4", bool), ("nx", bool), ("viridian", bool), ("timeoffset", string), diff -r 8a29891d6a98 -r 3e977aa71278 tools/libxl/xl_cmdimpl.c --- a/tools/libxl/xl_cmdimpl.c Fri Nov 18 10:33:33 2011 +0000 +++ b/tools/libxl/xl_cmdimpl.c Fri Nov 18 10:34:22 2011 +0000 @@ -683,6 +683,10 @@ static void parse_config_data(const char b_info->u.hvm.apic = l; if (!xlu_cfg_get_long (config, "acpi", &l)) b_info->u.hvm.acpi = l; + if (!xlu_cfg_get_long (config, "acpi_s3", &l)) + b_info->u.hvm.acpi_s3 = l; + if (!xlu_cfg_get_long (config, "acpi_s4", &l)) + b_info->u.hvm.acpi_s4 = l; if (!xlu_cfg_get_long (config, "nx", &l)) b_info->u.hvm.nx = l; if (!xlu_cfg_get_long (config, "viridian", &l)) _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Apparently Analagous Threads
- [PATCH 0/2] genid: ACPI Windows generation ID updates
- Bug#710650: Bug#718767: transition: ocaml 4.00.1
- Bug#710650: Bug#718767: transition: ocaml 4.00.1
- [PATCH 0 of 6] Add support for a VM generation ID virtual device (v2)
- Re: [Qemu-devel] Hvmloader: Modify ACPI to only supply _EJ0 methods for PCIslots that support hotplug by runtime patching