mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-08-03 01:06:53 +00:00
hv: Other preparation for trampoline code relocation
- For UEFI boot, allocate memory for trampoline code in ACRN EFI, and pass the pointer to HV through efi_ctx - Correct LOW_RAM_SIZE and LOW_RAM_START in Kconfig and bsp_cfg.h - use trampline_start16_paddr instead of the hardcoded CONFIG_LOW_RAM_START for initial guest GDT and page tables Signed-off-by: Zheng, Gen <gen.zheng@intel.com> Signed-off-by: Jason Chen CJ <jason.cj.chen@intel.com> Signed-off-by: Zide Chen <zide.chen@intel.com> Acked-by: Eddie Dong <eddie.dong@intel.com> Acked-by: Xu, Anthony <anthony.xu@intel.com>
This commit is contained in:
parent
40c8c4d3c3
commit
2a1a6ad0af
@ -74,15 +74,9 @@ config MEM_LOGLEVEL_DEFAULT
|
|||||||
int "Default loglevel in memory"
|
int "Default loglevel in memory"
|
||||||
default 4
|
default 4
|
||||||
|
|
||||||
config LOW_RAM_START
|
|
||||||
hex "Address of the beginning of low RAM region"
|
|
||||||
default 0x00001000 if PLATFORM_SBL
|
|
||||||
default 0x00008000 if PLATFORM_UEFI
|
|
||||||
|
|
||||||
config LOW_RAM_SIZE
|
config LOW_RAM_SIZE
|
||||||
hex "Size of the low RAM region"
|
hex "Size of the low RAM region"
|
||||||
default 0x000cf000 if PLATFORM_SBL
|
default 0x00010000
|
||||||
default 0x00010000 if PLATFORM_UEFI
|
|
||||||
|
|
||||||
config RAM_START
|
config RAM_START
|
||||||
hex "Address of the RAM region assigned to the hypervisor"
|
hex "Address of the RAM region assigned to the hypervisor"
|
||||||
|
@ -26,6 +26,8 @@ volatile uint32_t up_count = 0;
|
|||||||
/* physical cpu active bitmap, support up to 64 cpus */
|
/* physical cpu active bitmap, support up to 64 cpus */
|
||||||
uint64_t pcpu_active_bitmap = 0;
|
uint64_t pcpu_active_bitmap = 0;
|
||||||
|
|
||||||
|
uint64_t trampline_start16_paddr;
|
||||||
|
|
||||||
/* TODO: add more capability per requirement */
|
/* TODO: add more capability per requirement */
|
||||||
/*APICv features*/
|
/*APICv features*/
|
||||||
#define VAPIC_FEATURE_VIRT_ACCESS (1 << 0)
|
#define VAPIC_FEATURE_VIRT_ACCESS (1 << 0)
|
||||||
|
@ -674,9 +674,8 @@ uint64_t e820_alloc_low_memory(uint32_t size)
|
|||||||
* This API assume that the trusty memory is remapped to guest physical address
|
* This API assume that the trusty memory is remapped to guest physical address
|
||||||
* of 511G to 511G + 16MB
|
* of 511G to 511G + 16MB
|
||||||
*
|
*
|
||||||
* FIXME: here using hard code GUEST_INIT_PAGE_TABLE_START as guest init page
|
* FIXME: here the guest init page table will occupy at most
|
||||||
* table gpa start, and it will occupy at most GUEST_INIT_PT_PAGE_NUM pages.
|
* GUEST_INIT_PT_PAGE_NUM pages. Some check here:
|
||||||
* Some check here:
|
|
||||||
* - guest page table space should not override trampline code area
|
* - guest page table space should not override trampline code area
|
||||||
* (it's a little tricky here, as under current identical mapping, HV & SOS
|
* (it's a little tricky here, as under current identical mapping, HV & SOS
|
||||||
* share same memory under 1M; under uefi boot mode, the defered AP startup
|
* share same memory under 1M; under uefi boot mode, the defered AP startup
|
||||||
@ -688,7 +687,7 @@ uint64_t e820_alloc_low_memory(uint32_t size)
|
|||||||
* after guest realmode/32bit no paging mode got supported.
|
* after guest realmode/32bit no paging mode got supported.
|
||||||
******************************************************************/
|
******************************************************************/
|
||||||
#define GUEST_INIT_PAGE_TABLE_SKIP_SIZE 0x8000UL
|
#define GUEST_INIT_PAGE_TABLE_SKIP_SIZE 0x8000UL
|
||||||
#define GUEST_INIT_PAGE_TABLE_START (CONFIG_LOW_RAM_START + \
|
#define GUEST_INIT_PAGE_TABLE_START (trampline_start16_paddr + \
|
||||||
GUEST_INIT_PAGE_TABLE_SKIP_SIZE)
|
GUEST_INIT_PAGE_TABLE_SKIP_SIZE)
|
||||||
#define GUEST_INIT_PT_PAGE_NUM 7
|
#define GUEST_INIT_PT_PAGE_NUM 7
|
||||||
#define RSDP_F_ADDR 0xE0000
|
#define RSDP_F_ADDR 0xE0000
|
||||||
@ -794,7 +793,7 @@ uint64_t create_guest_initial_paging(struct vm *vm)
|
|||||||
******************************************************************/
|
******************************************************************/
|
||||||
|
|
||||||
#define GUEST_INIT_GDT_SKIP_SIZE 0x8000UL
|
#define GUEST_INIT_GDT_SKIP_SIZE 0x8000UL
|
||||||
#define GUEST_INIT_GDT_START (CONFIG_LOW_RAM_START + \
|
#define GUEST_INIT_GDT_START (trampline_start16_paddr + \
|
||||||
GUEST_INIT_GDT_SKIP_SIZE)
|
GUEST_INIT_GDT_SKIP_SIZE)
|
||||||
|
|
||||||
/* The GDT defined below compatible with linux kernel */
|
/* The GDT defined below compatible with linux kernel */
|
||||||
|
@ -17,8 +17,7 @@
|
|||||||
#define HEAP_SIZE 0x100000
|
#define HEAP_SIZE 0x100000
|
||||||
#define CONSOLE_LOGLEVEL_DEFAULT 3
|
#define CONSOLE_LOGLEVEL_DEFAULT 3
|
||||||
#define MEM_LOGLEVEL_DEFAULT 5
|
#define MEM_LOGLEVEL_DEFAULT 5
|
||||||
#define CONFIG_LOW_RAM_START 0x00001000
|
#define CONFIG_LOW_RAM_SIZE 0x00010000
|
||||||
#define CONFIG_LOW_RAM_SIZE 0x000CF000
|
|
||||||
#define CONFIG_RAM_START 0x6E000000
|
#define CONFIG_RAM_START 0x6E000000
|
||||||
#define CONFIG_RAM_SIZE 0x02000000 /* 32M */
|
#define CONFIG_RAM_SIZE 0x02000000 /* 32M */
|
||||||
#define CONFIG_MTRR_ENABLED 1
|
#define CONFIG_MTRR_ENABLED 1
|
||||||
|
@ -190,12 +190,6 @@ again:
|
|||||||
mmap[j].mm_type = E820_RAM;
|
mmap[j].mm_type = E820_RAM;
|
||||||
j++;
|
j++;
|
||||||
|
|
||||||
/* reserve secondary memory region(0x1000 ~ 0x10000) for hv */
|
|
||||||
err = __emalloc(CONFIG_LOW_RAM_SIZE, CONFIG_LOW_RAM_START,
|
|
||||||
&addr, EfiReservedMemoryType);
|
|
||||||
if (err != EFI_SUCCESS)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
mbi->mi_flags |= MULTIBOOT_INFO_HAS_MMAP | MULTIBOOT_INFO_HAS_CMDLINE;
|
mbi->mi_flags |= MULTIBOOT_INFO_HAS_MMAP | MULTIBOOT_INFO_HAS_CMDLINE;
|
||||||
mbi->mi_mmap_length = j*sizeof(struct multiboot_mmap);
|
mbi->mi_mmap_length = j*sizeof(struct multiboot_mmap);
|
||||||
|
|
||||||
@ -227,6 +221,13 @@ switch_to_guest_mode(EFI_HANDLE image)
|
|||||||
|
|
||||||
efi_ctx = (struct efi_ctx *)(UINTN)addr;
|
efi_ctx = (struct efi_ctx *)(UINTN)addr;
|
||||||
|
|
||||||
|
/* reserve secondary memory region for hv */
|
||||||
|
err = emalloc_for_low_mem(&addr, CONFIG_LOW_RAM_SIZE);
|
||||||
|
if (err != EFI_SUCCESS)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
efi_ctx->ap_trampline_buf = (void *)addr;
|
||||||
|
|
||||||
config_table = sys_table->ConfigurationTable;
|
config_table = sys_table->ConfigurationTable;
|
||||||
|
|
||||||
for (i = 0; i < sys_table->NumberOfTableEntries; i++) {
|
for (i = 0; i < sys_table->NumberOfTableEntries; i++) {
|
||||||
|
@ -95,6 +95,7 @@ struct e820_entry {
|
|||||||
struct efi_ctx {
|
struct efi_ctx {
|
||||||
uint64_t rip;
|
uint64_t rip;
|
||||||
VOID *rsdp;
|
VOID *rsdp;
|
||||||
|
VOID *ap_trampline_buf;
|
||||||
dt_addr_t gdt;
|
dt_addr_t gdt;
|
||||||
dt_addr_t idt;
|
dt_addr_t idt;
|
||||||
uint16_t tr_sel;
|
uint16_t tr_sel;
|
||||||
|
@ -17,7 +17,6 @@
|
|||||||
#define HEAP_SIZE 0x100000
|
#define HEAP_SIZE 0x100000
|
||||||
#define CONSOLE_LOGLEVEL_DEFAULT 3
|
#define CONSOLE_LOGLEVEL_DEFAULT 3
|
||||||
#define MEM_LOGLEVEL_DEFAULT 5
|
#define MEM_LOGLEVEL_DEFAULT 5
|
||||||
#define CONFIG_LOW_RAM_START 0x00008000
|
|
||||||
#define CONFIG_LOW_RAM_SIZE 0x00010000
|
#define CONFIG_LOW_RAM_SIZE 0x00010000
|
||||||
#define CONFIG_RAM_START 0x20000000
|
#define CONFIG_RAM_START 0x20000000
|
||||||
#define CONFIG_RAM_SIZE 0x02000000 /* 32M */
|
#define CONFIG_RAM_SIZE 0x02000000 /* 32M */
|
||||||
|
@ -97,6 +97,11 @@ void *get_rsdp_from_uefi(void)
|
|||||||
return HPA2HVA(efi_ctx->rsdp);
|
return HPA2HVA(efi_ctx->rsdp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *get_ap_trampline_buf(void)
|
||||||
|
{
|
||||||
|
return efi_ctx->ap_trampline_buf;
|
||||||
|
}
|
||||||
|
|
||||||
static void efi_init(void)
|
static void efi_init(void)
|
||||||
{
|
{
|
||||||
struct multiboot_info *mbi = NULL;
|
struct multiboot_info *mbi = NULL;
|
||||||
|
@ -169,6 +169,7 @@ extern uint8_t trampline_pdpt_addr[];
|
|||||||
extern uint8_t trampline_gdt_ptr[];
|
extern uint8_t trampline_gdt_ptr[];
|
||||||
extern uint8_t trampline_start64_fixup[];
|
extern uint8_t trampline_start64_fixup[];
|
||||||
|
|
||||||
|
extern uint64_t trampline_start16_paddr;
|
||||||
extern int ibrs_type;
|
extern int ibrs_type;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -15,6 +15,7 @@ typedef struct {
|
|||||||
struct efi_ctx {
|
struct efi_ctx {
|
||||||
uint64_t rip;
|
uint64_t rip;
|
||||||
void *rsdp;
|
void *rsdp;
|
||||||
|
void *ap_trampline_buf;
|
||||||
dt_addr_t gdt;
|
dt_addr_t gdt;
|
||||||
dt_addr_t idt;
|
dt_addr_t idt;
|
||||||
uint16_t tr_sel;
|
uint16_t tr_sel;
|
||||||
@ -50,5 +51,6 @@ struct efi_ctx {
|
|||||||
}__attribute__((packed));
|
}__attribute__((packed));
|
||||||
|
|
||||||
void *get_rsdp_from_uefi(void);
|
void *get_rsdp_from_uefi(void);
|
||||||
|
void *get_ap_trampline_buf(void);
|
||||||
|
|
||||||
#endif /* UEFI_H*/
|
#endif /* UEFI_H*/
|
||||||
|
Loading…
Reference in New Issue
Block a user