diff options
author | Keir Fraser <keir@xen.org> | 2011-11-14 20:15:35 +0000 |
---|---|---|
committer | Keir Fraser <keir@xen.org> | 2011-11-14 20:15:35 +0000 |
commit | 029265a33af16749819a057257f77301f36910bc (patch) | |
tree | 7eb14159198f8fb66b72d6a795c3f40a1c7f0510 /tools/firmware | |
parent | 8698d6d56bc56ba0daabab40497d04e85ea05937 (diff) | |
download | xen-029265a33af16749819a057257f77301f36910bc.tar.gz xen-029265a33af16749819a057257f77301f36910bc.tar.bz2 xen-029265a33af16749819a057257f77301f36910bc.zip |
hvmloader: Move acpi_info structure out from low memory.
This avoids a conflict with SeaBIOS's memory management. Moreover
there is no reason that acp_info must live below 1MB, and moving it
out actually simplifies our code.
Signed-off-by: Keir Fraser <keir@xen.org>
Diffstat (limited to 'tools/firmware')
-rw-r--r-- | tools/firmware/hvmloader/acpi/build.c | 5 | ||||
-rw-r--r-- | tools/firmware/hvmloader/acpi/dsdt.asl | 4 | ||||
-rw-r--r-- | tools/firmware/hvmloader/config.h | 11 | ||||
-rw-r--r-- | tools/firmware/hvmloader/e820.c | 55 | ||||
-rw-r--r-- | tools/firmware/hvmloader/rombios.c | 1 | ||||
-rw-r--r-- | tools/firmware/hvmloader/util.c | 2 |
6 files changed, 24 insertions, 54 deletions
diff --git a/tools/firmware/hvmloader/acpi/build.c b/tools/firmware/hvmloader/acpi/build.c index c902885080..02cdf14ad1 100644 --- a/tools/firmware/hvmloader/acpi/build.c +++ b/tools/firmware/hvmloader/acpi/build.c @@ -276,7 +276,7 @@ static int construct_secondary_tables(unsigned long *table_ptrs, void acpi_build_tables(struct acpi_config *config, unsigned int physical) { - struct acpi_info *acpi_info = (struct acpi_info *)ACPI_INFO_PHYSICAL_ADDRESS; + struct acpi_info *acpi_info; struct acpi_20_rsdp *rsdp; struct acpi_20_rsdt *rsdt; struct acpi_20_xsdt *xsdt; @@ -287,6 +287,9 @@ void acpi_build_tables(struct acpi_config *config, unsigned int physical) unsigned long secondary_tables[16]; int nr_secondaries, i; + /* Allocate and initialise the acpi info area. */ + mem_hole_populate_ram(ACPI_INFO_PHYSICAL_ADDRESS >> PAGE_SHIFT, 1); + acpi_info = (struct acpi_info *)ACPI_INFO_PHYSICAL_ADDRESS; memset(acpi_info, 0, sizeof(*acpi_info)); /* diff --git a/tools/firmware/hvmloader/acpi/dsdt.asl b/tools/firmware/hvmloader/acpi/dsdt.asl index 0549d7b607..8ae90db2b1 100644 --- a/tools/firmware/hvmloader/acpi/dsdt.asl +++ b/tools/firmware/hvmloader/acpi/dsdt.asl @@ -61,8 +61,8 @@ DefinitionBlock ("DSDT.aml", "DSDT", 2, "Xen", "HVM", 0) Scope (\_SB) { - /* ACPI_INFO_PHYSICAL_ADDRESS == 0x9F000 */ - OperationRegion(BIOS, SystemMemory, 0x9F000, 24) + /* ACPI_INFO_PHYSICAL_ADDRESS == 0xFC000000 */ + OperationRegion(BIOS, SystemMemory, 0xFC000000, 24) Field(BIOS, ByteAcc, NoLock, Preserve) { UAR1, 1, UAR2, 1, diff --git a/tools/firmware/hvmloader/config.h b/tools/firmware/hvmloader/config.h index 079416613e..d911352e82 100644 --- a/tools/firmware/hvmloader/config.h +++ b/tools/firmware/hvmloader/config.h @@ -54,18 +54,17 @@ extern struct bios_config seabios_config; #define PCI_MEM_END 0xfc000000 extern unsigned long pci_mem_start, pci_mem_end; -/* Reserved for special BIOS mappings, etc. */ -#define RESERVED_MEMBASE 0xfc000000 /* Memory map. */ #define SCRATCH_PHYSICAL_ADDRESS 0x00010000 #define HYPERCALL_PHYSICAL_ADDRESS 0x00080000 -#define ACPI_INFO_PHYSICAL_ADDRESS 0x0009F000 #define VGABIOS_PHYSICAL_ADDRESS 0x000C0000 #define HVMLOADER_PHYSICAL_ADDRESS 0x00100000 - -#define ACPI_INFO_SIZE 0xC00 -#define ACPI_INFO_PHYSICAL_END (ACPI_INFO_PHYSICAL_ADDRESS + ACPI_INFO_SIZE) +/* Special BIOS mappings, etc. are allocated from here upwards... */ +#define RESERVED_MEMBASE 0xFC000000 +/* NB. ACPI_INFO_PHYSICAL_ADDRESS *MUST* match definition in acpi/dsdt.asl! */ +#define ACPI_INFO_PHYSICAL_ADDRESS 0xFC000000 +#define RESERVED_MEMORY_DYNAMIC 0xFC001000 extern unsigned long scratch_start; diff --git a/tools/firmware/hvmloader/e820.c b/tools/firmware/hvmloader/e820.c index 8e68e8c9a3..3b50dd015d 100644 --- a/tools/firmware/hvmloader/e820.c +++ b/tools/firmware/hvmloader/e820.c @@ -81,55 +81,24 @@ int build_e820_table(struct e820entry *e820, /* Lowmem must be at least 512K to keep Windows happy) */ ASSERT ( lowmem_reserved_base > 512<<10 ); + ASSERT ( bios_image_base < 0x100000 ); + /* - * Lowmem reservation must either cover the ACPI info region - * entirely or not at all. Sitting half way through suggests - * something funny is going on. + * 0x0-lowmem_reserved_base: Ordinary RAM. */ - ASSERT ( lowmem_reserved_base < ACPI_INFO_PHYSICAL_ADDRESS || - lowmem_reserved_base > ACPI_INFO_PHYSICAL_END ); - - ASSERT ( bios_image_base < 0x100000 ); + e820[nr].addr = 0x00000; + e820[nr].size = lowmem_reserved_base; + e820[nr].type = E820_RAM; + nr++; - if ( lowmem_reserved_base < ACPI_INFO_PHYSICAL_ADDRESS ) - { - /* - * 0x0-lowmem_reserved_base: Ordinary RAM. - */ - e820[nr].addr = 0x00000; - e820[nr].size = lowmem_reserved_base; - e820[nr].type = E820_RAM; - nr++; - } - else + /* lowmem_reserved_base-0xA0000: reserved by BIOS implementation. */ + if ( lowmem_reserved_base < 0xA0000 ) { - /* 0x0-ACPI_INFO: Ordinary RAM. */ - e820[nr].addr = 0x00000; - e820[nr].size = ACPI_INFO_PHYSICAL_ADDRESS; - e820[nr].type = E820_RAM; - nr++; - - /* ACPI INFO: Reserved. */ - e820[nr].addr = ACPI_INFO_PHYSICAL_ADDRESS; - e820[nr].size = ACPI_INFO_SIZE; + /* Reserved for internal use. */ + e820[nr].addr = lowmem_reserved_base; + e820[nr].size = 0xA0000-lowmem_reserved_base; e820[nr].type = E820_RESERVED; nr++; - - /* ACPI_INFO-lowmem_reserved_base: Ordinary RAM. */ - e820[nr].addr = ACPI_INFO_PHYSICAL_END; - e820[nr].size = lowmem_reserved_base - ACPI_INFO_PHYSICAL_END; - e820[nr].type = E820_RAM; - nr++; - } - - /* lowmem_reserved_base-0xa00000: reserved by BIOS implementation. */ - if ( lowmem_reserved_base < 0xA0000 ) - { - /* Reserved for internal use. */ - e820[nr].addr = lowmem_reserved_base; - e820[nr].size = 0xA0000-lowmem_reserved_base; - e820[nr].type = E820_RESERVED; - nr++; } /* diff --git a/tools/firmware/hvmloader/rombios.c b/tools/firmware/hvmloader/rombios.c index fa38014354..d5831aa9cf 100644 --- a/tools/firmware/hvmloader/rombios.c +++ b/tools/firmware/hvmloader/rombios.c @@ -47,7 +47,6 @@ static void rombios_setup_e820(void) { /* * 0x9E000-0x09F000: Stack. - * 0x9F000-0x09C000: ACPI info. * 0x9FC00-0x0A0000: Extended BIOS Data Area (EBDA). * ... * 0xE0000-0x0F0000: PC-specific area. We place various tables here. diff --git a/tools/firmware/hvmloader/util.c b/tools/firmware/hvmloader/util.c index 0801fb6aac..c2ba855c4a 100644 --- a/tools/firmware/hvmloader/util.c +++ b/tools/firmware/hvmloader/util.c @@ -343,7 +343,7 @@ void mem_hole_populate_ram(xen_pfn_t mfn, uint32_t nr_mfns) } } -static uint32_t reserve = RESERVED_MEMBASE - 1; +static uint32_t reserve = RESERVED_MEMORY_DYNAMIC - 1; xen_pfn_t mem_hole_alloc(uint32_t nr_mfns) { |