|
62 | 62 | #include <asm/intel-family.h>
|
63 | 63 | #include <asm/cpu_device_id.h>
|
64 | 64 | #include <asm/uv/uv.h>
|
| 65 | +#include <asm/ia32.h> |
65 | 66 | #include <asm/set_memory.h>
|
66 | 67 | #include <asm/traps.h>
|
67 | 68 | #include <asm/sev.h>
|
@@ -2074,24 +2075,24 @@ void syscall_init(void)
|
2074 | 2075 | wrmsr(MSR_STAR, 0, (__USER32_CS << 16) | __KERNEL_CS);
|
2075 | 2076 | wrmsrl(MSR_LSTAR, (unsigned long)entry_SYSCALL_64);
|
2076 | 2077 |
|
2077 |
| -#ifdef CONFIG_IA32_EMULATION |
2078 |
| - wrmsrl_cstar((unsigned long)entry_SYSCALL_compat); |
2079 |
| - /* |
2080 |
| - * This only works on Intel CPUs. |
2081 |
| - * On AMD CPUs these MSRs are 32-bit, CPU truncates MSR_IA32_SYSENTER_EIP. |
2082 |
| - * This does not cause SYSENTER to jump to the wrong location, because |
2083 |
| - * AMD doesn't allow SYSENTER in long mode (either 32- or 64-bit). |
2084 |
| - */ |
2085 |
| - wrmsrl_safe(MSR_IA32_SYSENTER_CS, (u64)__KERNEL_CS); |
2086 |
| - wrmsrl_safe(MSR_IA32_SYSENTER_ESP, |
2087 |
| - (unsigned long)(cpu_entry_stack(smp_processor_id()) + 1)); |
2088 |
| - wrmsrl_safe(MSR_IA32_SYSENTER_EIP, (u64)entry_SYSENTER_compat); |
2089 |
| -#else |
2090 |
| - wrmsrl_cstar((unsigned long)entry_SYSCALL32_ignore); |
2091 |
| - wrmsrl_safe(MSR_IA32_SYSENTER_CS, (u64)GDT_ENTRY_INVALID_SEG); |
2092 |
| - wrmsrl_safe(MSR_IA32_SYSENTER_ESP, 0ULL); |
2093 |
| - wrmsrl_safe(MSR_IA32_SYSENTER_EIP, 0ULL); |
2094 |
| -#endif |
| 2078 | + if (ia32_enabled()) { |
| 2079 | + wrmsrl_cstar((unsigned long)entry_SYSCALL_compat); |
| 2080 | + /* |
| 2081 | + * This only works on Intel CPUs. |
| 2082 | + * On AMD CPUs these MSRs are 32-bit, CPU truncates MSR_IA32_SYSENTER_EIP. |
| 2083 | + * This does not cause SYSENTER to jump to the wrong location, because |
| 2084 | + * AMD doesn't allow SYSENTER in long mode (either 32- or 64-bit). |
| 2085 | + */ |
| 2086 | + wrmsrl_safe(MSR_IA32_SYSENTER_CS, (u64)__KERNEL_CS); |
| 2087 | + wrmsrl_safe(MSR_IA32_SYSENTER_ESP, |
| 2088 | + (unsigned long)(cpu_entry_stack(smp_processor_id()) + 1)); |
| 2089 | + wrmsrl_safe(MSR_IA32_SYSENTER_EIP, (u64)entry_SYSENTER_compat); |
| 2090 | + } else { |
| 2091 | + wrmsrl_cstar((unsigned long)entry_SYSCALL32_ignore); |
| 2092 | + wrmsrl_safe(MSR_IA32_SYSENTER_CS, (u64)GDT_ENTRY_INVALID_SEG); |
| 2093 | + wrmsrl_safe(MSR_IA32_SYSENTER_ESP, 0ULL); |
| 2094 | + wrmsrl_safe(MSR_IA32_SYSENTER_EIP, 0ULL); |
| 2095 | + } |
2095 | 2096 |
|
2096 | 2097 | /*
|
2097 | 2098 | * Flags to clear on syscall; clear as much as possible
|
|
0 commit comments