84 lines
1.8 KiB
ArmAsm
84 lines
1.8 KiB
ArmAsm
/*
|
|
* \brief Linux syscall() binding
|
|
* \author Christian Prochaska
|
|
* \date 2009-07-14
|
|
*
|
|
* based on glibc-2.9/sysdeps/unix/sysv/linux/i386/syscall.S
|
|
*
|
|
* error case:
|
|
* glibc's syscall() function returns -1 and sets errno
|
|
* lx_syscall() returns -errno
|
|
*/
|
|
|
|
|
|
#define L(name) name
|
|
|
|
#define ENTER_KERNEL int $0x80
|
|
|
|
.text
|
|
.globl lx_syscall
|
|
.type lx_syscall, @function
|
|
lx_syscall:
|
|
.cfi_startproc
|
|
/* PUSHARGS_6*/ /* Save register contents. */
|
|
/* PUSHARGS_6 begin */
|
|
pushl %ebp;
|
|
.cfi_adjust_cfa_offset 4;
|
|
.cfi_rel_offset %ebp, 0;
|
|
L(PUSHBP1):
|
|
pushl %edi;
|
|
.cfi_adjust_cfa_offset 4;
|
|
.cfi_rel_offset %edi, 0;
|
|
L(PUSHDI1):
|
|
pushl %esi;
|
|
.cfi_adjust_cfa_offset 4;
|
|
.cfi_rel_offset %esi, 0;
|
|
L(PUSHSI1):
|
|
pushl %ebx;
|
|
.cfi_adjust_cfa_offset 4;
|
|
.cfi_rel_offset %ebx, 0;
|
|
L(PUSHBX1):
|
|
/* PUSHARGS_6 end */
|
|
|
|
/*_DOARGS_6(44)*/ /* Load arguments. */
|
|
/*_DOARGS_6(44) begin*/
|
|
movl 44(%esp), %ebp;
|
|
movl 40(%esp), %edi;
|
|
movl 36(%esp), %esi;
|
|
movl 32(%esp), %edx;
|
|
movl 28(%esp), %ecx;
|
|
movl 24(%esp), %ebx;
|
|
/*_DOARGS_6(44) end*/
|
|
movl 20(%esp), %eax /* Load syscall number into %eax. */
|
|
ENTER_KERNEL /* Do the system call. */
|
|
/* POPARGS_6*/ /* Restore register contents. */
|
|
/* POPARGS_6 begin */
|
|
popl %ebx;
|
|
.cfi_adjust_cfa_offset -4;
|
|
.cfi_restore %ebx;
|
|
L(POPBX1):
|
|
popl %esi;
|
|
.cfi_adjust_cfa_offset -4;
|
|
.cfi_restore %esi;
|
|
L(POPSI1):
|
|
popl %edi;
|
|
.cfi_adjust_cfa_offset -4;
|
|
.cfi_restore %edi;
|
|
L(POPDI1):
|
|
popl %ebp;
|
|
.cfi_adjust_cfa_offset -4;
|
|
.cfi_restore %ebp;
|
|
L(POPBP1):
|
|
/* POPARGS_6 end */
|
|
L(pseudo_end):
|
|
ret /* Return to caller. */
|
|
|
|
.cfi_endproc
|
|
|
|
/*
|
|
* Allow stacks to be mapped executable (needed because Genode does not
|
|
* offer an API to handle non-execute mappings yet).
|
|
*/
|
|
.section .note.GNU-stack, "", @progbits
|
|
|