Hi, readelf -n will work now.
TBH I do not know what S390_HIGH_GPRS are for. From what I read they are not present on s390 iron, they are also not present for s390x processes, they are present only for s390 processes on s390x iron/kernel. But gcc -m31 still does not use the upper halves of r0-r15 there. I could ask at IBM but so far I ignore S390_HIGH_GPRS in this and further patches. They are now just printed by readelf, nothing more. 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. Thanks, Jan backends/ 2012-10-09 Jan Kratochvil <[email protected]> * Makefile.am (s390_SRCS): Add s390_corenote.c and s390x_corenote.c. * s390_corenote.c: new file. * s390_init.c (s390_init): Install s390x_core_note and s390_core_note. * s390x_corenote.c: new file. src/ 2012-10-09 Jan Kratochvil <[email protected]> * readelf.c (handle_core_items) <nitems == 1>: Fix non-zero OFFSET. tests/ 2012-10-09 Jan Kratochvil <[email protected]> * run-readelf-mixed-corenote.sh: New testcase for readelf -n of s390 and s390x core notes. * testfile67.bz2: New file. * testfile68.bz2: New file. 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/s390_corenote.c b/backends/s390_corenote.c new file mode 100644 index 0000000..4312537 --- /dev/null +++ b/backends/s390_corenote.c @@ -0,0 +1,173 @@ +/* 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) \ + { .offset = at * BITS/8, .regno = dwreg, .count = n, .bits = BITS } + + GR (0, 1, 64), /* pswm */ + GR (1, 1, 65), /* pswa */ + GR (2, 16, 0), /* r0-r15 */ + /* 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). */ + +#undef GR + }; +#define PRSTATUS_REGS_SIZE (BITS / 8 * (BITS == 32 ? 37 : 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 0. */ + 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 + }; +#define FPREGSET_SIZE (17 * 8) + +#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 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 no_items[0]; + +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 }, + }; + +#define EXTRA_NOTES_HIGH_GPRS \ + EXTRA_REGSET_ITEMS (NT_S390_HIGH_GPRS, 16 * BITS / 8, high_regs, no_items) + +#else /* BITS == 64 */ + +#define EXTRA_NOTES_HIGH_GPRS + +#endif /* BITS == 64 */ + +static const Ebl_Core_Item last_break_items[] = + { + { + .name = "last_break", .group = "last_break", + .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_call", + .offset = 0, + .count = 0, .type = ELF_T_WORD, + .format = 'x', + }, + }; + +static const Ebl_Register_Location no_regs[0]; + +#define EXTRA_NOTES \ + EXTRA_NOTES_HIGH_GPRS \ + EXTRA_REGSET_ITEMS (NT_S390_LAST_BREAK, 8, no_regs, last_break_items) \ + EXTRA_REGSET_ITEMS (NT_S390_SYSTEM_CALL, 4, no_regs, system_call_items) + +#include "linux-core-note.c" diff --git a/backends/s390_init.c b/backends/s390_init.c index 528e357..c1d3ef6 100644 --- a/backends/s390_init.c +++ b/backends/s390_init.c @@ -55,6 +55,13 @@ s390_init (elf, machine, eh, ehlen) HOOK (eh, reloc_simple_type); HOOK (eh, register_info); HOOK (eh, return_value_location); + if (eh->class == ELFCLASS64) + { + __typeof (s390_core_note) s390x_core_note; + 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..bf0c924 100644 --- a/src/readelf.c +++ b/src/readelf.c @@ -7698,6 +7698,7 @@ handle_core_items (Elf *core, const void *desc, size_t descsz, const void *last = desc; if (nitems == 1) { + descsz -= sorted_items[0]->offset; 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. */ @@ -7706,6 +7707,7 @@ handle_core_items (Elf *core, const void *desc, size_t descsz, if (size == 0) return colno; + size += sorted_items[0]->offset; desc += descsz - size; descsz = size; } diff --git a/tests/run-readelf-mixed-corenote.sh b/tests/run-readelf-mixed-corenote.sh index f9b96c8..bdb5d3e 100755 --- a/tests/run-readelf-mixed-corenote.sh +++ b/tests/run-readelf-mixed-corenote.sh @@ -84,4 +84,133 @@ 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 + 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: 0 + 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 + 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 + r0: 1023 r1: 1023 r2: 0 r3: 0 + r4: 0 r5: 1023 r6: 0 r7: 0 + r8: 0 r9: 0 r10: 0 r11: 0 + r12: 1023 r13: 0 r14: 0 r15: 0 +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 _______________________________________________ elfutils-devel mailing list [email protected] https://lists.fedorahosted.org/mailman/listinfo/elfutils-devel
