mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 18:21:39 +01:00
Guest kernel does need to know in some cases where the tables are located
to treat these regions properly. One example is kexec process where
the first kernel needs to pass ACPI region locations to the second
kernel which is now a requirement in Linux after 02a3e3cdb7f12 ("x86/boot:
Parse SRAT table and count immovable memory regions") in order for kexec
transition to actually work.
That commit introduced accesses to XSDT and SRAT while the second kernel
is still using kexec transition tables. The transition tables do not have
e820 "reserved" regions mapped where those tables are located currently
in a Xen guest. Instead "ACPI data" regions are mapped with the transition
tables that was introduced by the following commit 6bbeb276b7 ("x86/kexec:
Add the EFI system tables and ACPI tables to the ident map").
Reserve 1MB (out of 16MB currently available) right after ACPI info page for
ACPI tables exclusively but populate this region on demand and only indicate
populated memory as "ACPI data" since according to ACPI spec that memory is
reclaimable by the guest if necessary. That is close to how we treat
the same ACPI data in PVH guests. 1MB should be enough for now but could be
later extended if required.
Signed-off-by: Igor Druzhinin <igor.druzhinin@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
103 lines
2.9 KiB
C
103 lines
2.9 KiB
C
#ifndef __HVMLOADER_CONFIG_H__
|
|
#define __HVMLOADER_CONFIG_H__
|
|
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
|
|
enum virtual_vga { VGA_none, VGA_std, VGA_cirrus, VGA_pt };
|
|
extern enum virtual_vga virtual_vga;
|
|
|
|
extern unsigned long igd_opregion_pgbase;
|
|
#define IGD_OPREGION_PAGES 3
|
|
|
|
struct bios_config {
|
|
const char *name;
|
|
|
|
/* BIOS ROM image bits */
|
|
void *image;
|
|
unsigned int image_size;
|
|
|
|
/* Physical address to load at */
|
|
unsigned int bios_address;
|
|
|
|
/* ROMS */
|
|
void (*load_roms)(void);
|
|
|
|
void (*bios_load)(const struct bios_config *config, void *addr,
|
|
uint32_t size, void *extra_addr);
|
|
|
|
void (*bios_info_setup)(void);
|
|
void (*bios_info_finish)(void);
|
|
|
|
void (*e820_setup)(void);
|
|
|
|
void (*acpi_build_tables)(void);
|
|
void (*create_mp_tables)(void);
|
|
void (*create_smbios_tables)(void);
|
|
void (*create_pir_tables)(void);
|
|
};
|
|
|
|
extern struct bios_config rombios_config;
|
|
extern struct bios_config seabios_config;
|
|
extern struct bios_config ovmf_config;
|
|
|
|
#define PAGE_SHIFT 12
|
|
#define PAGE_SIZE (1ul << PAGE_SHIFT)
|
|
|
|
extern uint32_t ioapic_base_address;
|
|
extern uint8_t ioapic_version;
|
|
|
|
#define IOAPIC_ID 0x01
|
|
|
|
#define LAPIC_BASE_ADDRESS 0xfee00000
|
|
#define LAPIC_ID(vcpu_id) ((vcpu_id) * 2)
|
|
|
|
#define PCI_ISA_DEVFN 0x08 /* dev 1, fn 0 */
|
|
#define PCI_ISA_IRQ_MASK 0x0c20U /* ISA IRQs 5,10,11 are PCI connected */
|
|
|
|
/* MMIO hole: Hardcoded defaults, which can be dynamically expanded. */
|
|
#define PCI_MEM_END 0xfc000000
|
|
|
|
#define ACPI_TIS_HDR_ADDRESS 0xFED40F00UL
|
|
|
|
extern unsigned long pci_mem_start, pci_mem_end;
|
|
extern uint64_t pci_hi_mem_start, pci_hi_mem_end;
|
|
|
|
extern bool acpi_enabled;
|
|
|
|
/* Memory map. */
|
|
#define SCRATCH_PHYSICAL_ADDRESS 0x00010000
|
|
#define HYPERCALL_PHYSICAL_ADDRESS 0x00080000
|
|
#define VGABIOS_PHYSICAL_ADDRESS 0x000C0000
|
|
#define HVMLOADER_PHYSICAL_ADDRESS 0x00100000
|
|
/* 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 ACPI_MEMORY_DYNAMIC_START 0xFC001000
|
|
#define RESERVED_MEMORY_DYNAMIC_START 0xFC100000
|
|
#define RESERVED_MEMORY_DYNAMIC_END 0xFE000000
|
|
/*
|
|
* GUEST_RESERVED: Physical address space reserved for guest use.
|
|
* This is not dynamically advertised to guests, so this range must *never*
|
|
* be used for any purpose by us, in future. It must always be marked as
|
|
* reserved in the memory map (e.g., E820_RESERVED) so that mechanisms such
|
|
* as PCI BAR remapping do not allocate from this region.
|
|
*/
|
|
#define GUEST_RESERVED_START 0xFE700000
|
|
#define GUEST_RESERVED_END 0xFE800000
|
|
|
|
extern unsigned long scratch_start;
|
|
|
|
#endif /* __HVMLOADER_CONFIG_H__ */
|
|
|
|
/*
|
|
* Local variables:
|
|
* mode: C
|
|
* c-file-style: "BSD"
|
|
* c-basic-offset: 4
|
|
* tab-width: 4
|
|
* indent-tabs-mode: nil
|
|
* End:
|
|
*/
|