o) When trying to determine whether the pcpu pointer is a managed address, check

not just that it is greater than the minimal kernel virtual address, but also
   that it is less than the maximal kernel virtual address.  On n64 kernels, the
   pcpup comes out of a direct-mapped address that, with an unsigned compare, is
   rather greater than the minimal kernel virtual address.
o) Turn the panic if interrupts are disabled in cpu_idle into a KASSERT since on
   other architectures it's behind INVARIANTS anyway.
o) Add a check that not all interrupts are masked, too.
o) Add cpu_idleclock() and cpu_activeclock() use to cpu_idle as is done on other
   architectures.
This commit is contained in:
Juli Mallett 2011-01-01 00:20:14 +00:00
parent 5cc703974c
commit 5610751bf1
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=216862

View File

@ -426,8 +426,10 @@ cpu_pcpu_init(struct pcpu *pcpu, int cpuid, size_t size)
pcpu->pc_next_asid = 1;
pcpu->pc_asid_generation = 1;
#ifdef SMP
if ((vm_offset_t)pcpup >= VM_MIN_KERNEL_ADDRESS)
if ((vm_offset_t)pcpup >= VM_MIN_KERNEL_ADDRESS &&
(vm_offset_t)pcpup <= VM_MAX_KERNEL_ADDRESS) {
mips_pcpu_tlb_init(pcpu);
}
#endif
}
@ -483,10 +485,20 @@ spinlock_exit(void)
void
cpu_idle(int busy)
{
if (mips_rd_status() & MIPS_SR_INT_IE)
__asm __volatile ("wait");
else
panic("ints disabled in idleproc!");
KASSERT((mips_rd_status() & MIPS_SR_INT_IE) != 0,
("interrupts disabled in idle process."));
KASSERT((mips_rd_status() & MIPS_INT_MASK) != 0,
("all interrupts masked in idle process."));
if (!busy) {
critical_enter();
cpu_idleclock();
}
__asm __volatile ("wait");
if (!busy) {
cpu_activeclock();
critical_exit();
}
}
int