View | Details | Raw Unified | Return to bug 233863 | Differences between
and this patch

Collapse All | Expand All

(-)/usr/src/sys/powerpc/aim/mp_cpudep.c (+11 lines)
Lines 107-112 Link Here
107
	powerpc_sync();
107
	powerpc_sync();
108
}
108
}
109
109
110
#ifdef __powerpc64__
111
extern void hack_into_slb_if_needed(void* vap); // HACK!!!
112
#endif
113
110
uintptr_t
114
uintptr_t
111
cpudep_ap_bootstrap(void)
115
cpudep_ap_bootstrap(void)
112
{
116
{
Lines 116-127 Link Here
116
	mtmsr(msr);
120
	mtmsr(msr);
117
121
118
	pcpup->pc_curthread = pcpup->pc_idlethread;
122
	pcpup->pc_curthread = pcpup->pc_idlethread;
123
119
#ifdef __powerpc64__
124
#ifdef __powerpc64__
120
	__asm __volatile("mr 13,%0" :: "r"(pcpup->pc_curthread));
125
	__asm __volatile("mr 13,%0" :: "r"(pcpup->pc_curthread));
121
#else
126
#else
122
	__asm __volatile("mr 2,%0" :: "r"(pcpup->pc_curthread));
127
	__asm __volatile("mr 2,%0" :: "r"(pcpup->pc_curthread));
123
#endif
128
#endif
129
124
	pcpup->pc_curpcb = pcpup->pc_curthread->td_pcb;
130
	pcpup->pc_curpcb = pcpup->pc_curthread->td_pcb;
131
132
#ifdef __powerpc64__
133
	hack_into_slb_if_needed(pcpup->pc_curpcb); // HACK!!!
134
#endif
135
125
	sp = pcpup->pc_curpcb->pcb_sp;
136
	sp = pcpup->pc_curpcb->pcb_sp;
126
137
127
	return (sp);
138
	return (sp);
(-)/usr/src/sys/powerpc/aim/slb.c (+22 lines)
Lines 464-469 Link Here
464
	critical_exit();
464
	critical_exit();
465
}
465
}
466
466
467
void hack_into_slb_if_needed(void* vap); // HACK!!!
468
void hack_into_slb_if_needed(void* vap) // HACK!!!
469
{ // HACK!!!
470
	struct slb *cache= PCPU_GET(aim.slb);
471
	vm_offset_t va=    (vm_offset_t)vap;
472
	uint64_t    slbv=  kernel_va_to_slbv(va);
473
	uint64_t    esid=  va>>ADDR_SR_SHFT;
474
	uint64_t    slbe=  (esid<<SLBE_ESID_SHIFT) | SLBE_VALID;
475
	int i;
476
477
	for (i = 0; i < n_slbs; i++) {
478
		if (i == USER_SLB_SLOT)
479
			continue;
480
		if (cache[i].slbe == (slbe | i))
481
			break;
482
	}
483
484
	if (i==n_slbs)
485
		slb_insert_kernel(slbe,slbv);
486
} // HACK!!!
487
488
467
void
489
void
468
slb_insert_user(pmap_t pm, struct slb *slb)
490
slb_insert_user(pmap_t pm, struct slb *slb)
469
{
491
{

Return to bug 233863