Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/checkpoint-restore/criu.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'compel/arch/arm/plugins/std/syscalls/syscall-common.S')
-rw-r--r--compel/arch/arm/plugins/std/syscalls/syscall-common.S34
1 files changed, 34 insertions, 0 deletions
diff --git a/compel/arch/arm/plugins/std/syscalls/syscall-common.S b/compel/arch/arm/plugins/std/syscalls/syscall-common.S
new file mode 100644
index 000000000..9ac53bdd2
--- /dev/null
+++ b/compel/arch/arm/plugins/std/syscalls/syscall-common.S
@@ -0,0 +1,34 @@
+#include "common/asm/linkage.h"
+
+@ We use the register R8 unlike libc that uses R12.
+@ This avoids corruption of the register by the stub
+@ for the syscall sys_munmap() when syscalls are hooked
+@ by ptrace(). However we have to make sure that
+@ the compiler doesn't use the register on the route
+@ between parasite_service() and sys_munmap().
+
+syscall_common:
+ ldr r7, [r7]
+ add r8, sp, #24
+ ldm r8, {r4, r5, r6}
+ svc 0x00000000
+ pop {r4, r5, r6, r7, r8, pc}
+
+
+.macro syscall name, nr
+ .nr_\name :
+ .long \nr
+
+ ENTRY(\name)
+ push {r4, r5, r6, r7, r8, lr}
+ adr r7, .nr_\name
+ b syscall_common
+ END(\name)
+.endm
+
+
+ENTRY(__cr_restore_rt)
+ adr r7, .nr_sys_rt_sigreturn
+ ldr r7, [r7]
+ svc #0
+END(__cr_restore_rt)