summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHarald van Dijk <harald@gigawatt.nl>2021-07-25 02:39:37 +0100
committerGitHub <noreply@github.com>2021-07-24 21:39:37 -0400
commit07f826fdd4d8a23a190f107f7ec6ad830a4864a0 (patch)
tree4b8b9aaf9caf2eeadf332d13302b8725377019bb /src
parentbe0b3b6e75d4890fe18ba4164b91387beaebee06 (diff)
downloadlibffi-07f826fdd4d8a23a190f107f7ec6ad830a4864a0.tar.gz
Fix trampoline_code_table for x32. (#657)
x32's struct tramp_parm has 32-bit pointers. This change adjusts the loads and offsets accordingly.
Diffstat (limited to 'src')
-rw-r--r--src/x86/unix64.S24
1 files changed, 20 insertions, 4 deletions
diff --git a/src/x86/unix64.S b/src/x86/unix64.S
index ca6fe0c..8cf3a23 100644
--- a/src/x86/unix64.S
+++ b/src/x86/unix64.S
@@ -505,11 +505,19 @@ C(ffi_closure_unix64_alt):
* - restore the stack pointer to what it was when the trampoline was invoked.
*/
#ifdef ENDBR_PRESENT
-#define X86_DATA_OFFSET 4077
-#define X86_CODE_OFFSET 4073
+# define X86_DATA_OFFSET 4077
+# ifdef __ILP32__
+# define X86_CODE_OFFSET 4069
+# else
+# define X86_CODE_OFFSET 4073
+# endif
#else
-#define X86_DATA_OFFSET 4081
-#define X86_CODE_OFFSET 4077
+# define X86_DATA_OFFSET 4081
+# ifdef __ILP32__
+# define X86_CODE_OFFSET 4073
+# else
+# define X86_CODE_OFFSET 4077
+# endif
#endif
.align UNIX64_TRAMP_MAP_SIZE
@@ -521,9 +529,17 @@ C(trampoline_code_table):
_CET_ENDBR
subq $16, %rsp /* Make space on the stack */
movq %r10, (%rsp) /* Save %r10 on stack */
+#ifdef __ILP32__
+ movl X86_DATA_OFFSET(%rip), %r10d /* Copy data into %r10 */
+#else
movq X86_DATA_OFFSET(%rip), %r10 /* Copy data into %r10 */
+#endif
movq %r10, 8(%rsp) /* Save data on stack */
+#ifdef __ILP32__
+ movl X86_CODE_OFFSET(%rip), %r10d /* Copy code into %r10 */
+#else
movq X86_CODE_OFFSET(%rip), %r10 /* Copy code into %r10 */
+#endif
jmp *%r10 /* Jump to code */
.align 8
.endr