Changeset View
Changeset View
Standalone View
Standalone View
sys/x86/xen/pv.c
Show First 20 Lines • Show All 562 Lines • ▼ Show 20 Lines | xen_pvh_parse_preload_data(uint64_t modulep) | ||||
caddr_t kmdp; | caddr_t kmdp; | ||||
vm_ooffset_t off; | vm_ooffset_t off; | ||||
vm_paddr_t metadata; | vm_paddr_t metadata; | ||||
char *envp; | char *envp; | ||||
char acpi_rsdp[19]; | char acpi_rsdp[19]; | ||||
if (start_info->modlist_paddr != 0) { | if (start_info->modlist_paddr != 0) { | ||||
struct hvm_modlist_entry *mod; | struct hvm_modlist_entry *mod; | ||||
const char *cmdline; | |||||
mod = (struct hvm_modlist_entry *) | mod = (struct hvm_modlist_entry *) | ||||
(start_info->modlist_paddr + KERNBASE); | (start_info->modlist_paddr + KERNBASE); | ||||
preload_metadata = (caddr_t)(mod[0].paddr + KERNBASE); | cmdline = mod[0].cmdline_paddr ? | ||||
(const char *)(mod[0].cmdline_paddr + KERNBASE) : NULL; | |||||
if (strcmp(cmdline, "header") == 0) { | |||||
struct xen_header *header; | |||||
header = (struct xen_header *)(mod[0].paddr + KERNBASE); | |||||
if ((header->flags & XENHEADER_HAS_MODULEP_OFFSET) != | |||||
XENHEADER_HAS_MODULEP_OFFSET) { | |||||
xc_printf("Unable to load module metadata\n"); | |||||
HYPERVISOR_shutdown(SHUTDOWN_crash); | |||||
} | |||||
preload_metadata = (caddr_t)(mod[0].paddr + | |||||
header->modulep_offset + KERNBASE); | |||||
kmdp = preload_search_by_type("elf kernel"); | kmdp = preload_search_by_type("elf kernel"); | ||||
if (kmdp == NULL) | if (kmdp == NULL) | ||||
kmdp = preload_search_by_type("elf64 kernel"); | kmdp = preload_search_by_type("elf64 kernel"); | ||||
KASSERT(kmdp != NULL, ("unable to find kernel")); | if (kmdp == NULL) { | ||||
xc_printf("Unable to find kernel\n"); | |||||
HYPERVISOR_shutdown(SHUTDOWN_crash); | |||||
} | |||||
/* | /* | ||||
* Xen has relocated the metadata and the modules, | * Xen has relocated the metadata and the modules, so | ||||
* so we need to recalculate it's position. This is | * we need to recalculate it's position. This is done | ||||
* done by saving the original modulep address and | * by saving the original modulep address and then | ||||
* then calculating the offset with mod_start, | * calculating the offset from the real modulep | ||||
* which contains the relocated modulep address. | * position. | ||||
*/ | */ | ||||
metadata = MD_FETCH(kmdp, MODINFOMD_MODULEP, | |||||
vm_paddr_t); | |||||
off = mod[0].paddr + header->modulep_offset - metadata + | |||||
KERNBASE; | |||||
} else { | |||||
preload_metadata = (caddr_t)(mod[0].paddr + KERNBASE); | |||||
kmdp = preload_search_by_type("elf kernel"); | |||||
if (kmdp == NULL) | |||||
kmdp = preload_search_by_type("elf64 kernel"); | |||||
if (kmdp == NULL) { | |||||
xc_printf("Unable to find kernel\n"); | |||||
HYPERVISOR_shutdown(SHUTDOWN_crash); | |||||
} | |||||
metadata = MD_FETCH(kmdp, MODINFOMD_MODULEP, vm_paddr_t); | metadata = MD_FETCH(kmdp, MODINFOMD_MODULEP, vm_paddr_t); | ||||
off = mod[0].paddr + KERNBASE - metadata; | off = mod[0].paddr + KERNBASE - metadata; | ||||
} | |||||
preload_bootstrap_relocate(off); | preload_bootstrap_relocate(off); | ||||
boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int); | boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int); | ||||
envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *); | envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *); | ||||
if (envp != NULL) | if (envp != NULL) | ||||
envp += off; | envp += off; | ||||
xen_pvh_set_env(envp, reject_option); | xen_pvh_set_env(envp, reject_option); | ||||
▲ Show 20 Lines • Show All 42 Lines • Show Last 20 Lines |