Hi Roland,
pushed (without */ChangeLog changes) as:
jankratochvil/s390-core
On Tue, 09 Oct 2012 20:53:48 +0200, Roland McGrath wrote:
I don't know what the story is on DWARF register number mapping
for those.
i.e., if there are separate DWARF register numbers assigned for the high
halves or what.
No.
http://download.boulder.ibm.com/ibmdl/pub/software/dw/linux390/docu/lzsab...
GDB has only some internal DWARF numbering with offset 66 for them.
> I also do not understand much what is there the exception
<nitems == 1> in
> readelf.c but it crashes without the fix for s390 core file S390_LAST_BREAK.
I don't recall enough any more about this. Let's get some clarity before
changing it. I did it for some reason.
It is there for special handling of ./tests/run-readelf-vmcoreinfo.sh .
So I put there 'offset == 0' which is still compatible with VMCOREINFO and
removed the unclean previous fix.
> + /* ar0-r15 */
> + { .offset = 18 * BITS/8, .regno = 48, .count = 16, .bits = 32 }
> + /* ar15 end is at "offset" (BITS == 32 ? 18 + 16 == 34 : 18 + 16 / 2
== 26).
> + orig_r2 is at "offset" (BITS == 32 ? 34 : 26). */
I'm not sure I understand this comment or why it's here.
I had unclear the layout of s390 core note. But it was wrong anyway. I have
changed/fixed it all a bit.
> +#define PRSTATUS_REGS_SIZE (BITS / 8 * (BITS == 32 ? 37 : 27))
I don't understand this difference. What are the 10 extra words for 32-bit?
I have both fixed it and reworded it, 32-bit s390 has unusual 8 bytes
alignment. This fixed displaying the pr_fpvalid field.
(gdb) ptype s390_compat_regs
type = struct {
psw_compat_t psw;
__u32 gprs[16];
__u32 acrs[16];
__u32 orig_gpr2;
}
(gdb) p sizeof (s390_compat_regs)
$1 = 144
(gdb) p sizeof (s390_compat_regs)/4
$3 = 36
(gdb) p &((s390_compat_regs *)0)->orig_gpr2
$4 = (__u32 *) 0x88
(gdb) p (int)&((s390_compat_regs *)0)->orig_gpr2/4
$5 = 34
(gdb) ptype struct compat_elf_prstatus
type = struct compat_elf_prstatus {
struct compat_elf_siginfo pr_info;
short int pr_cursig;
compat_ulong_t pr_sigpend;
compat_ulong_t pr_sighold;
compat_pid_t pr_pid;
compat_pid_t pr_ppid;
compat_pid_t pr_pgrp;
compat_pid_t pr_sid;
struct compat_timeval pr_utime;
struct compat_timeval pr_stime;
struct compat_timeval pr_cutime;
struct compat_timeval pr_cstime;
compat_elf_gregset_t pr_reg;
compat_int_t pr_fpvalid;
}
(gdb) p sizeof (struct compat_elf_prstatus)
$15 = 224
(gdb) p (int)&((struct compat_elf_prstatus *)0)->pr_fpvalid
$13 = 216
> +static const Ebl_Register_Location high_regs[] =
> + {
> + /* Upper halves of r0-r15 are stored here.
> + FIXME: It is currently not combined with the r0-r15 lower halves. */
> + { .offset = 0, .regno = 0, .count = 16, .bits = 32 },
> + };
This can't be right, because those DWARF register numbers are already
taken. If they don't have their own register numbers, then there are two
possibilities:
1. We define a first-class concept for split registers, so something
generically knows how to combine upper and lower halves.
2. We just treat these as non-register values, using Ebl_Core_Item so
readelf will print them separately but nothing will know how they
correspond to any DWARF-described registers.
#2 is easy. #1 would need to be designed.
I already tried #1 but later reverted the patches as they did not work well and
they are not required for the unwinder.
Implemented #2 by the items.
Thanks,
Jan
commit dca8b2de4dd5e335fc3410a2cb5664cd38db8ee4
Author: Jan Kratochvil <jan.kratochvil(a)redhat.com>
Date: Wed Oct 10 19:32:05 2012 +0200
backends/
2012-10-10 Jan Kratochvil <jan.kratochvil(a)redhat.com>
* Makefile.am (s390_SRCS): Add s390_corenote.c and s390x_corenote.c.
* linux-core-note.c (struct EBLHOOK(prstatus)): New field alignment.
(EXTRA_ITEMS): New macro.
* s390_corenote.c: New file.
* s390_init.c (s390x_core_note): New declaration.
(s390_init): Install s390x_core_note and s390_core_note.
* s390x_corenote.c: New file.
src/
2012-10-10 Jan Kratochvil <jan.kratochvil(a)redhat.com>
* readelf.c (handle_core_items): New variable wrap, choose
REGISTER_WRAP_COLUMN for "register" group. Use it instead of
ITEM_WRAP_COLUMN. Limit special repeated items handling to OFFSET 0.
Initialize COLNO to MAX of also REGISTER_WRAP_COLUMN.
tests/
2012-10-10 Jan Kratochvil <jan.kratochvil(a)redhat.com>
* run-readelf-mixed-corenote.sh: New testcase for readelf -n of s390
and s390x core notes.
* testfile67.bz2: New file.
* testfile68.bz2: New file.
Signed-off-by: Jan Kratochvil <jan.kratochvil(a)redhat.com>
diff --git a/backends/Makefile.am b/backends/Makefile.am
index 982ff2a..283bbfc 100644
--- a/backends/Makefile.am
+++ b/backends/Makefile.am
@@ -94,7 +94,8 @@ ppc64_SRCS = ppc64_init.c ppc64_symbol.c ppc64_retval.c \
libebl_ppc64_pic_a_SOURCES = $(ppc64_SRCS)
am_libebl_ppc64_pic_a_OBJECTS = $(ppc64_SRCS:.c=.os)
-s390_SRCS = s390_init.c s390_symbol.c s390_regs.c s390_retval.c
+s390_SRCS = s390_init.c s390_symbol.c s390_regs.c s390_retval.c \
+ s390_corenote.c s390x_corenote.c
libebl_s390_pic_a_SOURCES = $(s390_SRCS)
am_libebl_s390_pic_a_OBJECTS = $(s390_SRCS:.c=.os)
diff --git a/backends/linux-core-note.c b/backends/linux-core-note.c
index 1592694..b082349 100644
--- a/backends/linux-core-note.c
+++ b/backends/linux-core-note.c
@@ -83,6 +83,9 @@ struct EBLHOOK(prstatus)
struct EBLHOOK(timeval) pr_cstime;
FIELD (ULONG, pr_reg[PRSTATUS_REGS_SIZE / sizeof (ULONG)]);
FIELD (INT, pr_fpvalid);
+#ifdef ALIGN_STRUCT
+ char alignment[] __attribute__ ((aligned (ALIGN_STRUCT)));
+#endif
};
#define FNAMESZ 16
@@ -263,6 +266,17 @@ EBLHOOK(core_note) (nhdr, name, regs_offset, nregloc, reglocs,
nitems, items)
*items = extra_items; \
return 1;
+#define EXTRA_ITEMS(type, size, extra_items) \
+ case type: \
+ if (nhdr->n_descsz != size) \
+ return 0; \
+ *regs_offset = 0; \
+ *nregloc = 0; \
+ *reglocs = NULL; \
+ *nitems = sizeof extra_items / sizeof extra_items[0]; \
+ *items = extra_items; \
+ return 1;
+
#ifdef FPREGSET_SIZE
EXTRA_REGSET (NT_FPREGSET, FPREGSET_SIZE, fpregset_regs)
#endif
diff --git a/backends/s390_corenote.c b/backends/s390_corenote.c
new file mode 100644
index 0000000..399df6a
--- /dev/null
+++ b/backends/s390_corenote.c
@@ -0,0 +1,195 @@
+/* S390 specific core note handling.
+ Copyright (C) 2012 Red Hat, Inc.
+ This file is part of elfutils.
+
+ This file is free software; you can redistribute it and/or modify
+ it under the terms of either
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at
+ your option) any later version
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at
+ your option) any later version
+
+ or both in parallel, as here.
+
+ elfutils is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see <
http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <elf.h>
+#include <inttypes.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <sys/time.h>
+
+#ifndef BITS
+# define BITS 32
+# define BACKEND s390_
+#else
+# define BITS 64
+# define BACKEND s390x_
+#endif
+#include "libebl_CPU.h"
+
+static const Ebl_Register_Location prstatus_regs[] =
+ {
+#define GR(at, n, dwreg, b) \
+ { .offset = at * BITS/8, .regno = dwreg, .count = n, .bits = b }
+
+ GR ( 0, 1, 64, BITS), /* pswm */
+ GR ( 1, 1, 65, BITS), /* pswa */
+ GR ( 2, 16, 0, BITS), /* r0-r15 */
+ GR (18, 16, 48, 32), /* ar0-ar15 */
+
+#undef GR
+ };
+
+ /* orig_r2 is at offset (BITS == 32 ? 34 * 4 : 26 * 8). s390 has 8 bytes
+ ALIGN_STRUCT, this is why the total 32-bit size is 36 * 4. */
+#define PRSTATUS_REGS_SIZE (BITS / 8 * (BITS == 32 ? 36 : 27))
+
+static const Ebl_Register_Location fpregset_regs[] =
+ {
+#define FPR(at, n, dwreg) \
+ { .offset = at * 64/8, .regno = dwreg, .count = n, .bits = 64 }
+
+ /* fpc is at offset 0, see fpregset_items, it has no assigned DWARF regno.
+ Bytes at offsets 4 to 7 are unused. */
+ FPR (1 + 0, 1, 16), /* f0 */
+ FPR (1 + 1, 1, 20), /* f1 */
+ FPR (1 + 2, 1, 17), /* f2 */
+ FPR (1 + 3, 1, 21), /* f3 */
+ FPR (1 + 4, 1, 18), /* f4 */
+ FPR (1 + 5, 1, 22), /* f5 */
+ FPR (1 + 6, 1, 19), /* f6 */
+ FPR (1 + 7, 1, 23), /* f7 */
+ FPR (1 + 8, 1, 24), /* f8 */
+ FPR (1 + 9, 1, 28), /* f9 */
+ FPR (1 + 10, 1, 25), /* f10 */
+ FPR (1 + 11, 1, 29), /* f11 */
+ FPR (1 + 12, 1, 26), /* f12 */
+ FPR (1 + 13, 1, 30), /* f13 */
+ FPR (1 + 14, 1, 27), /* f14 */
+ FPR (1 + 15, 1, 31), /* f15 */
+
+#undef FPR
+ };
+
+static const Ebl_Core_Item fpregset_items[] =
+ {
+ {
+ .name = "fpc", .group = "register",
+ .offset = 0,
+ .count = 0, .type = ELF_T_WORD,
+ .format = 'x',
+ },
+ };
+
+/* Do not set FPREGSET_SIZE so that we can supply fpregset_items. */
+#define EXTRA_NOTES_FPREGSET \
+ EXTRA_REGSET_ITEMS (NT_FPREGSET, 17 * 8, fpregset_regs, fpregset_items)
+
+#if BITS == 32
+# define ULONG uint32_t
+# define ALIGN_ULONG 4
+# define TYPE_ULONG ELF_T_WORD
+# define TYPE_LONG ELF_T_SWORD
+# define UID_T uint16_t
+# define GID_T uint16_t
+# define ALIGN_UID_T 2
+# define ALIGN_GID_T 2
+# define TYPE_UID_T ELF_T_HALF
+# define TYPE_GID_T ELF_T_HALF
+#else
+# define ULONG uint64_t
+# define ALIGN_ULONG 8
+# define TYPE_ULONG ELF_T_XWORD
+# define TYPE_LONG ELF_T_SXWORD
+# define UID_T uint32_t
+# define GID_T uint32_t
+# define ALIGN_UID_T 4
+# define ALIGN_GID_T 4
+# define TYPE_UID_T ELF_T_WORD
+# define TYPE_GID_T ELF_T_WORD
+#endif
+#define PID_T int32_t
+#define ALIGN_PID_T 4
+#define TYPE_PID_T ELF_T_SWORD
+#define ALIGN_STRUCT 8
+
+#define PRSTATUS_REGSET_ITEMS \
+ { \
+ .name = "orig_r2", .type = TYPE_LONG, .format = 'd', \
+ .offset = offsetof (struct EBLHOOK(prstatus), \
+ pr_reg[BITS == 32 ? 34 : 26]), \
+ .group = "register" \
+ }
+
+#if BITS == 32
+
+static const Ebl_Core_Item high_regs_items[] =
+ {
+#define HR(n) \
+ { \
+ .name = "high_r" #n , .group = "register", .offset = (n) *
4, \
+ .count = 0, .type = ELF_T_WORD, .format = 'x', \
+ }
+
+ /* Upper halves of r0-r15 are stored here.
+ FIXME: They are currently not combined with the r0-r15 lower halves. */
+ HR (0), HR (1), HR (2), HR (3), HR (4), HR (5), HR (6), HR (7), HR (8),
+ HR (9), HR (10), HR (11), HR (12), HR (13), HR (14), HR (15)
+
+#undef HR
+ };
+
+#define EXTRA_NOTES_HIGH_GPRS \
+ EXTRA_ITEMS (NT_S390_HIGH_GPRS, 16 * 4, high_regs_items)
+
+#else /* BITS == 64 */
+
+#define EXTRA_NOTES_HIGH_GPRS
+
+#endif /* BITS == 64 */
+
+static const Ebl_Core_Item last_break_items[] =
+ {
+ {
+ .name = "last_break", .group = "system",
+ .offset = BITS == 32 ? 4 : 0,
+ .count = 0, .type = BITS == 32 ? ELF_T_WORD : ELF_T_XWORD,
+ .format = 'x',
+ },
+ };
+
+static const Ebl_Core_Item system_call_items[] =
+ {
+ {
+ .name = "system_call", .group = "system",
+ .offset = 0,
+ .count = 0, .type = ELF_T_WORD,
+ .format = 'x',
+ },
+ };
+
+#define EXTRA_NOTES \
+ EXTRA_NOTES_FPREGSET \
+ EXTRA_NOTES_HIGH_GPRS \
+ EXTRA_ITEMS (NT_S390_LAST_BREAK, 8, last_break_items) \
+ EXTRA_ITEMS (NT_S390_SYSTEM_CALL, 4, system_call_items)
+
+#include "linux-core-note.c"
diff --git a/backends/s390_init.c b/backends/s390_init.c
index 528e357..91fe4b8 100644
--- a/backends/s390_init.c
+++ b/backends/s390_init.c
@@ -37,6 +37,8 @@
/* This defines the common reloc hooks based on arm_reloc.def. */
#include "common-reloc.c"
+extern __typeof (s390_core_note) s390x_core_note;
+
const char *
s390_init (elf, machine, eh, ehlen)
@@ -55,6 +57,10 @@ s390_init (elf, machine, eh, ehlen)
HOOK (eh, reloc_simple_type);
HOOK (eh, register_info);
HOOK (eh, return_value_location);
+ if (eh->class == ELFCLASS64)
+ eh->core_note = s390x_core_note;
+ else
+ HOOK (eh, core_note);
/* Only the 64-bit format uses the incorrect hash table entry size. */
if (eh->class == ELFCLASS64)
diff --git a/backends/s390x_corenote.c b/backends/s390x_corenote.c
new file mode 100644
index 0000000..427bf7d
--- /dev/null
+++ b/backends/s390x_corenote.c
@@ -0,0 +1,2 @@
+#define BITS 64
+#include "s390_corenote.c"
diff --git a/src/readelf.c b/src/readelf.c
index 5d167eb..d181631 100644
--- a/src/readelf.c
+++ b/src/readelf.c
@@ -7453,6 +7453,9 @@ handle_core_item (Elf *core, const Ebl_Core_Item *item, const void
*desc,
if (type == ELF_T_ADDR)
type = gelf_getclass (core) == ELFCLASS32 ? ELF_T_WORD : ELF_T_XWORD;
+ unsigned int wrap = (item->group && strcmp (item->group,
"register") == 0
+ ? REGISTER_WRAP_COLUMN : ITEM_WRAP_COLUMN);
+
switch (item->format)
{
case 'd':
@@ -7461,7 +7464,7 @@ handle_core_item (Elf *core, const Ebl_Core_Item *item, const void
*desc,
{
#define DO_TYPE(NAME, Name, hex, dec, max) \
case ELF_T_##NAME: \
- colno = print_core_item (colno, ',', ITEM_WRAP_COLUMN, \
+ colno = print_core_item (colno, ',', wrap, \
0, item->name, max, dec, value.Name[0]); \
break
TYPES;
@@ -7477,7 +7480,7 @@ handle_core_item (Elf *core, const Ebl_Core_Item *item, const void
*desc,
{
#define DO_TYPE(NAME, Name, hex, dec, max) \
case ELF_T_##NAME: \
- colno = print_core_item (colno, ',', ITEM_WRAP_COLUMN, \
+ colno = print_core_item (colno, ',', wrap, \
0, item->name, max, hex, value.Name[0]); \
break
TYPES;
@@ -7546,8 +7549,7 @@ handle_core_item (Elf *core, const Ebl_Core_Item *item, const void
*desc,
if (lastbit > 0 && lastbit + 1 != nbits)
p += sprintf (p, "-%u", nbits - bias);
- colno = print_core_item (colno, ',', ITEM_WRAP_COLUMN, 0, item->name,
- 4 + nbits * 4,
+ colno = print_core_item (colno, ',', wrap, 0, item->name, 4 + nbits * 4,
negate ? "~<%s>" : "<%s>", printed);
}
break;
@@ -7587,18 +7589,18 @@ handle_core_item (Elf *core, const Ebl_Core_Item *item, const void
*desc,
else
usec &= UINT32_MAX;
}
- colno = print_core_item (colno, ',', ITEM_WRAP_COLUMN, 0, item->name,
+ colno = print_core_item (colno, ',', wrap, 0, item->name,
maxfmt, "%" PRIu64 ".%.6" PRIu64, sec, usec);
break;
case 'c':
assert (count == 1);
- colno = print_core_item (colno, ',', ITEM_WRAP_COLUMN, 0, item->name,
+ colno = print_core_item (colno, ',', wrap, 0, item->name,
1, "%c", value.Byte[0]);
break;
case 's':
- colno = print_core_item (colno, ',', ITEM_WRAP_COLUMN, 0, item->name,
+ colno = print_core_item (colno, ',', wrap, 0, item->name,
count, "%.*s", (int) count, value.Byte);
break;
@@ -7626,7 +7628,7 @@ handle_core_item (Elf *core, const Ebl_Core_Item *item, const void
*desc,
s = eol + 1;
}
- colno = ITEM_WRAP_COLUMN;
+ colno = wrap;
break;
default:
@@ -7696,8 +7698,9 @@ handle_core_items (Elf *core, const void *desc, size_t descsz,
unsigned int colno = 0;
const void *last = desc;
- if (nitems == 1)
+ if (nitems == 1 && sorted_items[0]->offset == 0)
{
+ /* This block is here for special handling of vmcoreinfo_items. */
size_t size = descsz;
/* If this note contains registers as well as items, don't pass
&size to express that we don't wish to repeat. */
@@ -7722,7 +7725,7 @@ handle_core_items (Elf *core, const void *desc, size_t descsz,
colno = handle_core_item (core, *item, desc, colno, NULL);
/* Force a line break at the end of the group. */
- colno = ITEM_WRAP_COLUMN;
+ colno = MAX (ITEM_WRAP_COLUMN, REGISTER_WRAP_COLUMN);
}
if (descsz == 0)
diff --git a/tests/run-readelf-mixed-corenote.sh b/tests/run-readelf-mixed-corenote.sh
index f9b96c8..db7eb18 100755
--- a/tests/run-readelf-mixed-corenote.sh
+++ b/tests/run-readelf-mixed-corenote.sh
@@ -84,4 +84,137 @@ Note segment of 892 bytes at offset 0x274:
d30: 0x0000000000000000 d31: 0x0000000000000000
EOF
+testfiles testfile67
+testrun_compare ../src/readelf -n testfile67 <<\EOF
+
+Note segment of 1044 bytes at offset 0xe8:
+ Owner Data size Type
+ CORE 336 PRSTATUS
+ info.si_signo: 4, info.si_code: 0, info.si_errno: 0, cursig: 4
+ sigpend: <>
+ sighold: <>
+ pid: 805, ppid: 804, pgrp: 804, sid: 699
+ utime: 0.000042, stime: 0.000103, cutime: 0.000000, cstime: 0.000000
+ orig_r2: 2571552016, fpvalid: 1
+ pswm: 0x0705c00180000000 pswa: 0x00000000800000d6
+ r0: 4393751543808 r1: 4398002544388
+ r2: 11 r3: 2571578208
+ r4: 2571702016 r5: 4398003235624
+ r6: 2571580768 r7: 2571702016
+ r8: 2571578208 r9: 2571552016
+ r10: 2571552016 r11: 0
+ r12: 4398003499008 r13: 2148274656
+ r14: 0 r15: 4398040761216
+ a0: 0x000003ff a1: 0xfd54a6f0 a2: 0x00000000 a3: 0x00000000
+ a4: 0x00000000 a5: 0x00000000 a6: 0x00000000 a7: 0x00000000
+ a8: 0x00000000 a9: 0x00000000 a10: 0x00000000 a11: 0x00000000
+ a12: 0x00000000 a13: 0x00000000 a14: 0x00000000 a15: 0x00000000
+ CORE 136 PRPSINFO
+ state: 0, sname: R, zomb: 0, nice: 0, flag: 0x0000000000400400
+ uid: 0, gid: 0, pid: 805, ppid: 804, pgrp: 804, sid: 699
+ fname: 1, psargs: ./1
+ CORE 304 AUXV
+ SYSINFO_EHDR: 0
+ HWCAP: 0x37f
+ PAGESZ: 4096
+ CLKTCK: 100
+ PHDR: 0x80000040
+ PHENT: 56
+ PHNUM: 2
+ BASE: 0
+ FLAGS: 0
+ ENTRY: 0x800000d4
+ UID: 0
+ EUID: 0
+ GID: 0
+ EGID: 0
+ SECURE: 0
+ RANDOM: 0x3ffffa8463c
+ EXECFN: 0x3ffffa85ff4
+ PLATFORM: 0x3ffffa8464c
+ NULL
+ CORE 136 FPREGSET
+ fpc: 0x00000000
+ f0: 0x0000000000000040 f1: 0x4b00000000000000
+ f2: 0x0000000000000041 f3: 0x3ad50b5555555600
+ f4: 0x0000000000000000 f5: 0x0000000000000000
+ f6: 0x0000000000000000 f7: 0x0000000000000000
+ f8: 0x0000000000000000 f9: 0x0000000000000000
+ f10: 0x0000000000000000 f11: 0x0000000000000000
+ f12: 0x0000000000000000 f13: 0x0000000000000000
+ f14: 0x0000000000000000 f15: 0x0000000000000000
+ LINUX 8 S390_LAST_BREAK
+ last_break: 0x000003fffd75ccbe
+ LINUX 4 S390_SYSTEM_CALL
+ system_call: 0x00000000
+EOF
+
+testfiles testfile68
+testrun_compare ../src/readelf -n testfile68 <<\EOF
+
+Note segment of 852 bytes at offset 0x94:
+ Owner Data size Type
+ CORE 224 PRSTATUS
+ info.si_signo: 4, info.si_code: 0, info.si_errno: 0, cursig: 4
+ sigpend: <>
+ sighold: <>
+ pid: 839, ppid: 838, pgrp: 838, sid: 699
+ utime: 0.000043, stime: 0.000102, cutime: 0.000000, cstime: 0.000000
+ orig_r2: -1723388288, fpvalid: 1
+ pswm: 0x070dc000 pswa: 0x8040009a
+ r0: 0 r1: -43966716 r2: 11 r3: -1723238816
+ r4: -1723265280 r5: -43275480 r6: -1723245280 r7: -1723265280
+ r8: -1723238816 r9: -1723388288 r10: -1723388288 r11: 0
+ r12: -43012096 r13: -2146692640 r14: 0 r15: 2139883440
+ a0: 0x000003ff a1: 0xfd54a6f0 a2: 0x00000000 a3: 0x00000000
+ a4: 0x00000000 a5: 0x00000000 a6: 0x00000000 a7: 0x00000000
+ a8: 0x00000000 a9: 0x00000000 a10: 0x00000000 a11: 0x00000000
+ a12: 0x00000000 a13: 0x00000000 a14: 0x00000000 a15: 0x00000000
+ CORE 124 PRPSINFO
+ state: 0, sname: R, zomb: 0, nice: 0, flag: 0x00400400
+ uid: 0, gid: 0, pid: 839, ppid: 838, pgrp: 838, sid: 699
+ fname: 2, psargs: ./2
+ CORE 152 AUXV
+ SYSINFO_EHDR: 0
+ HWCAP: 0x37f
+ PAGESZ: 4096
+ CLKTCK: 100
+ PHDR: 0x400034
+ PHENT: 32
+ PHNUM: 2
+ BASE: 0
+ FLAGS: 0
+ ENTRY: 0x400098
+ UID: 0
+ EUID: 0
+ GID: 0
+ EGID: 0
+ SECURE: 0
+ RANDOM: 0x7f8c090c
+ EXECFN: 0x7f8c1ff4
+ PLATFORM: 0x7f8c091c
+ NULL
+ CORE 136 FPREGSET
+ fpc: 0x00000000
+ f0: 0x0000000000000040 f1: 0x4b00000000000000
+ f2: 0x0000000000000041 f3: 0x3ad50b5555555600
+ f4: 0x0000000000000000 f5: 0x0000000000000000
+ f6: 0x0000000000000000 f7: 0x0000000000000000
+ f8: 0x0000000000000000 f9: 0x0000000000000000
+ f10: 0x0000000000000000 f11: 0x0000000000000000
+ f12: 0x0000000000000000 f13: 0x0000000000000000
+ f14: 0x0000000000000000 f15: 0x0000000000000000
+ LINUX 8 S390_LAST_BREAK
+ last_break: 0xfd75ccbe
+ LINUX 4 S390_SYSTEM_CALL
+ system_call: 0x00000000
+ LINUX 64 S390_HIGH_GPRS
+ high_r0: 0x000003ff, high_r1: 0x000003ff, high_r2: 0x00000000
+ high_r3: 0x00000000, high_r4: 0x00000000, high_r5: 0x000003ff
+ high_r6: 0x00000000, high_r7: 0x00000000, high_r8: 0x00000000
+ high_r9: 0x00000000, high_r10: 0x00000000, high_r11: 0x00000000
+ high_r12: 0x000003ff, high_r13: 0x00000000, high_r14: 0x00000000
+ high_r15: 0x00000000
+EOF
+
exit 0
diff --git a/tests/testfile67.bz2 b/tests/testfile67.bz2
new file mode 100644
index 0000000000000000000000000000000000000000..bb64745db70a79db3a6182241fe77b0fcaf49144
GIT binary patch
literal 424
zcmV;Z0ayM)T4*^jL0KkKSp%-fGyny?|NsC0^`z!m;#6;~*FfZmf&jok03ZQKKnX$w
z2LM1oL<+D0Ml&##1SIk_#Schm*+2tEjWjYe)6@+;O$MH(PbumRPf0aBNr=-;7$!qZ
z1k*GV34|Din3yIIBvNXF)X)r?8Z<P}WND^AG|&cyfB?w&!<bg=OB(IC)<|MqFF-*h
z$2l~;A#Q3NuA8jKD-hXbf3B_R6sQa_M;6xIz1|$XFLT4ki$-~9{)$^bED(es3wExs
zV@QM5fHrPRms%kYs4jL9V3l#CfI!=67KWCioYIixAQ!XXTF18_2#Z2vKp_V65&~CI
zq>v!8@R+|EuO8_UZb$@JkwUZ-N{Q);h(LnT1E@H|ft<#xihi^m<OBx^2wfnRASzJe
zR}i7f7_dhUhAz6?42@wBv=-`Ubir^dgL8!AvwPK=m5iGzZh2ke+-=z4qOKtGz`;NY
zH`;<n9*p`5<iSmh=3yv*?qs!Mqw7NRRVy+uwFTuUGUrH7M!`>3vcE0o@k3txP?A7n
SBPpSX{}*yaI8cxSuE;cf2DsJ$
literal 0
HcmV?d00001
diff --git a/tests/testfile68.bz2 b/tests/testfile68.bz2
new file mode 100644
index 0000000000000000000000000000000000000000..3fe67921ff46f4b00d215577798c9aac17329e81
GIT binary patch
literal 399
zcmV;A0dW38T4*^jL0KkKSqTOjlK=&l|NsC0;iTY6ln`sJmqTTUg9N}-1aJWeKnXwu
z0sue&L<+D0Og7pgo~EXrjUkZH>KbG;8UO&$27qV)8kr#g001-q00000G8qJkQMEzn
zhJmJoMvXMlpa1{{LqVp6&^Y<!wJa`?_=Gac$zoGyWk?N4W!)8zSe#QUg;(|Lc6BP3
zx)^$<gd~s?LAJ{d&F=~T7g?Wf3QRuVvtJh?Oeiv|!@C8lF)s)>okr$l2>^nd>mI{J
z$v`S6VHBQ+<RK|KWtax!#DpN7paN#IohGeu!3-qv@Isd}fB-=bPOl79VUXr%OD-U!
z46Ce{i$>0&ka9sxc2a@eQwUUq(_oT<FlY@DWE;dVz7UWGNQfvPh!z4E_eh9`Li`!d
zA-U($Oyj^n7#7=>rEIHVa$vg52!z#%`d&49>hM$d3ID5KFQyo?{)-!eG$;)$81;7D
t0H7j{fJm8zoJ7K~%a_SNR}He$TV1yn1d>2^wOC)`?ntK!5&<B?QedNJq*wp|
literal 0
HcmV?d00001