diff options
Diffstat (limited to 'src/cpu/x86/64bit/prot2long.inc')
-rw-r--r-- | src/cpu/x86/64bit/prot2long.inc | 27 |
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 |