|
From: <sv...@va...> - 2014-02-20 23:19:06
|
Author: sewardj
Date: Thu Feb 20 23:18:32 2014
New Revision: 13823
Log:
arm64-linux: make restarting of syscalls interrupted by signals work
Modified:
trunk/coregrind/m_syswrap/syswrap-main.c
trunk/include/vki/vki-arm64-linux.h
Modified: trunk/coregrind/m_syswrap/syswrap-main.c
==============================================================================
--- trunk/coregrind/m_syswrap/syswrap-main.c (original)
+++ trunk/coregrind/m_syswrap/syswrap-main.c Thu Feb 20 23:18:32 2014
@@ -2046,8 +2046,25 @@
}
#elif defined(VGP_arm64_linux)
- // probably simplest to copy the ppc version
- I_die_here;
+ arch->vex.guest_PC -= 4; // sizeof(arm64 instr)
+
+ /* Make sure our caller is actually sane, and we're really backing
+ back over a syscall.
+
+ svc #0 == d4 00 00 01
+ */
+ {
+ UChar *p = (UChar *)arch->vex.guest_PC;
+
+ if (p[0] != 0x01 || p[1] != 0x00 || p[2] != 0x00 || p[3] != 0xD4)
+ VG_(message)(
+ Vg_DebugMsg,
+ "?! restarting over syscall at %#llx %02x %02x %02x %02x\n",
+ arch->vex.guest_PC + 0ULL, p[0], p[1], p[2], p[3]
+ );
+
+ vg_assert(p[0] == 0x01 && p[1] == 0x00 && p[2] == 0x00 && p[3] == 0xD4);
+ }
#elif defined(VGP_x86_darwin)
arch->vex.guest_EIP = arch->vex.guest_IP_AT_SYSCALL;
Modified: trunk/include/vki/vki-arm64-linux.h
==============================================================================
--- trunk/include/vki/vki-arm64-linux.h (original)
+++ trunk/include/vki/vki-arm64-linux.h Thu Feb 20 23:18:32 2014
@@ -515,15 +515,18 @@
typedef struct vki_user_fpsimd_state vki_elf_fpregset_t;
//----------------------------------------------------------------------
-// From linux-3.10.5/include/uapi/asm-generic/ucontext.h
+// From linux-3.10.5/arch/arm64/include/asm/ucontext.h
//----------------------------------------------------------------------
struct vki_ucontext {
- unsigned long uc_flags;
- struct vki_ucontext *uc_link;
- vki_stack_t uc_stack;
- struct vki_sigcontext uc_mcontext;
- vki_sigset_t uc_sigmask;
+ unsigned long uc_flags;
+ struct vki_ucontext *uc_link;
+ vki_stack_t uc_stack;
+ vki_sigset_t uc_sigmask;
+ /* glibc uses a 1024-bit sigset_t */
+ __vki_u8 __unused[1024 / 8 - sizeof(vki_sigset_t)];
+ /* last for future expansion */
+ struct vki_sigcontext uc_mcontext;
};
//ZZ //----------------------------------------------------------------------
|