From d4a17ec6ea250ee1329b5f590027d05e865f0335 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ciro=20Santilli=20=E5=85=AD=E5=9B=9B=E4=BA=8B=E4=BB=B6=20?= =?UTF-8?q?=E6=B3=95=E8=BD=AE=E5=8A=9F?= Date: Thu, 25 Jun 2020 11:00:10 +0000 Subject: [PATCH] lkmc_futex: use inline assembly directly. Makes it more predictable for gem5 LDXR experiments, since otherwise a dynamically linked syscall has LLSC instructions of its own. --- lkmc/futex.h | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/lkmc/futex.h b/lkmc/futex.h index 5bf3aab..c2e6923 100644 --- a/lkmc/futex.h +++ b/lkmc/futex.h @@ -12,9 +12,22 @@ static int lkmc_futex(int *uaddr, int futex_op, int val, const struct timespec *timeout, int *uaddr2, int val3) { - (void)uaddr2; - return syscall(SYS_futex, uaddr, futex_op, val, - timeout, uaddr, val3); + register uint64_t x0 __asm__ ("x0") = (uint64_t)uaddr; + register uint64_t x1 __asm__ ("x1") = futex_op; + register uint64_t x2 __asm__ ("x2") = val; + register const struct timespec *x3 __asm__ ("x3") = timeout; + register int *x4 __asm__ ("x4") = uaddr2; + register uint64_t x5 __asm__ ("x5") = val3; + register uint64_t x8 __asm__ ("x8") = SYS_futex; /* syscall number */ + __asm__ __volatile__ ( + "svc 0;" + : "+r" (x0) + : "r" (x1), "r" (x2), "r" (x3), "r" (x4), "r" (x5), "r" (x8) + : "memory" + ); + return x0; + //return syscall(SYS_futex, uaddr, futex_op, val, + // timeout, uaddr2, val3); } #endif