]> granicus.if.org Git - strace/commitdiff
sparc, sparc64: refactor arch_set_error and arch_set_success
authorDmitry V. Levin <ldv@altlinux.org>
Thu, 4 Jul 2019 18:25:49 +0000 (18:25 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Thu, 4 Jul 2019 18:25:49 +0000 (18:25 +0000)
* linux/sparc/set_error.c (sparc_set_o0_psr): New function.
(arch_set_error, arch_set_success): Use it.
* linux/sparc64/set_error.c (sparc64_set_o0_tstate): New function.
(arch_set_error, arch_set_success): Use it.

linux/sparc/set_error.c
linux/sparc64/set_error.c

index 1679df0fbba1e97910e4355e66a097f78fa70eee..0e5d143ff656bc53e9eac690b728ca0efc79bfe8 100644 (file)
@@ -6,21 +6,25 @@
  */
 
 static int
-arch_set_error(struct tcb *tcp)
+sparc_set_o0_psr(struct tcb *tcp, const unsigned long o0,
+                const unsigned long psr_set, const unsigned long psr_clear)
 {
        if (ptrace_syscall_info_is_valid() && get_regs(tcp) < 0)
                return -1;
-       sparc_regs.psr |= PSR_C;
-       sparc_regs.u_regs[U_REG_O0] = tcp->u_error;
+       sparc_regs.u_regs[U_REG_O0] = o0;
+       sparc_regs.psr |= psr_set;
+       sparc_regs.psr &= ~psr_clear;
        return set_regs(tcp->pid);
 }
 
+static int
+arch_set_error(struct tcb *tcp)
+{
+       return sparc_set_o0_psr(tcp, tcp->u_error, PSR_C, 0);
+}
+
 static int
 arch_set_success(struct tcb *tcp)
 {
-       if (ptrace_syscall_info_is_valid() && get_regs(tcp) < 0)
-               return -1;
-       sparc_regs.psr &= ~PSR_C;
-       sparc_regs.u_regs[U_REG_O0] = tcp->u_rval;
-       return set_regs(tcp->pid);
+       return sparc_set_o0_psr(tcp, tcp->u_rval, 0, PSR_C);
 }
index 290fad3424e834d10d61f44d165a5a505a4a89e0..846b7ddd1de593dc4588731f1ce36a8d9625e55c 100644 (file)
@@ -6,21 +6,26 @@
  */
 
 static int
-arch_set_error(struct tcb *tcp)
+sparc64_set_o0_tstate(struct tcb *tcp, const unsigned long o0,
+                     const unsigned long tstate_set,
+                     const unsigned long tstate_clear)
 {
        if (ptrace_syscall_info_is_valid() && get_regs(tcp) < 0)
                return -1;
-       sparc_regs.tstate |= 0x1100000000UL;
-       sparc_regs.u_regs[U_REG_O0] = tcp->u_error;
+       sparc_regs.u_regs[U_REG_O0] = o0;
+       sparc_regs.tstate |= tstate_set;
+       sparc_regs.tstate &= ~tstate_clear;
        return set_regs(tcp->pid);
 }
 
+static int
+arch_set_error(struct tcb *tcp)
+{
+       return sparc64_set_o0_tstate(tcp, tcp->u_error, 0x1100000000UL, 0);
+}
+
 static int
 arch_set_success(struct tcb *tcp)
 {
-       if (ptrace_syscall_info_is_valid() && get_regs(tcp) < 0)
-               return -1;
-       sparc_regs.tstate &= ~0x1100000000UL;
-       sparc_regs.u_regs[U_REG_O0] = tcp->u_rval;
-       return set_regs(tcp->pid);
+       return sparc64_set_o0_tstate(tcp, tcp->u_rval, 0, 0x1100000000UL);
 }