[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 |