[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 2 of 2] Add configuration options to selectively disable S3 and S4 ACPI power states


  • To: Paul Durrant <Paul.Durrant@xxxxxxxxxx>, "xen-devel@xxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxx>
  • From: Keir Fraser <keir@xxxxxxx>
  • Date: Fri, 18 Nov 2011 09:35:42 +0000
  • Cc:
  • Delivery-date: Fri, 18 Nov 2011 09:36:32 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xensource.com>
  • Thread-index: AcylTUvRZV7WF7N3u0mmSwGUSns+jwAgo7/gAAFlaUc=
  • Thread-topic: [Xen-devel] [PATCH 2 of 2] Add configuration options to selectively disable S3 and S4 ACPI power states

The OSPM shouldn't care. It parses all tables at start of day into one big
homogeneous namespace.

On 18/11/2011 08:56, "Paul Durrant" <Paul.Durrant@xxxxxxxxxx> wrote:

> Not sure whether that will work, but I can give it a try. Windows quite often
> has very particular ideas about where things should be.
> 
>   Paul
> 
>> -----Original Message-----
>> From: Keir Fraser [mailto:keir.xen@xxxxxxxxx] On Behalf Of Keir
>> Fraser
>> Sent: 17 November 2011 17:21
>> To: Paul Durrant; xen-devel@xxxxxxxxxxxxxxxxxxx
>> Subject: Re: [Xen-devel] [PATCH 2 of 2] Add configuration options to
>> selectively disable S3 and S4 ACPI power states
>> 
>> On 17/11/2011 16:43, "Paul Durrant" <paul.durrant@xxxxxxxxxx> wrote:
>> 
>>> # HG changeset patch
>>> # User Paul Durrant <paul.durrant@xxxxxxxxxx> # Date 1321548043 0
>> #
>>> Node ID c25af1f86de1699ee36684e740a323adbcffdfb5
>>> # Parent  447738ef67ea2690c8ea6684f2e0e0b3528ad446
>>> Add configuration options to selectively disable S3 and S4 ACPI
>> power states.
>>> 
>>> Introduce acpi_s3 and acpi_s4 configuration options (default=1).
>> When
>>> one of these parameters is 0 it causes removal of the respective
>>> package (_S3 or _S4) from the DSDT thereby disabling that power
>> state
>>> in the guest.
>> 
>> Yeeees. Brave as binary patching the DSDT is, how about sticking _S3
>> and _S4 in optional SSDTs?
>> 
>>  -- Keir
>> 
>>> Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
>>> 
>>> diff -r 447738ef67ea -r c25af1f86de1
>>> tools/firmware/hvmloader/acpi/acpi2_0.h
>>> --- a/tools/firmware/hvmloader/acpi/acpi2_0.h Thu Nov 17 16:21:21
>> 2011
>>> +0000
>>> +++ b/tools/firmware/hvmloader/acpi/acpi2_0.h Thu Nov 17 16:40:43
>> 2011
>>> +++ +0000
>>> @@ -396,6 +396,8 @@ struct acpi_config {
>>>      int dsdt_anycpu_len;
>>>      unsigned char *dsdt_15cpu;
>>>      int dsdt_15cpu_len;
>>> +    int dsdt_s3_enabled;
>>> +    int dsdt_s4_enabled;
>>>  };
>>> 
>>>  void acpi_build_tables(struct acpi_config *config, unsigned int
>>> physical); diff -r 447738ef67ea -r c25af1f86de1
>>> tools/firmware/hvmloader/acpi/build.c
>>> --- a/tools/firmware/hvmloader/acpi/build.c Thu Nov 17 16:21:21
>> 2011
>>> +0000
>>> +++ b/tools/firmware/hvmloader/acpi/build.c Thu Nov 17 16:40:43
>> 2011
>>> +++ +0000
>>> @@ -274,6 +274,54 @@ static int construct_secondary_tables(un
>>>      return nr_tables;
>>>  }
>>> 
>>> +static uint8_t *find_name(uint8_t *dsdt, const char *prefix) {
>>> +    int len = strlen(prefix);
>>> +    int i;
>>> +
>>> +    for ( i = 0; i < ((struct acpi_header *)dsdt)->length - len;
>> i++,
>>> + dsdt++
>>> )
>>> +    {
>>> +        if ( memcmp(dsdt, prefix, len) == 0 && *(dsdt - 1) ==
>> 0x08 )
>>> +            return dsdt - 1;
>>> +    }
>>> +
>>> +    return NULL;
>>> +}
>>> +
>>> +static void remove_package(uint8_t *dsdt, const char *prefix) {
>>> +    struct acpi_header *header = (struct acpi_header *)dsdt;
>>> +    uint8_t *start = find_name(dsdt, prefix);
>>> +    uint8_t *end = dsdt + header->length - 1;
>>> +    uint8_t *package;
>>> +    uint8_t *len;
>>> +    uint8_t *next;
>>> +
>>> +    if ( start == NULL )
>>> +        return;
>>> +
>>> +    package = start + 5; /* 1 byte op, 4 bytes payload */
>>> +    if ( package > end )
>>> +        return;
>>> +    if ( *package != 0x12 )
>>> +        return;
>>> +
>>> +    len = package + 1;
>>> +    if ( package > end )
>>> +        return;
>>> +
>>> +    next = package + 1 + *len; /* 1 byte op, len bytes payload */
>>> +    if ( next > end + 1 )
>>> +        return;
>>> +
>>> +    printf("DSDT: removing '%c%c%c%c' (%d bytes)\n",
>>> +           *(start + 1), *(start + 2), *(start + 3), *(start +
>> 4),
>>> +           next - start);
>>> +
>>> +    memcpy(start, next, header->length - (next - dsdt));
>>> +    header->length -= next - start;
>>> +}
>>> +
>>>  void acpi_build_tables(struct acpi_config *config, unsigned int
>>> physical)  {
>>>      struct acpi_info *acpi_info;
>>> @@ -310,19 +358,29 @@ void acpi_build_tables(struct acpi_confi
>>>       */
>>>      if ( hvm_info->nr_vcpus <= 15 && config->dsdt_15cpu)
>>>      {
>>> -        dsdt = mem_alloc(config->dsdt_15cpu_len, 16);
>>> +        dsdt = mem_probe(config->dsdt_15cpu_len, 16);
>>>          if (!dsdt) goto oom;
>>>          memcpy(dsdt, config->dsdt_15cpu, config->dsdt_15cpu_len);
>>>          nr_processor_objects = 15;
>>>      }
>>>      else
>>>      {
>>> -        dsdt = mem_alloc(config->dsdt_anycpu_len, 16);
>>> +        dsdt = mem_probe(config->dsdt_anycpu_len, 16);
>>>          if (!dsdt) goto oom;
>>>          memcpy(dsdt, config->dsdt_anycpu, config-
>>> dsdt_anycpu_len);
>>>          nr_processor_objects = HVM_MAX_VCPUS;
>>>      }
>>> 
>>> +    if ( !config->dsdt_s3_enabled)
>>> +        remove_package(dsdt, "_S3");
>>> +    if ( !config->dsdt_s4_enabled)
>>> +        remove_package(dsdt, "_S4");
>>> +
>>> +    set_checksum(dsdt,
>>> +                 offsetof(struct acpi_header, checksum),
>>> +                 ((struct acpi_header*)dsdt)->length);
>>> +    mem_commit(dsdt, ((struct acpi_header*)dsdt)->length);
>>> +
>>>      /*
>>>       * N.B. ACPI 1.0 operating systems may not handle FADT with
>> revision 2
>>>       * or above properly, notably Windows 2000, which tries to
>> copy
>>> FADT diff -r 447738ef67ea -r c25af1f86de1
>>> tools/firmware/hvmloader/config.h
>>> --- a/tools/firmware/hvmloader/config.h Thu Nov 17 16:21:21 2011
>> +0000
>>> +++ b/tools/firmware/hvmloader/config.h Thu Nov 17 16:40:43 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 447738ef67ea -r c25af1f86de1
>>> tools/firmware/hvmloader/hvmloader.c
>>> --- a/tools/firmware/hvmloader/hvmloader.c Thu Nov 17 16:21:21
>> 2011
>>> +0000
>>> +++ b/tools/firmware/hvmloader/hvmloader.c Thu Nov 17 16:40:43
>> 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 447738ef67ea -r c25af1f86de1
>>> tools/firmware/hvmloader/rombios.c
>>> --- a/tools/firmware/hvmloader/rombios.c Thu Nov 17 16:21:21 2011
>>> +0000
>>> +++ b/tools/firmware/hvmloader/rombios.c Thu Nov 17 16:40:43 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,
>>> +        .dsdt_s3_enabled = s3_enabled,
>>> +        .dsdt_s4_enabled = s4_enabled,
>>>      };
>>> 
>>>      acpi_build_tables(&config, ACPI_PHYSICAL_ADDRESS); diff -r
>>> 447738ef67ea -r c25af1f86de1 tools/firmware/hvmloader/seabios.c
>>> --- a/tools/firmware/hvmloader/seabios.c Thu Nov 17 16:21:21 2011
>>> +0000
>>> +++ b/tools/firmware/hvmloader/seabios.c Thu Nov 17 16:40:43 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,
>>> +        .dsdt_s3_enabled = s3_enabled,
>>> +        .dsdt_s4_enabled = s4_enabled,
>>>      };
>>> 
>>>      acpi_build_tables(&config, rsdp); diff -r 447738ef67ea -r
>>> c25af1f86de1 tools/firmware/hvmloader/util.c
>>> --- a/tools/firmware/hvmloader/util.c Thu Nov 17 16:21:21 2011
>> +0000
>>> +++ b/tools/firmware/hvmloader/util.c Thu Nov 17 16:40:43 2011
>> +0000
>>> @@ -352,28 +352,35 @@ xen_pfn_t mem_hole_alloc(uint32_t nr_mfn
>>>      return hvm_info->reserved_mem_pgstart;  }
>>> 
>>> -void *mem_alloc(uint32_t size, uint32_t align)
>>> +void *mem_probe(uint32_t size, uint32_t align)
>>>  {
>>> -    uint32_t s, e;
>>> +    uint32_t r, s, e;
>>> +    void *base;
>>> 
>>>      /* Align to at least 16 bytes. */
>>>      if ( align < 16 )
>>>          align = 16;
>>> 
>>> -    s = (reserve + align) & ~(align - 1);
>>> +    r = reserve;
>>> +    s = (r + align) & ~(align - 1);
>>>      e = s + size - 1;
>>> 
>>> +    base = (void *)s;
>>> +
>>>      BUG_ON((e < s) || (e >> PAGE_SHIFT) >=
>>> hvm_info->reserved_mem_pgstart);
>>> 
>>> -    while ( (reserve >> PAGE_SHIFT) != (e >> PAGE_SHIFT) )
>>> +    while ( (r >> PAGE_SHIFT) != (e >> PAGE_SHIFT) )
>>>      {
>>> -        reserve += PAGE_SIZE;
>>> -        mem_hole_populate_ram(reserve >> PAGE_SHIFT, 1);
>>> +        r += PAGE_SIZE;
>>> +        mem_hole_populate_ram(r >> PAGE_SHIFT, 1);
>>>      }
>>> 
>>> -    reserve = e;
>>> +    return (void *)(unsigned long)s;
>>> +}
>>> 
>>> -    return (void *)(unsigned long)s;
>>> +void mem_commit(void *base, uint32_t size) {
>>> +    reserve = (uint32_t)base + size;
>>>  }
>>> 
>>>  void *scratch_alloc(uint32_t size, uint32_t align) diff -r
>>> 447738ef67ea -r c25af1f86de1 tools/firmware/hvmloader/util.h
>>> --- a/tools/firmware/hvmloader/util.h Thu Nov 17 16:21:21 2011
>> +0000
>>> +++ b/tools/firmware/hvmloader/util.h Thu Nov 17 16:40:43 2011
>> +0000
>>> @@ -172,7 +172,16 @@ void mem_hole_populate_ram(xen_pfn_t mfn
>>> xen_pfn_t mem_hole_alloc(uint32_t nr_mfns);
>>> 
>>>  /* Allocate memory in a reserved region below 4GB. */ -void
>>> *mem_alloc(uint32_t size, uint32_t align);
>>> +void *mem_probe(uint32_t size, uint32_t align); void
>> mem_commit(void
>>> +*base, uint32_t size);
>>> +
>>> +static inline void *mem_alloc(uint32_t size, uint32_t align) {
>>> +    void *base = mem_probe(size, align);
>>> +    mem_commit(base, size);
>>> +    return base;
>>> +}
>>> +
>>>  #define virt_to_phys(v) ((unsigned long)(v))
>>> 
>>>  /* Allocate memory in a scratch region */ diff -r 447738ef67ea -r
>>> c25af1f86de1 tools/libxl/libxl_create.c
>>> --- a/tools/libxl/libxl_create.c Thu Nov 17 16:21:21 2011 +0000
>>> +++ b/tools/libxl/libxl_create.c Thu Nov 17 16:40:43 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 447738ef67ea -r c25af1f86de1 tools/libxl/libxl_types.idl
>>> --- a/tools/libxl/libxl_types.idl Thu Nov 17 16:21:21 2011 +0000
>>> +++ b/tools/libxl/libxl_types.idl Thu Nov 17 16:40:43 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 447738ef67ea -r c25af1f86de1 tools/libxl/xl_cmdimpl.c
>>> --- a/tools/libxl/xl_cmdimpl.c Thu Nov 17 16:21:21 2011 +0000
>>> +++ b/tools/libxl/xl_cmdimpl.c Thu Nov 17 16:40:43 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@xxxxxxxxxxxxxxxxxxx
>>> http://lists.xensource.com/xen-devel
>> 
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.