2022-03-25 18:06:10

by Brian Gerst

[permalink] [raw]
Subject: [PATCH 0/4] x86-32: Clean up GS segment handling

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


2022-03-25 18:50:45

by Andy Lutomirski

[permalink] [raw]
Subject: Re: [PATCH 0/4] x86-32: Clean up GS segment handling

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 <[email protected]>

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(-)
>

2022-03-25 18:56:23

by Brian Gerst

[permalink] [raw]
Subject: [PATCH 2/4] 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 <[email protected]>
---
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

2022-03-25 19:37:30

by Brian Gerst

[permalink] [raw]
Subject: [PATCH 4/4] x86: Merge load_gs_index()

Merge the 32- and 64-bit implementations of load_gs_index().

Signed-off-by: Brian Gerst <[email protected]>
---
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

2022-04-06 13:25:34

by Thomas Gleixner

[permalink] [raw]
Subject: Re: [PATCH 0/4] x86-32: Clean up GS segment handling

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 <[email protected]>

2022-04-13 15:24:12

by Michael Ellerman

[permalink] [raw]
Subject: Re: [PATCH 2/4] ELF: Remove elf_core_copy_kernel_regs()

Borislav Petkov <[email protected]> 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 <[email protected]>
>> ---
>> 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

2022-04-13 19:28:04

by Borislav Petkov

[permalink] [raw]
Subject: Re: [PATCH 2/4] ELF: Remove elf_core_copy_kernel_regs()

+ 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 <[email protected]>
> ---
> 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

Subject: [tip: x86/core] ELF: Remove elf_core_copy_kernel_regs()

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 <[email protected]>
AuthorDate: Fri, 25 Mar 2022 11:39:51 -04:00
Committer: Borislav Petkov <[email protected]>
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 <[email protected]>
Signed-off-by: Borislav Petkov <[email protected]>
Reviewed-by: Thomas Gleixner <[email protected]>
Acked-by: Andy Lutomirski <[email protected]>
Acked-by: Michael Ellerman <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
---
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);

Subject: [tip: x86/core] x86/asm: Merge load_gs_index()

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 <[email protected]>
AuthorDate: Fri, 25 Mar 2022 11:39:53 -04:00
Committer: Borislav Petkov <[email protected]>
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 <[email protected]>
Signed-off-by: Borislav Petkov <[email protected]>
Reviewed-by: Thomas Gleixner <[email protected]>
Acked-by: Andy Lutomirski <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
---
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 */