diff options
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/kern_fork.c | 1 | ||||
-rw-r--r-- | sys/kern/kern_malloc.c | 3 | ||||
-rw-r--r-- | sys/kern/subr_smp.c | 4 | ||||
-rw-r--r-- | sys/kern/subr_trap.c | 8 |
4 files changed, 10 insertions, 6 deletions
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c index 1c8cb38..9dc8ec3 100644 --- a/sys/kern/kern_fork.c +++ b/sys/kern/kern_fork.c @@ -351,6 +351,7 @@ again: nextpid = trypid; p2 = newproc; + p2->p_intr_nesting_level = 0; p2->p_stat = SIDL; /* protect against others */ p2->p_pid = trypid; LIST_INSERT_HEAD(&allproc, p2, p_list); diff --git a/sys/kern/kern_malloc.c b/sys/kern/kern_malloc.c index 396f02b..ec33f61 100644 --- a/sys/kern/kern_malloc.c +++ b/sys/kern/kern_malloc.c @@ -44,6 +44,7 @@ #include <sys/mutex.h> #include <sys/vmmeter.h> #include <sys/lock.h> +#include <sys/proc.h> #include <vm/vm.h> #include <vm/vm_param.h> @@ -147,7 +148,7 @@ malloc(size, type, flags) #if defined(INVARIANTS) && defined(__i386__) if (flags == M_WAITOK) - KASSERT(PCPU_GET(intr_nesting_level) == 0, + KASSERT(curproc->p_intr_nesting_level == 0, ("malloc(M_WAITOK) in interrupt context")); #endif indx = BUCKETINDX(size); diff --git a/sys/kern/subr_smp.c b/sys/kern/subr_smp.c index bf560cd..966d3f8 100644 --- a/sys/kern/subr_smp.c +++ b/sys/kern/subr_smp.c @@ -581,10 +581,12 @@ mp_enable(u_int boot_addr) /* install an inter-CPU IPI for forcing an additional software trap */ setidt(XCPUAST_OFFSET, Xcpuast, SDT_SYS386IGT, SEL_KPL, GSEL(GCODE_SEL, SEL_KPL)); - + +#if 0 /* install an inter-CPU IPI for interrupt forwarding */ setidt(XFORWARD_IRQ_OFFSET, Xforward_irq, SDT_SYS386IGT, SEL_KPL, GSEL(GCODE_SEL, SEL_KPL)); +#endif /* install an inter-CPU IPI for CPU stop/restart */ setidt(XCPUSTOP_OFFSET, Xcpustop, diff --git a/sys/kern/subr_trap.c b/sys/kern/subr_trap.c index 6ee3e6d..0170dbe 100644 --- a/sys/kern/subr_trap.c +++ b/sys/kern/subr_trap.c @@ -480,7 +480,7 @@ restart: if (in_vm86call) break; - if (PCPU_GET(intr_nesting_level) != 0) + if (p->p_intr_nesting_level != 0) break; /* @@ -687,7 +687,7 @@ trap_pfault(frame, usermode, eva) if (p == NULL || (!usermode && va < VM_MAXUSER_ADDRESS && - (PCPU_GET(intr_nesting_level) != 0 || + (p->p_intr_nesting_level != 0 || PCPU_GET(curpcb) == NULL || PCPU_GET(curpcb)->pcb_onfault == NULL))) { trap_fatal(frame, eva); @@ -751,7 +751,7 @@ trap_pfault(frame, usermode, eva) return (0); nogo: if (!usermode) { - if (PCPU_GET(intr_nesting_level) == 0 && + if (p->p_intr_nesting_level == 0 && PCPU_GET(curpcb) != NULL && PCPU_GET(curpcb)->pcb_onfault != NULL) { frame->tf_eip = (int)PCPU_GET(curpcb)->pcb_onfault; @@ -858,7 +858,7 @@ trap_pfault(frame, usermode, eva) return (0); nogo: if (!usermode) { - if (PCPU_GET(intr_nesting_level) == 0 && + if (p->p_intr_nesting_level == 0 && PCPU_GET(curpcb) != NULL && PCPU_GET(curpcb)->pcb_onfault != NULL) { frame->tf_eip = (int)PCPU_GET(curpcb)->pcb_onfault; |