luoqi 1999/11/15 12:19:28 PST Modified files: (Branch: RELENG_3) sys/i386/i386 genassym.c locore.s machdep.c sys/i386/include cpufunc.h Log: MFC: Save %fs and %gs in sigcontext when delivering signals and restore them upon return. Revision Changes Path 1.62.2.3 +4 -1 src/sys/i386/i386/genassym.c 1.118.2.3 +11 -7 src/sys/i386/i386/locore.s 1.322.2.9 +5 -1 src/sys/i386/i386/machdep.c 1.85.2.2 +29 -1 src/sys/i386/include/cpufunc.h luoqi 1999/11/15 12:34:50 PST Modified files: (Branch: RELENG_3) sys/pc98/i386 machdep.c Log: MFC: Save %fs and %gs in sigcontext when delivering signals and restore them upon return. Revision Changes Path 1.105.2.10 +5 -1 src/sys/pc98/i386/machdep.c Index: i386/i386/genassym.c =================================================================== RCS file: /home/cvs/cvs/src/sys/i386/i386/genassym.c,v retrieving revision 1.62.2.2 retrieving revision 1.62.2.3 diff -p -u -r1.62.2.2 -r1.62.2.3 --- src/sys/i386/i386/genassym.c 1999/08/29 16:05:40 1.62.2.2 +++ /home/cvs/cvs/src/sys/i386/i386/genassym.c 1999/11/15 20:19:23 1.62.2.3 @@ -173,6 +173,9 @@ main() printf("#define\tSIGF_SCP %#x\n", OS(sigframe, sf_scp)); printf("#define\tSIGF_HANDLER %#x\n", OS(sigframe, sf_handler)); printf("#define\tSIGF_SC %#x\n", OS(sigframe, sf_sc)); + printf("#define\tSC_PS %#x\n", OS(sigcontext, sc_ps)); + printf("#define\tSC_FS %#x\n", OS(sigcontext, sc_fs)); + printf("#define\tSC_GS %#x\n", OS(sigcontext, sc_gs)); printf("#define\tB_READ %#x\n", B_READ); printf("#define\tENOENT %d\n", ENOENT); Index: i386/i386/locore.s =================================================================== RCS file: /home/cvs/cvs/src/sys/i386/i386/locore.s,v retrieving revision 1.118.2.2 retrieving revision 1.118.2.3 diff -p -u -r1.118.2.2 -r1.118.2.3 --- src/sys/i386/i386/locore.s 1999/08/29 16:05:42 1.118.2.2 +++ /home/cvs/cvs/src/sys/i386/i386/locore.s 1999/11/15 20:19:24 1.118.2.3 @@ -433,13 +433,17 @@ NON_GPROF_ENTRY(prepare_usermode) */ NON_GPROF_ENTRY(sigcode) call SIGF_HANDLER(%esp) - lea SIGF_SC(%esp),%eax /* scp (the call may have clobbered the */ - /* copy at 8(%esp)) */ - pushl %eax - pushl %eax /* junk to fake return address */ + lea SIGF_SC(%esp),%eax /* scp (the copy at 8(%esp) */ + pushl %eax /* may have been clobbered) */ + testl $PSL_VM,SC_PS(%eax) + jne 9f + movl SC_FS(%eax),%fs /* restore %fs */ + movl SC_GS(%eax),%gs /* restore %gs */ +9: + pushl %eax /* junk to fake return addr */ movl $SYS_sigreturn,%eax /* sigreturn() */ - LCALL(0x7,0) /* enter kernel with args on stack */ - hlt /* never gets here */ + LCALL(0x7,0) /* enter kernel with args */ +0: jmp 0b ALIGN_TEXT _esigcode: Index: i386/i386/machdep.c =================================================================== RCS file: /home/cvs/cvs/src/sys/i386/i386/machdep.c,v retrieving revision 1.322.2.8 retrieving revision 1.322.2.9 diff -p -u -r1.322.2.8 -r1.322.2.9 --- src/sys/i386/i386/machdep.c 1999/08/29 16:05:43 1.322.2.8 +++ /home/cvs/cvs/src/sys/i386/i386/machdep.c 1999/11/15 20:19:25 1.322.2.9 @@ -579,6 +579,8 @@ sendsig(catcher, sig, mask, code) sf.sf_sc.sc_ds = regs->tf_ds; sf.sf_sc.sc_ss = regs->tf_ss; sf.sf_sc.sc_es = regs->tf_es; + sf.sf_sc.sc_fs = rfs(); + sf.sf_sc.sc_gs = rgs(); sf.sf_sc.sc_isp = regs->tf_isp; /* @@ -643,6 +645,8 @@ sendsig(catcher, sig, mask, code) regs->tf_cs = _ucodesel; regs->tf_ds = _udatasel; regs->tf_es = _udatasel; + load_fs(_udatasel); + load_gs(_udatasel); regs->tf_ss = _udatasel; } Index: i386/include/cpufunc.h =================================================================== RCS file: /home/cvs/cvs/src/sys/i386/include/cpufunc.h,v retrieving revision 1.85.2.1 retrieving revision 1.85.2.2 diff -p -u -r1.85.2.1 -r1.85.2.2 --- src/sys/i386/include/cpufunc.h 1999/08/29 16:06:26 1.85.2.1 +++ /home/cvs/cvs/src/sys/i386/include/cpufunc.h 1999/11/15 20:19:28 1.85.2.2 @@ -424,6 +424,34 @@ static __inline void wrmsr(u_int msr, u_int64_t newval) { __asm __volatile(".byte 0x0f, 0x30" : : "A" (newval), "c" (msr)); +} + +static __inline u_int +rfs(void) +{ + u_int sel; + __asm __volatile("movl %%fs,%0" : "=rm" (sel)); + return (sel); +} + +static __inline u_int +rgs(void) +{ + u_int sel; + __asm __volatile("movl %%gs,%0" : "=rm" (sel)); + return (sel); +} + +static __inline void +load_fs(u_int sel) +{ + __asm __volatile("movl %0,%%fs" : : "rm" (sel)); +} + +static __inline void +load_gs(u_int sel) +{ + __asm __volatile("movl %0,%%gs" : : "rm" (sel)); } #else /* !__GNUC__ */ Index: pc98/i386/machdep.c =================================================================== RCS file: /home/cvs/cvs/src/sys/pc98/i386/machdep.c,v retrieving revision 1.105.2.9 retrieving revision 1.105.2.10 diff -p -u -r1.105.2.9 -r1.105.2.10 --- src/sys/pc98/i386/machdep.c 1999/11/14 01:54:08 1.105.2.9 +++ /home/cvs/cvs/src/sys/pc98/i386/machdep.c 1999/11/15 20:34:48 1.105.2.10 @@ -592,6 +592,8 @@ sendsig(catcher, sig, mask, code) sf.sf_sc.sc_ds = regs->tf_ds; sf.sf_sc.sc_ss = regs->tf_ss; sf.sf_sc.sc_es = regs->tf_es; + sf.sf_sc.sc_fs = rfs(); + sf.sf_sc.sc_gs = rgs(); sf.sf_sc.sc_isp = regs->tf_isp; /* @@ -656,6 +658,8 @@ sendsig(catcher, sig, mask, code) regs->tf_cs = _ucodesel; regs->tf_ds = _udatasel; regs->tf_es = _udatasel; + load_fs(_udatasel); + load_gs(_udatasel); regs->tf_ss = _udatasel; }