Port-vax archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: Reproducable kernel crash
On Fri, Mar 01, 2024 at 05:43:49AM +1100, matthew green wrote:
> sounds about right to me. this should genreally only be
> called by MI code doing context switch. besides this one
> vax call, there are two in arm that may be an issue, though
> i can perhaps see why at least the efirt one is needed:
>
> arch/arm/arm/ast.c: pmap_activate(l);
> arch/arm/arm/efi_machdep.c: pmap_activate(l);
>
> does it happen without this bonus activate call?
Unfortunately cpu_lwp_bootstrap() is not able to start kernel threads
without it - must have something to do with faking the CALLS for it:
/*
* Set up the calls frame above (below) the trapframe and populate
* it with something good. This is so that we can simulate that we
* called cpu_lwp_bootstrap with a CALLS insn and it can return to
* sret.
*/
cf = (struct callsframe *)tf - 1;
cf->ca_cond = 0;
cf->ca_maskpsw = 0x20000000; /* CALLS stack frame, no registers */
cf->ca_pc = (uintptr_t)&sret; /* return PC; userspace trampoline */
cf->ca_argno = 1;
cf->ca_arg1 = 0; /* unused */
/*
* Set up internal defs in PCB. This matches the "fake" CALLS frame
* that were constructed earlier.
*/
pcb2->pcb_onfault = NULL;
pcb2->AP = (uintptr_t)&cf->ca_argno;
pcb2->KSP = (uintptr_t)cf;
pcb2->FP = (uintptr_t)cf;
pcb2->PC = (uintptr_t)cpu_lwp_bootstrap + 2;
pcb2->PSL = PSL_HIGHIPL;
pcb2->ESP = (uintptr_t)&pcb2->pcb_onfault;
pcb2->SSP = (uintptr_t)l2;
Without the pmap_activate() I get:
[ 1.0153750] panic: trap: type 7, code 0, pc 8010bdf5, psl 4
Stopped in pid 0.11 (system) at netbsd:vpanic+0x179: pushl $0
db> bt
panic: trap: type 7, code 0, pc 8010bdf5, psl 4
Stack traceback :
0x8afcfdb0: vpanic+0x179(0x802136cb,0x8afcfe48)
0x8afcfdd0: printf_nostamp+0x0(0x802136cb,0x7,0,0x8010bdf5,0x4)
0x8afcfdfc: trap+0xae(0x8afcff10)
0x8afcff10: trap type=0x7 code=0x0 pc=0x8010bdf5 psl=0x4
0x8afcfedc: lwp_startup+0x93(0x8029a080,0x87f0f800)
0x8afcff60: cpu_lwp_bootstrap+0xf(0)
and that is:
(gdb) list *(lwp_startup+0x93)
0x8010bdf5 is in lwp_startup (../../../../kern/kern_lwp.c:1070).
1065 LOCKDEBUG_BARRIER(NULL, 0);
1066 SDT_PROBE(proc, kernel, , lwp__start, new_lwp, 0, 0, 0, 0);
1067
1068 /* For kthreads, acquire kernel lock if not MPSAFE. */
1069 if (__predict_false((new_lwp->l_pflag & LP_MPSAFE) == 0)) {
1070 KERNEL_LOCK(1, new_lwp);
1071 }
1072 }
the KERNEL_LOCK()
Martin
Home |
Main Index |
Thread Index |
Old Index