genode/base-linux/src/platform/x86_32/lx_syscall.S

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