back to regs->m_gpr[3]/m_xer/m_result on completion.
Returns 0 if the syscall was successfully called (even if the
- syscall itself failed), or a -ve error code if one of the
- sigprocmasks failed (there's no way to determine which one
- failed).
+ syscall itself failed), or an 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
Prototype:
- Int ML_(do_syscall_for_client_WRK)(
+ UWord ML_(do_syscall_for_client_WRK)(
Int syscallno, // r3
void* guest_state, // r4
const vki_sigset_t *sysmask, // r5
/* set the signal mask for doing the system call */
/* set up for sigprocmask(SIG_SETMASK, sysmask, postmask) */
-1: li 0,__NR_sigprocmask
+1: li 0,__NR_rt_sigprocmask
li 3,VKI_SIG_SETMASK
mr 4,5
mr 5,6
+ mr 6,7
sc /* set the mask */
bso 7f /* if the sigprocmask fails */
/* block signals again */
/* set up for sigprocmask(SIG_SETMASK, postmask, NULL) */
-4: li 0,__NR_sigprocmask
+4: li 0,__NR_rt_sigprocmask
li 3,VKI_SIG_SETMASK
mr 4,29
li 5,0
mr 6,28
sc /* set the mask */
bso 7f /* if the sigprocmask fails */
-
/* now safe from signals */
+ li 3,0 /* SUCCESS */
/* pop off stack frame */
5: ld 28,48(1)
blr
/* failure: return -ve error code */
-7: neg 3,3
+7: ori 3,3,0x8000 /* FAILURE -- ensure return value is nonzero */
b 5b
.section .rodata
VG_(fixup_guest_state_after_syscall_interrupted) below for details.
*/
extern
-void ML_(do_syscall_for_client_WRK)( Int syscallno,
- void* guest_state,
- const vki_sigset_t *syscall_mask,
- const vki_sigset_t *restore_mask,
- Int nsigwords );
+UWord ML_(do_syscall_for_client_WRK)( Int syscallno,
+ void* guest_state,
+ const vki_sigset_t *syscall_mask,
+ const vki_sigset_t *restore_mask,
+ Int nsigwords );
static
void do_syscall_for_client ( Int syscallno,
const vki_sigset_t* syscall_mask )
{
vki_sigset_t saved;
- ML_(do_syscall_for_client_WRK)(
- syscallno, &tst->arch.vex,
- syscall_mask, &saved, _VKI_NSIG_WORDS * sizeof(UWord)
+ UWord err
+ = ML_(do_syscall_for_client_WRK)(
+ syscallno, &tst->arch.vex,
+ syscall_mask, &saved, _VKI_NSIG_WORDS * sizeof(UWord)
+ );
+ vg_assert2(
+ err == 0,
+ "ML_(do_syscall_for_client_WRK): sigprocmask error %d",
+ (Int)(err & 0xFFF)
);
}