The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=eea3e4dd9703a252509d75814049aa8da5007ebb
commit eea3e4dd9703a252509d75814049aa8da5007ebb Author: Konstantin Belousov <k...@freebsd.org> AuthorDate: 2025-05-22 06:55:50 +0000 Commit: Konstantin Belousov <k...@freebsd.org> CommitDate: 2025-05-28 11:11:23 +0000 amd64: add mc_tlsbase member to mcontext Tested by: pho Reviewed by: olce Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D50482 --- sys/amd64/amd64/exec_machdep.c | 6 ++++++ sys/x86/include/frame.h | 1 + sys/x86/include/ucontext.h | 8 ++++++-- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/sys/amd64/amd64/exec_machdep.c b/sys/amd64/amd64/exec_machdep.c index 46e4f0c9e07b..da68289e2c83 100644 --- a/sys/amd64/amd64/exec_machdep.c +++ b/sys/amd64/amd64/exec_machdep.c @@ -635,6 +635,8 @@ get_mcontext(struct thread *td, mcontext_t *mcp, int flags) mcp->mc_gsbase = pcb->pcb_gsbase; mcp->mc_xfpustate = 0; mcp->mc_xfpustate_len = 0; + mcp->mc_tlsbase = (pcb->pcb_flags & PCB_TLSBASE) != 0 ? + pcb->pcb_tlsbase : 0; bzero(mcp->mc_spare, sizeof(mcp->mc_spare)); return (0); } @@ -709,6 +711,10 @@ set_mcontext(struct thread *td, mcontext_t *mcp) pcb->pcb_fsbase = mcp->mc_fsbase; pcb->pcb_gsbase = mcp->mc_gsbase; } + if ((mcp->mc_flags & _MC_HASTLSBASE) != 0) { + pcb->pcb_tlsbase = mcp->mc_tlsbase; + set_pcb_flags(pcb, PCB_TLSBASE); + } return (0); } diff --git a/sys/x86/include/frame.h b/sys/x86/include/frame.h index 9574e8c0ed02..994e19b979fc 100644 --- a/sys/x86/include/frame.h +++ b/sys/x86/include/frame.h @@ -152,6 +152,7 @@ struct trapframe { #define TF_HASSEGS 0x1 #define TF_HASBASES 0x2 #define TF_HASFPXSTATE 0x4 +#define TF_RESERV0 0x8 /* no tlsbase in the trapframe */ #endif /* __amd64__ */ #endif /* _MACHINE_FRAME_H_ */ diff --git a/sys/x86/include/ucontext.h b/sys/x86/include/ucontext.h index b7964e8c7141..00edc8c16bce 100644 --- a/sys/x86/include/ucontext.h +++ b/sys/x86/include/ucontext.h @@ -99,7 +99,9 @@ typedef struct __mcontext { #define _MC_HASSEGS 0x1 #define _MC_HASBASES 0x2 #define _MC_HASFPXSTATE 0x4 -#define _MC_FLAG_MASK (_MC_HASSEGS | _MC_HASBASES | _MC_HASFPXSTATE) +#define _MC_HASTLSBASE 0x8 +#define _MC_FLAG_MASK (_MC_HASSEGS | _MC_HASBASES | _MC_HASFPXSTATE | \ + _MC_HASTLSBASE) typedef struct __mcontext { /* @@ -158,7 +160,9 @@ typedef struct __mcontext { __register_t mc_xfpustate; __register_t mc_xfpustate_len; - long mc_spare[4]; + __register_t mc_tlsbase; + + long mc_spare[3]; } mcontext_t; #endif /* __amd64__ */