diff --git a/README.adoc b/README.adoc index 1ca5979..a66e5e2 100644 --- a/README.adoc +++ b/README.adoc @@ -11998,6 +11998,8 @@ Examples: * link:lkmc/x86_64.h[] `ENTRY` and `EXIT` +One important catch is that the stack must always be aligned to 16-bits before making calls: https://stackoverflow.com/questions/56324948/why-does-calling-the-c-abort-function-from-an-x86-64-assembly-function-lead-to + Bibliography: * https://en.wikipedia.org/wiki/X86_calling_conventions#System_V_AMD64_ABI @@ -13434,7 +13436,7 @@ output: .... CPSR.M 0x3 -CPSR.M 0x3 +CPSR.M 0xA CPSR.M 0x3 CurrentEL.EL 0x1 CurrentEL.EL 0x2 diff --git a/lkmc/x86_64.h b/lkmc/x86_64.h index 5ad67fa..de4cce0 100644 --- a/lkmc/x86_64.h +++ b/lkmc/x86_64.h @@ -31,6 +31,7 @@ * https://github.com/cirosantilli/linux-kernel-module-cheat#x86_64-calling-convention */ #define LKMC_EPILOGUE \ + add $8, %rsp; \ pop %rbx; \ pop %r12; \ pop %r13; \ @@ -56,6 +57,7 @@ main: \ push %r13; \ push %r12; \ push %rbx; \ + sub $8, %rsp; \ main_after_prologue: \ ;