]> granicus.if.org Git - strace/commitdiff
Cleanup print_pc
authorDmitry V. Levin <ldv@altlinux.org>
Mon, 30 Nov 2015 03:30:51 +0000 (03:30 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Mon, 30 Nov 2015 03:30:51 +0000 (03:30 +0000)
Apparently, there are only two types of instruction pointer printers
depending on the architecture: those that print a register that was
fetched earlier, and those that fetch a register themselves using upeek.
With this change, architectures of the first type have ARCH_PC_REG
defined in their arch_regs.c file, architectures of the first type
have ARCH_PC_PEEK_ADDR defined there, and the common code in syscall.c
uses these macros to print the instruction pointer.

* Makefile.am (EXTRA_DIST): Remove linux/*/print_pc.c.
* linux/*/print_pc.c: Remove.
* linux/aarch64/arch_regs.c(ARCH_PC_REG): Define macro.
* linux/arc/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/arm/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/avr32/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/i386/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/ia64/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/metag/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/mips/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/nios2/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/or1k/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/powerpc64/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/powerpc/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/s390/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/s390x/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/sparc64/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/sparc/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/tile/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/x32/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/x86_64/arch_regs.c(ARCH_PC_REG): Likewise.
* linux/alpha/arch_regs.c(ARCH_PC_PEEK_ADDR): Define macro.
* linux/bfin/arch_regs.c(ARCH_PC_PEEK_ADDR): Likewise.
* linux/crisv10/arch_regs.c(ARCH_PC_PEEK_ADDR): Likewise.
* linux/crisv32/arch_regs.c(ARCH_PC_PEEK_ADDR): Likewise.
* linux/hppa/arch_regs.c(ARCH_PC_PEEK_ADDR): Likewise.
* linux/m68k/arch_regs.c(ARCH_PC_PEEK_ADDR): Likewise.
* linux/microblaze/arch_regs.c(ARCH_PC_PEEK_ADDR): Likewise.
* linux/sh64/arch_regs.c(ARCH_PC_PEEK_ADDR): Likewise.
* linux/sh/arch_regs.c(ARCH_PC_PEEK_ADDR): Likewise.
* linux/xtensa/arch_regs.c(ARCH_PC_PEEK_ADDR): Likewise.
* syscall.c (print_pc): Stop including "print_pc.c".
Use ARCH_PC_REG or ARCH_PC_PEEK_ADDR.

60 files changed:
Makefile.am
linux/aarch64/arch_regs.c
linux/aarch64/print_pc.c [deleted file]
linux/alpha/arch_regs.c
linux/alpha/print_pc.c [deleted file]
linux/arc/arch_regs.c
linux/arc/print_pc.c [deleted file]
linux/arm/arch_regs.c
linux/arm/print_pc.c [deleted file]
linux/avr32/arch_regs.c
linux/avr32/print_pc.c [deleted file]
linux/bfin/arch_regs.c
linux/bfin/print_pc.c [deleted file]
linux/crisv10/arch_regs.c
linux/crisv10/print_pc.c [deleted file]
linux/crisv32/arch_regs.c
linux/crisv32/print_pc.c [deleted file]
linux/hppa/arch_regs.c
linux/hppa/print_pc.c [deleted file]
linux/i386/arch_regs.c
linux/i386/print_pc.c [deleted file]
linux/ia64/arch_regs.c
linux/ia64/print_pc.c [deleted file]
linux/m68k/arch_regs.c
linux/m68k/print_pc.c [deleted file]
linux/metag/arch_regs.c
linux/metag/print_pc.c [deleted file]
linux/microblaze/arch_regs.c
linux/microblaze/print_pc.c [deleted file]
linux/mips/arch_regs.c
linux/mips/print_pc.c [deleted file]
linux/nios2/arch_regs.c
linux/nios2/print_pc.c [deleted file]
linux/or1k/arch_regs.c
linux/or1k/print_pc.c [deleted file]
linux/powerpc/arch_regs.c
linux/powerpc/print_pc.c [deleted file]
linux/powerpc64/arch_regs.c
linux/powerpc64/print_pc.c [deleted file]
linux/s390/arch_regs.c
linux/s390/print_pc.c [deleted file]
linux/s390x/arch_regs.c
linux/s390x/print_pc.c [deleted file]
linux/sh/arch_regs.c
linux/sh/print_pc.c [deleted file]
linux/sh64/arch_regs.c
linux/sh64/print_pc.c [deleted file]
linux/sparc/arch_regs.c
linux/sparc/print_pc.c [deleted file]
linux/sparc64/arch_regs.c
linux/sparc64/print_pc.c [deleted file]
linux/tile/arch_regs.c
linux/tile/print_pc.c [deleted file]
linux/x32/arch_regs.c
linux/x32/print_pc.c [deleted file]
linux/x86_64/arch_regs.c
linux/x86_64/print_pc.c [deleted file]
linux/xtensa/arch_regs.c
linux/xtensa/print_pc.c [deleted file]
syscall.c

index 0052d0e1f4384abb7558421c01f819de0cdc6784..624807bdc92fdab3514bc0f5782a33f5ac5fdcb9 100644 (file)
@@ -227,7 +227,6 @@ EXTRA_DIST =                                \
        linux/aarch64/ioctls_arch1.h    \
        linux/aarch64/ioctls_inc0.h     \
        linux/aarch64/ioctls_inc1.h     \
-       linux/aarch64/print_pc.c        \
        linux/aarch64/signalent1.h      \
        linux/aarch64/syscallent.h      \
        linux/aarch64/syscallent1.h     \
@@ -242,7 +241,6 @@ EXTRA_DIST =                                \
        linux/alpha/get_syscall_result.c\
        linux/alpha/ioctls_arch0.h      \
        linux/alpha/ioctls_inc0.h       \
-       linux/alpha/print_pc.c          \
        linux/alpha/signalent.h         \
        linux/alpha/syscallent.h        \
        linux/alpha/userent.h           \
@@ -252,7 +250,6 @@ EXTRA_DIST =                                \
        linux/arc/get_syscall_args.c    \
        linux/arc/ioctls_arch0.h        \
        linux/arc/ioctls_inc0.h         \
-       linux/arc/print_pc.c            \
        linux/arc/syscallent.h          \
        linux/arch_regs.h               \
        linux/arch_sigreturn.c          \
@@ -264,7 +261,6 @@ EXTRA_DIST =                                \
        linux/arm/get_syscall_args.c    \
        linux/arm/ioctls_arch0.h        \
        linux/arm/ioctls_inc0.h         \
-       linux/arm/print_pc.c            \
        linux/arm/syscallent.h          \
        linux/arm/userent.h             \
        linux/avr32/arch_regs.c         \
@@ -273,7 +269,6 @@ EXTRA_DIST =                                \
        linux/avr32/get_syscall_args.c  \
        linux/avr32/ioctls_arch0.h      \
        linux/avr32/ioctls_inc0.h       \
-       linux/avr32/print_pc.c          \
        linux/avr32/syscallent.h        \
        linux/avr32/userent.h           \
        linux/bfin/arch_regs.c          \
@@ -283,7 +278,6 @@ EXTRA_DIST =                                \
        linux/bfin/get_syscall_result.c \
        linux/bfin/ioctls_arch0.h       \
        linux/bfin/ioctls_inc0.h        \
-       linux/bfin/print_pc.c           \
        linux/bfin/syscallent.h         \
        linux/bfin/userent.h            \
        linux/crisv10/arch_regs.c       \
@@ -292,7 +286,6 @@ EXTRA_DIST =                                \
        linux/crisv10/get_scno.c        \
        linux/crisv10/get_syscall_args.c        \
        linux/crisv10/get_syscall_result.c      \
-       linux/crisv10/print_pc.c        \
        linux/crisv10/userent.h         \
        linux/crisv32/arch_regs.c       \
        linux/crisv32/arch_sigreturn.c  \
@@ -300,7 +293,6 @@ EXTRA_DIST =                                \
        linux/crisv32/get_scno.c        \
        linux/crisv32/get_syscall_args.c        \
        linux/crisv32/get_syscall_result.c      \
-       linux/crisv32/print_pc.c        \
        linux/crisv32/userent.h         \
        linux/dummy.h                   \
        linux/errnoent.h                \
@@ -313,7 +305,6 @@ EXTRA_DIST =                                \
        linux/hppa/get_syscall_result.c \
        linux/hppa/ioctls_arch0.h       \
        linux/hppa/ioctls_inc0.h        \
-       linux/hppa/print_pc.c           \
        linux/hppa/signalent.h          \
        linux/hppa/syscallent.h         \
        linux/i386/arch_regs.c          \
@@ -324,7 +315,6 @@ EXTRA_DIST =                                \
        linux/i386/get_syscall_args.c   \
        linux/i386/ioctls_arch0.h       \
        linux/i386/ioctls_inc0.h        \
-       linux/i386/print_pc.c           \
        linux/i386/syscallent.h         \
        linux/i386/userent.h            \
        linux/i386/userent0.h           \
@@ -337,7 +327,6 @@ EXTRA_DIST =                                \
        linux/ia64/get_syscall_args.c   \
        linux/ia64/ioctls_arch0.h       \
        linux/ia64/ioctls_inc0.h        \
-       linux/ia64/print_pc.c           \
        linux/ia64/syscallent.h         \
        linux/ia64/userent.h            \
        linux/inet_diag.h               \
@@ -349,7 +338,6 @@ EXTRA_DIST =                                \
        linux/m68k/get_syscall_result.c \
        linux/m68k/ioctls_arch0.h       \
        linux/m68k/ioctls_inc0.h        \
-       linux/m68k/print_pc.c           \
        linux/m68k/syscallent.h         \
        linux/m68k/userent.h            \
        linux/metag/arch_regs.c         \
@@ -358,7 +346,6 @@ EXTRA_DIST =                                \
        linux/metag/get_syscall_args.c  \
        linux/metag/ioctls_arch0.h      \
        linux/metag/ioctls_inc0.h       \
-       linux/metag/print_pc.c          \
        linux/metag/syscallent.h        \
        linux/microblaze/arch_regs.c    \
        linux/microblaze/arch_sigreturn.c       \
@@ -368,7 +355,6 @@ EXTRA_DIST =                                \
        linux/microblaze/get_syscall_result.c   \
        linux/microblaze/ioctls_arch0.h \
        linux/microblaze/ioctls_inc0.h  \
-       linux/microblaze/print_pc.c     \
        linux/microblaze/syscallent.h   \
        linux/microblaze/userent.h      \
        linux/mips/arch_getrval2.c      \
@@ -382,7 +368,6 @@ EXTRA_DIST =                                \
        linux/mips/get_syscall_args.c   \
        linux/mips/ioctls_arch0.h       \
        linux/mips/ioctls_inc0.h        \
-       linux/mips/print_pc.c           \
        linux/mips/signalent.h          \
        linux/mips/syscallent-compat.h  \
        linux/mips/syscallent-n32.h     \
@@ -397,7 +382,6 @@ EXTRA_DIST =                                \
        linux/nios2/get_syscall_args.c  \
        linux/nios2/ioctls_arch0.h      \
        linux/nios2/ioctls_inc0.h       \
-       linux/nios2/print_pc.c          \
        linux/nios2/syscallent.h        \
        linux/or1k/arch_regs.c          \
        linux/or1k/get_error.c          \
@@ -405,7 +389,6 @@ EXTRA_DIST =                                \
        linux/or1k/get_syscall_args.c   \
        linux/or1k/ioctls_arch0.h       \
        linux/or1k/ioctls_inc0.h        \
-       linux/or1k/print_pc.c           \
        linux/or1k/syscallent.h         \
        linux/or1k/userent.h            \
        linux/personality.h             \
@@ -419,7 +402,6 @@ EXTRA_DIST =                                \
        linux/powerpc/getregs_old.c     \
        linux/powerpc/ioctls_arch0.h    \
        linux/powerpc/ioctls_inc0.h     \
-       linux/powerpc/print_pc.c        \
        linux/powerpc/syscallent.h      \
        linux/powerpc/userent.h         \
        linux/powerpc64/arch_regs.c     \
@@ -435,7 +417,6 @@ EXTRA_DIST =                                \
        linux/powerpc64/ioctls_arch1.h  \
        linux/powerpc64/ioctls_inc0.h   \
        linux/powerpc64/ioctls_inc1.h   \
-       linux/powerpc64/print_pc.c      \
        linux/powerpc64/signalent1.h    \
        linux/powerpc64/syscallent.h    \
        linux/powerpc64/syscallent1.h   \
@@ -449,7 +430,6 @@ EXTRA_DIST =                                \
        linux/s390/get_syscall_args.c   \
        linux/s390/ioctls_arch0.h       \
        linux/s390/ioctls_inc0.h        \
-       linux/s390/print_pc.c           \
        linux/s390/syscallent.h         \
        linux/s390/userent.h            \
        linux/s390/userent0.h           \
@@ -462,7 +442,6 @@ EXTRA_DIST =                                \
        linux/s390x/get_syscall_args.c  \
        linux/s390x/ioctls_arch0.h      \
        linux/s390x/ioctls_inc0.h       \
-       linux/s390x/print_pc.c          \
        linux/s390x/syscallent.h        \
        linux/s390x/userent.h           \
        linux/sh/arch_getrval2.c        \
@@ -473,7 +452,6 @@ EXTRA_DIST =                                \
        linux/sh/get_syscall_result.c   \
        linux/sh/ioctls_arch0.h         \
        linux/sh/ioctls_inc0.h          \
-       linux/sh/print_pc.c             \
        linux/sh/syscallent.h           \
        linux/sh/userent.h              \
        linux/sh/userent0.h             \
@@ -485,7 +463,6 @@ EXTRA_DIST =                                \
        linux/sh64/get_syscall_result.c \
        linux/sh64/ioctls_arch0.h       \
        linux/sh64/ioctls_inc0.h        \
-       linux/sh64/print_pc.c           \
        linux/sh64/syscallent.h         \
        linux/sh64/userent.h            \
        linux/signalent.h               \
@@ -501,7 +478,6 @@ EXTRA_DIST =                                \
        linux/sparc/get_syscall_args.c  \
        linux/sparc/ioctls_arch0.h      \
        linux/sparc/ioctls_inc0.h       \
-       linux/sparc/print_pc.c          \
        linux/sparc/signalent.h         \
        linux/sparc/syscallent.h        \
        linux/sparc/userent.h           \
@@ -518,7 +494,6 @@ EXTRA_DIST =                                \
        linux/sparc64/ioctls_arch1.h    \
        linux/sparc64/ioctls_inc0.h     \
        linux/sparc64/ioctls_inc1.h     \
-       linux/sparc64/print_pc.c        \
        linux/sparc64/signalent.h       \
        linux/sparc64/signalent1.h      \
        linux/sparc64/syscallent.h      \
@@ -537,7 +512,6 @@ EXTRA_DIST =                                \
        linux/tile/ioctls_arch1.h       \
        linux/tile/ioctls_inc0.h        \
        linux/tile/ioctls_inc1.h        \
-       linux/tile/print_pc.c           \
        linux/tile/signalent1.h         \
        linux/tile/syscallent.h         \
        linux/tile/syscallent1.h        \
@@ -557,7 +531,6 @@ EXTRA_DIST =                                \
        linux/x32/ioctls_arch1.h        \
        linux/x32/ioctls_inc0.h         \
        linux/x32/ioctls_inc1.h         \
-       linux/x32/print_pc.c            \
        linux/x32/signalent1.h          \
        linux/x32/syscallent.h          \
        linux/x32/syscallent1.h         \
@@ -578,7 +551,6 @@ EXTRA_DIST =                                \
        linux/x86_64/ioctls_inc0.h      \
        linux/x86_64/ioctls_inc1.h      \
        linux/x86_64/ioctls_inc2.h      \
-       linux/x86_64/print_pc.c         \
        linux/x86_64/signalent1.h       \
        linux/x86_64/signalent2.h       \
        linux/x86_64/syscallent.h       \
@@ -592,7 +564,6 @@ EXTRA_DIST =                                \
        linux/xtensa/get_syscall_result.c       \
        linux/xtensa/ioctls_arch0.h     \
        linux/xtensa/ioctls_inc0.h      \
-       linux/xtensa/print_pc.c         \
        linux/xtensa/syscallent.h       \
        linux/xtensa/userent.h          \
        maint/ioctls_gen.sh             \
index 3b9c2f6413c46cf712d66583ffca7d95e0d6e00e..78b747089f8f63573b0a42b100904dc968edb18d 100644 (file)
@@ -35,3 +35,4 @@ static struct iovec aarch64_io = {
 
 #define ARCH_REGS_FOR_GETREGSET arm_regs_union
 #define ARCH_IOVEC_FOR_GETREGSET aarch64_io
+#define ARCH_PC_REG ((aarch64_io.iov_len == sizeof(arm_regs)) ? arm_regs.ARM_pc : aarch64_regs.pc)
diff --git a/linux/aarch64/print_pc.c b/linux/aarch64/print_pc.c
deleted file mode 100644 (file)
index 23c0e5c..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-if (aarch64_io.iov_len == sizeof(arm_regs))
-       tprintf(fmt, (unsigned long) arm_regs.ARM_pc);
-else
-       tprintf(fmt, (unsigned long) aarch64_regs.pc);
index e2783ca405eb9324b43ecfb534ce3c7939440909..df1878e2d44e982c9d17e7f76b404a8d762fc062 100644 (file)
@@ -1,2 +1,3 @@
 static long alpha_r0;
 static long alpha_a3;
+#define ARCH_PC_PEEK_ADDR REG_PC
diff --git a/linux/alpha/print_pc.c b/linux/alpha/print_pc.c
deleted file mode 100644 (file)
index c0232e5..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-long pc;
-if (upeek(tcp->pid, REG_PC, &pc) < 0) {
-       PRINTBADPC;
-       return;
-}
-tprintf(fmt, pc);
index 0d57ae4e6ba9fceb235f8274a2b32601074f33f6..18460080ec92834183b64ecd6361f9014a2e5cf9 100644 (file)
@@ -1,2 +1,3 @@
 static struct user_regs_struct arc_regs;
 #define ARCH_REGS_FOR_GETREGSET arc_regs
+#define ARCH_PC_REG arc_regs.efa
diff --git a/linux/arc/print_pc.c b/linux/arc/print_pc.c
deleted file mode 100644 (file)
index f904544..0000000
+++ /dev/null
@@ -1 +0,0 @@
-tprintf(fmt, arc_regs.efa);
index ca1fb6d96e627867829dc5ecfa460ebf1a5b42e6..f5c02f0d79fb5f04ba089a37f13f9c4b4caf5b0c 100644 (file)
@@ -2,3 +2,4 @@ static struct pt_regs arm_regs;
 long *const arm_sp_ptr = &arm_regs.ARM_sp;
 
 #define ARCH_REGS_FOR_GETREGS arm_regs
+#define ARCH_PC_REG arm_regs.ARM_pc
diff --git a/linux/arm/print_pc.c b/linux/arm/print_pc.c
deleted file mode 100644 (file)
index b9d9622..0000000
+++ /dev/null
@@ -1 +0,0 @@
-tprintf(fmt, arm_regs.ARM_pc);
index aab03389ce8c74dc52b3d70c9d360e36be15c3e6..8b52a8d0e01e373d2e3fafde963475e247210557 100644 (file)
@@ -1,2 +1,3 @@
 static struct pt_regs avr32_regs;
 #define ARCH_REGS_FOR_GETREGS avr32_regs
+#define ARCH_PC_REG avr32_regs.pc
diff --git a/linux/avr32/print_pc.c b/linux/avr32/print_pc.c
deleted file mode 100644 (file)
index ca293e6..0000000
+++ /dev/null
@@ -1 +0,0 @@
-tprintf(fmt, avr32_regs.pc);
index f6f4204529b2f5a62ee6130f10af4198d0055d18..e1aa15e4ff3a7faeb8a3f4940551d6f031ab56d8 100644 (file)
@@ -1 +1,2 @@
 static long bfin_r0;
+#define ARCH_PC_PEEK_ADDR PT_PC
diff --git a/linux/bfin/print_pc.c b/linux/bfin/print_pc.c
deleted file mode 100644 (file)
index b1eef14..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-long pc;
-if (upeek(tcp->pid, PT_PC, &pc) < 0) {
-       PRINTBADPC;
-       return;
-}
-tprintf(fmt, pc);
index 573f5932b2fee0c1f83d327d60ca4321b583cce0..8f69b87383c2f63396e1d497de8c71363bc1c42a 100644 (file)
@@ -1 +1,2 @@
 static long cris_r10;
+#define ARCH_PC_PEEK_ADDR (4 * PT_IRP)
diff --git a/linux/crisv10/print_pc.c b/linux/crisv10/print_pc.c
deleted file mode 100644 (file)
index cc76216..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-long pc;
-if (upeek(tcp->pid, 4*PT_IRP, &pc) < 0) {
-       PRINTBADPC;
-       return;
-}
-tprintf(fmt, pc);
index a088e172a3499463ac640d2552d84fd947bf6d19..8e59c156abc97abc98c435cc442bdeda0eb666b3 100644 (file)
@@ -1 +1,2 @@
 #include "crisv10/arch_regs.c"
+#define ARCH_PC_PEEK_ADDR (4 * PT_ERP)
diff --git a/linux/crisv32/print_pc.c b/linux/crisv32/print_pc.c
deleted file mode 100644 (file)
index b4af692..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-long pc;
-if (upeek(tcp->pid, 4*PT_ERP, &pc) < 0) {
-       PRINTBADPC;
-       return;
-}
-tprintf(fmt, pc);
index 56d1ee3672d9a17c936eb9660f7b22b922e50a07..65432abb47558b1ea666b3f0408cb9e16e035a0e 100644 (file)
@@ -1 +1,2 @@
 static long hppa_r28;
+#define ARCH_PC_PEEK_ADDR PT_IAOQ0
diff --git a/linux/hppa/print_pc.c b/linux/hppa/print_pc.c
deleted file mode 100644 (file)
index 7656346..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-long pc;
-if (upeek(tcp->pid, PT_IAOQ0, &pc) < 0) {
-       PRINTBADPC;
-       return;
-}
-tprintf(fmt, pc);
index 15b56158283012dbd61c15646b879be28f78b4a2..ef30046542dc60f78d6549492e953002cb410db8 100644 (file)
@@ -2,3 +2,4 @@ static struct user_regs_struct i386_regs;
 long *const i386_esp_ptr = &i386_regs.esp;
 
 #define ARCH_REGS_FOR_GETREGS i386_regs
+#define ARCH_PC_REG i386_regs.eip
diff --git a/linux/i386/print_pc.c b/linux/i386/print_pc.c
deleted file mode 100644 (file)
index 0d5c957..0000000
+++ /dev/null
@@ -1 +0,0 @@
-tprintf(fmt, i386_regs.eip);
index d7de2018d7bb9880e702af11f8e249bdfadf7b08..14fffd5c4905b07d453507b2b5e6a684c3beb7ad 100644 (file)
@@ -5,3 +5,4 @@ unsigned long *const ia64_frame_ptr = &ia64_regs.gr[12];
 #define ia64_ia32mode  (ia64_regs.cr_ipsr & IA64_PSR_IS)
 
 #define ARCH_REGS_FOR_GETREGS ia64_regs
+#define ARCH_PC_REG ia64_regs.br[0]
diff --git a/linux/ia64/print_pc.c b/linux/ia64/print_pc.c
deleted file mode 100644 (file)
index fe96780..0000000
+++ /dev/null
@@ -1 +0,0 @@
-tprintf(fmt, ia64_regs.br[0]);
index 5d418251359e04674ce8a89fd23ab79547632d21..8f0ab79ad67f1ff7de0e582121ac685c6dea7782 100644 (file)
@@ -1 +1,2 @@
 static long m68k_d0;
+#define ARCH_PC_PEEK_ADDR (4 * PT_PC)
diff --git a/linux/m68k/print_pc.c b/linux/m68k/print_pc.c
deleted file mode 100644 (file)
index aa4497d..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-long pc;
-if (upeek(tcp->pid, 4*PT_PC, &pc) < 0) {
-       PRINTBADPC;
-       return;
-}
-tprintf(fmt, pc);
index b7923babb4b5bc1e4e3175c4a0526c2d7ce30f50..e9f0d78aa6899c7c6463f1d7ec734c682cb1eab0 100644 (file)
@@ -1,2 +1,3 @@
 static struct user_gp_regs metag_regs;
 #define ARCH_REGS_FOR_GETREGSET metag_regs
+#define ARCH_PC_REG metag_regs.pc
diff --git a/linux/metag/print_pc.c b/linux/metag/print_pc.c
deleted file mode 100644 (file)
index 4415f67..0000000
+++ /dev/null
@@ -1 +0,0 @@
-tprintf(fmt, metag_regs.pc);
index 9c26aad9dad172f631827c25ea63c3529937b0ec..c7bafabd2224fbf8cce6647bfbabee0c796bd80f 100644 (file)
@@ -1 +1,2 @@
 static long microblaze_r3;
+#define ARCH_PC_PEEK_ADDR PT_PC
diff --git a/linux/microblaze/print_pc.c b/linux/microblaze/print_pc.c
deleted file mode 100644 (file)
index b1eef14..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-long pc;
-if (upeek(tcp->pid, PT_PC, &pc) < 0) {
-       PRINTBADPC;
-       return;
-}
-tprintf(fmt, pc);
index c46e6ebac69fa02bf4036e2d18767cbad66533e1..44f6bd5e84ed3f4005bc4bfc7386a9ce0e90ea46 100644 (file)
@@ -1,3 +1,4 @@
 struct mips_regs mips_regs; /* not static */
 /* PTRACE_GETREGS on MIPS is available since linux v2.6.15. */
 #define ARCH_REGS_FOR_GETREGS mips_regs
+#define ARCH_PC_REG mips_REG_EPC
diff --git a/linux/mips/print_pc.c b/linux/mips/print_pc.c
deleted file mode 100644 (file)
index 569b0b6..0000000
+++ /dev/null
@@ -1 +0,0 @@
-tprintf(fmt, (unsigned long) mips_REG_EPC);
index 62827f972eb054034c7f0073c6b092880f945d99..2c30321f3ab0aa3e91970a30ddd1ffba91205217 100644 (file)
@@ -1,2 +1,3 @@
 static struct user_pt_regs nios2_regs;
 # define ARCH_REGS_FOR_GETREGSET nios2_regs
+#define ARCH_PC_REG nios2_regs.regs[PTR_EA]
diff --git a/linux/nios2/print_pc.c b/linux/nios2/print_pc.c
deleted file mode 100644 (file)
index d22e8f7..0000000
+++ /dev/null
@@ -1 +0,0 @@
-tprintf(fmt, nios2_regs.regs[PTR_EA]);
index 7415e08852c73dab089f2bb1511f6c622724ffeb..78693e5ae3e63bd1d0f8ae302515e74b4a59c782 100644 (file)
@@ -1,2 +1,3 @@
 static struct user_regs_struct or1k_regs;
 #define ARCH_REGS_FOR_GETREGSET or1k_regs
+#define ARCH_PC_REG or1k_regs.pc
diff --git a/linux/or1k/print_pc.c b/linux/or1k/print_pc.c
deleted file mode 100644 (file)
index 3fe4a1a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-tprintf(fmt, or1k_regs.pc);
index cd92d21ddae5b2e73fb6fb19a9035ab55e1cc661..dd573f71ebf16e13bb385ee7ad4760a0f1ab9bf1 100644 (file)
@@ -1,3 +1,4 @@
 struct pt_regs ppc_regs; /* not static */
 
 #define ARCH_REGS_FOR_GETREGS ppc_regs
+#define ARCH_PC_REG ppc_regs.nip
diff --git a/linux/powerpc/print_pc.c b/linux/powerpc/print_pc.c
deleted file mode 100644 (file)
index 34112fb..0000000
+++ /dev/null
@@ -1 +0,0 @@
-tprintf(fmt, ppc_regs.nip);
index b5c572dcc313e80774860db94235e7b19d56349c..90646515d03b3618872c0069e721d34be8701599 100644 (file)
@@ -1 +1,2 @@
 #include "powerpc/arch_regs.c"
+#define ARCH_PC_REG ppc_regs.nip
diff --git a/linux/powerpc64/print_pc.c b/linux/powerpc64/print_pc.c
deleted file mode 100644 (file)
index ddaf880..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include "powerpc/print_pc.c"
index 32c50a15707e61d41d6adf5b8cd74eb48f6e1686..fefb7630dc6e45f51ea153b78252034a3fe3c57e 100644 (file)
@@ -2,3 +2,4 @@
 static struct user_regs_struct s390_regset;
 unsigned long *const s390_frame_ptr = &s390_regset.gprs[15];
 #define ARCH_REGS_FOR_GETREGSET s390_regset
+#define ARCH_PC_REG s390_regset.psw.addr
diff --git a/linux/s390/print_pc.c b/linux/s390/print_pc.c
deleted file mode 100644 (file)
index f92ccd4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-tprintf(fmt, s390_regset.psw.addr);
index 62aece720fdb472302a44209e4228b8c823c49b4..74aaaf6d186e80a3196300a8f48af3b8e645bf4b 100644 (file)
@@ -1 +1,2 @@
 #include "s390/arch_regs.c"
+#define ARCH_PC_REG s390_regset.psw.addr
diff --git a/linux/s390x/print_pc.c b/linux/s390x/print_pc.c
deleted file mode 100644 (file)
index 9a445f7..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include "s390/print_pc.c"
index 9d24ee7530c3113f4627d53be5b64ecae1a00e56..0ce81843e9001486cf4b286a13a37ad3693382f1 100644 (file)
@@ -1 +1,2 @@
 static long sh_r0;
+#define ARCH_PC_PEEK_ADDR (4 * REG_PC)
diff --git a/linux/sh/print_pc.c b/linux/sh/print_pc.c
deleted file mode 100644 (file)
index 2f43eff..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-long pc;
-if (upeek(tcp->pid, 4*REG_PC, &pc) < 0) {
-       PRINTBADPC;
-       return;
-}
-tprintf(fmt, pc);
index e09cac5a5d0747d78abac501dd96052cf498189e..eb6701b95edbfd6275b0c100266be3d16edf54c0 100644 (file)
@@ -1 +1,2 @@
 static long sh64_r9;
+#define ARCH_PC_PEEK_ADDR REG_PC
diff --git a/linux/sh64/print_pc.c b/linux/sh64/print_pc.c
deleted file mode 100644 (file)
index c0232e5..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-long pc;
-if (upeek(tcp->pid, REG_PC, &pc) < 0) {
-       PRINTBADPC;
-       return;
-}
-tprintf(fmt, pc);
index ed13029e385500b852c32d562bd10d781b64b6ad..c0f22e6c849736c2da1762ad8664581247387260 100644 (file)
@@ -1,2 +1,3 @@
 struct pt_regs sparc_regs; /* not static */
 #define ARCH_REGS_FOR_GETREGS sparc_regs
+#define ARCH_PC_REG sparc_regs.pc
diff --git a/linux/sparc/print_pc.c b/linux/sparc/print_pc.c
deleted file mode 100644 (file)
index 683e3b1..0000000
+++ /dev/null
@@ -1 +0,0 @@
-tprintf(fmt, sparc_regs.pc);
index db38d88638f8c97725a1e6ba3850d0a2165a8d40..072a3553484e318fc6803c0eb939fde27317929c 100644 (file)
@@ -1 +1,2 @@
 #include "sparc/arch_regs.c"
+#define ARCH_PC_REG sparc_regs.tpc
diff --git a/linux/sparc64/print_pc.c b/linux/sparc64/print_pc.c
deleted file mode 100644 (file)
index 11c0ac4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-tprintf(fmt, sparc_regs.tpc);
index 455077c58999bdcb73cb95800266d250478941a7..6a7309d23c28ba9c7bed52fb90f29d9cd9875ad2 100644 (file)
@@ -1,2 +1,3 @@
 struct pt_regs tile_regs; /* not static */
 #define ARCH_REGS_FOR_GETREGS tile_regs
+#define ARCH_PC_REG tile_regs.pc
diff --git a/linux/tile/print_pc.c b/linux/tile/print_pc.c
deleted file mode 100644 (file)
index 8a6894f..0000000
+++ /dev/null
@@ -1 +0,0 @@
-tprintf(fmt, (unsigned long) tile_regs.pc);
index 62c70be828bf166a33b0e7c17934441e692cc5cf..8140bc09b7154a078d768271c3a14d39bf97111d 100644 (file)
@@ -1 +1,2 @@
 #include "x86_64/arch_regs.c"
+#define ARCH_PC_REG (x86_io.iov_len == sizeof(i386_regs) ? i386_regs.eip : x86_64_regs.rip)
diff --git a/linux/x32/print_pc.c b/linux/x32/print_pc.c
deleted file mode 100644 (file)
index 13ccdc2..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include "x86_64/print_pc.c"
index 1925dadbc025e7dd4451eea11d842a96c393757d..daee69f9e285bd02679152e1c44aa2a4df93df7e 100644 (file)
@@ -38,3 +38,4 @@ static struct iovec x86_io = {
 
 #define ARCH_REGS_FOR_GETREGSET x86_regs_union
 #define ARCH_IOVEC_FOR_GETREGSET x86_io
+#define ARCH_PC_REG (x86_io.iov_len == sizeof(i386_regs) ? i386_regs.eip : x86_64_regs.rip)
diff --git a/linux/x86_64/print_pc.c b/linux/x86_64/print_pc.c
deleted file mode 100644 (file)
index 71b080a..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-if (x86_io.iov_len == sizeof(i386_regs))
-       tprintf(fmt, (unsigned long) i386_regs.eip);
-else
-       tprintf(fmt, (unsigned long) x86_64_regs.rip);
index 1114cabe239b5a282f5f481c214f35d175c228f8..d36f56a05dec18835b3a9e39afdcf1ed53caf837 100644 (file)
@@ -1 +1,2 @@
 static long xtensa_a2;
+#define ARCH_PC_PEEK_ADDR REG_PC
diff --git a/linux/xtensa/print_pc.c b/linux/xtensa/print_pc.c
deleted file mode 100644 (file)
index c0232e5..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-long pc;
-if (upeek(tcp->pid, REG_PC, &pc) < 0) {
-       PRINTBADPC;
-       return;
-}
-tprintf(fmt, pc);
index 3f43a57d04baecf54403aa175cafb9c6033b44a3..99bc731f22ddccce37390a3a3e419950a48fe8ed 100644 (file)
--- a/syscall.c
+++ b/syscall.c
@@ -1197,32 +1197,21 @@ is_negated_errno(kernel_ulong_t val)
 void
 print_pc(struct tcb *tcp)
 {
-       const char *fmt;
-       const char *bad;
-
-#ifdef current_wordsize
-# define pc_wordsize current_wordsize
+#if defined ARCH_PC_REG
+# define ARCH_GET_PC 0
+#elif defined ARCH_PC_PEEK_ADDR
+       long pc;
+# define ARCH_PC_REG pc
+# define ARCH_GET_PC upeek(tcp->pid, ARCH_PC_PEEK_ADDR, &pc)
 #else
-# define pc_wordsize personality_wordsize[tcp->currpers]
+# error Neither ARCH_PC_REG nor ARCH_PC_PEEK_ADDR is defined
 #endif
-
-       if (pc_wordsize == 4) {
-               fmt = "[%08lx] ";
-               bad = "[????????] ";
-       } else {
-               fmt = "[%016lx] ";
-               bad = "[????????????????] ";
-       }
-
-#undef pc_wordsize
-#define PRINTBADPC tprints(bad)
-
-       if (get_regs_error) {
-               PRINTBADPC;
-               return;
-       }
-
-#include "print_pc.c"
+       if (get_regs_error || ARCH_GET_PC)
+               tprints(current_wordsize == 4 ? "[????????] "
+                                             : "[????????????????] ");
+       else
+               tprintf(current_wordsize == 4 ? "[%08lx] " : "[%016lx] ",
+                       (unsigned long) ARCH_PC_REG);
 }
 
 #if defined X86_64 || defined POWERPC