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:
Родитель
385065734c
Коммит
b8f70953c1
|
@ -1443,8 +1443,12 @@ BUILD_INTERRUPT3(hv_stimer0_callback_vector, HYPERV_STIMER0_VECTOR,
|
|||
|
||||
ENTRY(page_fault)
|
||||
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
|
||||
|
||||
ENCODE_FRAME_POINTER
|
||||
|
@ -1452,6 +1456,7 @@ ENTRY(page_fault)
|
|||
|
||||
/* fixup %gs */
|
||||
GS_TO_REG %ecx
|
||||
movl PT_GS(%esp), %edi
|
||||
REG_TO_PTGS %ecx
|
||||
SET_KERNEL_GS %ecx
|
||||
|
||||
|
@ -1463,9 +1468,9 @@ ENTRY(page_fault)
|
|||
|
||||
TRACE_IRQS_OFF
|
||||
movl %esp, %eax # pt_regs pointer
|
||||
call do_page_fault
|
||||
CALL_NOSPEC %edi
|
||||
jmp ret_from_exception
|
||||
END(page_fault)
|
||||
END(common_exception_read_cr2)
|
||||
|
||||
common_exception:
|
||||
/* the function address is in %gs's slot on the stack */
|
||||
|
@ -1595,7 +1600,7 @@ END(general_protection)
|
|||
ENTRY(async_page_fault)
|
||||
ASM_CLAC
|
||||
pushl $do_async_page_fault
|
||||
jmp common_exception
|
||||
jmp common_exception_read_cr2
|
||||
END(async_page_fault)
|
||||
#endif
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче