summaryrefslogtreecommitdiff
path: root/ecomp-c/libc-freestanding.c
diff options
context:
space:
mode:
Diffstat (limited to 'ecomp-c/libc-freestanding.c')
-rw-r--r--ecomp-c/libc-freestanding.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/ecomp-c/libc-freestanding.c b/ecomp-c/libc-freestanding.c
index f37aa83..35f2e02 100644
--- a/ecomp-c/libc-freestanding.c
+++ b/ecomp-c/libc-freestanding.c
@@ -138,6 +138,19 @@ static __attribute__((noinline)) int syscall1( int id, int arg0 )
return retval;
}
+void __builtin_unreachable( void );
+
+static __attribute__((noinline)) __attribute__((noreturn)) void syscall1noret( int id, int arg0 )
+{
+ __asm__ volatile( "\
+ push %%ebx\n\
+ mov %0, %%eax\n\
+ mov %1, %%ebx\n\
+ int $0x80\n\
+ pop %%ebx\n" : : "m"( id ), "m"( arg0 ) );
+ __builtin_unreachable( );
+}
+
static __attribute__((noinline)) int syscall3( int id, int arg0, int arg1, int arg2 )
{
int retval;
@@ -164,9 +177,9 @@ static __attribute__((noinline)) int syscall3( int id, int arg0, int arg1, int a
return retval;
}
-void exit( int status )
+__attribute__((noreturn)) void exit( int status )
{
- syscall1( SYSCALL_EXIT, status );
+ syscall1noret( SYSCALL_EXIT, status );
}
static void strreverse( char *s )