Date: Fri, 16 Sep 2016 07:09:35 +0000 (UTC) From: Bruce Evans <bde@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r305865 - in head/sys: amd64/amd64 x86/include Message-ID: <201609160709.u8G79Z99091770@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: bde Date: Fri Sep 16 07:09:35 2016 New Revision: 305865 URL: https://svnweb.freebsd.org/changeset/base/305865 Log: Fix decoding of tf_rsp on amd64, and move TF_HAS_STACKREGS() to the i386-only section, and fix a comment about the amd64 kernel trapframe not having stackregs. tf_rsp doesn't need decoding on amd64, but had an old clone of i386 code to do this in 1 place, and since the amd64 kernel trapframe does have stackregs, the result was an off-by-16 error for %rsp in an error message. Modified: head/sys/amd64/amd64/trap.c head/sys/x86/include/frame.h Modified: head/sys/amd64/amd64/trap.c ============================================================================== --- head/sys/amd64/amd64/trap.c Fri Sep 16 06:31:10 2016 (r305864) +++ head/sys/amd64/amd64/trap.c Fri Sep 16 07:09:35 2016 (r305865) @@ -776,7 +776,6 @@ trap_fatal(frame, eva) { int code, ss; u_int type; - long esp; struct soft_segment_descriptor softseg; char *msg; @@ -807,14 +806,8 @@ trap_fatal(frame, eva) } printf("instruction pointer = 0x%lx:0x%lx\n", frame->tf_cs & 0xffff, frame->tf_rip); - if (TF_HAS_STACKREGS(frame)) { - ss = frame->tf_ss & 0xffff; - esp = frame->tf_rsp; - } else { - ss = GSEL(GDATA_SEL, SEL_KPL); - esp = (long)&frame->tf_rsp; - } - printf("stack pointer = 0x%x:0x%lx\n", ss, esp); + ss = frame->tf_ss & 0xffff; + printf("stack pointer = 0x%x:0x%lx\n", ss, frame->tf_rsp); printf("frame pointer = 0x%x:0x%lx\n", ss, frame->tf_rbp); printf("code segment = base 0x%lx, limit 0x%lx, type 0x%x\n", softseg.ssd_base, softseg.ssd_limit, softseg.ssd_type); Modified: head/sys/x86/include/frame.h ============================================================================== --- head/sys/x86/include/frame.h Fri Sep 16 06:31:10 2016 (r305864) +++ head/sys/x86/include/frame.h Fri Sep 16 07:09:35 2016 (r305865) @@ -98,6 +98,15 @@ struct trapframe_vm86 { int tf_vm86_fs; int tf_vm86_gs; }; + +/* + * This alias for the MI TRAPF_USERMODE() should be used when we don't + * care about user mode itself, but need to know if a frame has stack + * registers. The difference is only logical, but on i386 the logic + * for using TRAPF_USERMODE() is complicated by sometimes treating vm86 + * bioscall mode (which is a special ring 3 user mode) as kernel mode. + */ +#define TF_HAS_STACKREGS(tf) TRAPF_USERMODE(tf) #endif /* __i386__ */ #ifdef __amd64__ @@ -136,7 +145,7 @@ struct trapframe { register_t tf_rip; register_t tf_cs; register_t tf_rflags; - /* below only when crossing rings (user to kernel) */ + /* the amd64 frame always has the stack registers */ register_t tf_rsp; register_t tf_ss; }; @@ -146,13 +155,4 @@ struct trapframe { #define TF_HASFPXSTATE 0x4 #endif /* __amd64__ */ -/* - * This alias for the MI TRAPF_USERMODE() should be used when we don't - * care about user mode itself, but need to know if a frame has stack - * registers. The difference is only logical, but on i386 the logic - * for using TRAPF_USERMODE() is complicated by sometimes treating vm86 - * bioscall mode (which is a special ring 3 user mode) as kernel mode. - */ -#define TF_HAS_STACKREGS(tf) TRAPF_USERMODE(tf) - #endif /* _MACHINE_FRAME_H_ */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201609160709.u8G79Z99091770>