UEFI: create new func named construct_mbi

Cleanup the mass code for constructing multiboot info

Signed-off-by: Zheng, Gen <gen.zheng@intel.com>
This commit is contained in:
Zheng, Gen 2018-03-30 12:33:23 +08:00 committed by Jack Ren
parent 2bec3b3c73
commit 88b79c901b
1 changed files with 54 additions and 45 deletions

View File

@ -63,28 +63,19 @@ static inline void hv_jump(EFI_PHYSICAL_ADDRESS hv_start,
hf(MULTIBOOT_INFO_MAGIC, mbi);
}
static EFI_STATUS
switch_to_guest_mode(EFI_HANDLE image)
EFI_STATUS
construct_mbi(struct multiboot_info **mbi_ret, struct efi_ctx *efi_ctx)
{
UINTN map_size, _map_size, map_key;
UINT32 desc_version;
UINTN desc_size;
EFI_MEMORY_DESCRIPTOR *map_buf;
EFI_PHYSICAL_ADDRESS addr;
EFI_STATUS err;
struct multiboot_mmap *mmap;
EFI_STATUS err = EFI_SUCCESS;
struct multiboot_info *mbi;
struct efi_ctx *efi_ctx;
struct acpi_table_rsdp *rsdp = NULL;
struct multiboot_mmap *mmap;
int i, j;
err = emalloc(sizeof(struct efi_ctx), 8, &addr);
if (err != EFI_SUCCESS)
goto out;
efi_ctx = (struct efi_ctx *)(UINTN)addr;
/* multiboot info */
err = emalloc(16384, 8, &addr);
if (err != EFI_SUCCESS)
@ -100,28 +91,6 @@ switch_to_guest_mode(EFI_HANDLE image)
mmap = (struct multiboot_mmap *)(UINTN)addr;
memset((void *)mmap, 0x0, sizeof(*mmap)*128);
EFI_CONFIGURATION_TABLE *config_table = sys_table->ConfigurationTable;
for (i = 0; i < sys_table->NumberOfTableEntries;i++) {
EFI_GUID acpi_20_table_guid = ACPI_20_TABLE_GUID;
EFI_GUID acpi_table_guid = ACPI_TABLE_GUID;
if (CompareGuid(&acpi_20_table_guid, &config_table->VendorGuid) == 0) {
rsdp = config_table->VendorTable;
break;
}
if (CompareGuid(&acpi_table_guid, &config_table->VendorGuid) == 0)
rsdp = config_table->VendorTable;
config_table++;
}
if (!rsdp) {
Print(L"unable to find RSDP\n");
goto out;
}
/* We're just interested in the map's size for now */
map_size = 0;
err = get_memory_map(&map_size, NULL, NULL, NULL, NULL);
@ -199,15 +168,6 @@ again:
default:
continue;
}
if (e820_type == E820_RAM) {
UINT64 start = d->PhysicalStart;
UINT64 end = d->PhysicalStart
+ (d->NumberOfPages<<EFI_PAGE_SHIFT);
if (start <= CONFIG_RAM_START && end >
(CONFIG_RAM_START + CONFIG_RAM_SIZE))
Print(L"e820[%d] start=%lx len=%lx\n", i,
d->PhysicalStart, d->NumberOfPages << EFI_PAGE_SHIFT);
}
if (j && mmap[j-1].mm_type == e820_type &&
(mmap[j-1].mm_base_addr + mmap[j-1].mm_length)
@ -246,9 +206,58 @@ again:
mbi->mi_flags |= MULTIBOOT_INFO_HAS_DRIVES;
mbi->mi_drives_addr = (UINT32)(UINTN)efi_ctx;
*mbi_ret = mbi;
out:
return err;
}
static EFI_STATUS
switch_to_guest_mode(EFI_HANDLE image)
{
EFI_PHYSICAL_ADDRESS addr;
EFI_STATUS err;
struct multiboot_info *mbi = NULL;
struct efi_ctx *efi_ctx;
struct acpi_table_rsdp *rsdp = NULL;
int i;
EFI_CONFIGURATION_TABLE *config_table;
err = emalloc(sizeof(struct efi_ctx), 8, &addr);
if (err != EFI_SUCCESS)
goto out;
efi_ctx = (struct efi_ctx *)(UINTN)addr;
config_table = sys_table->ConfigurationTable;
for (i = 0; i < sys_table->NumberOfTableEntries; i++) {
EFI_GUID acpi_20_table_guid = ACPI_20_TABLE_GUID;
EFI_GUID acpi_table_guid = ACPI_TABLE_GUID;
if (CompareGuid(&acpi_20_table_guid,
&config_table->VendorGuid) == 0) {
rsdp = config_table->VendorTable;
break;
}
if (CompareGuid(&acpi_table_guid,
&config_table->VendorGuid) == 0)
rsdp = config_table->VendorTable;
config_table++;
}
if (!rsdp) {
Print(L"unable to find RSDP\n");
goto out;
}
efi_ctx->rsdp = rsdp;
//Print(L"start 9!\n");
/* construct multiboot info and deliver it to hypervisor */
err = construct_mbi(&mbi, efi_ctx);
if (err != EFI_SUCCESS)
goto out;
asm volatile ("mov %%cr0, %0" : "=r"(efi_ctx->cr0));
asm volatile ("mov %%cr3, %0" : "=r"(efi_ctx->cr3));