summaryrefslogtreecommitdiff
path: root/src/cpu/x86/64bit/prot2long.inc
diff options
context:
space:
mode:
Diffstat (limited to 'src/cpu/x86/64bit/prot2long.inc')
-rw-r--r--src/cpu/x86/64bit/prot2long.inc27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/cpu/x86/64bit/prot2long.inc b/src/cpu/x86/64bit/prot2long.inc
new file mode 100644
index 0000000000..96c44a86f5
--- /dev/null
+++ b/src/cpu/x86/64bit/prot2long.inc
@@ -0,0 +1,27 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+.text
+.code32
+/*
+ * Macro to wrap a x86_64 function to be called from x86_32 code.
+ * This assumes that 0-3 32bit arguments are passed to the
+ * calling function.
+ *
+ * In order to preserve ESP without setting up a stack frame
+ * pass the function to call in EAX. The macro prepends "__prot2lm_"
+ * to the wrapped function name.
+ */
+.macro prot2lm_wrapper func2call:req
+ .global __prot2lm_\func2call
+__prot2lm_\func2call :
+ /* Get function to call */
+ mov $\func2call, %eax
+
+ /*
+ * Jump to function instead of call.
+ * It will return directly to caller.
+ */
+ jmp long_mode_call_3arg
+
+ /* Not reachable */
+.endm