[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
- [PATCH 0/6] Remove simplified Meslibc version for TinyCC in RISCV, Ekaitz Zarraga, 2024/04/16
- [PATCH 1/6] Revert "build: Add support for TCC in RISC-V.", Ekaitz Zarraga, 2024/04/16
- [PATCH 2/6] Revert "riscv64: Fix arguments of _start function in tcc.", Ekaitz Zarraga, 2024/04/16
- [PATCH 3/6] Revert "riscv64: Simplify assembly constructs not supported by tcc.",
Ekaitz Zarraga <=
- [PATCH 4/6] Revert "riscv64: Add support for tcc.", Ekaitz Zarraga, 2024/04/16
- [PATCH 5/6] Revert "lib: Add missing (empty) crt files for RISC-V." partially, Ekaitz Zarraga, 2024/04/16
- [PATCH 6/6] amend! lib: Add setjmp/longjmp for riscv64., Ekaitz Zarraga, 2024/04/16
- Re: [PATCH 0/6] Remove simplified Meslibc version for TinyCC in RISCV, Janneke Nieuwenhuizen, 2024/04/21