Hi,

It seems that the trampoline code got too long and resulted in the
coredumps people reported. The following patch solves that. it basicly
works as follows:

o  Simplify the trampoline code so that it doesn't have to distinguish
   between an old- and new sigframe and also restoring %gs in both
cases.
o  Which sigreturn to use is now determined by the process flag that
   is used to determine which sendsig is to be used (symmetry)
o  restoring %gs is now handled in the proper sigreturn.

I'll commit this if noone objects.

-- 
Marcel Moolenaar                        mailto:[EMAIL PROTECTED]
SCC Internetworking & Databases           http://www.scc.nl/
The FreeBSD project                mailto:[EMAIL PROTECTED]
Index: i386/i386/genassym.c
===================================================================
RCS file: /home/ncvs/src/sys/i386/i386/genassym.c,v
retrieving revision 1.80
diff -u -r1.80 genassym.c
--- genassym.c  1999/10/04 19:33:51     1.80
+++ genassym.c  1999/10/05 12:02:18
@@ -148,7 +148,6 @@
        printf("#define\tTF_EFLAGS %#x\n", OS(trapframe, tf_eflags));
 
        printf("#define\tSIGF_HANDLER %#x\n", OS(sigframe, sf_ahu.sf_handler));
-       printf("#define\tSIGF_SIGRET %#x\n", OS(sigframe, sf_sigreturn));
        printf("#define\tSIGF_SC %#x\n", OS(osigframe, sf_siginfo.si_sc));
        printf("#define\tSIGF_UC %#x\n", OS(sigframe, sf_uc));
 
Index: i386/i386/locore.s
===================================================================
RCS file: /home/ncvs/src/sys/i386/i386/locore.s,v
retrieving revision 1.128
diff -u -r1.128 locore.s
--- locore.s    1999/09/29 15:06:19     1.128
+++ locore.s    1999/10/05 11:54:06
@@ -415,37 +415,14 @@
  */
 NON_GPROF_ENTRY(sigcode)
        call    SIGF_HANDLER(%esp)              /* call signal handler */
-       movl    SIGF_SIGRET(%esp),%eax          /* Get sigreturn cookie */
-       cmpl    $0x0ABCDEF0,%eax                /* New one? */
-       jne     3f
-/* New signalling code */
-       lea     SIGF_UC(%esp),%eax              /* get ucontext */
+       lea     SIGF_UC(%esp),%eax              /* get ucontext_t */
        pushl   %eax
-       testl   $PSL_VM,UC_EFLAGS(%eax)
-       jne     1f
-       movl    UC_GS(%eax),%gs                 /* restore %gs */
-1:
        movl    $SYS_sigreturn,%eax
        pushl   %eax                            /* junk to fake return addr. */
        int     $0x80                           /* enter kernel with args */
-                                               /* on stack */
-2:
-       jmp     2b
-/* Old signalling code */
-3:
-       lea     SIGF_SC(%esp),%eax              /* get sigcontext */
-       pushl   %eax
-       testl   $PSL_VM,SC_PS(%eax)
-       jne     4f
-       movl    SC_GS(%eax),%gs                 /* restore %gs */
-4:
-       movl    $SYS_osigreturn,%eax
-       pushl   %eax                            /* junk to fake return addr. */
-       int     $0x80                           /* enter kernel with args */
                                                /* on stack */
-5:
-       jmp     5b
-
+1:
+       jmp     1b
        ALIGN_TEXT
 _esigcode:
 
Index: i386/i386/machdep.c
===================================================================
RCS file: /home/ncvs/src/sys/i386/i386/machdep.c,v
retrieving revision 1.366
diff -u -r1.366 machdep.c
--- machdep.c   1999/10/04 19:33:51     1.366
+++ machdep.c   1999/10/05 12:47:23
@@ -725,8 +725,6 @@
                tf->tf_eflags &= ~(PSL_VM|PSL_NT|PSL_T|PSL_VIF|PSL_VIP);
        }
 
-       sf.sf_sigreturn = 0x0ABCDEF0;
-
        /*
         * Copy the sigframe out to the user's stack.
         */
@@ -789,6 +787,8 @@
                struct trapframe_vm86 *tf = (struct trapframe_vm86 *)regs;
                struct vm86_kernel *vm86;
 
+               load_gs(scp->sc_gs);
+
                /*
                 * if pcb_ext == 0 or vm86_inited == 0, the user hasn't
                 * set up the vm86 area, and we can't enter vm86 mode.
@@ -888,6 +888,10 @@
        ucontext_t *ucp;
        int cs, eflags;
 
+       if ((p->p_flag & P_NEWSIGSET) == 0) {
+               return osigreturn(p, (struct osigreturn_args *)uap);
+       }
+
        regs = p->p_md.md_regs;
        ucp = uap->sigcntxp;
        eflags = ucp->uc_mcontext.mc_tf.tf_eflags;
@@ -898,6 +902,8 @@
        if (eflags & PSL_VM) {
                struct trapframe_vm86 *tf = (struct trapframe_vm86 *)regs;
                struct vm86_kernel *vm86;
+
+               load_gs(ucp->uc_mcontext.mc_gs);
 
                /*
                 * if pcb_ext == 0 or vm86_inited == 0, the user hasn't
Index: i386/include/sigframe.h
===================================================================
RCS file: /home/ncvs/src/sys/i386/include/sigframe.h,v
retrieving revision 1.2
diff -u -r1.2 sigframe.h
--- sigframe.h  1999/10/03 12:55:58     1.2
+++ sigframe.h  1999/10/05 11:53:53
@@ -86,9 +86,8 @@
                __siginfohandler_t      *sf_action;
                __sighandler_t          *sf_handler;
        } sf_ahu;
-       register_t      sf_sigreturn;   /* sigreturn to use */
-       siginfo_t       sf_si;          /* = *sf_siginfo (SA_SIGINFO case) */
        ucontext_t      sf_uc;          /* = *sf_ucontext */
+       siginfo_t       sf_si;          /* = *sf_siginfo (SA_SIGINFO case) */
 };
 
 #endif /* !_MACHINE_SIGFRAME_H_ */

Reply via email to