summaryrefslogtreecommitdiff
path: root/arch/x86/entry
diff options
context:
space:
mode:
authorPeter Zijlstra <peterz@infradead.org>2022-07-06 15:33:30 +0200
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2022-07-23 12:54:10 +0200
commit925340f99bdfd747bcb6950d5576224fd75dc103 (patch)
treebbdf7756366ee770faf668f8d7ab9748be586da8 /arch/x86/entry
parent2f8967e22322251f3c4aa74f6ee30c267d5f91bb (diff)
x86/entry: Move PUSH_AND_CLEAR_REGS() back into error_entry
commit 2c08b9b38f5b0f4a6c2d29be22b695e4ec4a556b upstream. Commit ee774dac0da1 ("x86/entry: Move PUSH_AND_CLEAR_REGS out of error_entry()") moved PUSH_AND_CLEAR_REGS out of error_entry, into its own function, in part to avoid calling error_entry() for XenPV. However, commit 7c81c0c9210c ("x86/entry: Avoid very early RET") had to change that because the 'ret' was too early and moved it into idtentry, bloating the text size, since idtentry is expanded for every exception vector. However, with the advent of xen_error_entry() in commit d147553b64bad ("x86/xen: Add UNTRAIN_RET") it became possible to remove PUSH_AND_CLEAR_REGS from idtentry, back into *error_entry(). Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Borislav Petkov <bp@suse.de> [cascardo: error_entry still does cld] Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@canonical.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'arch/x86/entry')
-rw-r--r--arch/x86/entry/entry_64.S9
1 files changed, 6 insertions, 3 deletions
diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S
index 08b047b023ee..763ff243aeca 100644
--- a/arch/x86/entry/entry_64.S
+++ b/arch/x86/entry/entry_64.S
@@ -320,6 +320,8 @@ SYM_CODE_END(ret_from_fork)
SYM_CODE_START_LOCAL(xen_error_entry)
UNWIND_HINT_FUNC
+ PUSH_AND_CLEAR_REGS save_ret=1
+ ENCODE_FRAME_POINTER 8
UNTRAIN_RET
RET
SYM_CODE_END(xen_error_entry)
@@ -331,9 +333,6 @@ SYM_CODE_END(xen_error_entry)
*/
.macro idtentry_body cfunc has_error_code:req
- PUSH_AND_CLEAR_REGS
- ENCODE_FRAME_POINTER
-
/*
* Call error_entry() and switch to the task stack if from userspace.
*
@@ -1014,6 +1013,10 @@ SYM_CODE_END(paranoid_exit)
SYM_CODE_START_LOCAL(error_entry)
UNWIND_HINT_FUNC
cld
+
+ PUSH_AND_CLEAR_REGS save_ret=1
+ ENCODE_FRAME_POINTER 8
+
testb $3, CS+8(%rsp)
jz .Lerror_kernelspace