Changeset View
Changeset View
Standalone View
Standalone View
head/sys/arm64/arm64/machdep.c
Show First 20 Lines • Show All 957 Lines • ▼ Show 20 Lines | |||||
#ifdef FDT | #ifdef FDT | ||||
static void | static void | ||||
try_load_dtb(caddr_t kmdp) | try_load_dtb(caddr_t kmdp) | ||||
{ | { | ||||
vm_offset_t dtbp; | vm_offset_t dtbp; | ||||
dtbp = MD_FETCH(kmdp, MODINFOMD_DTBP, vm_offset_t); | dtbp = MD_FETCH(kmdp, MODINFOMD_DTBP, vm_offset_t); | ||||
#if defined(FDT_DTB_STATIC) | |||||
/* | |||||
* In case the device tree blob was not retrieved (from metadata) try | |||||
* to use the statically embedded one. | |||||
*/ | |||||
if (dtbp == 0) | |||||
dtbp = (vm_offset_t)&fdt_static_dtb; | |||||
#endif | |||||
if (dtbp == (vm_offset_t)NULL) { | if (dtbp == (vm_offset_t)NULL) { | ||||
printf("ERROR loading DTB\n"); | printf("ERROR loading DTB\n"); | ||||
return; | return; | ||||
} | } | ||||
if (OF_install(OFW_FDT, 0) == FALSE) | if (OF_install(OFW_FDT, 0) == FALSE) | ||||
panic("Cannot install FDT"); | panic("Cannot install FDT"); | ||||
▲ Show 20 Lines • Show All 87 Lines • ▼ Show 20 Lines | else { | ||||
dczva_line_shift = DCZID_BS_SIZE(dczid_el0); | dczva_line_shift = DCZID_BS_SIZE(dczid_el0); | ||||
dczva_line_size = sizeof(int) << dczva_line_shift; | dczva_line_size = sizeof(int) << dczva_line_shift; | ||||
/* Change pagezero function */ | /* Change pagezero function */ | ||||
pagezero = pagezero_cache; | pagezero = pagezero_cache; | ||||
} | } | ||||
} | } | ||||
static vm_offset_t | |||||
freebsd_parse_boot_param(struct arm64_bootparams *abp) | |||||
{ | |||||
vm_offset_t lastaddr; | |||||
void *kmdp; | |||||
static char *loader_envp; | |||||
preload_metadata = (caddr_t)(uintptr_t)(abp->modulep); | |||||
kmdp = preload_search_by_type("elf kernel"); | |||||
if (kmdp == NULL) | |||||
return (0); | |||||
boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int); | |||||
loader_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *); | |||||
init_static_kenv(loader_envp, 0); | |||||
lastaddr = MD_FETCH(kmdp, MODINFOMD_KERNEND, vm_offset_t); | |||||
return (lastaddr); | |||||
} | |||||
void | void | ||||
initarm(struct arm64_bootparams *abp) | initarm(struct arm64_bootparams *abp) | ||||
{ | { | ||||
struct efi_fb *efifb; | struct efi_fb *efifb; | ||||
struct efi_map_header *efihdr; | struct efi_map_header *efihdr; | ||||
struct pcpu *pcpup; | struct pcpu *pcpup; | ||||
char *env; | char *env; | ||||
#ifdef FDT | #ifdef FDT | ||||
struct mem_region mem_regions[FDT_MEM_REGIONS]; | struct mem_region mem_regions[FDT_MEM_REGIONS]; | ||||
int mem_regions_sz; | int mem_regions_sz; | ||||
#endif | #endif | ||||
vm_offset_t lastaddr; | vm_offset_t lastaddr; | ||||
caddr_t kmdp; | caddr_t kmdp; | ||||
bool valid; | bool valid; | ||||
/* Set the module data location */ | if ((abp->modulep & VM_MIN_KERNEL_ADDRESS) == | ||||
preload_metadata = (caddr_t)(uintptr_t)(abp->modulep); | VM_MIN_KERNEL_ADDRESS) | ||||
/* Booted from loader. */ | |||||
lastaddr = freebsd_parse_boot_param(abp); | |||||
#ifdef LINUX_BOOT_ABI | |||||
else | |||||
/* Booted from U-Boot. */ | |||||
lastaddr = linux_parse_boot_param(abp); | |||||
#endif | |||||
/* Find the kernel address */ | /* Find the kernel address */ | ||||
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"); | ||||
boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int); | |||||
init_static_kenv(MD_FETCH(kmdp, MODINFOMD_ENVP, char *), 0); | |||||
link_elf_ireloc(kmdp); | link_elf_ireloc(kmdp); | ||||
#ifdef FDT | #ifdef FDT | ||||
try_load_dtb(kmdp); | try_load_dtb(kmdp); | ||||
#ifdef LINUX_BOOT_ABI | |||||
parse_bootargs(&lastaddr, abp); | |||||
jhibbits: This should be guarded by the boot mode, really. On powerpc we only use ofw_parse_bootargs()… | |||||
siddharthtuli_gmail.comAuthorUnsubmitted Done Inline ActionsI will use FreeBSD: guard in bootargs as noted by mmel. siddharthtuli_gmail.com: I will use FreeBSD: guard in bootargs as noted by mmel. | |||||
#endif | #endif | ||||
#endif | |||||
efi_systbl_phys = MD_FETCH(kmdp, MODINFOMD_FW_HANDLE, vm_paddr_t); | efi_systbl_phys = MD_FETCH(kmdp, MODINFOMD_FW_HANDLE, vm_paddr_t); | ||||
/* Find the address to start allocating from */ | |||||
lastaddr = MD_FETCH(kmdp, MODINFOMD_KERNEND, vm_offset_t); | |||||
/* Load the physical memory ranges */ | /* Load the physical memory ranges */ | ||||
efihdr = (struct efi_map_header *)preload_search_info(kmdp, | efihdr = (struct efi_map_header *)preload_search_info(kmdp, | ||||
MODINFO_METADATA | MODINFOMD_EFI_MAP); | MODINFO_METADATA | MODINFOMD_EFI_MAP); | ||||
if (efihdr != NULL) | if (efihdr != NULL) | ||||
add_efi_map_entries(efihdr); | add_efi_map_entries(efihdr); | ||||
#ifdef FDT | #ifdef FDT | ||||
else { | else { | ||||
▲ Show 20 Lines • Show All 185 Lines • Show Last 20 Lines |
This should be guarded by the boot mode, really. On powerpc we only use ofw_parse_bootargs() if there's no mdp (meaning it's not booted from loader).
Actually, I see parse_bootargs() internally guards, but the guard is rather clumsy. See below.