Date: Mon, 4 May 98 07:02:01 EDT From: luoqi@watermarkgroup.com (Luoqi Chen) To: jb@cimlogic.com.au, luoqi@watermarkgroup.com Cc: current@FreeBSD.ORG Subject: Re: 'fatal trap 12' on boot (smp and up) Message-ID: <9805041102.AA13313@watermarkgroup.com>
next in thread | raw e-mail | index | archive | help
> I think I made a mistake in my patch that cause the core dump. Try to > enclose the two lines in the patch that reset fs and gs inside > if (pcb == curpcb) {}. Without this, the code might trash fs & gs in > another process' context. Probably pcb->pcb_fs and pcb->pcb_gs need to be reset too. Please use the following patch (I've also sent it in a follow-up to the original PR i386/6219). -lq Index: machdep.c =================================================================== RCS file: /fun/cvs/src/sys/i386/i386/machdep.c,v retrieving revision 1.294 diff -u -r1.294 machdep.c --- machdep.c 1998/04/06 15:46:17 1.294 +++ machdep.c 1998/05/04 10:40:30 @@ -768,14 +768,15 @@ u_long stack; { struct trapframe *regs = p->p_md.md_regs; - -#ifdef USER_LDT struct pcb *pcb = &p->p_addr->u_pcb; +#ifdef USER_LDT /* was i386_user_cleanup() in NetBSD */ if (pcb->pcb_ldt) { - if (pcb == curpcb) - lldt(GSEL(GUSERLDT_SEL, SEL_KPL)); + if (pcb == curpcb) { + lldt(_default_ldt); + currentldt = _default_ldt; + } kmem_free(kernel_map, (vm_offset_t)pcb->pcb_ldt, pcb->pcb_ldt_len * sizeof(union descriptor)); pcb->pcb_ldt_len = (int)pcb->pcb_ldt = 0; @@ -790,6 +791,14 @@ regs->tf_ds = _udatasel; regs->tf_es = _udatasel; regs->tf_cs = _ucodesel; + + /* reset %fs and %gs as well */ + pcb->pcb_fs = _udatasel; + pcb->pcb_gs = _udatasel; + if (pcb == curpcb) { + __asm("mov %0,%%fs" : : "r" (_udatasel)); + __asm("mov %0,%%gs" : : "r" (_udatasel)); + } /* * Initialize the math emulator (if any) for the current process. Index: vm_machdep.c =================================================================== RCS file: /fun/cvs/src/sys/i386/i386/vm_machdep.c,v retrieving revision 1.105 diff -u -r1.105 vm_machdep.c --- vm_machdep.c 1998/03/23 19:52:42 1.105 +++ vm_machdep.c 1998/04/14 01:30:21 @@ -703,8 +703,10 @@ #endif #ifdef USER_LDT if (pcb->pcb_ldt != 0) { - if (pcb == curpcb) - lldt(GSEL(GUSERLDT_SEL, SEL_KPL)); + if (pcb == curpcb) { + lldt(_default_ldt); + currentldt = _default_ldt; + } kmem_free(kernel_map, (vm_offset_t)pcb->pcb_ldt, pcb->pcb_ldt_len * sizeof(union descriptor)); pcb->pcb_ldt_len = (int)pcb->pcb_ldt = 0; To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?9805041102.AA13313>