It's fragile to try to retrieve the stack pointer by taking the address of a variable on the stack. For instance, clang reserves more stack space than gcc here, indicating that the variable may not be at the start of the stack. Instead of relying upon this to work, retrieve the "%rbp" value, which contains the value of "%rsp" before stack allocation. Signed-off-by: Bill Wendling <morbo@xxxxxxxxxx> --- x86/realmode.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/x86/realmode.c b/x86/realmode.c index cf45fd6..7c89dd1 100644 --- a/x86/realmode.c +++ b/x86/realmode.c @@ -518,11 +518,12 @@ extern void retf_imm(void); static void test_call(void) { - u32 esp[16]; u32 addr; inregs = (struct regs){ 0 }; - inregs.esp = (u32)esp; + + // At this point the original stack pointer is in %ebp. + asm volatile ("mov %%ebp, %0" : "=rm"(inregs.esp)); MK_INSN(call1, "mov $test_function, %eax \n\t" "call *%eax\n\t"); -- 2.23.0.700.g56cf767bdb-goog