Messages in this thread Patch in this message | | | From | Lai Jiangshan <> | Subject | [PATCH V5 31/50] x86/entry: Add the C version ist_switch_to_kernel_cr3() | Date | Wed, 10 Nov 2021 19:57:17 +0800 |
| |
From: Lai Jiangshan <laijs@linux.alibaba.com>
It switches the CR3 to kernel CR3 and returns the original CR3, and the caller should save the return value.
It is the C version of SAVE_AND_SWITCH_TO_KERNEL_CR3.
Not functional difference intended.
Signed-off-by: Lai Jiangshan <laijs@linux.alibaba.com> --- arch/x86/entry/entry64.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)
diff --git a/arch/x86/entry/entry64.c b/arch/x86/entry/entry64.c index 0dc63ae8153a..283bd685a275 100644 --- a/arch/x86/entry/entry64.c +++ b/arch/x86/entry/entry64.c @@ -35,8 +35,23 @@ static __always_inline void switch_to_kernel_cr3(void) if (static_cpu_has(X86_FEATURE_PTI)) pti_switch_to_kernel_cr3(__native_read_cr3()); } + +static __always_inline unsigned long ist_switch_to_kernel_cr3(void) +{ + unsigned long cr3 = 0; + + if (static_cpu_has(X86_FEATURE_PTI)) { + cr3 = __native_read_cr3(); + + if (cr3 & PTI_USER_PGTABLE_MASK) + pti_switch_to_kernel_cr3(cr3); + } + + return cr3; +} #else static __always_inline void switch_to_kernel_cr3(void) {} +static __always_inline unsigned long ist_switch_to_kernel_cr3(void) { return 0; } #endif /* -- 2.19.1.6.gb485710b
| |