* [PATCH 0/4] x86-32: Clean up GS segment handling
@ 2022-03-25 15:39 Brian Gerst
2022-03-25 15:39 ` [PATCH 1/4] x86-32: Simplify ELF_CORE_COPY_REGS Brian Gerst
` (5 more replies)
0 siblings, 6 replies; 13+ messages in thread
From: Brian Gerst @ 2022-03-25 15:39 UTC (permalink / raw)
To: linux-kernel, x86
Cc: Andy Lutomirski, Borislav Petkov, Thomas Gleixner,
H . Peter Anvin, Peter Zijlstra, Brian Gerst
Since commit 3fb0fdb3bbe ("Make the canary into a regular percpu
variable"), the GS segment is no longer switched on kernel entry for
32-bit kernels. Clean up the remaining code that handled lazy GS
switching.
Brian Gerst (4):
x86-32: Simplify ELF_CORE_COPY_REGS
ELF: Remove elf_core_copy_kernel_regs()
x86-32: Remove lazy GS macros
x86: Merge load_gs_index()
arch/powerpc/kernel/fadump.c | 2 +-
arch/powerpc/platforms/powernv/opal-core.c | 2 +-
arch/x86/include/asm/elf.h | 15 ++-------------
arch/x86/include/asm/mmu_context.h | 2 +-
arch/x86/include/asm/segment.h | 12 ------------
arch/x86/include/asm/special_insns.h | 7 ++++---
arch/x86/kernel/process.c | 5 +----
arch/x86/kernel/process_32.c | 11 ++++-------
arch/x86/kernel/ptrace.c | 6 +++---
arch/x86/kernel/signal.c | 8 +++++---
arch/x86/kernel/vm86_32.c | 4 ++--
arch/x86/lib/insn-eval.c | 5 +++--
arch/x86/math-emu/get_address.c | 2 +-
include/linux/elfcore.h | 9 ---------
kernel/kexec_core.c | 2 +-
15 files changed, 29 insertions(+), 63 deletions(-)
--
2.35.1
^ permalink raw reply [flat|nested] 13+ messages in thread* [PATCH 1/4] x86-32: Simplify ELF_CORE_COPY_REGS 2022-03-25 15:39 [PATCH 0/4] x86-32: Clean up GS segment handling Brian Gerst @ 2022-03-25 15:39 ` Brian Gerst 2022-04-15 9:42 ` [tip: x86/core] x86/32: " tip-bot2 for Brian Gerst 2022-03-25 15:39 ` [PATCH 2/4] ELF: Remove elf_core_copy_kernel_regs() Brian Gerst ` (4 subsequent siblings) 5 siblings, 1 reply; 13+ messages in thread From: Brian Gerst @ 2022-03-25 15:39 UTC (permalink / raw) To: linux-kernel, x86 Cc: Andy Lutomirski, Borislav Petkov, Thomas Gleixner, H . Peter Anvin, Peter Zijlstra, Brian Gerst GS is now always a user segment, so there is no difference between user and kernel registers. Signed-off-by: Brian Gerst <brgerst@gmail.com> --- arch/x86/include/asm/elf.h | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/arch/x86/include/asm/elf.h b/arch/x86/include/asm/elf.h index 29fea180a665..cb0ff1055ab1 100644 --- a/arch/x86/include/asm/elf.h +++ b/arch/x86/include/asm/elf.h @@ -116,7 +116,7 @@ extern unsigned int vdso32_enabled; * now struct_user_regs, they are different) */ -#define ELF_CORE_COPY_REGS_COMMON(pr_reg, regs) \ +#define ELF_CORE_COPY_REGS(pr_reg, regs) \ do { \ pr_reg[0] = regs->bx; \ pr_reg[1] = regs->cx; \ @@ -128,6 +128,7 @@ do { \ pr_reg[7] = regs->ds; \ pr_reg[8] = regs->es; \ pr_reg[9] = regs->fs; \ + savesegment(gs, pr_reg[10]); \ pr_reg[11] = regs->orig_ax; \ pr_reg[12] = regs->ip; \ pr_reg[13] = regs->cs; \ @@ -136,18 +137,6 @@ do { \ pr_reg[16] = regs->ss; \ } while (0); -#define ELF_CORE_COPY_REGS(pr_reg, regs) \ -do { \ - ELF_CORE_COPY_REGS_COMMON(pr_reg, regs);\ - pr_reg[10] = get_user_gs(regs); \ -} while (0); - -#define ELF_CORE_COPY_KERNEL_REGS(pr_reg, regs) \ -do { \ - ELF_CORE_COPY_REGS_COMMON(pr_reg, regs);\ - savesegment(gs, pr_reg[10]); \ -} while (0); - #define ELF_PLATFORM (utsname()->machine) #define set_personality_64bit() do { } while (0) -- 2.35.1 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [tip: x86/core] x86/32: Simplify ELF_CORE_COPY_REGS 2022-03-25 15:39 ` [PATCH 1/4] x86-32: Simplify ELF_CORE_COPY_REGS Brian Gerst @ 2022-04-15 9:42 ` tip-bot2 for Brian Gerst 0 siblings, 0 replies; 13+ messages in thread From: tip-bot2 for Brian Gerst @ 2022-04-15 9:42 UTC (permalink / raw) To: linux-tip-commits Cc: Brian Gerst, Borislav Petkov, Thomas Gleixner, Andy Lutomirski, x86, linux-kernel The following commit has been merged into the x86/core branch of tip: Commit-ID: f5d9283ecb33329073033029fe427155aa0abfb1 Gitweb: https://git.kernel.org/tip/f5d9283ecb33329073033029fe427155aa0abfb1 Author: Brian Gerst <brgerst@gmail.com> AuthorDate: Fri, 25 Mar 2022 11:39:50 -04:00 Committer: Borislav Petkov <bp@suse.de> CommitterDate: Tue, 12 Apr 2022 15:42:59 +02:00 x86/32: Simplify ELF_CORE_COPY_REGS GS is now always a user segment, so there is no difference between user and kernel registers. Signed-off-by: Brian Gerst <brgerst@gmail.com> Signed-off-by: Borislav Petkov <bp@suse.de> Reviewed-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: Andy Lutomirski <luto@kernel.org> Link: https://lore.kernel.org/r/20220325153953.162643-2-brgerst@gmail.com --- arch/x86/include/asm/elf.h | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/arch/x86/include/asm/elf.h b/arch/x86/include/asm/elf.h index 29fea18..cb0ff10 100644 --- a/arch/x86/include/asm/elf.h +++ b/arch/x86/include/asm/elf.h @@ -116,7 +116,7 @@ extern unsigned int vdso32_enabled; * now struct_user_regs, they are different) */ -#define ELF_CORE_COPY_REGS_COMMON(pr_reg, regs) \ +#define ELF_CORE_COPY_REGS(pr_reg, regs) \ do { \ pr_reg[0] = regs->bx; \ pr_reg[1] = regs->cx; \ @@ -128,6 +128,7 @@ do { \ pr_reg[7] = regs->ds; \ pr_reg[8] = regs->es; \ pr_reg[9] = regs->fs; \ + savesegment(gs, pr_reg[10]); \ pr_reg[11] = regs->orig_ax; \ pr_reg[12] = regs->ip; \ pr_reg[13] = regs->cs; \ @@ -136,18 +137,6 @@ do { \ pr_reg[16] = regs->ss; \ } while (0); -#define ELF_CORE_COPY_REGS(pr_reg, regs) \ -do { \ - ELF_CORE_COPY_REGS_COMMON(pr_reg, regs);\ - pr_reg[10] = get_user_gs(regs); \ -} while (0); - -#define ELF_CORE_COPY_KERNEL_REGS(pr_reg, regs) \ -do { \ - ELF_CORE_COPY_REGS_COMMON(pr_reg, regs);\ - savesegment(gs, pr_reg[10]); \ -} while (0); - #define ELF_PLATFORM (utsname()->machine) #define set_personality_64bit() do { } while (0) ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 2/4] ELF: Remove elf_core_copy_kernel_regs() 2022-03-25 15:39 [PATCH 0/4] x86-32: Clean up GS segment handling Brian Gerst 2022-03-25 15:39 ` [PATCH 1/4] x86-32: Simplify ELF_CORE_COPY_REGS Brian Gerst @ 2022-03-25 15:39 ` Brian Gerst 2022-04-13 11:41 ` Borislav Petkov 2022-04-15 9:42 ` [tip: x86/core] " tip-bot2 for Brian Gerst 2022-03-25 15:39 ` [PATCH 3/4] x86-32: Remove lazy GS macros Brian Gerst ` (3 subsequent siblings) 5 siblings, 2 replies; 13+ messages in thread From: Brian Gerst @ 2022-03-25 15:39 UTC (permalink / raw) To: linux-kernel, x86 Cc: Andy Lutomirski, Borislav Petkov, Thomas Gleixner, H . Peter Anvin, Peter Zijlstra, Brian Gerst x86-32 was the last architecture that implemented separate user and kernel registers. Signed-off-by: Brian Gerst <brgerst@gmail.com> --- arch/powerpc/kernel/fadump.c | 2 +- arch/powerpc/platforms/powernv/opal-core.c | 2 +- include/linux/elfcore.h | 9 --------- kernel/kexec_core.c | 2 +- 4 files changed, 3 insertions(+), 12 deletions(-) diff --git a/arch/powerpc/kernel/fadump.c b/arch/powerpc/kernel/fadump.c index 4fdb7c77fda1..c0cf17196d6c 100644 --- a/arch/powerpc/kernel/fadump.c +++ b/arch/powerpc/kernel/fadump.c @@ -752,7 +752,7 @@ u32 *__init fadump_regs_to_elf_notes(u32 *buf, struct pt_regs *regs) * FIXME: How do i get PID? Do I really need it? * prstatus.pr_pid = ???? */ - elf_core_copy_kernel_regs(&prstatus.pr_reg, regs); + elf_core_copy_regs(&prstatus.pr_reg, regs); buf = append_elf_note(buf, CRASH_CORE_NOTE_NAME, NT_PRSTATUS, &prstatus, sizeof(prstatus)); return buf; diff --git a/arch/powerpc/platforms/powernv/opal-core.c b/arch/powerpc/platforms/powernv/opal-core.c index 0331f1973f0e..dd6e99edff76 100644 --- a/arch/powerpc/platforms/powernv/opal-core.c +++ b/arch/powerpc/platforms/powernv/opal-core.c @@ -112,7 +112,7 @@ static void __init fill_prstatus(struct elf_prstatus *prstatus, int pir, struct pt_regs *regs) { memset(prstatus, 0, sizeof(struct elf_prstatus)); - elf_core_copy_kernel_regs(&(prstatus->pr_reg), regs); + elf_core_copy_regs(&(prstatus->pr_reg), regs); /* * Overload PID with PIR value. diff --git a/include/linux/elfcore.h b/include/linux/elfcore.h index f8e206e82476..346a8b56cdc8 100644 --- a/include/linux/elfcore.h +++ b/include/linux/elfcore.h @@ -84,15 +84,6 @@ static inline void elf_core_copy_regs(elf_gregset_t *elfregs, struct pt_regs *re #endif } -static inline void elf_core_copy_kernel_regs(elf_gregset_t *elfregs, struct pt_regs *regs) -{ -#ifdef ELF_CORE_COPY_KERNEL_REGS - ELF_CORE_COPY_KERNEL_REGS((*elfregs), regs); -#else - elf_core_copy_regs(elfregs, regs); -#endif -} - static inline int elf_core_copy_task_regs(struct task_struct *t, elf_gregset_t* elfregs) { #if defined (ELF_CORE_COPY_TASK_REGS) diff --git a/kernel/kexec_core.c b/kernel/kexec_core.c index 68480f731192..be4b54c2c615 100644 --- a/kernel/kexec_core.c +++ b/kernel/kexec_core.c @@ -1078,7 +1078,7 @@ void crash_save_cpu(struct pt_regs *regs, int cpu) return; memset(&prstatus, 0, sizeof(prstatus)); prstatus.common.pr_pid = current->pid; - elf_core_copy_kernel_regs(&prstatus.pr_reg, regs); + elf_core_copy_regs(&prstatus.pr_reg, regs); buf = append_elf_note(buf, KEXEC_CORE_NOTE_NAME, NT_PRSTATUS, &prstatus, sizeof(prstatus)); final_note(buf); -- 2.35.1 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH 2/4] ELF: Remove elf_core_copy_kernel_regs() 2022-03-25 15:39 ` [PATCH 2/4] ELF: Remove elf_core_copy_kernel_regs() Brian Gerst @ 2022-04-13 11:41 ` Borislav Petkov 2022-04-13 12:31 ` Michael Ellerman 2022-04-15 9:42 ` [tip: x86/core] " tip-bot2 for Brian Gerst 1 sibling, 1 reply; 13+ messages in thread From: Borislav Petkov @ 2022-04-13 11:41 UTC (permalink / raw) To: Brian Gerst, linuxppc-dev Cc: linux-kernel, x86, Andy Lutomirski, Thomas Gleixner, H . Peter Anvin, Peter Zijlstra + PPC ML as an FYI that this change will come through tip. On Fri, Mar 25, 2022 at 11:39:51AM -0400, Brian Gerst wrote: > x86-32 was the last architecture that implemented separate user and > kernel registers. > > Signed-off-by: Brian Gerst <brgerst@gmail.com> > --- > arch/powerpc/kernel/fadump.c | 2 +- > arch/powerpc/platforms/powernv/opal-core.c | 2 +- > include/linux/elfcore.h | 9 --------- > kernel/kexec_core.c | 2 +- > 4 files changed, 3 insertions(+), 12 deletions(-) > > diff --git a/arch/powerpc/kernel/fadump.c b/arch/powerpc/kernel/fadump.c > index 4fdb7c77fda1..c0cf17196d6c 100644 > --- a/arch/powerpc/kernel/fadump.c > +++ b/arch/powerpc/kernel/fadump.c > @@ -752,7 +752,7 @@ u32 *__init fadump_regs_to_elf_notes(u32 *buf, struct pt_regs *regs) > * FIXME: How do i get PID? Do I really need it? > * prstatus.pr_pid = ???? > */ > - elf_core_copy_kernel_regs(&prstatus.pr_reg, regs); > + elf_core_copy_regs(&prstatus.pr_reg, regs); > buf = append_elf_note(buf, CRASH_CORE_NOTE_NAME, NT_PRSTATUS, > &prstatus, sizeof(prstatus)); > return buf; > diff --git a/arch/powerpc/platforms/powernv/opal-core.c b/arch/powerpc/platforms/powernv/opal-core.c > index 0331f1973f0e..dd6e99edff76 100644 > --- a/arch/powerpc/platforms/powernv/opal-core.c > +++ b/arch/powerpc/platforms/powernv/opal-core.c > @@ -112,7 +112,7 @@ static void __init fill_prstatus(struct elf_prstatus *prstatus, int pir, > struct pt_regs *regs) > { > memset(prstatus, 0, sizeof(struct elf_prstatus)); > - elf_core_copy_kernel_regs(&(prstatus->pr_reg), regs); > + elf_core_copy_regs(&(prstatus->pr_reg), regs); > > /* > * Overload PID with PIR value. > diff --git a/include/linux/elfcore.h b/include/linux/elfcore.h > index f8e206e82476..346a8b56cdc8 100644 > --- a/include/linux/elfcore.h > +++ b/include/linux/elfcore.h > @@ -84,15 +84,6 @@ static inline void elf_core_copy_regs(elf_gregset_t *elfregs, struct pt_regs *re > #endif > } > > -static inline void elf_core_copy_kernel_regs(elf_gregset_t *elfregs, struct pt_regs *regs) > -{ > -#ifdef ELF_CORE_COPY_KERNEL_REGS > - ELF_CORE_COPY_KERNEL_REGS((*elfregs), regs); > -#else > - elf_core_copy_regs(elfregs, regs); > -#endif > -} > - > static inline int elf_core_copy_task_regs(struct task_struct *t, elf_gregset_t* elfregs) > { > #if defined (ELF_CORE_COPY_TASK_REGS) > diff --git a/kernel/kexec_core.c b/kernel/kexec_core.c > index 68480f731192..be4b54c2c615 100644 > --- a/kernel/kexec_core.c > +++ b/kernel/kexec_core.c > @@ -1078,7 +1078,7 @@ void crash_save_cpu(struct pt_regs *regs, int cpu) > return; > memset(&prstatus, 0, sizeof(prstatus)); > prstatus.common.pr_pid = current->pid; > - elf_core_copy_kernel_regs(&prstatus.pr_reg, regs); > + elf_core_copy_regs(&prstatus.pr_reg, regs); > buf = append_elf_note(buf, KEXEC_CORE_NOTE_NAME, NT_PRSTATUS, > &prstatus, sizeof(prstatus)); > final_note(buf); > -- > 2.35.1 > -- Regards/Gruss, Boris. https://people.kernel.org/tglx/notes-about-netiquette ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/4] ELF: Remove elf_core_copy_kernel_regs() 2022-04-13 11:41 ` Borislav Petkov @ 2022-04-13 12:31 ` Michael Ellerman 0 siblings, 0 replies; 13+ messages in thread From: Michael Ellerman @ 2022-04-13 12:31 UTC (permalink / raw) To: Borislav Petkov, Brian Gerst, linuxppc-dev Cc: linux-kernel, x86, Andy Lutomirski, Thomas Gleixner, H . Peter Anvin, Peter Zijlstra Borislav Petkov <bp@alien8.de> writes: > + PPC ML as an FYI that this change will come through tip. Ack. cheers > On Fri, Mar 25, 2022 at 11:39:51AM -0400, Brian Gerst wrote: >> x86-32 was the last architecture that implemented separate user and >> kernel registers. >> >> Signed-off-by: Brian Gerst <brgerst@gmail.com> >> --- >> arch/powerpc/kernel/fadump.c | 2 +- >> arch/powerpc/platforms/powernv/opal-core.c | 2 +- >> include/linux/elfcore.h | 9 --------- >> kernel/kexec_core.c | 2 +- >> 4 files changed, 3 insertions(+), 12 deletions(-) >> >> diff --git a/arch/powerpc/kernel/fadump.c b/arch/powerpc/kernel/fadump.c >> index 4fdb7c77fda1..c0cf17196d6c 100644 >> --- a/arch/powerpc/kernel/fadump.c >> +++ b/arch/powerpc/kernel/fadump.c >> @@ -752,7 +752,7 @@ u32 *__init fadump_regs_to_elf_notes(u32 *buf, struct pt_regs *regs) >> * FIXME: How do i get PID? Do I really need it? >> * prstatus.pr_pid = ???? >> */ >> - elf_core_copy_kernel_regs(&prstatus.pr_reg, regs); >> + elf_core_copy_regs(&prstatus.pr_reg, regs); >> buf = append_elf_note(buf, CRASH_CORE_NOTE_NAME, NT_PRSTATUS, >> &prstatus, sizeof(prstatus)); >> return buf; >> diff --git a/arch/powerpc/platforms/powernv/opal-core.c b/arch/powerpc/platforms/powernv/opal-core.c >> index 0331f1973f0e..dd6e99edff76 100644 >> --- a/arch/powerpc/platforms/powernv/opal-core.c >> +++ b/arch/powerpc/platforms/powernv/opal-core.c >> @@ -112,7 +112,7 @@ static void __init fill_prstatus(struct elf_prstatus *prstatus, int pir, >> struct pt_regs *regs) >> { >> memset(prstatus, 0, sizeof(struct elf_prstatus)); >> - elf_core_copy_kernel_regs(&(prstatus->pr_reg), regs); >> + elf_core_copy_regs(&(prstatus->pr_reg), regs); >> >> /* >> * Overload PID with PIR value. >> diff --git a/include/linux/elfcore.h b/include/linux/elfcore.h >> index f8e206e82476..346a8b56cdc8 100644 >> --- a/include/linux/elfcore.h >> +++ b/include/linux/elfcore.h >> @@ -84,15 +84,6 @@ static inline void elf_core_copy_regs(elf_gregset_t *elfregs, struct pt_regs *re >> #endif >> } >> >> -static inline void elf_core_copy_kernel_regs(elf_gregset_t *elfregs, struct pt_regs *regs) >> -{ >> -#ifdef ELF_CORE_COPY_KERNEL_REGS >> - ELF_CORE_COPY_KERNEL_REGS((*elfregs), regs); >> -#else >> - elf_core_copy_regs(elfregs, regs); >> -#endif >> -} >> - >> static inline int elf_core_copy_task_regs(struct task_struct *t, elf_gregset_t* elfregs) >> { >> #if defined (ELF_CORE_COPY_TASK_REGS) >> diff --git a/kernel/kexec_core.c b/kernel/kexec_core.c >> index 68480f731192..be4b54c2c615 100644 >> --- a/kernel/kexec_core.c >> +++ b/kernel/kexec_core.c >> @@ -1078,7 +1078,7 @@ void crash_save_cpu(struct pt_regs *regs, int cpu) >> return; >> memset(&prstatus, 0, sizeof(prstatus)); >> prstatus.common.pr_pid = current->pid; >> - elf_core_copy_kernel_regs(&prstatus.pr_reg, regs); >> + elf_core_copy_regs(&prstatus.pr_reg, regs); >> buf = append_elf_note(buf, KEXEC_CORE_NOTE_NAME, NT_PRSTATUS, >> &prstatus, sizeof(prstatus)); >> final_note(buf); >> -- >> 2.35.1 >> > > -- > Regards/Gruss, > Boris. > > https://people.kernel.org/tglx/notes-about-netiquette ^ permalink raw reply [flat|nested] 13+ messages in thread
* [tip: x86/core] ELF: Remove elf_core_copy_kernel_regs() 2022-03-25 15:39 ` [PATCH 2/4] ELF: Remove elf_core_copy_kernel_regs() Brian Gerst 2022-04-13 11:41 ` Borislav Petkov @ 2022-04-15 9:42 ` tip-bot2 for Brian Gerst 1 sibling, 0 replies; 13+ messages in thread From: tip-bot2 for Brian Gerst @ 2022-04-15 9:42 UTC (permalink / raw) To: linux-tip-commits Cc: Brian Gerst, Borislav Petkov, Thomas Gleixner, Andy Lutomirski, Michael Ellerman, x86, linux-kernel The following commit has been merged into the x86/core branch of tip: Commit-ID: 9554e908fb5d02e48a681d1eca180225bf109e83 Gitweb: https://git.kernel.org/tip/9554e908fb5d02e48a681d1eca180225bf109e83 Author: Brian Gerst <brgerst@gmail.com> AuthorDate: Fri, 25 Mar 2022 11:39:51 -04:00 Committer: Borislav Petkov <bp@suse.de> CommitterDate: Thu, 14 Apr 2022 14:08:26 +02:00 ELF: Remove elf_core_copy_kernel_regs() x86-32 was the last architecture that implemented separate user and kernel registers. Signed-off-by: Brian Gerst <brgerst@gmail.com> Signed-off-by: Borislav Petkov <bp@suse.de> Reviewed-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: Andy Lutomirski <luto@kernel.org> Acked-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20220325153953.162643-3-brgerst@gmail.com --- arch/powerpc/kernel/fadump.c | 2 +- arch/powerpc/platforms/powernv/opal-core.c | 2 +- include/linux/elfcore.h | 9 --------- kernel/kexec_core.c | 2 +- 4 files changed, 3 insertions(+), 12 deletions(-) diff --git a/arch/powerpc/kernel/fadump.c b/arch/powerpc/kernel/fadump.c index 65562c4..4c09c66 100644 --- a/arch/powerpc/kernel/fadump.c +++ b/arch/powerpc/kernel/fadump.c @@ -752,7 +752,7 @@ u32 *__init fadump_regs_to_elf_notes(u32 *buf, struct pt_regs *regs) * FIXME: How do i get PID? Do I really need it? * prstatus.pr_pid = ???? */ - elf_core_copy_kernel_regs(&prstatus.pr_reg, regs); + elf_core_copy_regs(&prstatus.pr_reg, regs); buf = append_elf_note(buf, CRASH_CORE_NOTE_NAME, NT_PRSTATUS, &prstatus, sizeof(prstatus)); return buf; diff --git a/arch/powerpc/platforms/powernv/opal-core.c b/arch/powerpc/platforms/powernv/opal-core.c index b97bc17..adcb1a1 100644 --- a/arch/powerpc/platforms/powernv/opal-core.c +++ b/arch/powerpc/platforms/powernv/opal-core.c @@ -112,7 +112,7 @@ static void __init fill_prstatus(struct elf_prstatus *prstatus, int pir, struct pt_regs *regs) { memset(prstatus, 0, sizeof(struct elf_prstatus)); - elf_core_copy_kernel_regs(&(prstatus->pr_reg), regs); + elf_core_copy_regs(&(prstatus->pr_reg), regs); /* * Overload PID with PIR value. diff --git a/include/linux/elfcore.h b/include/linux/elfcore.h index f8e206e..346a8b5 100644 --- a/include/linux/elfcore.h +++ b/include/linux/elfcore.h @@ -84,15 +84,6 @@ static inline void elf_core_copy_regs(elf_gregset_t *elfregs, struct pt_regs *re #endif } -static inline void elf_core_copy_kernel_regs(elf_gregset_t *elfregs, struct pt_regs *regs) -{ -#ifdef ELF_CORE_COPY_KERNEL_REGS - ELF_CORE_COPY_KERNEL_REGS((*elfregs), regs); -#else - elf_core_copy_regs(elfregs, regs); -#endif -} - static inline int elf_core_copy_task_regs(struct task_struct *t, elf_gregset_t* elfregs) { #if defined (ELF_CORE_COPY_TASK_REGS) diff --git a/kernel/kexec_core.c b/kernel/kexec_core.c index 68480f7..be4b54c 100644 --- a/kernel/kexec_core.c +++ b/kernel/kexec_core.c @@ -1078,7 +1078,7 @@ void crash_save_cpu(struct pt_regs *regs, int cpu) return; memset(&prstatus, 0, sizeof(prstatus)); prstatus.common.pr_pid = current->pid; - elf_core_copy_kernel_regs(&prstatus.pr_reg, regs); + elf_core_copy_regs(&prstatus.pr_reg, regs); buf = append_elf_note(buf, KEXEC_CORE_NOTE_NAME, NT_PRSTATUS, &prstatus, sizeof(prstatus)); final_note(buf); ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 3/4] x86-32: Remove lazy GS macros 2022-03-25 15:39 [PATCH 0/4] x86-32: Clean up GS segment handling Brian Gerst 2022-03-25 15:39 ` [PATCH 1/4] x86-32: Simplify ELF_CORE_COPY_REGS Brian Gerst 2022-03-25 15:39 ` [PATCH 2/4] ELF: Remove elf_core_copy_kernel_regs() Brian Gerst @ 2022-03-25 15:39 ` Brian Gerst 2022-04-15 9:42 ` [tip: x86/core] x86/32: " tip-bot2 for Brian Gerst 2022-03-25 15:39 ` [PATCH 4/4] x86: Merge load_gs_index() Brian Gerst ` (2 subsequent siblings) 5 siblings, 1 reply; 13+ messages in thread From: Brian Gerst @ 2022-03-25 15:39 UTC (permalink / raw) To: linux-kernel, x86 Cc: Andy Lutomirski, Borislav Petkov, Thomas Gleixner, H . Peter Anvin, Peter Zijlstra, Brian Gerst GS is always a user segment now. Signed-off-by: Brian Gerst <brgerst@gmail.com> --- arch/x86/include/asm/mmu_context.h | 2 +- arch/x86/include/asm/segment.h | 5 ----- arch/x86/kernel/process.c | 5 +---- arch/x86/kernel/process_32.c | 11 ++++------- arch/x86/kernel/ptrace.c | 6 +++--- arch/x86/kernel/signal.c | 8 +++++--- arch/x86/kernel/vm86_32.c | 4 ++-- arch/x86/lib/insn-eval.c | 5 +++-- arch/x86/math-emu/get_address.c | 2 +- 9 files changed, 20 insertions(+), 28 deletions(-) diff --git a/arch/x86/include/asm/mmu_context.h b/arch/x86/include/asm/mmu_context.h index 27516046117a..b8d40ddeab00 100644 --- a/arch/x86/include/asm/mmu_context.h +++ b/arch/x86/include/asm/mmu_context.h @@ -141,7 +141,7 @@ do { \ #ifdef CONFIG_X86_32 #define deactivate_mm(tsk, mm) \ do { \ - lazy_load_gs(0); \ + loadsegment(gs, 0); \ } while (0) #else #define deactivate_mm(tsk, mm) \ diff --git a/arch/x86/include/asm/segment.h b/arch/x86/include/asm/segment.h index 656ed6531d03..617b3663e4dd 100644 --- a/arch/x86/include/asm/segment.h +++ b/arch/x86/include/asm/segment.h @@ -354,11 +354,6 @@ static inline void __loadsegment_fs(unsigned short value) * x86-32 user GS accessors. This is ugly and could do with some cleaning up. */ #ifdef CONFIG_X86_32 -# define get_user_gs(regs) (u16)({ unsigned long v; savesegment(gs, v); v; }) -# define set_user_gs(regs, v) loadsegment(gs, (unsigned long)(v)) -# define task_user_gs(tsk) ((tsk)->thread.gs) -# define lazy_save_gs(v) savesegment(gs, (v)) -# define lazy_load_gs(v) loadsegment(gs, (v)) # define load_gs_index(v) loadsegment(gs, (v)) #endif /* X86_32 */ diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index b370767f5b19..96a9885b9c3a 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c @@ -160,6 +160,7 @@ int copy_thread(unsigned long clone_flags, unsigned long sp, unsigned long arg, savesegment(ds, p->thread.ds); #else p->thread.sp0 = (unsigned long) (childregs + 1); + savesegment(gs, p->thread.gs); /* * Clear all status flags including IF and set fixed bit. 64bit * does not have this initialization as the frame does not contain @@ -191,10 +192,6 @@ int copy_thread(unsigned long clone_flags, unsigned long sp, unsigned long arg, if (sp) childregs->sp = sp; -#ifdef CONFIG_X86_32 - task_user_gs(p) = get_user_gs(current_pt_regs()); -#endif - if (unlikely(p->flags & PF_IO_WORKER)) { /* * An IO thread is a user space thread, but it doesn't diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c index 26edb1cd07a4..877358f3dba7 100644 --- a/arch/x86/kernel/process_32.c +++ b/arch/x86/kernel/process_32.c @@ -63,10 +63,7 @@ void __show_regs(struct pt_regs *regs, enum show_regs_mode mode, unsigned long d0, d1, d2, d3, d6, d7; unsigned short gs; - if (user_mode(regs)) - gs = get_user_gs(regs); - else - savesegment(gs, gs); + savesegment(gs, gs); show_ip(regs, log_lvl); @@ -114,7 +111,7 @@ void release_thread(struct task_struct *dead_task) void start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp) { - set_user_gs(regs, 0); + loadsegment(gs, 0); regs->fs = 0; regs->ds = __USER_DS; regs->es = __USER_DS; @@ -177,7 +174,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) * used %fs or %gs (it does not today), or if the kernel is * running inside of a hypervisor layer. */ - lazy_save_gs(prev->gs); + savesegment(gs, prev->gs); /* * Load the per-thread Thread-Local Storage descriptor. @@ -208,7 +205,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) * Restore %gs if needed (which is common) */ if (prev->gs | next->gs) - lazy_load_gs(next->gs); + loadsegment(gs, next->gs); this_cpu_write(current_task, next_p); diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c index 8d2f2f995539..a2336db1aac1 100644 --- a/arch/x86/kernel/ptrace.c +++ b/arch/x86/kernel/ptrace.c @@ -171,9 +171,9 @@ static u16 get_segment_reg(struct task_struct *task, unsigned long offset) retval = *pt_regs_access(task_pt_regs(task), offset); else { if (task == current) - retval = get_user_gs(task_pt_regs(task)); + savesegment(gs, retval); else - retval = task_user_gs(task); + retval = task->thread.gs; } return retval; } @@ -211,7 +211,7 @@ static int set_segment_reg(struct task_struct *task, break; case offsetof(struct user_regs_struct, gs): - task_user_gs(task) = value; + task->thread.gs = value; } return 0; diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c index ec71e06ae364..add4bb6f9d43 100644 --- a/arch/x86/kernel/signal.c +++ b/arch/x86/kernel/signal.c @@ -94,7 +94,7 @@ static bool restore_sigcontext(struct pt_regs *regs, return false; #ifdef CONFIG_X86_32 - set_user_gs(regs, sc.gs); + loadsegment(gs, sc.gs); regs->fs = sc.fs; regs->es = sc.es; regs->ds = sc.ds; @@ -147,8 +147,10 @@ __unsafe_setup_sigcontext(struct sigcontext __user *sc, void __user *fpstate, struct pt_regs *regs, unsigned long mask) { #ifdef CONFIG_X86_32 - unsafe_put_user(get_user_gs(regs), - (unsigned int __user *)&sc->gs, Efault); + unsigned int gs; + savesegment(gs, gs); + + unsafe_put_user(gs, (unsigned int __user *)&sc->gs, Efault); unsafe_put_user(regs->fs, (unsigned int __user *)&sc->fs, Efault); unsafe_put_user(regs->es, (unsigned int __user *)&sc->es, Efault); unsafe_put_user(regs->ds, (unsigned int __user *)&sc->ds, Efault); diff --git a/arch/x86/kernel/vm86_32.c b/arch/x86/kernel/vm86_32.c index c21bcd668284..e9e803a4d44c 100644 --- a/arch/x86/kernel/vm86_32.c +++ b/arch/x86/kernel/vm86_32.c @@ -151,7 +151,7 @@ void save_v86_state(struct kernel_vm86_regs *regs, int retval) memcpy(®s->pt, &vm86->regs32, sizeof(struct pt_regs)); - lazy_load_gs(vm86->regs32.gs); + loadsegment(gs, vm86->regs32.gs); regs->pt.ax = retval; return; @@ -325,7 +325,7 @@ static long do_sys_vm86(struct vm86plus_struct __user *user_vm86, bool plus) * Save old state */ vm86->saved_sp0 = tsk->thread.sp0; - lazy_save_gs(vm86->regs32.gs); + savesegment(gs, vm86->regs32.gs); /* make room for real-mode segments */ preempt_disable(); diff --git a/arch/x86/lib/insn-eval.c b/arch/x86/lib/insn-eval.c index b781d324211b..21104c41cba0 100644 --- a/arch/x86/lib/insn-eval.c +++ b/arch/x86/lib/insn-eval.c @@ -342,9 +342,9 @@ static int resolve_seg_reg(struct insn *insn, struct pt_regs *regs, int regoff) */ static short get_segment_selector(struct pt_regs *regs, int seg_reg_idx) { -#ifdef CONFIG_X86_64 unsigned short sel; +#ifdef CONFIG_X86_64 switch (seg_reg_idx) { case INAT_SEG_REG_IGNORE: return 0; @@ -402,7 +402,8 @@ static short get_segment_selector(struct pt_regs *regs, int seg_reg_idx) case INAT_SEG_REG_FS: return (unsigned short)(regs->fs & 0xffff); case INAT_SEG_REG_GS: - return get_user_gs(regs); + savesegment(gs, sel); + return sel; case INAT_SEG_REG_IGNORE: default: return -EINVAL; diff --git a/arch/x86/math-emu/get_address.c b/arch/x86/math-emu/get_address.c index b82ca14ba718..4a9fd9029a53 100644 --- a/arch/x86/math-emu/get_address.c +++ b/arch/x86/math-emu/get_address.c @@ -153,7 +153,7 @@ static long pm_address(u_char FPU_modrm, u_char segment, switch (segment) { case PREFIX_GS_ - 1: /* user gs handling can be lazy, use special accessors */ - addr->selector = get_user_gs(FPU_info->regs); + savesegment(gs, addr->selector); break; default: addr->selector = PM_REG_(segment); -- 2.35.1 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [tip: x86/core] x86/32: Remove lazy GS macros 2022-03-25 15:39 ` [PATCH 3/4] x86-32: Remove lazy GS macros Brian Gerst @ 2022-04-15 9:42 ` tip-bot2 for Brian Gerst 0 siblings, 0 replies; 13+ messages in thread From: tip-bot2 for Brian Gerst @ 2022-04-15 9:42 UTC (permalink / raw) To: linux-tip-commits Cc: Brian Gerst, Borislav Petkov, Thomas Gleixner, Andy Lutomirski, x86, linux-kernel The following commit has been merged into the x86/core branch of tip: Commit-ID: 3a24a60854d2ef19e0edcd11cdbbb4fabc655dde Gitweb: https://git.kernel.org/tip/3a24a60854d2ef19e0edcd11cdbbb4fabc655dde Author: Brian Gerst <brgerst@gmail.com> AuthorDate: Fri, 25 Mar 2022 11:39:52 -04:00 Committer: Borislav Petkov <bp@suse.de> CommitterDate: Thu, 14 Apr 2022 14:09:43 +02:00 x86/32: Remove lazy GS macros GS is always a user segment now. Signed-off-by: Brian Gerst <brgerst@gmail.com> Signed-off-by: Borislav Petkov <bp@suse.de> Reviewed-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: Andy Lutomirski <luto@kernel.org> Link: https://lore.kernel.org/r/20220325153953.162643-4-brgerst@gmail.com --- arch/x86/include/asm/mmu_context.h | 2 +- arch/x86/include/asm/segment.h | 5 ----- arch/x86/kernel/process.c | 5 +---- arch/x86/kernel/process_32.c | 11 ++++------- arch/x86/kernel/ptrace.c | 6 +++--- arch/x86/kernel/signal.c | 8 +++++--- arch/x86/kernel/vm86_32.c | 4 ++-- arch/x86/lib/insn-eval.c | 5 +++-- arch/x86/math-emu/get_address.c | 2 +- 9 files changed, 20 insertions(+), 28 deletions(-) diff --git a/arch/x86/include/asm/mmu_context.h b/arch/x86/include/asm/mmu_context.h index 2751604..b8d40dd 100644 --- a/arch/x86/include/asm/mmu_context.h +++ b/arch/x86/include/asm/mmu_context.h @@ -141,7 +141,7 @@ do { \ #ifdef CONFIG_X86_32 #define deactivate_mm(tsk, mm) \ do { \ - lazy_load_gs(0); \ + loadsegment(gs, 0); \ } while (0) #else #define deactivate_mm(tsk, mm) \ diff --git a/arch/x86/include/asm/segment.h b/arch/x86/include/asm/segment.h index 656ed65..617b366 100644 --- a/arch/x86/include/asm/segment.h +++ b/arch/x86/include/asm/segment.h @@ -354,11 +354,6 @@ static inline void __loadsegment_fs(unsigned short value) * x86-32 user GS accessors. This is ugly and could do with some cleaning up. */ #ifdef CONFIG_X86_32 -# define get_user_gs(regs) (u16)({ unsigned long v; savesegment(gs, v); v; }) -# define set_user_gs(regs, v) loadsegment(gs, (unsigned long)(v)) -# define task_user_gs(tsk) ((tsk)->thread.gs) -# define lazy_save_gs(v) savesegment(gs, (v)) -# define lazy_load_gs(v) loadsegment(gs, (v)) # define load_gs_index(v) loadsegment(gs, (v)) #endif /* X86_32 */ diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index b370767..96a9885 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c @@ -160,6 +160,7 @@ int copy_thread(unsigned long clone_flags, unsigned long sp, unsigned long arg, savesegment(ds, p->thread.ds); #else p->thread.sp0 = (unsigned long) (childregs + 1); + savesegment(gs, p->thread.gs); /* * Clear all status flags including IF and set fixed bit. 64bit * does not have this initialization as the frame does not contain @@ -191,10 +192,6 @@ int copy_thread(unsigned long clone_flags, unsigned long sp, unsigned long arg, if (sp) childregs->sp = sp; -#ifdef CONFIG_X86_32 - task_user_gs(p) = get_user_gs(current_pt_regs()); -#endif - if (unlikely(p->flags & PF_IO_WORKER)) { /* * An IO thread is a user space thread, but it doesn't diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c index 26edb1c..877358f 100644 --- a/arch/x86/kernel/process_32.c +++ b/arch/x86/kernel/process_32.c @@ -63,10 +63,7 @@ void __show_regs(struct pt_regs *regs, enum show_regs_mode mode, unsigned long d0, d1, d2, d3, d6, d7; unsigned short gs; - if (user_mode(regs)) - gs = get_user_gs(regs); - else - savesegment(gs, gs); + savesegment(gs, gs); show_ip(regs, log_lvl); @@ -114,7 +111,7 @@ void release_thread(struct task_struct *dead_task) void start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp) { - set_user_gs(regs, 0); + loadsegment(gs, 0); regs->fs = 0; regs->ds = __USER_DS; regs->es = __USER_DS; @@ -177,7 +174,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) * used %fs or %gs (it does not today), or if the kernel is * running inside of a hypervisor layer. */ - lazy_save_gs(prev->gs); + savesegment(gs, prev->gs); /* * Load the per-thread Thread-Local Storage descriptor. @@ -208,7 +205,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) * Restore %gs if needed (which is common) */ if (prev->gs | next->gs) - lazy_load_gs(next->gs); + loadsegment(gs, next->gs); this_cpu_write(current_task, next_p); diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c index 98d10ef..37c12fb 100644 --- a/arch/x86/kernel/ptrace.c +++ b/arch/x86/kernel/ptrace.c @@ -170,9 +170,9 @@ static u16 get_segment_reg(struct task_struct *task, unsigned long offset) retval = *pt_regs_access(task_pt_regs(task), offset); else { if (task == current) - retval = get_user_gs(task_pt_regs(task)); + savesegment(gs, retval); else - retval = task_user_gs(task); + retval = task->thread.gs; } return retval; } @@ -210,7 +210,7 @@ static int set_segment_reg(struct task_struct *task, break; case offsetof(struct user_regs_struct, gs): - task_user_gs(task) = value; + task->thread.gs = value; } return 0; diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c index e439eb1..9c7265b 100644 --- a/arch/x86/kernel/signal.c +++ b/arch/x86/kernel/signal.c @@ -93,7 +93,7 @@ static bool restore_sigcontext(struct pt_regs *regs, return false; #ifdef CONFIG_X86_32 - set_user_gs(regs, sc.gs); + loadsegment(gs, sc.gs); regs->fs = sc.fs; regs->es = sc.es; regs->ds = sc.ds; @@ -146,8 +146,10 @@ __unsafe_setup_sigcontext(struct sigcontext __user *sc, void __user *fpstate, struct pt_regs *regs, unsigned long mask) { #ifdef CONFIG_X86_32 - unsafe_put_user(get_user_gs(regs), - (unsigned int __user *)&sc->gs, Efault); + unsigned int gs; + savesegment(gs, gs); + + unsafe_put_user(gs, (unsigned int __user *)&sc->gs, Efault); unsafe_put_user(regs->fs, (unsigned int __user *)&sc->fs, Efault); unsafe_put_user(regs->es, (unsigned int __user *)&sc->es, Efault); unsafe_put_user(regs->ds, (unsigned int __user *)&sc->ds, Efault); diff --git a/arch/x86/kernel/vm86_32.c b/arch/x86/kernel/vm86_32.c index c21bcd6..e9e803a 100644 --- a/arch/x86/kernel/vm86_32.c +++ b/arch/x86/kernel/vm86_32.c @@ -151,7 +151,7 @@ exit_vm86: memcpy(®s->pt, &vm86->regs32, sizeof(struct pt_regs)); - lazy_load_gs(vm86->regs32.gs); + loadsegment(gs, vm86->regs32.gs); regs->pt.ax = retval; return; @@ -325,7 +325,7 @@ static long do_sys_vm86(struct vm86plus_struct __user *user_vm86, bool plus) * Save old state */ vm86->saved_sp0 = tsk->thread.sp0; - lazy_save_gs(vm86->regs32.gs); + savesegment(gs, vm86->regs32.gs); /* make room for real-mode segments */ preempt_disable(); diff --git a/arch/x86/lib/insn-eval.c b/arch/x86/lib/insn-eval.c index b781d32..21104c4 100644 --- a/arch/x86/lib/insn-eval.c +++ b/arch/x86/lib/insn-eval.c @@ -342,9 +342,9 @@ static int resolve_seg_reg(struct insn *insn, struct pt_regs *regs, int regoff) */ static short get_segment_selector(struct pt_regs *regs, int seg_reg_idx) { -#ifdef CONFIG_X86_64 unsigned short sel; +#ifdef CONFIG_X86_64 switch (seg_reg_idx) { case INAT_SEG_REG_IGNORE: return 0; @@ -402,7 +402,8 @@ static short get_segment_selector(struct pt_regs *regs, int seg_reg_idx) case INAT_SEG_REG_FS: return (unsigned short)(regs->fs & 0xffff); case INAT_SEG_REG_GS: - return get_user_gs(regs); + savesegment(gs, sel); + return sel; case INAT_SEG_REG_IGNORE: default: return -EINVAL; diff --git a/arch/x86/math-emu/get_address.c b/arch/x86/math-emu/get_address.c index b82ca14..4a9fd90 100644 --- a/arch/x86/math-emu/get_address.c +++ b/arch/x86/math-emu/get_address.c @@ -153,7 +153,7 @@ static long pm_address(u_char FPU_modrm, u_char segment, switch (segment) { case PREFIX_GS_ - 1: /* user gs handling can be lazy, use special accessors */ - addr->selector = get_user_gs(FPU_info->regs); + savesegment(gs, addr->selector); break; default: addr->selector = PM_REG_(segment); ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 4/4] x86: Merge load_gs_index() 2022-03-25 15:39 [PATCH 0/4] x86-32: Clean up GS segment handling Brian Gerst ` (2 preceding siblings ...) 2022-03-25 15:39 ` [PATCH 3/4] x86-32: Remove lazy GS macros Brian Gerst @ 2022-03-25 15:39 ` Brian Gerst 2022-04-15 9:42 ` [tip: x86/core] x86/asm: " tip-bot2 for Brian Gerst 2022-03-25 15:45 ` [PATCH 0/4] x86-32: Clean up GS segment handling Andy Lutomirski 2022-04-05 16:12 ` Thomas Gleixner 5 siblings, 1 reply; 13+ messages in thread From: Brian Gerst @ 2022-03-25 15:39 UTC (permalink / raw) To: linux-kernel, x86 Cc: Andy Lutomirski, Borislav Petkov, Thomas Gleixner, H . Peter Anvin, Peter Zijlstra, Brian Gerst Merge the 32- and 64-bit implementations of load_gs_index(). Signed-off-by: Brian Gerst <brgerst@gmail.com> --- arch/x86/include/asm/segment.h | 7 ------- arch/x86/include/asm/special_insns.h | 7 ++++--- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/arch/x86/include/asm/segment.h b/arch/x86/include/asm/segment.h index 617b3663e4dd..2e7890dd58a4 100644 --- a/arch/x86/include/asm/segment.h +++ b/arch/x86/include/asm/segment.h @@ -350,13 +350,6 @@ static inline void __loadsegment_fs(unsigned short value) #define savesegment(seg, value) \ asm("mov %%" #seg ",%0":"=r" (value) : : "memory") -/* - * x86-32 user GS accessors. This is ugly and could do with some cleaning up. - */ -#ifdef CONFIG_X86_32 -# define load_gs_index(v) loadsegment(gs, (v)) -#endif /* X86_32 */ - #endif /* !__ASSEMBLY__ */ #endif /* __KERNEL__ */ diff --git a/arch/x86/include/asm/special_insns.h b/arch/x86/include/asm/special_insns.h index 68c257a3de0d..45b18eb94fa1 100644 --- a/arch/x86/include/asm/special_insns.h +++ b/arch/x86/include/asm/special_insns.h @@ -184,14 +184,15 @@ static inline void wbinvd(void) native_wbinvd(); } -#ifdef CONFIG_X86_64 static inline void load_gs_index(unsigned int selector) { +#ifdef CONFIG_X86_64 native_load_gs_index(selector); -} - +#else + loadsegment(gs, selector); #endif +} #endif /* CONFIG_PARAVIRT_XXL */ -- 2.35.1 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [tip: x86/core] x86/asm: Merge load_gs_index() 2022-03-25 15:39 ` [PATCH 4/4] x86: Merge load_gs_index() Brian Gerst @ 2022-04-15 9:42 ` tip-bot2 for Brian Gerst 0 siblings, 0 replies; 13+ messages in thread From: tip-bot2 for Brian Gerst @ 2022-04-15 9:42 UTC (permalink / raw) To: linux-tip-commits Cc: Brian Gerst, Borislav Petkov, Thomas Gleixner, Andy Lutomirski, x86, linux-kernel The following commit has been merged into the x86/core branch of tip: Commit-ID: 203d8919a9eda5d1bc68ac3cd7637588334c9dc1 Gitweb: https://git.kernel.org/tip/203d8919a9eda5d1bc68ac3cd7637588334c9dc1 Author: Brian Gerst <brgerst@gmail.com> AuthorDate: Fri, 25 Mar 2022 11:39:53 -04:00 Committer: Borislav Petkov <bp@suse.de> CommitterDate: Thu, 14 Apr 2022 14:15:54 +02:00 x86/asm: Merge load_gs_index() Merge the 32- and 64-bit implementations of load_gs_index(). Signed-off-by: Brian Gerst <brgerst@gmail.com> Signed-off-by: Borislav Petkov <bp@suse.de> Reviewed-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: Andy Lutomirski <luto@kernel.org> Link: https://lore.kernel.org/r/20220325153953.162643-5-brgerst@gmail.com --- arch/x86/include/asm/segment.h | 7 ------- arch/x86/include/asm/special_insns.h | 7 ++++--- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/arch/x86/include/asm/segment.h b/arch/x86/include/asm/segment.h index 617b366..2e7890d 100644 --- a/arch/x86/include/asm/segment.h +++ b/arch/x86/include/asm/segment.h @@ -350,13 +350,6 @@ static inline void __loadsegment_fs(unsigned short value) #define savesegment(seg, value) \ asm("mov %%" #seg ",%0":"=r" (value) : : "memory") -/* - * x86-32 user GS accessors. This is ugly and could do with some cleaning up. - */ -#ifdef CONFIG_X86_32 -# define load_gs_index(v) loadsegment(gs, (v)) -#endif /* X86_32 */ - #endif /* !__ASSEMBLY__ */ #endif /* __KERNEL__ */ diff --git a/arch/x86/include/asm/special_insns.h b/arch/x86/include/asm/special_insns.h index 68c257a..45b18eb 100644 --- a/arch/x86/include/asm/special_insns.h +++ b/arch/x86/include/asm/special_insns.h @@ -184,14 +184,15 @@ static inline void wbinvd(void) native_wbinvd(); } -#ifdef CONFIG_X86_64 static inline void load_gs_index(unsigned int selector) { +#ifdef CONFIG_X86_64 native_load_gs_index(selector); -} - +#else + loadsegment(gs, selector); #endif +} #endif /* CONFIG_PARAVIRT_XXL */ ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH 0/4] x86-32: Clean up GS segment handling 2022-03-25 15:39 [PATCH 0/4] x86-32: Clean up GS segment handling Brian Gerst ` (3 preceding siblings ...) 2022-03-25 15:39 ` [PATCH 4/4] x86: Merge load_gs_index() Brian Gerst @ 2022-03-25 15:45 ` Andy Lutomirski 2022-04-05 16:12 ` Thomas Gleixner 5 siblings, 0 replies; 13+ messages in thread From: Andy Lutomirski @ 2022-03-25 15:45 UTC (permalink / raw) To: Brian Gerst, linux-kernel, x86 Cc: Borislav Petkov, Thomas Gleixner, H . Peter Anvin, Peter Zijlstra On 3/25/22 08:39, Brian Gerst wrote: > Since commit 3fb0fdb3bbe ("Make the canary into a regular percpu > variable"), the GS segment is no longer switched on kernel entry for > 32-bit kernels. Clean up the remaining code that handled lazy GS > switching. > Acked-by: Andy Lutomirski <luto@kernel.org> Thanks! > Brian Gerst (4): > x86-32: Simplify ELF_CORE_COPY_REGS > ELF: Remove elf_core_copy_kernel_regs() > x86-32: Remove lazy GS macros > x86: Merge load_gs_index() > > arch/powerpc/kernel/fadump.c | 2 +- > arch/powerpc/platforms/powernv/opal-core.c | 2 +- > arch/x86/include/asm/elf.h | 15 ++------------- > arch/x86/include/asm/mmu_context.h | 2 +- > arch/x86/include/asm/segment.h | 12 ------------ > arch/x86/include/asm/special_insns.h | 7 ++++--- > arch/x86/kernel/process.c | 5 +---- > arch/x86/kernel/process_32.c | 11 ++++------- > arch/x86/kernel/ptrace.c | 6 +++--- > arch/x86/kernel/signal.c | 8 +++++--- > arch/x86/kernel/vm86_32.c | 4 ++-- > arch/x86/lib/insn-eval.c | 5 +++-- > arch/x86/math-emu/get_address.c | 2 +- > include/linux/elfcore.h | 9 --------- > kernel/kexec_core.c | 2 +- > 15 files changed, 29 insertions(+), 63 deletions(-) > ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 0/4] x86-32: Clean up GS segment handling 2022-03-25 15:39 [PATCH 0/4] x86-32: Clean up GS segment handling Brian Gerst ` (4 preceding siblings ...) 2022-03-25 15:45 ` [PATCH 0/4] x86-32: Clean up GS segment handling Andy Lutomirski @ 2022-04-05 16:12 ` Thomas Gleixner 5 siblings, 0 replies; 13+ messages in thread From: Thomas Gleixner @ 2022-04-05 16:12 UTC (permalink / raw) To: Brian Gerst, linux-kernel, x86 Cc: Andy Lutomirski, Borislav Petkov, H . Peter Anvin, Peter Zijlstra, Brian Gerst On Fri, Mar 25 2022 at 11:39, Brian Gerst wrote: > Since commit 3fb0fdb3bbe ("Make the canary into a regular percpu > variable"), the GS segment is no longer switched on kernel entry for > 32-bit kernels. Clean up the remaining code that handled lazy GS > switching. Reviewed-by: Thomas Gleixner <tglx@linutronix.de> ^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2022-04-15 9:42 UTC | newest] Thread overview: 13+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-03-25 15:39 [PATCH 0/4] x86-32: Clean up GS segment handling Brian Gerst 2022-03-25 15:39 ` [PATCH 1/4] x86-32: Simplify ELF_CORE_COPY_REGS Brian Gerst 2022-04-15 9:42 ` [tip: x86/core] x86/32: " tip-bot2 for Brian Gerst 2022-03-25 15:39 ` [PATCH 2/4] ELF: Remove elf_core_copy_kernel_regs() Brian Gerst 2022-04-13 11:41 ` Borislav Petkov 2022-04-13 12:31 ` Michael Ellerman 2022-04-15 9:42 ` [tip: x86/core] " tip-bot2 for Brian Gerst 2022-03-25 15:39 ` [PATCH 3/4] x86-32: Remove lazy GS macros Brian Gerst 2022-04-15 9:42 ` [tip: x86/core] x86/32: " tip-bot2 for Brian Gerst 2022-03-25 15:39 ` [PATCH 4/4] x86: Merge load_gs_index() Brian Gerst 2022-04-15 9:42 ` [tip: x86/core] x86/asm: " tip-bot2 for Brian Gerst 2022-03-25 15:45 ` [PATCH 0/4] x86-32: Clean up GS segment handling Andy Lutomirski 2022-04-05 16:12 ` Thomas Gleixner
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox