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

Re: [Xen-devel] [PATCH] x86/ACPI: invalidate BGRT


  • To: Jan Beulich <JBeulich@xxxxxxxx>, xen-devel <xen-devel@xxxxxxxxxxxxx>
  • From: Keir Fraser <keir@xxxxxxx>
  • Date: Mon, 05 Nov 2012 17:15:05 +0000
  • Delivery-date: Mon, 05 Nov 2012 17:15:48 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xen.org>
  • Thread-index: Ac27eRkXnyDo8+eskEmM+ixAJTW45A==
  • Thread-topic: [Xen-devel] [PATCH] x86/ACPI: invalidate BGRT

On 05/11/2012 16:49, "Jan Beulich" <JBeulich@xxxxxxxx> wrote:

> Since the image pointed to may (and generally will) live in boot
> services memory (which we add to the global memory pool long before
> ACPI tables get looked at), we should prevent Dom0 from trying to
> retrieve the image data.
> 
> The alternatives would be to
> - not add boot services memory to the global pool at all, or
> - defer adding boot services memory until Dom0 indicates it is safe to
>   do so, or
> - find and parse the BGRT table in xen/arch/x86/efi/boot.c, and avoid
>   adding that specific region to the E820 table.
> None of these is really attractive, and as Xen commonly prints to the
> video console anyway (without trying to avoid any regions on the
> screen), the invalidation would need to be done conditionally anyway.
> 
> (xen/include/acpi/actbl3.h is a verbatim copy from Linux 3.7-rc4)
> 
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>

Acked-by: Keir Fraser <keir@xxxxxxx>

> --- a/xen/arch/x86/acpi/boot.c
> +++ b/xen/arch/x86/acpi/boot.c
> @@ -286,6 +286,25 @@ static int __init acpi_parse_hpet(struct
>  #define acpi_parse_hpet NULL
>  #endif
>  
> +static int __init acpi_invalidate_bgrt(struct acpi_table_header *table)
> +{
> + struct acpi_table_bgrt *bgrt_tbl =
> +  container_of(table, struct acpi_table_bgrt, header);
> +
> + if (table->length < sizeof(*bgrt_tbl))
> +  return -1;
> +
> + if (!(bgrt_tbl->status & 1))
> +  return 0;
> +
> + printk(KERN_INFO PREFIX "BGRT: invalidating v%d image at %#"PRIx64" for
> (%u,%u)\n",
> +        bgrt_tbl->version, bgrt_tbl->image_address,
> +        bgrt_tbl->image_offset_x, bgrt_tbl->image_offset_y);
> + bgrt_tbl->status &= ~1;
> +
> + return 0;
> +}
> +
>  #ifdef CONFIG_ACPI_SLEEP
>  #define acpi_fadt_copy_address(dst, src, len) do {   \
> if (fadt->header.revision >= FADT2_REVISION_ID)   \
> @@ -653,5 +672,7 @@ int __init acpi_boot_init(void)
>  
> erst_init();
>  
> + acpi_table_parse(ACPI_SIG_BGRT, acpi_invalidate_bgrt);
> +
> return 0;
>  }
> --- a/xen/include/acpi/actbl.h
> +++ b/xen/include/acpi/actbl.h
> @@ -314,6 +314,7 @@ enum acpi_prefered_pm_profiles {
>  
>  #include <acpi/actbl1.h>
>  #include <acpi/actbl2.h>
> +#include <acpi/actbl3.h>
>  
>  /*
>   * Sizes of the various flavors of FADT. We need to look closely
> --- /dev/null
> +++ b/xen/include/acpi/actbl3.h
> @@ -0,0 +1,557 @@
> +/****************************************************************************
> **
> + *
> + * Name: actbl3.h - ACPI Table Definitions
> + *
> + 
> *****************************************************************************/
> +
> +/*
> + * Copyright (C) 2000 - 2012, Intel Corp.
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + *    notice, this list of conditions, and the following disclaimer,
> + *    without modification.
> + * 2. Redistributions in binary form must reproduce at minimum a disclaimer
> + *    substantially similar to the "NO WARRANTY" disclaimer below
> + *    ("Disclaimer") and any redistribution must be conditioned upon
> + *    including a substantially similar Disclaimer requirement for further
> + *    binary redistribution.
> + * 3. Neither the names of the above-listed copyright holders nor the names
> + *    of any contributors may be used to endorse or promote products derived
> + *    from this software without specific prior written permission.
> + *
> + * Alternatively, this software may be distributed under the terms of the
> + * GNU General Public License ("GPL") version 2 as published by the Free
> + * Software Foundation.
> + *
> + * NO WARRANTY
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
> + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
> + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
> + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
> + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
> + * POSSIBILITY OF SUCH DAMAGES.
> + */
> +
> +#ifndef __ACTBL3_H__
> +#define __ACTBL3_H__
> +
> +/****************************************************************************
> ***
> + *
> + * Additional ACPI Tables (3)
> + *
> + * These tables are not consumed directly by the ACPICA subsystem, but are
> + * included here to support device drivers and the AML disassembler.
> + *
> + * The tables in this file are fully defined within the ACPI specification.
> + *
> + 
> 
******************************************************************************>
/
> +
> +/*
> + * Values for description table header signatures for tables defined in this
> + * file. Useful because they make it more difficult to inadvertently type in
> + * the wrong signature.
> + */
> +#define ACPI_SIG_BGRT           "BGRT" /* Boot Graphics Resource Table */
> +#define ACPI_SIG_DRTM           "DRTM" /* Dynamic Root of Trust for
> Measurement table */
> +#define ACPI_SIG_FPDT           "FPDT" /* Firmware Performance Data Table */
> +#define ACPI_SIG_GTDT           "GTDT" /* Generic Timer Description Table */
> +#define ACPI_SIG_MPST           "MPST" /* Memory Power State Table */
> +#define ACPI_SIG_PCCT           "PCCT" /* Platform Communications Channel
> Table */
> +#define ACPI_SIG_PMTT           "PMTT" /* Platform Memory Topology Table */
> +#define ACPI_SIG_RASF           "RASF" /* RAS Feature table */
> +
> +#define ACPI_SIG_S3PT           "S3PT" /* S3 Performance (sub)Table */
> +#define ACPI_SIG_PCCS           "PCC" /* PCC Shared Memory Region */
> +
> +/* Reserved table signatures */
> +
> +#define ACPI_SIG_CSRT           "CSRT" /* Core System Resources Table */
> +#define ACPI_SIG_MATR           "MATR" /* Memory Address Translation Table */
> +#define ACPI_SIG_MSDM           "MSDM" /* Microsoft Data Management Table */
> +#define ACPI_SIG_WPBT           "WPBT" /* Windows Platform Binary Table */
> +
> +/*
> + * All tables must be byte-packed to match the ACPI specification, since
> + * the tables are provided by the system BIOS.
> + */
> +#pragma pack(1)
> +
> +/*
> + * Note: C bitfields are not used for this reason:
> + *
> + * "Bitfields are great and easy to read, but unfortunately the C language
> + * does not specify the layout of bitfields in memory, which means they are
> + * essentially useless for dealing with packed data in on-disk formats or
> + * binary wire protocols." (Or ACPI tables and buffers.) "If you ask me,
> + * this decision was a design error in C. Ritchie could have picked an order
> + * and stuck with it." Norman Ramsey.
> + * See http://stackoverflow.com/a/1053662/41661
> + */
> +
> +/****************************************************************************
> ***
> + *
> + * BGRT - Boot Graphics Resource Table (ACPI 5.0)
> + *        Version 1
> + *
> + 
> 
******************************************************************************>
/
> +
> +struct acpi_table_bgrt {
> + struct acpi_table_header header; /* Common ACPI table header */
> + u16 version;
> + u8 status;
> + u8 image_type;
> + u64 image_address;
> + u32 image_offset_x;
> + u32 image_offset_y;
> +};
> +
> +/****************************************************************************
> ***
> + *
> + * DRTM - Dynamic Root of Trust for Measurement table
> + *
> + 
> 
******************************************************************************>
/
> +
> +struct acpi_table_drtm {
> + struct acpi_table_header header; /* Common ACPI table header */
> + u64 entry_base_address;
> + u64 entry_length;
> + u32 entry_address32;
> + u64 entry_address64;
> + u64 exit_address;
> + u64 log_area_address;
> + u32 log_area_length;
> + u64 arch_dependent_address;
> + u32 flags;
> +};
> +
> +/* 1) Validated Tables List */
> +
> +struct acpi_drtm_vtl_list {
> + u32 validated_table_list_count;
> +};
> +
> +/* 2) Resources List */
> +
> +struct acpi_drtm_resource_list {
> + u32 resource_list_count;
> +};
> +
> +/* 3) Platform-specific Identifiers List */
> +
> +struct acpi_drtm_id_list {
> + u32 id_list_count;
> +};
> +
> +/****************************************************************************
> ***
> + *
> + * FPDT - Firmware Performance Data Table (ACPI 5.0)
> + *        Version 1
> + *
> + 
> 
******************************************************************************>
/
> +
> +struct acpi_table_fpdt {
> + struct acpi_table_header header; /* Common ACPI table header */
> +};
> +
> +/* FPDT subtable header */
> +
> +struct acpi_fpdt_header {
> + u16 type;
> + u8 length;
> + u8 revision;
> +};
> +
> +/* Values for Type field above */
> +
> +enum acpi_fpdt_type {
> + ACPI_FPDT_TYPE_BOOT = 0,
> + ACPI_FPDT_TYPE_S3PERF = 1,
> +};
> +
> +/*
> + * FPDT subtables
> + */
> +
> +/* 0: Firmware Basic Boot Performance Record */
> +
> +struct acpi_fpdt_boot {
> + struct acpi_fpdt_header header;
> + u8 reserved[4];
> + u64 reset_end;
> + u64 load_start;
> + u64 startup_start;
> + u64 exit_services_entry;
> + u64 exit_services_exit;
> +};
> +
> +/* 1: S3 Performance Table Pointer Record */
> +
> +struct acpi_fpdt_s3pt_ptr {
> + struct acpi_fpdt_header header;
> + u8 reserved[4];
> + u64 address;
> +};
> +
> +/*
> + * S3PT - S3 Performance Table. This table is pointed to by the
> + * FPDT S3 Pointer Record above.
> + */
> +struct acpi_table_s3pt {
> + u8 signature[4]; /* "S3PT" */
> + u32 length;
> +};
> +
> +/*
> + * S3PT Subtables
> + */
> +struct acpi_s3pt_header {
> + u16 type;
> + u8 length;
> + u8 revision;
> +};
> +
> +/* Values for Type field above */
> +
> +enum acpi_s3pt_type {
> + ACPI_S3PT_TYPE_RESUME = 0,
> + ACPI_S3PT_TYPE_SUSPEND = 1,
> +};
> +
> +struct acpi_s3pt_resume {
> + struct acpi_s3pt_header header;
> + u32 resume_count;
> + u64 full_resume;
> + u64 average_resume;
> +};
> +
> +struct acpi_s3pt_suspend {
> + struct acpi_s3pt_header header;
> + u64 suspend_start;
> + u64 suspend_end;
> +};
> +
> +/****************************************************************************
> ***
> + *
> + * GTDT - Generic Timer Description Table (ACPI 5.0)
> + *        Version 1
> + *
> + 
> 
******************************************************************************>
/
> +
> +struct acpi_table_gtdt {
> + struct acpi_table_header header; /* Common ACPI table header */
> + u64 address;
> + u32 flags;
> + u32 secure_pl1_interrupt;
> + u32 secure_pl1_flags;
> + u32 non_secure_pl1_interrupt;
> + u32 non_secure_pl1_flags;
> + u32 virtual_timer_interrupt;
> + u32 virtual_timer_flags;
> + u32 non_secure_pl2_interrupt;
> + u32 non_secure_pl2_flags;
> +};
> +
> +/* Values for Flags field above */
> +
> +#define ACPI_GTDT_MAPPED_BLOCK_PRESENT      1
> +
> +/* Values for all "TimerFlags" fields above */
> +
> +#define ACPI_GTDT_INTERRUPT_MODE            1
> +#define ACPI_GTDT_INTERRUPT_POLARITY        2
> +
> +/****************************************************************************
> ***
> + *
> + * MPST - Memory Power State Table (ACPI 5.0)
> + *        Version 1
> + *
> + 
> 
******************************************************************************>
/
> +
> +#define ACPI_MPST_CHANNEL_INFO \
> + u16                             reserved1; \
> + u8                              channel_id; \
> + u8                              reserved2; \
> + u16                             power_node_count;
> +
> +/* Main table */
> +
> +struct acpi_table_mpst {
> + struct acpi_table_header header; /* Common ACPI table header */
> +  ACPI_MPST_CHANNEL_INFO /* Platform Communication Channel */
> +};
> +
> +/* Memory Platform Communication Channel Info */
> +
> +struct acpi_mpst_channel {
> + ACPI_MPST_CHANNEL_INFO /* Platform Communication Channel */
> +};
> +
> +/* Memory Power Node Structure */
> +
> +struct acpi_mpst_power_node {
> + u8 flags;
> + u8 reserved1;
> + u16 node_id;
> + u32 length;
> + u64 range_address;
> + u64 range_length;
> + u8 num_power_states;
> + u8 num_physical_components;
> + u16 reserved2;
> +};
> +
> +/* Values for Flags field above */
> +
> +#define ACPI_MPST_ENABLED               1
> +#define ACPI_MPST_POWER_MANAGED         2
> +#define ACPI_MPST_HOT_PLUG_CAPABLE      4
> +
> +/* Memory Power State Structure (follows POWER_NODE above) */
> +
> +struct acpi_mpst_power_state {
> + u8 power_state;
> + u8 info_index;
> +};
> +
> +/* Physical Component ID Structure (follows POWER_STATE above) */
> +
> +struct acpi_mpst_component {
> + u16 component_id;
> +};
> +
> +/* Memory Power State Characteristics Structure (follows all POWER_NODEs) */
> +
> +struct acpi_mpst_data_hdr {
> + u16 characteristics_count;
> +};
> +
> +struct acpi_mpst_power_data {
> + u8 revision;
> + u8 flags;
> + u16 reserved1;
> + u32 average_power;
> + u32 power_saving;
> + u64 exit_latency;
> + u64 reserved2;
> +};
> +
> +/* Values for Flags field above */
> +
> +#define ACPI_MPST_PRESERVE              1
> +#define ACPI_MPST_AUTOENTRY             2
> +#define ACPI_MPST_AUTOEXIT              4
> +
> +/* Shared Memory Region (not part of an ACPI table) */
> +
> +struct acpi_mpst_shared {
> + u32 signature;
> + u16 pcc_command;
> + u16 pcc_status;
> + u16 command_register;
> + u16 status_register;
> + u16 power_state_id;
> + u16 power_node_id;
> + u64 energy_consumed;
> + u64 average_power;
> +};
> +
> +/****************************************************************************
> ***
> + *
> + * PCCT - Platform Communications Channel Table (ACPI 5.0)
> + *        Version 1
> + *
> + 
> 
******************************************************************************>
/
> +
> +struct acpi_table_pcct {
> + struct acpi_table_header header; /* Common ACPI table header */
> + u32 flags;
> + u32 latency;
> + u32 reserved;
> +};
> +
> +/* Values for Flags field above */
> +
> +#define ACPI_PCCT_DOORBELL              1
> +
> +/*
> + * PCCT subtables
> + */
> +
> +/* 0: Generic Communications Subspace */
> +
> +struct acpi_pcct_subspace {
> + struct acpi_subtable_header header;
> + u8 reserved[6];
> + u64 base_address;
> + u64 length;
> + struct acpi_generic_address doorbell_register;
> + u64 preserve_mask;
> + u64 write_mask;
> +};
> +
> +/*
> + * PCC memory structures (not part of the ACPI table)
> + */
> +
> +/* Shared Memory Region */
> +
> +struct acpi_pcct_shared_memory {
> + u32 signature;
> + u16 command;
> + u16 status;
> +};
> +
> +/****************************************************************************
> ***
> + *
> + * PMTT - Platform Memory Topology Table (ACPI 5.0)
> + *        Version 1
> + *
> + 
> 
******************************************************************************>
/
> +
> +struct acpi_table_pmtt {
> + struct acpi_table_header header; /* Common ACPI table header */
> + u32 reserved;
> +};
> +
> +/* Common header for PMTT subtables that follow main table */
> +
> +struct acpi_pmtt_header {
> + u8 type;
> + u8 reserved1;
> + u16 length;
> + u16 flags;
> + u16 reserved2;
> +};
> +
> +/* Values for Type field above */
> +
> +#define ACPI_PMTT_TYPE_SOCKET           0
> +#define ACPI_PMTT_TYPE_CONTROLLER       1
> +#define ACPI_PMTT_TYPE_DIMM             2
> +#define ACPI_PMTT_TYPE_RESERVED         3 /* 0x03-0xFF are reserved */
> +
> +/* Values for Flags field above */
> +
> +#define ACPI_PMTT_TOP_LEVEL             0x0001
> +#define ACPI_PMTT_PHYSICAL              0x0002
> +#define ACPI_PMTT_MEMORY_TYPE           0x000C
> +
> +/*
> + * PMTT subtables, correspond to Type in struct acpi_pmtt_header
> + */
> +
> +/* 0: Socket Structure */
> +
> +struct acpi_pmtt_socket {
> + struct acpi_pmtt_header header;
> + u16 socket_id;
> + u16 reserved;
> +};
> +
> +/* 1: Memory Controller subtable */
> +
> +struct acpi_pmtt_controller {
> + struct acpi_pmtt_header header;
> + u32 read_latency;
> + u32 write_latency;
> + u32 read_bandwidth;
> + u32 write_bandwidth;
> + u16 access_width;
> + u16 alignment;
> + u16 reserved;
> + u16 domain_count;
> +};
> +
> +/* 1a: Proximity Domain substructure */
> +
> +struct acpi_pmtt_domain {
> + u32 proximity_domain;
> +};
> +
> +/* 2: Physical Component Identifier (DIMM) */
> +
> +struct acpi_pmtt_physical_component {
> + struct acpi_pmtt_header header;
> + u16 component_id;
> + u16 reserved;
> + u32 memory_size;
> + u32 bios_handle;
> +};
> +
> +/****************************************************************************
> ***
> + *
> + * RASF - RAS Feature Table (ACPI 5.0)
> + *        Version 1
> + *
> + 
> 
******************************************************************************>
/
> +
> +struct acpi_table_rasf {
> + struct acpi_table_header header; /* Common ACPI table header */
> + u8 channel_id[12];
> +};
> +
> +/* RASF Platform Communication Channel Shared Memory Region */
> +
> +struct acpi_rasf_shared_memory {
> + u32 signature;
> + u16 command;
> + u16 status;
> + u64 requested_address;
> + u64 requested_length;
> + u64 actual_address;
> + u64 actual_length;
> + u16 flags;
> + u8 speed;
> +};
> +
> +/* Masks for Flags and Speed fields above */
> +
> +#define ACPI_RASF_SCRUBBER_RUNNING      1
> +#define ACPI_RASF_SPEED                 (7<<1)
> +
> +/* Channel Commands */
> +
> +enum acpi_rasf_commands {
> + ACPI_RASF_GET_RAS_CAPABILITIES = 1,
> + ACPI_RASF_GET_PATROL_PARAMETERS = 2,
> + ACPI_RASF_START_PATROL_SCRUBBER = 3,
> + ACPI_RASF_STOP_PATROL_SCRUBBER = 4
> +};
> +
> +/* Channel Command flags */
> +
> +#define ACPI_RASF_GENERATE_SCI          (1<<15)
> +
> +/* Status values */
> +
> +enum acpi_rasf_status {
> + ACPI_RASF_SUCCESS = 0,
> + ACPI_RASF_NOT_VALID = 1,
> + ACPI_RASF_NOT_SUPPORTED = 2,
> + ACPI_RASF_BUSY = 3,
> + ACPI_RASF_FAILED = 4,
> + ACPI_RASF_ABORTED = 5,
> + ACPI_RASF_INVALID_DATA = 6
> +};
> +
> +/* Status flags */
> +
> +#define ACPI_RASF_COMMAND_COMPLETE      (1)
> +#define ACPI_RASF_SCI_DOORBELL          (1<<1)
> +#define ACPI_RASF_ERROR                 (1<<2)
> +#define ACPI_RASF_STATUS                (0x1F<<3)
> +
> +/* Reset to default packing */
> +
> +#pragma pack()
> +
> +#endif    /* __ACTBL3_H__ */
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx
> http://lists.xen.org/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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