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.
This commit is contained in:
Ciro Santilli 六四事件 法轮功
2020-06-25 11:00:10 +00:00
parent 15ffa40b6e
commit d4a17ec6ea

View File

@@ -12,9 +12,22 @@ static int
lkmc_futex(int *uaddr, int futex_op, int val, lkmc_futex(int *uaddr, int futex_op, int val,
const struct timespec *timeout, int *uaddr2, int val3) const struct timespec *timeout, int *uaddr2, int val3)
{ {
(void)uaddr2; register uint64_t x0 __asm__ ("x0") = (uint64_t)uaddr;
return syscall(SYS_futex, uaddr, futex_op, val, register uint64_t x1 __asm__ ("x1") = futex_op;
timeout, uaddr, val3); 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 #endif