-2012-10-12 Jan Kratochvil <jan.kratochvil@redhat.com>
- Roland McGrath <roland@hack.frob.com>
-
- * Makefile.am (s390_SRCS): Add s390_corenote.c and s390x_corenote.c.
- * linux-core-note.c (PR_REG_TYPE, ALIGN_PR_REG_TYPE, PR_FPVALID_TYPE)
- (ALIGN_PR_FPVALID_TYPE): New definitions.
- (struct EBLHOOK(prstatus)): Change field pr_reg to type PR_REG_TYPE and
- field pr_fpvalid to type PR_FPVALID_TYPE.
- (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.
-
2012-10-12 Jan Kratochvil <jan.kratochvil@redhat.com>
* linux-core-note.c (prstatus_items): Rename groups of sigpend and
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_corenote.c s390x_corenote.c
+s390_SRCS = s390_init.c s390_symbol.c s390_regs.c s390_retval.c
libebl_s390_pic_a_SOURCES = $(s390_SRCS)
am_libebl_s390_pic_a_OBJECTS = $(s390_SRCS:.c=.os)
{
.name = "fpscr", .group = "register",
.offset = 0,
- .type = ELF_T_WORD, .format = 'x',
+ .count = 0, .type = ELF_T_WORD, .format = 'x',
},
};
#define INT int32_t
#define ALIGN_INT 4
#define TYPE_INT ELF_T_SWORD
-#ifndef PR_REG_TYPE
-# define PR_REG_TYPE ULONG
-#endif
-#ifndef ALIGN_PR_REG_TYPE
-# define ALIGN_PR_REG_TYPE ALIGN_ULONG
-#endif
-#ifndef PR_FPVALID_TYPE
-# define PR_FPVALID_TYPE INT
-#endif
-#ifndef ALIGN_PR_FPVALID_TYPE
-# define ALIGN_PR_FPVALID_TYPE ALIGN_INT
-#endif
#define FIELD(type, name) type name __attribute__ ((aligned (ALIGN_##type)))
struct EBLHOOK(timeval) pr_stime;
struct EBLHOOK(timeval) pr_cutime;
struct EBLHOOK(timeval) pr_cstime;
- FIELD (PR_REG_TYPE, pr_reg[PRSTATUS_REGS_SIZE / sizeof (PR_REG_TYPE)]);
- FIELD (PR_FPVALID_TYPE, pr_fpvalid);
+ FIELD (ULONG, pr_reg[PRSTATUS_REGS_SIZE / sizeof (ULONG)]);
+ FIELD (INT, pr_fpvalid);
};
#define FNAMESZ 16
*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
+++ /dev/null
-/* 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). */
-#define PRSTATUS_REGS_SIZE (BITS / 8 * (BITS == 32 ? 35 : 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, .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_PR_REG_TYPE 8
-#define ALIGN_PR_FPVALID_TYPE 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, \
- .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,
- .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, .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"
/* 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)
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)
+++ /dev/null
-#define BITS 64
-#include "s390_corenote.c"
-2012-10-12 Jan Kratochvil <jan.kratochvil@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 and formats '\n', 'b' and 'B'. Initialize COLNO to MAX of
- also REGISTER_WRAP_COLUMN.
-
2012-10-12 Jan Kratochvil <jan.kratochvil@redhat.com>
* readelf.c (ITEM_WRAP_COLUMN, REGISTER_WRAP_COLUMN): Merge to ...
if (nitems == 0)
return 0;
- unsigned int colno = 0;
- if (items[0].format == '\n' || items[0].format == 'b'
- || items[0].format == 'B')
- {
- assert (nitems == 1);
- assert (items[0].offset == 0);
- size_t size = descsz;
- colno = handle_core_item (core, items, desc, colno, &size);
- /* If SIZE is not zero here there is some remaining data. But we do not
- know how to process it anyway. */
- return colno;
- }
-
/* Sort to collect the groups together. */
const Ebl_Core_Item *sorted_items[nitems];
for (size_t i = 0; i < nitems; ++i)
qsort (groups, ngroups, sizeof groups[0], &compare_core_item_groups);
/* Write out all the groups. */
+ unsigned int colno = 0;
+
const void *last = desc;
+ if (nitems == 1)
+ {
+ 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. */
+ colno = handle_core_item (core, sorted_items[0], desc, colno,
+ size != 0 ? &size : NULL);
+
+ if (size == 0)
+ return colno;
+ desc += descsz - size;
+ descsz = size;
+ }
+
do
{
for (size_t i = 0; i < ngroups; ++i)
-2012-10-12 Jan Kratochvil <jan.kratochvil@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.
-
2012-10-10 Jan Kratochvil <jan.kratochvil@redhat.com>
* run-addrname-test.sh: New test for core vDSO bias.
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