
/*--------------------------------------------------------------------*/
/*--- Support for doing system calls.        syscall-arm-linux.S ---*/
/*--------------------------------------------------------------------*/

/*
  This file is part of Valgrind, a dynamic binary instrumentation
  framework.

  Copyright (C) 2008-2013 Evan Geller (gaze@bea.ms)

  This program is free software; you can redistribute it and/or
  modify it under the terms of the GNU General Public License as
  published by the Free Software Foundation; either version 2 of the
  License, or (at your option) any later version.

  This program is distributed in the hope that it will be useful, but
  WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
  02111-1307, USA.

  The GNU General Public License is contained in the file COPYING.
*/

#if defined(VGP_arm_linux)

#include "pub_core_basics_asm.h"
#include "pub_core_vkiscnums_asm.h"
#include "libvex_guest_offsets.h"
      

/*----------------------------------------------------------------*/
/*
        Perform a syscall for the client.  This will run a syscall
        with the client's specific per-thread signal mask.

        The structure of this function is such that, if the syscall is
        interrupted by a signal, we can determine exactly what
        execution state we were in with respect to the execution of
        the syscall by examining the value of IP in the signal
        handler.  This means that we can always do the appropriate
        thing to precisely emulate the kernel's signal/syscall
        interactions.

        The syscall number is taken from the argument, even though it
        should also be in regs->m_R7.  The syscall result is written
        back to regs->m_R0 on completion.

        Returns 0 if the syscall was successfully called (even if the
        syscall itself failed), or a nonzero error code in the lowest
        8 bits if one of the sigprocmasks failed (there's no way to
        determine which one failed).  And there's no obvious way to
        recover from that either, but nevertheless we want to know.

        VG_(fixup_guest_state_after_syscall_interrupted) does the
        thread state fixup in the case where we were interrupted by a
        signal.

        Prototype:

   UWord ML_(do_syscall_for_client_WRK)(
              Int syscallno,                 // r0
              void* guest_state,             // r1
              const vki_sigset_t *sysmask,   // r2
              const vki_sigset_t *postmask,  // r3
              Int nsigwords)                 // [sp, #0]
*/
/* from vki_arch.h */
#define VKI_SIG_SETMASK 2

.globl ML_(do_syscall_for_client_WRK)
ML_(do_syscall_for_client_WRK):

   /* Stash callee-saves and our args on the stack */
   push {r0, r1, r3, r4, r5, r7, fp, lr}

1:

   mov r7, #__NR_rt_sigprocmask
   mov r0, #VKI_SIG_SETMASK 
   mov r1, r2 /* sysmask */
   mov r2, r3 /* postmask */
   ldr r3, [sp, #32] /* nsigwords */
   svc 0x00000000


   ldr r5, [sp, #4] /* guest_state */

   ldr r7, [sp, #0] /* syscall# */
   ldr r0, [r5, #OFFSET_arm_R0]
   ldr r1, [r5, #OFFSET_arm_R1]
   ldr r2, [r5, #OFFSET_arm_R2]
   ldr r3, [r5, #OFFSET_arm_R3]
   ldr r4, [r5, #OFFSET_arm_R4]
   ldr r5, [r5, #OFFSET_arm_R5]

2: svc 0x00000000
3:
   ldr r5, [sp, #4] /* guest_state */
   str r0, [r5, #OFFSET_arm_R0]

4:
   mov r7, #__NR_rt_sigprocmask
   mov r0, #VKI_SIG_SETMASK 
   ldr r1, [sp, #8] /* postmask */
   mov r2, #0
   ldr r3, [sp, #32] /* nsigwords */
   svc 0x00000000

   cmp r0, #0
   blt 7f
   add sp, sp, #4 /* r0 contains return value */

5: /* Success */
   mov r0, #0
   pop {r1, r3, r4, r5, r7, fp, pc}

7: /* Failure: return 0x8000 | error code */
   orr r0, r0, #0x8000
   pop {r1, r3, r4, r5, r7, fp, pc}


.section .rodata
/* export the ranges so that
   VG_(fixup_guest_state_after_syscall_interrupted) can do the
   right thing */

.globl ML_(blksys_setup)
.globl ML_(blksys_restart)
.globl ML_(blksys_complete)
.globl ML_(blksys_committed)
.globl ML_(blksys_finished)
ML_(blksys_setup):      .long 1b
ML_(blksys_restart):    .long 2b
ML_(blksys_complete):   .long 3b
ML_(blksys_committed):  .long 4b
ML_(blksys_finished):   .long 5b

/* Let the linker know we don't need an executable stack */
.section .note.GNU-stack,"",%progbits

.previous

#endif // defined(VGP_arm_linux)
   
/*--------------------------------------------------------------------*/
/*--- end                                                          ---*/
/*--------------------------------------------------------------------*/
