Signed-off-by: Waldemar Kozaczuk <jwkozac...@gmail.com>
---
 tests/tst-syscall.cc | 46 +++++++++++++++++++++++++++++++++++++-------
 1 file changed, 39 insertions(+), 7 deletions(-)

diff --git a/tests/tst-syscall.cc b/tests/tst-syscall.cc
index 79332ad6..12722f1b 100644
--- a/tests/tst-syscall.cc
+++ b/tests/tst-syscall.cc
@@ -40,18 +40,29 @@ bool do_expect(T actual, T expected, const char *actuals, 
const char *expecteds,
 
 int main(int argc, char **argv)
 {
-    // Test that the x86 SYSCALL instruction works, and produces the same
+    // Test that the x86 SYSCALL and aarch64 SVC instructions work, and 
produce the same
     // results as the syscall() function (with expected differences in how
     // errors are returned).
     unsigned long syscall_nr = __NR_gettid;
     long tid = 0;
 
-    asm ("movq %1, %%rax\n"
+#ifdef __x86_64__
+    asm ("movq %[syscall_no], %%rax\n"
          "syscall\n"
-         "movq %%rax, %0\n"
-         : "=m" (tid)
-         : "m" (syscall_nr)
+         "movq %%rax, %[tid]\n"
+         : [tid]"=m" (tid)
+         : [syscall_no]"m" (syscall_nr)
          : "rax", "rdi");
+#endif
+
+#ifdef __aarch64__
+    asm ("mov x8, %[syscall_no]\n"
+         "svc #0\n"
+         "mov %[tid], x0\n"
+         : [tid]"=r" (tid)
+         : [syscall_no]"r" (syscall_nr)
+         : "x0", "x8");
+#endif
 
     std::cout << "got tid=" << tid << std::endl;
     expect(tid >= 0, true);
@@ -68,17 +79,38 @@ int main(int argc, char **argv)
     off_t offset = 0;
     void* buf = NULL;
 
+    syscall_nr = __NR_mmap;
+
+#ifdef __x86_64__
     asm ("movq %[addr], %%rdi\n"
          "movq %[length], %%rsi\n"
          "movl %[prot], %%edx\n"
          "movq %[flags], %%r10\n"
          "movq %[fd], %%r8\n"
          "movq %[offset], %%r9\n"
-         "movq $9, %%rax\n"
+         "movq %[syscall_no], %%rax\n"
          "syscall\n"
          "movq %%rax, %[buf]\n"
          : [buf] "=m" (buf)
-         : [addr] "m" (addr), [length] "m" (length), [prot] "m" (prot), 
[flags] "m" (flags), [fd] "m" (fd), [offset] "m" (offset));
+         : [addr] "m" (addr), [length] "m" (length), [prot] "m" (prot),
+           [flags] "m" (flags), [fd] "m" (fd), [offset] "m" (offset), 
[syscall_no] "m" (syscall_nr));
+#endif
+
+#ifdef __aarch64__
+    asm ("mov x0, %[addr]\n"
+         "mov x1, %[length]\n"
+         "mov x2, %[prot]\n"
+         "mov x3, %[flags]\n"
+         "mov x4, %[fd]\n"
+         "mov x5, %[offset]\n"
+         "mov x8, %[syscall_no]\n"
+         "svc #0\n"
+         "mov %[buf], x0\n"
+         : [buf] "=r" (buf)
+         : [addr] "r" (addr), [length] "r" (length), [prot] "r" (prot),
+           [flags] "r" (flags), [fd] "r" (fd), [offset] "r" (offset), 
[syscall_no] "r" (syscall_nr)
+         : "x0", "x1", "x2", "x3", "x4", "x5", "x8");
+#endif
 
     assert(((long)buf) >= 0);
     munmap(buf, length);
-- 
2.27.0

-- 
You received this message because you are subscribed to the Google Groups "OSv 
Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to osv-dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/osv-dev/20220429040831.13321-1-jwkozaczuk%40gmail.com.

Reply via email to