Previously, __internal_syscall() compiled into asm-code that unconditionally
sets the syscall argument registers a0 to a5.
For example, the instruction sequence for a exit syscall looked like
this:
li a0, 1 # in ther caller of exit()
# ... # in newlib:
li a1, 0 # unused arguments
li a2, 0
li a3, 0
li a4, 0
li a5, 0
li a7, 93 # exit syscall number
(i.e. the binary contains then 5 superfluous instructions for this
one argument syscall)
This commit changes the RISC-V syscall code such that only the required
syscall argument registers are set.
GCC detects that argc is known at compile time and thus evaluates all the
if-statements where argc is used at compile time (tested with -O2 and -Os).
11 lines
255 B
C
11 lines
255 B
C
#include <machine/syscall.h>
|
|
#include <sys/time.h>
|
|
#include "internal_syscall.h"
|
|
|
|
/* Get the current time. Only relatively correct. */
|
|
int
|
|
_gettimeofday(struct timeval *tp, void *tzp)
|
|
{
|
|
return syscall_errno (SYS_gettimeofday, 1, tp, 0, 0, 0, 0, 0);
|
|
}
|