* Andy Lutomirski <l...@kernel.org> wrote:

>  /* May not be marked __init: used by software suspend */
>  void syscall_init(void)
>  {
> @@ -1627,7 +1637,7 @@ void cpu_init(void)
>        * set up and load the per-CPU TSS
>        */
>       if (!oist->ist[0]) {
> -             char *estacks = per_cpu(exception_stacks, cpu);
> +             char *estacks = get_cpu_entry_area(cpu)->exception_stacks;
>  
>               for (v = 0; v < N_EXCEPTION_STACKS; v++) {
>                       estacks += exception_stack_sizes[v];

This generates a new build warning:

 /home/mingo/tip/arch/x86/kernel/cpu/common.c: In function ‘syscall_init’:
 /home/mingo/tip/arch/x86/kernel/cpu/common.c:1443:6: warning: unused variable 
‘cpu’ [-Wunused-variable]
   int cpu = smp_processor_id();

because 'cpu' is now unused in the !CONFIG_IA32_EMULATION part.

The naive fix is something like the patch below, untested.

Thanks,

        Ingo

 arch/x86/kernel/cpu/common.c | 30 ++++++++++++++++--------------
 1 file changed, 16 insertions(+), 14 deletions(-)

diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
index c7f3a0a19dce..557bad9f4179 100644
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -1440,24 +1440,26 @@ void syscall_init(void)
        extern char _entry_trampoline[];
        extern char entry_SYSCALL_64_trampoline[];
 
-       int cpu = smp_processor_id();
-
        wrmsr(MSR_STAR, 0, (__USER32_CS << 16) | __KERNEL_CS);
        wrmsrl(MSR_LSTAR, (unsigned 
long)get_cpu_entry_area(smp_processor_id())->entry_trampoline + 
(entry_SYSCALL_64_trampoline - _entry_trampoline));
 
 #ifdef CONFIG_IA32_EMULATION
-       wrmsrl(MSR_CSTAR, (unsigned long)entry_SYSCALL_compat);
-       /*
-        * This only works on Intel CPUs.
-        * On AMD CPUs these MSRs are 32-bit, CPU truncates 
MSR_IA32_SYSENTER_EIP.
-        * This does not cause SYSENTER to jump to the wrong location, because
-        * AMD doesn't allow SYSENTER in long mode (either 32- or 64-bit).
-        */
-       wrmsrl_safe(MSR_IA32_SYSENTER_CS, (u64)__KERNEL_CS);
-       wrmsrl_safe(MSR_IA32_SYSENTER_ESP,
-                   (unsigned long)&get_cpu_entry_area(cpu)->tss +
-                   offsetofend(struct tss_struct, SYSENTER_stack));
-       wrmsrl_safe(MSR_IA32_SYSENTER_EIP, (u64)entry_SYSENTER_compat);
+       {
+               int cpu = smp_processor_id();
+
+               wrmsrl(MSR_CSTAR, (unsigned long)entry_SYSCALL_compat);
+               /*
+                * This only works on Intel CPUs.
+                * On AMD CPUs these MSRs are 32-bit, CPU truncates 
MSR_IA32_SYSENTER_EIP.
+                * This does not cause SYSENTER to jump to the wrong location, 
because
+                * AMD doesn't allow SYSENTER in long mode (either 32- or 
64-bit).
+                */
+               wrmsrl_safe(MSR_IA32_SYSENTER_CS, (u64)__KERNEL_CS);
+               wrmsrl_safe(MSR_IA32_SYSENTER_ESP,
+                           (unsigned long)&get_cpu_entry_area(cpu)->tss +
+                           offsetofend(struct tss_struct, SYSENTER_stack));
+               wrmsrl_safe(MSR_IA32_SYSENTER_EIP, (u64)entry_SYSENTER_compat);
+       }
 #else
        wrmsrl(MSR_CSTAR, (unsigned long)ignore_sysret);
        wrmsrl_safe(MSR_IA32_SYSENTER_CS, (u64)GDT_ENTRY_INVALID_SEG);

Reply via email to