From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Denis Joseph Barrow" To: Andrew Cagney Cc: gdb-patches@sourceware.cygnus.com, s390-patches@gnu.org, Binutils Patches , bash_maintainers@gnu.org, "Martin Schwidefsky" , "Christoph Arenz" Subject: Re: New gdb 31 & 64 bit patches for S/390 Date: Thu, 05 Jul 2001 05:04:00 -0000 Message-id: X-SW-Source: 2001-07/msg00090.html The code below was trying to access registers several supervisor/priviliged mode registers, which arent accessible from the ptrace syscall or in core files, these registers do exist & will be used for kernel debugging. Its a long time ago & I can't remember the exact symtom but the code caused incorrect behaviour on s390, possibly bad_reg going to 1 & it doing a quick exit. D.J. Barrow Gnu/Linux for S/390 kernel developer eMail: djbarrow@de.ibm.com,barrow_dj@yahoo.com Phone: +49-(0)7031-16-2583 IBM Germany Lab, Schönaicherstr. 220, 71032 Böblingen Andrew Cagney on 04.07.2001 19:13:53 Please respond to Andrew Cagney To: Denis Joseph Barrow/Germany/Contr/IBM@IBMDE cc: gdb-patches@sourceware.cygnus.com, s390-patches@gnu.org, Binutils Patches , bash_maintainers@gnu.org, Martin Schwidefsky/Germany/IBM@IBMDE, Christoph Arenz/Germany/IBM@IBMDE Subject: Re: New gdb 31 & 64 bit patches for S/390 DJB, The patches included the change: 2001-02-26 D.J. Barrow * core-aout.c added check for CANNOT_FETCH_REGISTER in fetch_core_registers. --- src.orig/gdb/core-aout.c Sun Jul 30 03:48:24 2000 +++ src.new/gdb/core-aout.c Tue Feb 27 17:36:35 2001 @@ -81,6 +81,7 @@ int bad_reg = -1; CORE_ADDR reg_ptr = -reg_addr; /* Original u.u_ar0 is -reg_addr. */ int numregs = ARCH_NUM_REGS; + char *buf=alloca(MAX_REGISTER_RAW_SIZE); /* If u.u_ar0 was an absolute address in the core file, relativize it now, so we can use it as an offset into core_reg_sect. When we're done, @@ -93,12 +94,20 @@ for (regno = 0; regno < numregs; regno++) { - addr = CORE_REGISTER_ADDR (regno, reg_ptr); - if (addr >= core_reg_size - && bad_reg < 0) - bad_reg = regno; + if (CANNOT_FETCH_REGISTER (regno)) + { + memset (buf, '\0', REGISTER_RAW_SIZE (regno)); /* Supply zeroes */ + supply_register (regno, buf); + } else - supply_register (regno, core_reg_sect + addr); + { + addr = CORE_REGISTER_ADDR (regno, reg_ptr); + if (addr >= core_reg_size + && bad_reg < 0) + bad_reg = regno; + else + supply_register (regno, core_reg_sect + addr); + } } if (bad_reg >= 0) Can you please expand on this change. I don't think it is s390 specific. Andrew