summaryrefslogtreecommitdiff
path: root/src/arch
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch')
-rw-r--r--src/arch/x86/include/mode_switch.h20
1 files changed, 14 insertions, 6 deletions
diff --git a/src/arch/x86/include/mode_switch.h b/src/arch/x86/include/mode_switch.h
index 24efb1ef58..4235db9be3 100644
--- a/src/arch/x86/include/mode_switch.h
+++ b/src/arch/x86/include/mode_switch.h
@@ -3,10 +3,18 @@
#include <stdint.h>
#if ENV_X86_64
-int protected_mode_call_narg(uint32_t arg_count,
- uint32_t func_ptr,
+/*
+ * Assembly code that drops into protected mode and calls the function
+ * specified as first argument, which must have been compiled for x86_32.
+ * After the function returns it enters long mode again.
+ * The function pointer destination must be below 4GiB in physical memory.
+ *
+ * The called function has 0-3 arguments and returns an int.
+ */
+int protected_mode_call_3arg(uint32_t func_ptr,
uint32_t opt_arg1,
- uint32_t opt_arg2);
+ uint32_t opt_arg2,
+ uint32_t opt_arg3);
/*
* Drops into protected mode and calls the function, which must have been compiled for x86_32.
@@ -17,7 +25,7 @@ int protected_mode_call_narg(uint32_t arg_count,
*/
static inline int protected_mode_call(void *func)
{
- return protected_mode_call_narg(0, (uintptr_t)func, 0, 0);
+ return protected_mode_call_3arg((uintptr_t)func, 0, 0, 0);
}
/*
@@ -30,7 +38,7 @@ static inline int protected_mode_call(void *func)
*/
static inline int protected_mode_call_1arg(void *func, uint32_t arg1)
{
- return protected_mode_call_narg(1, (uintptr_t)func, arg1, 0);
+ return protected_mode_call_3arg((uintptr_t)func, arg1, 0, 0);
}
/*
@@ -43,7 +51,7 @@ static inline int protected_mode_call_1arg(void *func, uint32_t arg1)
*/
static inline int protected_mode_call_2arg(void *func, uint32_t arg1, uint32_t arg2)
{
- return protected_mode_call_narg(2, (uintptr_t)func, arg1, arg2);
+ return protected_mode_call_3arg((uintptr_t)func, arg1, arg2, 0);
}
#else
static inline int protected_mode_call(void *func)