+#elif defined(__arm__)
+ {
+ /*
+ * On arm, syscall numbers depend on a flavor (indirect or not)
+ * and can be in either r0 or r12 (always u32)
+ */
+
+ /* See bsd/dev/arm/systemcalls.c:arm_get_syscall_number */
+ arm_saved_state_t *arm_regs = (arm_saved_state_t *) find_user_regs(current_thread());
+
+ /* Check for indirect system call */
+ if (arm_regs->r[12] != 0)
+ code = arm_regs->r[12];
+ else
+ code = arm_regs->r[0];
+ }
+#elif defined(__arm64__)
+ {
+ /*
+ * On arm64, syscall numbers depend on a flavor (indirect or not)
+ * ... and for u32 can be in either r0 or r12
+ * ... and for u64 can be in either x0 or x16
+ */
+
+ /* see bsd/dev/arm/systemcalls.c:arm_get_syscall_number */
+ arm_saved_state_t *arm_regs = (arm_saved_state_t *) find_user_regs(current_thread());
+
+ if (is_saved_state32(arm_regs)) {
+ /* Check for indirect system call */
+ if (saved_state32(arm_regs)->r[12] != 0) {
+ code = saved_state32(arm_regs)->r[12];
+ }
+ else {
+ code = saved_state32(arm_regs)->r[0];
+ }
+ } else {
+ /* Check for indirect system call */
+ if (saved_state64(arm_regs)->x[ARM64_SYSCALL_CODE_REG_NUM] != 0 ) {
+ code = saved_state64(arm_regs)->x[ARM64_SYSCALL_CODE_REG_NUM];
+ }
+ else {
+ code = saved_state64(arm_regs)->x[0];
+ }
+ }
+ }