mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-15 12:54:27 +00:00
Avoid assumptions about the BSP being CPU 0.
MFC after: 3 weeks
This commit is contained in:
parent
8a92c52a84
commit
91419bdafd
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=326217
|
@ -530,11 +530,16 @@ openfirmware(void *args)
|
|||
return (-1);
|
||||
|
||||
#ifdef SMP
|
||||
rv_args.args = args;
|
||||
rv_args.in_progress = 1;
|
||||
smp_rendezvous(smp_no_rendezvous_barrier, ofw_rendezvous_dispatch,
|
||||
smp_no_rendezvous_barrier, &rv_args);
|
||||
result = rv_args.retval;
|
||||
if (cold) {
|
||||
result = openfirmware_core(args);
|
||||
} else {
|
||||
rv_args.args = args;
|
||||
rv_args.in_progress = 1;
|
||||
smp_rendezvous(smp_no_rendezvous_barrier,
|
||||
ofw_rendezvous_dispatch, smp_no_rendezvous_barrier,
|
||||
&rv_args);
|
||||
result = rv_args.retval;
|
||||
}
|
||||
#else
|
||||
result = openfirmware_core(args);
|
||||
#endif
|
||||
|
|
|
@ -235,9 +235,10 @@ uintptr_t
|
|||
powerpc_init(vm_offset_t fdt, vm_offset_t toc, vm_offset_t ofentry, void *mdp)
|
||||
{
|
||||
struct pcpu *pc;
|
||||
struct cpuref bsp;
|
||||
vm_offset_t startkernel, endkernel;
|
||||
void *kmdp;
|
||||
char *env;
|
||||
char *env;
|
||||
bool ofw_bootargs = false;
|
||||
#ifdef DDB
|
||||
vm_offset_t ksym_start;
|
||||
|
@ -311,32 +312,20 @@ powerpc_init(vm_offset_t fdt, vm_offset_t toc, vm_offset_t ofentry, void *mdp)
|
|||
*/
|
||||
proc_linkup0(&proc0, &thread0);
|
||||
thread0.td_frame = &frame0;
|
||||
|
||||
/*
|
||||
* Set up per-cpu data.
|
||||
*/
|
||||
pc = __pcpu;
|
||||
pcpu_init(pc, 0, sizeof(struct pcpu));
|
||||
pc->pc_curthread = &thread0;
|
||||
#ifdef __powerpc64__
|
||||
__asm __volatile("mr 13,%0" :: "r"(pc->pc_curthread));
|
||||
__asm __volatile("mr 13,%0" :: "r"(&thread0));
|
||||
#else
|
||||
__asm __volatile("mr 2,%0" :: "r"(pc->pc_curthread));
|
||||
__asm __volatile("mr 2,%0" :: "r"(&thread0));
|
||||
#endif
|
||||
pc->pc_cpuid = 0;
|
||||
|
||||
__asm __volatile("mtsprg 0, %0" :: "r"(pc));
|
||||
|
||||
/*
|
||||
* Init mutexes, which we use heavily in PMAP
|
||||
*/
|
||||
|
||||
mutex_init();
|
||||
|
||||
/*
|
||||
* Install the OF client interface
|
||||
*/
|
||||
|
||||
OF_bootstrap();
|
||||
|
||||
if (ofw_bootargs)
|
||||
|
@ -347,19 +336,6 @@ powerpc_init(vm_offset_t fdt, vm_offset_t toc, vm_offset_t ofentry, void *mdp)
|
|||
*/
|
||||
cninit();
|
||||
|
||||
/*
|
||||
* Complain if there is no metadata.
|
||||
*/
|
||||
if (mdp == NULL || kmdp == NULL) {
|
||||
printf("powerpc_init: no loader metadata.\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* Init KDB
|
||||
*/
|
||||
|
||||
kdb_init();
|
||||
|
||||
#ifdef AIM
|
||||
aim_cpu_init(toc);
|
||||
#else /* BOOKE */
|
||||
|
@ -375,6 +351,25 @@ powerpc_init(vm_offset_t fdt, vm_offset_t toc, vm_offset_t ofentry, void *mdp)
|
|||
|
||||
platform_probe_and_attach();
|
||||
|
||||
/*
|
||||
* Set up real per-cpu data.
|
||||
*/
|
||||
if (platform_smp_get_bsp(&bsp) != 0)
|
||||
bsp.cr_cpuid = 0;
|
||||
pc = &__pcpu[bsp.cr_cpuid];
|
||||
pcpu_init(pc, bsp.cr_cpuid, sizeof(struct pcpu));
|
||||
pc->pc_curthread = &thread0;
|
||||
thread0.td_oncpu = bsp.cr_cpuid;
|
||||
pc->pc_cpuid = bsp.cr_cpuid;
|
||||
pc->pc_hwref = bsp.cr_hwref;
|
||||
pc->pc_pir = mfspr(SPR_PIR);
|
||||
__asm __volatile("mtsprg 0, %0" :: "r"(pc));
|
||||
|
||||
/*
|
||||
* Init KDB
|
||||
*/
|
||||
kdb_init();
|
||||
|
||||
/*
|
||||
* Bring up MMU
|
||||
*/
|
||||
|
|
Loading…
Reference in a new issue