|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |