diff options
Diffstat (limited to 'ecomp-c/libc-freestanding.c')
-rw-r--r-- | ecomp-c/libc-freestanding.c | 17 |
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 ) |