mirror of https://gitee.com/openkylin/linux.git
x86/entry/32: Pass cr2 to do_async_page_fault()
Commita0d14b8909
("x86/mm, tracing: Fix CR2 corruption") added the address parameter to do_async_page_fault(), but does not pass it from the 32-bit entry point. To plumb it through, factor-out common_exception_read_cr2 in the same fashion as common_exception, and uses it from both page_fault and async_page_fault. For a 32-bit KVM guest, this fixes: Run /sbin/init as init process Starting init: /sbin/init exists but couldn't execute it (error -14) Fixes:a0d14b8909
("x86/mm, tracing: Fix CR2 corruption") Signed-off-by: Matt Mullins <mmullins@fb.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://lkml.kernel.org/r/20190724042058.24506-1-mmullins@fb.com
This commit is contained in:
parent
385065734c
commit
b8f70953c1
|
@ -1443,8 +1443,12 @@ BUILD_INTERRUPT3(hv_stimer0_callback_vector, HYPERV_STIMER0_VECTOR,
|
||||||
|
|
||||||
ENTRY(page_fault)
|
ENTRY(page_fault)
|
||||||
ASM_CLAC
|
ASM_CLAC
|
||||||
pushl $0; /* %gs's slot on the stack */
|
pushl $do_page_fault
|
||||||
|
jmp common_exception_read_cr2
|
||||||
|
END(page_fault)
|
||||||
|
|
||||||
|
common_exception_read_cr2:
|
||||||
|
/* the function address is in %gs's slot on the stack */
|
||||||
SAVE_ALL switch_stacks=1 skip_gs=1
|
SAVE_ALL switch_stacks=1 skip_gs=1
|
||||||
|
|
||||||
ENCODE_FRAME_POINTER
|
ENCODE_FRAME_POINTER
|
||||||
|
@ -1452,6 +1456,7 @@ ENTRY(page_fault)
|
||||||
|
|
||||||
/* fixup %gs */
|
/* fixup %gs */
|
||||||
GS_TO_REG %ecx
|
GS_TO_REG %ecx
|
||||||
|
movl PT_GS(%esp), %edi
|
||||||
REG_TO_PTGS %ecx
|
REG_TO_PTGS %ecx
|
||||||
SET_KERNEL_GS %ecx
|
SET_KERNEL_GS %ecx
|
||||||
|
|
||||||
|
@ -1463,9 +1468,9 @@ ENTRY(page_fault)
|
||||||
|
|
||||||
TRACE_IRQS_OFF
|
TRACE_IRQS_OFF
|
||||||
movl %esp, %eax # pt_regs pointer
|
movl %esp, %eax # pt_regs pointer
|
||||||
call do_page_fault
|
CALL_NOSPEC %edi
|
||||||
jmp ret_from_exception
|
jmp ret_from_exception
|
||||||
END(page_fault)
|
END(common_exception_read_cr2)
|
||||||
|
|
||||||
common_exception:
|
common_exception:
|
||||||
/* the function address is in %gs's slot on the stack */
|
/* the function address is in %gs's slot on the stack */
|
||||||
|
@ -1595,7 +1600,7 @@ END(general_protection)
|
||||||
ENTRY(async_page_fault)
|
ENTRY(async_page_fault)
|
||||||
ASM_CLAC
|
ASM_CLAC
|
||||||
pushl $do_async_page_fault
|
pushl $do_async_page_fault
|
||||||
jmp common_exception
|
jmp common_exception_read_cr2
|
||||||
END(async_page_fault)
|
END(async_page_fault)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue