Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 5 Apr 1998 21:20:02 -0700 (PDT)
From:      Luoqi Chen <luoqi@chen.ml.org>
To:        freebsd-bugs
Subject:   Re: i386/6219: wine causes system crash
Message-ID:  <199804060420.VAA15406@hub.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR i386/6219; it has been noted by GNATS.

From: Luoqi Chen <luoqi@chen.ml.org>
To: freebsd-gnats-submit@freebsd.org
Cc:  Subject: Re: i386/6219: wine causes system crash
Date: Mon, 06 Apr 1998 00:14:37 -0400

 I figured out the cause of the problem myself. There was a mistake
 made by the orignal submitter of the code. When disposing user ldt
 before an exec, the default ldt should be loaded, instead, the very
 user ldt that's being disposed of is loaded. The same mistake was made
 in cpu_exit(), except in this case the consequence is not as dire.
 Here's patch to fix the problem.
 
 
 Index: machdep.c
 ===================================================================
 RCS file: /fun/cvs/src/sys/i386/i386/machdep.c,v
 retrieving revision 1.292
 diff -u -r1.292 machdep.c
 --- machdep.c   1998/03/07 20:16:47     1.292
 +++ machdep.c   1998/04/06 02:59:59
 @@ -776,8 +776,10 @@
 
         /* 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;
 @@ -792,6 +794,10 @@
         regs->tf_ds = _udatasel;
         regs->tf_es = _udatasel;
         regs->tf_cs = _ucodesel;
 +
 +       /* reset %fs and %gs as well */
 +       __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.101
 diff -u -r1.101 vm_machdep.c
 --- vm_machdep.c        1998/02/25 03:56:09     1.101
 +++ vm_machdep.c        1998/04/06 02:56:47
 @@ -692,8 +692,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-bugs" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199804060420.VAA15406>