bug-mes
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 3/6] Revert "riscv64: Simplify assembly constructs not supported


From: Ekaitz Zarraga
Subject: [PATCH 3/6] Revert "riscv64: Simplify assembly constructs not supported by tcc."
Date: Tue, 16 Apr 2024 21:30:25 +0200

This reverts commit e5b99625c9c57f99d3e67dfee45e47fcece96f8b.
---
 lib/linux/riscv64-mes-tcc/_exit.c   |  6 ++-
 lib/linux/riscv64-mes-tcc/_write.c  | 11 +++--
 lib/linux/riscv64-mes-tcc/syscall.c | 63 +++++++++++++++++++----------
 3 files changed, 52 insertions(+), 28 deletions(-)

diff --git a/lib/linux/riscv64-mes-tcc/_exit.c 
b/lib/linux/riscv64-mes-tcc/_exit.c
index bad49694..21c697f8 100644
--- a/lib/linux/riscv64-mes-tcc/_exit.c
+++ b/lib/linux/riscv64-mes-tcc/_exit.c
@@ -28,10 +28,12 @@
 void
 _exit (int code)
 {
+  register long __a7 asm ("a7") = SYS_exit;
+  register long __a0 asm ("a0") = code;
   asm volatile (
-       "addi a7, zero, 93\n\t"
-       "ld a0, s0, -24\n\t"
        "ecall\n\t"
+       : // no outputs
+       : "r" (__a0), "r" (__a7)
        );
   // not reached
   _exit (0);
diff --git a/lib/linux/riscv64-mes-tcc/_write.c 
b/lib/linux/riscv64-mes-tcc/_write.c
index 07d9ded3..7fed0915 100644
--- a/lib/linux/riscv64-mes-tcc/_write.c
+++ b/lib/linux/riscv64-mes-tcc/_write.c
@@ -28,11 +28,14 @@
 ssize_t
 _write (int filedes, void const *buffer, size_t size)
 {
+  register long __a7 asm ("a7") = (long) SYS_write;
+  register long __a0 asm ("a0") = (long) filedes;
+  register long __a1 asm ("a1") = (long) buffer;
+  register long __a2 asm ("a2") = (long) size;
   asm volatile (
-       "addi a7, zero, 64\n\t"
-       "ld a0, s0, -24\n\t"
-       "ld a1, s0, -32\n\t"
-       "ld a2, s0, -40\n\t"
        "ecall\n\t"
+       : "+r" (__a0)
+       : "r" (__a7), "r" (__a1), "r" (__a2)
        );
+  return (ssize_t)__a0;
 }
diff --git a/lib/linux/riscv64-mes-tcc/syscall.c 
b/lib/linux/riscv64-mes-tcc/syscall.c
index 59ec8d7d..e0579914 100644
--- a/lib/linux/riscv64-mes-tcc/syscall.c
+++ b/lib/linux/riscv64-mes-tcc/syscall.c
@@ -27,70 +27,89 @@
 long
 __sys_call (long sys_call)
 {
-    asm volatile (
-       "ld a7, s0, -24\n\t"
+  register long __a7 asm ("a7") = sys_call;
+  register long __a0 asm ("a0");
+  asm volatile (
        "ecall\n\t"
+       : "=r" (__a0)
+       : "r" (__a7)
        );
+  return __a0;
 }
 
 long
 __sys_call1 (long sys_call, long one)
 {
+  register long __a7 asm ("a7") = sys_call;
+  register long __a0 asm ("a0") = one;
   asm volatile (
-       "ld a7, s0, -24\n\t"
-       "ld a0, s0, -32\n\t"
        "ecall\n\t"
+       : "+r" (__a0)
+       : "r" (__a7)
        );
+  return __a0;
 }
 
 long
 __sys_call2 (long sys_call, long one, long two)
 {
+  register long __a7 asm ("a7") = sys_call;
+  register long __a0 asm ("a0") = one;
+  register long __a1 asm ("a1") = two;
   asm volatile (
-       "ld a7, s0, -24\n\t"
-       "ld a0, s0, -32\n\t"
-       "ld a1, s0, -40\n\t"
        "ecall\n\t"
+       : "+r" (__a0)
+       : "r" (__a7), "r" (__a1)
        );
+  return __a0;
 }
 
 long
 __sys_call3 (long sys_call, long one, long two, long three)
 {
+  register long __a7 asm ("a7") = sys_call;
+  register long __a0 asm ("a0") = one;
+  register long __a1 asm ("a1") = two;
+  register long __a2 asm ("a2") = three;
   asm volatile (
-       "ld a7, s0, -24\n\t"
-       "ld a0, s0, -32\n\t"
-       "ld a1, s0, -40\n\t"
-       "ld a2, s0, -48\n\t"
        "ecall\n\t"
+       : "+r" (__a0)
+       : "r" (__a7), "r" (__a1), "r" (__a2)
        );
+  return __a0;
 }
 
 long
 __sys_call4 (long sys_call, long one, long two, long three, long four)
 {
+  register long __a7 asm ("a7") = sys_call;
+  register long __a0 asm ("a0") = one;
+  register long __a1 asm ("a1") = two;
+  register long __a2 asm ("a2") = three;
+  register long __a3 asm ("a3") = four;
   asm volatile (
-       "ld a7, s0, -24\n\t"
-       "ld a0, s0, -32\n\t"
-       "ld a1, s0, -40\n\t"
-       "ld a2, s0, -48\n\t"
-       "ld a3, s0, -56\n\t"
        "ecall\n\t"
+       : "+r" (__a0)
+       : "r" (__a7), "r" (__a1), "r" (__a2), "r" (__a3)
        );
+  return __a0;
 }
 
 long
 __sys_call5 (long sys_call, long one, long two, long three, long four, long 
five)
 {
+  register long __a7 asm ("a7") = sys_call;
+  register long __a0 asm ("a0") = one;
+  register long __a1 asm ("a1") = two;
+  register long __a2 asm ("a2") = three;
+  register long __a3 asm ("a3") = four;
+  register long __a4 asm ("a4") = five;
   asm volatile (
-       "ld a7, s0, -24\n\t"
-       "ld a0, s0, -32\n\t"
-       "ld a1, s0, -40\n\t"
-       "ld a2, s0, -48\n\t"
-       "ld a3, s0, -56\n\t"
-       "ld a4, s0, -64\n\t"
        "ecall\n\t"
+       : "+r" (__a0)
+       : "r" (__a7), "r" (__a1), "r" (__a2), "r" (__a3), "r" (__a4)
        );
+  return __a0;
 }
 // *INDENT-ON*
 
-- 
2.41.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]