Changeset View
Changeset View
Standalone View
Standalone View
head/sys/powerpc/powerpc/machdep.c
Show First 20 Lines • Show All 231 Lines • ▼ Show 20 Lines | |||||
} | } | ||||
extern vm_offset_t __startkernel, __endkernel; | extern vm_offset_t __startkernel, __endkernel; | ||||
extern unsigned char __bss_start[]; | extern unsigned char __bss_start[]; | ||||
extern unsigned char __sbss_start[]; | extern unsigned char __sbss_start[]; | ||||
extern unsigned char __sbss_end[]; | extern unsigned char __sbss_end[]; | ||||
extern unsigned char _end[]; | extern unsigned char _end[]; | ||||
void aim_early_init(vm_offset_t fdt, vm_offset_t toc, vm_offset_t ofentry, | |||||
void *mdp, uint32_t mdp_cookie); | |||||
void aim_cpu_init(vm_offset_t toc); | void aim_cpu_init(vm_offset_t toc); | ||||
void booke_cpu_init(void); | void booke_cpu_init(void); | ||||
uintptr_t | uintptr_t | ||||
powerpc_init(vm_offset_t fdt, vm_offset_t toc, vm_offset_t ofentry, void *mdp, | powerpc_init(vm_offset_t fdt, vm_offset_t toc, vm_offset_t ofentry, void *mdp, | ||||
uint32_t mdp_cookie) | uint32_t mdp_cookie) | ||||
{ | { | ||||
struct pcpu *pc; | struct pcpu *pc; | ||||
struct cpuref bsp; | struct cpuref bsp; | ||||
vm_offset_t startkernel, endkernel; | vm_offset_t startkernel, endkernel; | ||||
void *kmdp; | |||||
char *env; | char *env; | ||||
bool ofw_bootargs = false; | bool ofw_bootargs = false; | ||||
#ifdef DDB | #ifdef DDB | ||||
vm_offset_t ksym_start; | vm_offset_t ksym_start; | ||||
vm_offset_t ksym_end; | vm_offset_t ksym_end; | ||||
#endif | #endif | ||||
kmdp = NULL; | |||||
/* First guess at start/end kernel positions */ | /* First guess at start/end kernel positions */ | ||||
startkernel = __startkernel; | startkernel = __startkernel; | ||||
endkernel = __endkernel; | endkernel = __endkernel; | ||||
/* | /* | ||||
* If the metadata pointer cookie is not set to the magic value, | * If the metadata pointer cookie is not set to the magic value, | ||||
* the number in mdp should be treated as nonsense. | * the number in mdp should be treated as nonsense. | ||||
*/ | */ | ||||
if (mdp_cookie != 0xfb5d104d) | if (mdp_cookie != 0xfb5d104d) | ||||
mdp = NULL; | mdp = NULL; | ||||
#if !defined(BOOKE) | #if !defined(BOOKE) | ||||
/* | /* | ||||
* On BOOKE the BSS is already cleared and some variables | * On BOOKE the BSS is already cleared and some variables | ||||
* initialized. Do not wipe them out. | * initialized. Do not wipe them out. | ||||
*/ | */ | ||||
bzero(__sbss_start, __sbss_end - __sbss_start); | bzero(__sbss_start, __sbss_end - __sbss_start); | ||||
bzero(__bss_start, _end - __bss_start); | bzero(__bss_start, _end - __bss_start); | ||||
#endif | #endif | ||||
#ifdef AIM | #ifdef AIM | ||||
/* | aim_early_init(fdt, toc, ofentry, mdp, mdp_cookie); | ||||
* If running from an FDT, make sure we are in real mode to avoid | |||||
* tromping on firmware page tables. Everything in the kernel assumes | |||||
* 1:1 mappings out of firmware, so this won't break anything not | |||||
* already broken. This doesn't work if there is live OF, since OF | |||||
* may internally use non-1:1 mappings. | |||||
*/ | |||||
if (ofentry == 0) | |||||
mtmsr(mfmsr() & ~(PSL_IR | PSL_DR)); | |||||
#endif | #endif | ||||
/* | /* | ||||
* Parse metadata if present and fetch parameters. Must be done | * Parse metadata if present and fetch parameters. Must be done | ||||
* before console is inited so cninit gets the right value of | * before console is inited so cninit gets the right value of | ||||
* boothowto. | * boothowto. | ||||
*/ | */ | ||||
if (mdp != NULL) { | if (mdp != NULL) { | ||||
void *kmdp = NULL; | |||||
char *envp = NULL; | |||||
uintptr_t md_offset = 0; | |||||
vm_paddr_t kernelendphys; | |||||
#ifdef AIM | |||||
if ((uintptr_t)&powerpc_init > DMAP_BASE_ADDRESS) | |||||
md_offset = DMAP_BASE_ADDRESS; | |||||
#endif | |||||
preload_metadata = mdp; | preload_metadata = mdp; | ||||
if (md_offset > 0) { | |||||
preload_metadata += md_offset; | |||||
preload_bootstrap_relocate(md_offset); | |||||
} | |||||
kmdp = preload_search_by_type("elf kernel"); | kmdp = preload_search_by_type("elf kernel"); | ||||
if (kmdp != NULL) { | if (kmdp != NULL) { | ||||
boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int); | boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int); | ||||
init_static_kenv(MD_FETCH(kmdp, MODINFOMD_ENVP, char *), | envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *); | ||||
0); | if (envp != NULL) | ||||
endkernel = ulmax(endkernel, MD_FETCH(kmdp, | envp += md_offset; | ||||
MODINFOMD_KERNEND, vm_offset_t)); | init_static_kenv(envp, 0); | ||||
kernelendphys = MD_FETCH(kmdp, MODINFOMD_KERNEND, | |||||
vm_offset_t); | |||||
if (kernelendphys != 0) | |||||
kernelendphys += md_offset; | |||||
endkernel = ulmax(endkernel, kernelendphys); | |||||
#ifdef DDB | #ifdef DDB | ||||
ksym_start = MD_FETCH(kmdp, MODINFOMD_SSYM, uintptr_t); | ksym_start = MD_FETCH(kmdp, MODINFOMD_SSYM, uintptr_t); | ||||
ksym_end = MD_FETCH(kmdp, MODINFOMD_ESYM, uintptr_t); | ksym_end = MD_FETCH(kmdp, MODINFOMD_ESYM, uintptr_t); | ||||
db_fetch_ksymtab(ksym_start, ksym_end); | db_fetch_ksymtab(ksym_start, ksym_end); | ||||
#endif | #endif | ||||
} | } | ||||
} else { | } else { | ||||
init_static_kenv(init_kenv, sizeof(init_kenv)); | init_static_kenv(init_kenv, sizeof(init_kenv)); | ||||
▲ Show 20 Lines • Show All 254 Lines • Show Last 20 Lines |