Date: Fri, 27 Mar 2026 01:52:26 +0000 From: Konstantin Belousov <kib@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org Subject: git: 9f174a7fc758 - stable/15 - x86 FRED: add hardware definitions for the trap frames fields Message-ID: <69c5e2da.1edaa.b4c2e04@gitrepo.freebsd.org>
index | next in thread | raw e-mail
The branch stable/15 has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=9f174a7fc758c5c3d9b7861e0b0cdda5e7edf14c commit 9f174a7fc758c5c3d9b7861e0b0cdda5e7edf14c Author: Konstantin Belousov <kib@FreeBSD.org> AuthorDate: 2026-02-07 03:35:17 +0000 Commit: Konstantin Belousov <kib@FreeBSD.org> CommitDate: 2026-03-26 23:42:56 +0000 x86 FRED: add hardware definitions for the trap frames fields (cherry picked from commit e90950627327de9226b052851b36f341bc72b746) --- sys/amd64/amd64/trap.c | 17 ++++++++------- sys/x86/include/frame.h | 55 +++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 58 insertions(+), 14 deletions(-) diff --git a/sys/amd64/amd64/trap.c b/sys/amd64/amd64/trap.c index e4e4e98fbf7d..8a1d1528e6da 100644 --- a/sys/amd64/amd64/trap.c +++ b/sys/amd64/amd64/trap.c @@ -940,7 +940,7 @@ after_vmfault: static void trap_diag(struct trapframe *frame, vm_offset_t eva) { - int code, ss; + int code; u_int type; struct soft_segment_descriptor softseg; struct user_segment_descriptor *gdt; @@ -948,7 +948,7 @@ trap_diag(struct trapframe *frame, vm_offset_t eva) code = frame->tf_err; type = frame->tf_trapno; gdt = *PCPU_PTR(gdt); - sdtossd(&gdt[IDXSEL(frame->tf_cs & 0xffff)], &softseg); + sdtossd(&gdt[IDXSEL(frame->tf_cs)], &softseg); printf("\n\nFatal trap %d: %s while in %s mode\n", type, type < nitems(trap_msg) ? trap_msg[type] : UNKNOWN, @@ -967,11 +967,12 @@ trap_diag(struct trapframe *frame, vm_offset_t eva) code & PGEX_RSV ? "reserved bits in PTE" : code & PGEX_P ? "protection violation" : "page not present"); } - printf("instruction pointer = 0x%lx:0x%lx\n", - frame->tf_cs & 0xffff, frame->tf_rip); - 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("instruction pointer = %#hx:%#lx\n", + frame->tf_cs, frame->tf_rip); + printf("stack pointer = %#hx:%#lx\n", frame->tf_ss, + frame->tf_rsp); + printf("frame pointer = %#hx:%#lx\n", frame->tf_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); printf(" = DPL %d, pres %d, long %d, def32 %d, gran %d\n", @@ -1065,7 +1066,7 @@ dblfault_handler(struct trapframe *frame) "r8 %#lx r9 %#lx r10 %#lx\n" "r11 %#lx r12 %#lx r13 %#lx\n" "r14 %#lx r15 %#lx rflags %#lx\n" - "cs %#lx ss %#lx ds %#hx es %#hx fs %#hx gs %#hx\n" + "cs %#hx ss %#hx ds %#hx es %#hx fs %#hx gs %#hx\n" "fsbase %#lx gsbase %#lx kgsbase %#lx\n", frame->tf_rip, frame->tf_rsp, frame->tf_rbp, frame->tf_rax, frame->tf_rdx, frame->tf_rbx, diff --git a/sys/x86/include/frame.h b/sys/x86/include/frame.h index feef41ac7bfe..a6444d55cfaf 100644 --- a/sys/x86/include/frame.h +++ b/sys/x86/include/frame.h @@ -143,17 +143,60 @@ struct trapframe { /* below portion defined in hardware */ register_t tf_err; register_t tf_rip; - register_t tf_cs; + uint16_t tf_cs; + uint16_t tf_fred_evinfo3; + uint32_t tf_fred_zero2; register_t tf_rflags; /* the amd64 frame always has the stack registers */ register_t tf_rsp; - register_t tf_ss; + uint16_t tf_ss; + uint16_t tf_fred_evinfo1; + uint32_t tf_fred_evinfo2; + /* two long words added by FRED */ + uint64_t tf_fred_evdata; + uint64_t tf_fred_zero1; }; -#define TF_HASSEGS 0x1 -#define TF_HASBASES 0x2 -#define TF_HASFPXSTATE 0x4 -#define TF_RESERV0 0x8 /* no tlsbase in the trapframe */ +#define TF_FRED_EVDATA_B0 0x0000000000000001ull /* %dr6 B0 */ +#define TF_FRED_EVDATA_B1 0x0000000000000002ull +#define TF_FRED_EVDATA_B2 0x0000000000000004ull +#define TF_FRED_EVDATA_B3 0x0000000000000008ull +#define TF_FRED_EVDATA_BLD 0x0000000000000800ull /* bus lock acq + detected */ +#define TF_FRED_EVDATA_BD 0x0000000000002000ull /* dr access detected */ +#define TF_FRED_EVDATA_BS 0x0000000000004000ull /* single step */ +#define TF_FRED_EVDATA_RTM 0x0000000000010000ull /* #db or #bp in RTM */ + +#define TF_FRED_EVINFO1_STIINT 0x0001 /* hw intr blocked by STI */ +#define TF_FRED_EVINFO1_SYSCALL 0x0002 /* SYSCALL/SYSENTER/INTn */ +#define TF_FRED_EVINFO1_NMI 0x0004 /* NMI */ + +#define TF_FRED_EVINFO2_VECMASK 0x000000ff /* event vector mask */ +#define TF_FRED_EVINFO2_TYPEMASK 0x000f0000 /* event type mask */ +#define TF_FRED_EVINFO2_TYPE_EXTINT 0x00000000 +#define TF_FRED_EVINFO2_TYPE_NMI 0x00020000 +#define TF_FRED_EVINFO2_TYPE_EXC 0x00030000 +#define TF_FRED_EVINFO2_TYPE_INTn 0x00040000 +#define TF_FRED_EVINFO2_TYPE_INT1 0x00050000 +#define TF_FRED_EVINFO2_TYPE_INT3 0x00060000 +#define TF_FRED_EVINFO2_TYPE_SYSCALL 0x00070000 +#define TF_FRED_EVINFO2_ENCL 0x01000000 /* SGX-related */ +#define TF_FRED_EVINFO2_LM 0x02000000 /* in 64bit mode */ +#define TF_FRED_EVINFO2_NEST 0x04000000 /* during ev delivery */ +#define TF_FRED_EVINFO2_INSTLENMASK 0xf0000000 /* instr length mask */ +#define TF_FRED_EVINFO2_INSTLENSHIFT 28 /* instr length shift */ + +#define TF_FRED_EVINFO2_VEC_SYSCALL 1 +#define TF_FRED_EVINFO2_VEC_SYSENTER 2 + +#define TF_FRED_EVINFO3_CSLMASK 0x0003 /* event CSL mask */ +#define TF_FRED_EVINFO3_WFE 0x0004 /* in WAIT_FOR_ENDBRANCH */ + +#define TF_HASSEGS 0x00000001 +#define TF_HASBASES 0x00000002 +#define TF_HASFPXSTATE 0x00000004 +#define TF_RESERV0 0x00000008 /* no tlsbase in the trapframe */ +#define TF_FRED 0x00000010 #endif /* __amd64__ */ #endif /* _MACHINE_FRAME_H_ */home | help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?69c5e2da.1edaa.b4c2e04>
