From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31123 invoked by alias); 4 Feb 2013 18:31:13 -0000 Received: (qmail 31098 invoked by uid 22791); 4 Feb 2013 18:31:09 -0000 X-SWARE-Spam-Status: No, hits=-6.2 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,KHOP_SPAMHAUS_DROP,RCVD_IN_DNSWL_HI,RCVD_IN_HOSTKARMA_W,RP_MATCHES_RCVD,SPF_HELO_PASS,TW_CP X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 04 Feb 2013 18:30:55 +0000 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r14IUbdu029803 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 4 Feb 2013 13:30:44 -0500 Received: from psique (ovpn-113-130.phx2.redhat.com [10.3.113.130]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r14ITxvB012937; Mon, 4 Feb 2013 13:30:01 -0500 From: Sergio Durigan Junior To: Pedro Alves Cc: binutils@sourceware.org, jan.kratochvil@redhat.com, hongjiu.lu@intel.com, gdb-patches@sourceware.org Subject: Re: [PATCH 1/2] New entry points for writing Linux NT_PRPSINFO notes. References: <510AA7A3.4010702@redhat.com> <20130131230438.17941.90460.stgit@brno.lan> <20130201063725.GC30945@bubble.grove.modra.org> X-URL: http://www.redhat.com Date: Mon, 04 Feb 2013 18:31:00 -0000 In-Reply-To: <20130201063725.GC30945@bubble.grove.modra.org> (Alan Modra's message of "Fri, 1 Feb 2013 17:07:25 +1030") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2013-02/txt/msg00087.txt.bz2 On Friday, February 01 2013, Alan Modra wrote: > On Thu, Jan 31, 2013 at 11:04:38PM +0000, Pedro Alves wrote: >> * Makefile.in (SOURCE_HFILES): Add `elf-linux-psinfo.h'. >> * elf-bfd.h (elf_internal_linux_prpsinfo): New structure >> declaration. >> (elfcore_write_linux_prpsinfo32, elfcore_write_linux_prpsinfo64) >> (elfcore_write_ppc32_linux_prpsinfo32): New declarations. >> * elf-linux-psinfo.h: New file. >> * elf.c: Include elf-linux-psinfo.h. >> (elfcore_write_linux_prpsinfo32, elfcore_write_linux_prpsinfo64): >> New functions. >> * elf32-ppc.c: Include `elf-linux-psinfo.h'. >> (elf_external_ppc_linux_prpsinfo32): New structure declaration. >> (PPC_LINUX_PRPSINFO32_SWAP_FIELDS): New macro. >> (elfcore_write_ppc_linux_prpsinfo32): New function. > > Looks good to me. Committed. http://sourceware.org/ml/binutils-cvs/2013-02/msg00015.html -- Sergio Index: bfd/ChangeLog =================================================================== RCS file: /cvs/src/src/bfd/ChangeLog,v retrieving revision 1.5928 diff -u -r1.5928 ChangeLog --- bfd/ChangeLog 4 Feb 2013 14:48:20 -0000 1.5928 +++ bfd/ChangeLog 4 Feb 2013 18:25:02 -0000 @@ -1,3 +1,20 @@ +2013-02-04 Sergio Durigan Junior + Pedro Alves + + * Makefile.in (SOURCE_HFILES): Add `elf-linux-psinfo.h'. + * elf-bfd.h (elf_internal_linux_prpsinfo): New structure + declaration. + (elfcore_write_linux_prpsinfo32, elfcore_write_linux_prpsinfo64) + (elfcore_write_ppc32_linux_prpsinfo32): New declarations. + * elf-linux-psinfo.h: New file. + * elf.c: Include elf-linux-psinfo.h. + (elfcore_write_linux_prpsinfo32, elfcore_write_linux_prpsinfo64): + New functions. + * elf32-ppc.c: Include `elf-linux-psinfo.h'. + (elf_external_ppc_linux_prpsinfo32): New structure declaration. + (PPC_LINUX_PRPSINFO32_SWAP_FIELDS): New macro. + (elfcore_write_ppc_linux_prpsinfo32): New function. + 2013-02-04 Tristan Gingold * mach-o.c (bfd_mach_o_scan_start_address): Do not fail if no Index: bfd/Makefile.in =================================================================== RCS file: /cvs/src/src/bfd/Makefile.in,v retrieving revision 1.300 diff -u -r1.300 Makefile.in --- bfd/Makefile.in 4 Feb 2013 06:02:09 -0000 1.300 +++ bfd/Makefile.in 4 Feb 2013 18:25:02 -0000 @@ -1070,7 +1070,7 @@ CFILES = $(SOURCE_CFILES) $(BUILD_CFILES) SOURCE_HFILES = \ aout-target.h aoutf1.h aoutx.h coffcode.h coffswap.h ecoffswap.h \ - elf-bfd.h elf-hppa.h elf32-hppa.h \ + elf-bfd.h elf-linux-psinfo.h elf-hppa.h elf32-hppa.h \ elf64-hppa.h elfcode.h elfcore.h \ freebsd.h genlink.h go32stub.h \ libaout.h libbfd.h libcoff.h libecoff.h libhppa.h libieee.h \ Index: bfd/elf-bfd.h =================================================================== RCS file: /cvs/src/src/bfd/elf-bfd.h,v retrieving revision 1.355 diff -u -r1.355 elf-bfd.h --- bfd/elf-bfd.h 13 Jan 2013 12:32:10 -0000 1.355 +++ bfd/elf-bfd.h 4 Feb 2013 18:25:03 -0000 @@ -2285,6 +2285,42 @@ extern char *elfcore_write_register_note (bfd *, char *, int *, const char *, const void *, int); +/* Internal structure which holds information to be included in the + PRPSINFO section of Linux core files. + + This is an "internal" structure in the sense that it should be used + to pass information to BFD (via the `elfcore_write_linux_prpsinfo' + function), so things like endianess shouldn't be an issue. This + structure will eventually be converted in one of the + `elf_external_linux_*' structures and written out to an output bfd + by one of the functions declared below. */ + +struct elf_internal_linux_prpsinfo + { + char pr_state; /* Numeric process state. */ + char pr_sname; /* Char for pr_state. */ + char pr_zomb; /* Zombie. */ + char pr_nice; /* Nice val. */ + unsigned long pr_flag; /* Flags. */ + unsigned int pr_uid; + unsigned int pr_gid; + int pr_pid, pr_ppid, pr_pgrp, pr_sid; + char pr_fname[16 + 1]; /* Filename of executable. */ + char pr_psargs[80 + 1]; /* Initial part of arg list. */ + }; + +/* Linux/most 32-bit archs. */ +extern char *elfcore_write_linux_prpsinfo32 + (bfd *, char *, int *, const struct elf_internal_linux_prpsinfo *); + +/* Linux/most 64-bit archs. */ +extern char *elfcore_write_linux_prpsinfo64 + (bfd *, char *, int *, const struct elf_internal_linux_prpsinfo *); + +/* Linux/PPC32 uses different layout compared to most archs. */ +extern char *elfcore_write_ppc_linux_prpsinfo32 + (bfd *, char *, int *, const struct elf_internal_linux_prpsinfo *); + extern bfd *_bfd_elf32_bfd_from_remote_memory (bfd *templ, bfd_vma ehdr_vma, bfd_vma *loadbasep, int (*target_read_memory) (bfd_vma, bfd_byte *, bfd_size_type)); Index: bfd/elf.c =================================================================== RCS file: /cvs/src/src/bfd/elf.c,v retrieving revision 1.581 diff -u -r1.581 elf.c --- bfd/elf.c 8 Jan 2013 18:09:10 -0000 1.581 +++ bfd/elf.c 4 Feb 2013 18:25:04 -0000 @@ -45,6 +45,7 @@ #include "elf-bfd.h" #include "libiberty.h" #include "safe-ctype.h" +#include "elf-linux-psinfo.h" #ifdef CORE_HEADER #include CORE_HEADER @@ -9159,6 +9160,34 @@ } char * +elfcore_write_linux_prpsinfo32 + (bfd *abfd, char *buf, int *bufsiz, + const struct elf_internal_linux_prpsinfo *prpsinfo) +{ + struct elf_external_linux_prpsinfo32 data; + + memset (&data, 0, sizeof (data)); + LINUX_PRPSINFO32_SWAP_FIELDS (abfd, prpsinfo, data); + + return elfcore_write_note (abfd, buf, bufsiz, "CORE", NT_PRPSINFO, + &data, sizeof (data)); +} + +char * +elfcore_write_linux_prpsinfo64 + (bfd *abfd, char *buf, int *bufsiz, + const struct elf_internal_linux_prpsinfo *prpsinfo) +{ + struct elf_external_linux_prpsinfo64 data; + + memset (&data, 0, sizeof (data)); + LINUX_PRPSINFO64_SWAP_FIELDS (abfd, prpsinfo, data); + + return elfcore_write_note (abfd, buf, bufsiz, + "CORE", NT_PRPSINFO, &data, sizeof (data)); +} + +char * elfcore_write_prstatus (bfd *abfd, char *buf, int *bufsiz, Index: bfd/elf32-ppc.c =================================================================== RCS file: /cvs/src/src/bfd/elf32-ppc.c,v retrieving revision 1.323 diff -u -r1.323 elf32-ppc.c --- bfd/elf32-ppc.c 10 Jan 2013 20:03:53 -0000 1.323 +++ bfd/elf32-ppc.c 4 Feb 2013 18:25:05 -0000 @@ -37,6 +37,7 @@ #include "elf32-ppc.h" #include "elf-vxworks.h" #include "dwarf2.h" +#include "elf-linux-psinfo.h" typedef enum split16_format_type { @@ -1777,6 +1778,58 @@ 0xffff, /* dst_mask */ FALSE), /* pcrel_offset */ }; + +/* External 32-bit PPC structure for PRPSINFO. This structure is + ABI-defined, thus we choose to use char arrays here in order to + avoid dealing with different types in different architectures. + + The PPC 32-bit structure uses int for `pr_uid' and `pr_gid' while + most non-PPC architectures use `short int'. + + This structure will ultimately be written in the corefile's note + section, as the PRPSINFO. */ + +struct elf_external_ppc_linux_prpsinfo32 + { + char pr_state; /* Numeric process state. */ + char pr_sname; /* Char for pr_state. */ + char pr_zomb; /* Zombie. */ + char pr_nice; /* Nice val. */ + char pr_flag[4]; /* Flags. */ + char pr_uid[4]; + char pr_gid[4]; + char pr_pid[4]; + char pr_ppid[4]; + char pr_pgrp[4]; + char pr_sid[4]; + char pr_fname[16]; /* Filename of executable. */ + char pr_psargs[80]; /* Initial part of arg list. */ + }; + +/* Helper macro to swap (properly handling endianess) things from the + `elf_internal_prpsinfo' structure to the `elf_external_ppc_prpsinfo32' + structure. + + Note that FROM should be a pointer, and TO should be the explicit type. */ + +#define PPC_LINUX_PRPSINFO32_SWAP_FIELDS(abfd, from, to) \ + do \ + { \ + H_PUT_8 (abfd, from->pr_state, &to.pr_state); \ + H_PUT_8 (abfd, from->pr_sname, &to.pr_sname); \ + H_PUT_8 (abfd, from->pr_zomb, &to.pr_zomb); \ + H_PUT_8 (abfd, from->pr_nice, &to.pr_nice); \ + H_PUT_32 (abfd, from->pr_flag, to.pr_flag); \ + H_PUT_32 (abfd, from->pr_uid, to.pr_uid); \ + H_PUT_32 (abfd, from->pr_gid, to.pr_gid); \ + H_PUT_32 (abfd, from->pr_pid, to.pr_pid); \ + H_PUT_32 (abfd, from->pr_ppid, to.pr_ppid); \ + H_PUT_32 (abfd, from->pr_pgrp, to.pr_pgrp); \ + H_PUT_32 (abfd, from->pr_sid, to.pr_sid); \ + strncpy (to.pr_fname, from->pr_fname, sizeof (to.pr_fname)); \ + strncpy (to.pr_psargs, from->pr_psargs, sizeof (to.pr_psargs)); \ + } while (0) + /* Initialize the ppc_elf_howto_table, so that linear accesses can be done. */ @@ -2212,6 +2265,19 @@ return TRUE; } +char * +elfcore_write_ppc_linux_prpsinfo32 (bfd *abfd, char *buf, int *bufsiz, + const struct elf_internal_linux_prpsinfo *prpsinfo) +{ + struct elf_external_ppc_linux_prpsinfo32 data; + + memset (&data, 0, sizeof (data)); + PPC_LINUX_PRPSINFO32_SWAP_FIELDS (abfd, prpsinfo, data); + + return elfcore_write_note (abfd, buf, bufsiz, + "CORE", NT_PRPSINFO, &data, sizeof (data)); +} + static char * ppc_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type, ...) {