Changeset View
Changeset View
Standalone View
Standalone View
sys/powerpc/aim/aim_machdep.c
Show First 20 Lines • Show All 155 Lines • ▼ Show 20 Lines | |||||
extern void *extint, *extsize; | extern void *extint, *extsize; | ||||
extern void *dblow, *dbend; | extern void *dblow, *dbend; | ||||
extern void *imisstrap, *imisssize; | extern void *imisstrap, *imisssize; | ||||
extern void *dlmisstrap, *dlmisssize; | extern void *dlmisstrap, *dlmisssize; | ||||
extern void *dsmisstrap, *dsmisssize; | extern void *dsmisstrap, *dsmisssize; | ||||
extern void *ap_pcpu; | extern void *ap_pcpu; | ||||
extern void __restartkernel(vm_offset_t, vm_offset_t, vm_offset_t, void *, uint32_t, register_t offset, register_t msr); | extern void __restartkernel(vm_offset_t, vm_offset_t, vm_offset_t, void *, uint32_t, register_t offset, register_t msr); | ||||
extern void __restartkernel_virtual(vm_offset_t, vm_offset_t, vm_offset_t, void *, uint32_t, register_t offset, register_t msr); | |||||
void aim_early_init(vm_offset_t fdt, vm_offset_t toc, vm_offset_t ofentry, | void aim_early_init(vm_offset_t fdt, vm_offset_t toc, vm_offset_t ofentry, | ||||
void *mdp, uint32_t mdp_cookie); | void *mdp, uint32_t mdp_cookie); | ||||
void aim_cpu_init(vm_offset_t toc); | void aim_cpu_init(vm_offset_t toc); | ||||
void | void | ||||
aim_early_init(vm_offset_t fdt, vm_offset_t toc, vm_offset_t ofentry, void *mdp, | aim_early_init(vm_offset_t fdt, vm_offset_t toc, vm_offset_t ofentry, void *mdp, | ||||
uint32_t mdp_cookie) | uint32_t mdp_cookie) | ||||
{ | { | ||||
register_t scratch; | register_t scratch; | ||||
/* | /* | ||||
* If running from an FDT, make sure we are in real mode to avoid | * If running from an FDT, make sure we are in real mode to avoid | ||||
* tromping on firmware page tables. Everything in the kernel assumes | * tromping on firmware page tables. Everything in the kernel assumes | ||||
* 1:1 mappings out of firmware, so this won't break anything not | * 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 | * already broken. This doesn't work if there is live OF, since OF | ||||
* may internally use non-1:1 mappings. | * may internally use non-1:1 mappings. | ||||
*/ | */ | ||||
if (ofentry == 0) | if (ofentry == 0) | ||||
mtmsr(mfmsr() & ~(PSL_IR | PSL_DR)); | mtmsr(mfmsr() & ~(PSL_IR | PSL_DR)); | ||||
#ifdef __powerpc64__ | #ifdef __powerpc64__ | ||||
/* | /* | ||||
* If in real mode, relocate to high memory so that the kernel | * Relocate to high memory so that the kernel | ||||
* can execute from the direct map. | * can execute from the direct map. | ||||
* | |||||
* If we are in virtual mode already, use a special entry point | |||||
* that sets up a temporary DMAP to execute from until we can | |||||
* properly set up the MMU. | |||||
*/ | */ | ||||
if (!(mfmsr() & PSL_DR) && | if ((vm_offset_t)&aim_early_init < DMAP_BASE_ADDRESS) { | ||||
(vm_offset_t)&aim_early_init < DMAP_BASE_ADDRESS) | if (mfmsr() & PSL_DR) { | ||||
__restartkernel_virtual(fdt, 0, ofentry, mdp, | |||||
mdp_cookie, DMAP_BASE_ADDRESS, mfmsr()); | |||||
} else { | |||||
__restartkernel(fdt, 0, ofentry, mdp, mdp_cookie, | __restartkernel(fdt, 0, ofentry, mdp, mdp_cookie, | ||||
DMAP_BASE_ADDRESS, mfmsr()); | DMAP_BASE_ADDRESS, mfmsr()); | ||||
} | |||||
} | |||||
#endif | #endif | ||||
/* Various very early CPU fix ups */ | /* Various very early CPU fix ups */ | ||||
switch (mfpvr() >> 16) { | switch (mfpvr() >> 16) { | ||||
/* | /* | ||||
* PowerPC 970 CPUs have a misfeature requested by Apple that | * PowerPC 970 CPUs have a misfeature requested by Apple that | ||||
* makes them pretend they have a 32-byte cacheline. Turn this | * makes them pretend they have a 32-byte cacheline. Turn this | ||||
* off before we measure the cacheline size. | * off before we measure the cacheline size. | ||||
▲ Show 20 Lines • Show All 494 Lines • Show Last 20 Lines |