From 191de698a7f82b00a2e329ad5bc177a0c998037d Mon Sep 17 00:00:00 2001 From: "Jan (janneke) Nieuwenhuizen" Date: Mon, 7 Dec 2020 13:03:21 +0100 Subject: [PATCH] mescc: Mes C Library: ARM: _write.c: Inline fake asm. * lib/linux/arm-mes-gcc/_write.c (_write): Use inline fake asm. --- lib/linux/arm-mes-gcc/_write.c | 41 +++++++++++++--------------------- 1 file changed, 16 insertions(+), 25 deletions(-) diff --git a/lib/linux/arm-mes-gcc/_write.c b/lib/linux/arm-mes-gcc/_write.c index fec381fd..8711bde3 100644 --- a/lib/linux/arm-mes-gcc/_write.c +++ b/lib/linux/arm-mes-gcc/_write.c @@ -21,10 +21,9 @@ #include "mes/lib-mini.h" -#define SYS_write "0x04" - // *INDENT-OFF* #if !__TINYC__ +#define SYS_write "0x04" ssize_t _write (int filedes, void const *buffer, size_t size) { @@ -42,28 +41,20 @@ _write (int filedes, void const *buffer, size_t size) ); return r; } -// *INDENT-ON* #else //__TINYC__ -__asm__ (".global _write\n"); -__asm__ ("_write:\n"); -__asm__ (".int 0xe92d4880\n"); //push {r7, fp, lr} -__asm__ (".int 0xe28db008\n"); //add fp, sp, #8 -__asm__ (".int 0xe24dd01c\n"); //sub sp, sp, #28 -__asm__ (".int 0xe50b0018\n"); //str r0, [fp, #-24] ; 0xffffffe8 -__asm__ (".int 0xe50b101c\n"); //str r1, [fp, #-28] ; 0xffffffe4 -__asm__ (".int 0xe50b2020\n"); //str r2, [fp, #-32] ; 0xffffffe0 -__asm__ (".int 0xe51b3018\n"); //ldr r3, [fp, #-24] ; 0xffffffe8 -__asm__ (".int 0xe51bc01c\n"); //ldr ip, [fp, #-28] ; 0xffffffe4 -__asm__ (".int 0xe51be020\n"); //ldr lr, [fp, #-32] ; 0xffffffe0 -__asm__ (".int 0xe3a07004\n"); //mov r7, #4 -__asm__ (".int 0xe1a00003\n"); //mov r0, r3 -__asm__ (".int 0xe1a0100c\n"); //mov r1, ip -__asm__ (".int 0xe1a0300e\n"); //mov r3, lr -__asm__ (".int 0xef000000\n"); //svc 0x00000000 -__asm__ (".int 0xe1a03000\n"); //mov r3, r0 -__asm__ (".int 0xe50b3010\n"); //str r3, [fp, #-16] -__asm__ (".int 0xe51b3010\n"); //ldr r3, [fp, #-16] -__asm__ (".int 0xe1a00003\n"); //mov r0, r3 -__asm__ (".int 0xe24bd008\n"); //sub sp, fp, #8 -__asm__ (".int 0xe8bd8880\n"); //pop {r7, fp, pc} +#define SYS_write 0x04 +ssize_t +_write (int filedes, void const *buffer, size_t size) +{ + long r; + int c = SYS_write; + __asm__ (".int 0xe51b7008\n"); //ldr r7, [fp, #-8] ; + __asm__ (".int 0xe59b000c\n"); //ldr r0, [fp, #12] ; filedes + __asm__ (".int 0xe59b1010\n"); //ldr r1, [fp, #16] ; buffer + __asm__ (".int 0xe59b2014\n"); //ldr r2, [fp, #20] ; size + __asm__ (".int 0xef000000\n"); //svc 0x00000000 + __asm__ (".int 0xe50b0004\n"); //str r0, [fp, #-4] + return r; +} #endif //__TINYC__ +// *INDENT-ON*