From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30063 invoked by alias); 23 May 2003 06:58:08 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 29879 invoked from network); 23 May 2003 06:58:02 -0000 Received: from unknown (HELO zenia.red-bean.com) (12.223.225.216) by sources.redhat.com with SMTP; 23 May 2003 06:58:02 -0000 Received: from zenia.red-bean.com (localhost.localdomain [127.0.0.1]) by zenia.red-bean.com (8.12.5/8.12.5) with ESMTP id h4N75vFq000377; Fri, 23 May 2003 02:05:58 -0500 Received: (from jimb@localhost) by zenia.red-bean.com (8.12.5/8.12.5/Submit) id h4N75vaf000373; Fri, 23 May 2003 02:05:57 -0500 To: gdb-patches@sources.redhat.com Subject: RFC: s390x: correct core file register layout From: Jim Blandy Date: Fri, 23 May 2003 06:58:00 -0000 Message-ID: User-Agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.3 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-SW-Source: 2003-05/txt/msg00449.txt.bz2 2003-05-23 Jim Blandy * s390-nat.c (supply_gregset, fill_gregset): On the s390x, the elements of gregset_t are 64 bits each, but access registers are still 32 bits, so they're packed two per gregset_t element. Unpack/pack them properly. Index: gdb/s390-nat.c =================================================================== RCS file: /cvs/src/src/gdb/s390-nat.c,v retrieving revision 1.7 diff -c -r1.7 s390-nat.c *** gdb/s390-nat.c 14 Apr 2003 14:21:07 -0000 1.7 --- gdb/s390-nat.c 23 May 2003 06:52:07 -0000 *************** *** 251,259 **** for (regi = 0; regi < S390_NUM_GPRS; regi++) supply_register (S390_GP0_REGNUM + regi, (char *) &gregp[S390_GP0_REGNUM + regi]); for (regi = 0; regi < S390_NUM_ACRS; regi++) supply_register (S390_FIRST_ACR + regi, ! (char *) &gregp[S390_FIRST_ACR + regi]); /* unfortunately this isn't in gregsetp */ for (regi = 0; regi < S390_NUM_CRS; regi++) supply_register (S390_FIRST_CR + regi, NULL); --- 251,276 ---- for (regi = 0; regi < S390_NUM_GPRS; regi++) supply_register (S390_GP0_REGNUM + regi, (char *) &gregp[S390_GP0_REGNUM + regi]); + + #if defined (CONFIG_ARCH_S390X) + /* On the s390x, each element of gregset_t is 8 bytes long, but + each access register is still only 32 bits long. So they're + packed two per element. It's apparently traditional that + gregset_t must be an array, so when the registers it provides + have different sizes, something has to get strange + somewhere. */ + { + unsigned int *acrs = (unsigned int *) &gregp[S390_FIRST_ACR]; + + for (regi = 0; regi < S390_NUM_ACRS; regi++) + supply_register (S390_FIRST_ACR + regi, (char *) &acrs[regi]); + } + #else for (regi = 0; regi < S390_NUM_ACRS; regi++) supply_register (S390_FIRST_ACR + regi, ! (char *) &gregp[S390_FIRST_ACR + regi]); ! #endif ! /* unfortunately this isn't in gregsetp */ for (regi = 0; regi < S390_NUM_CRS; regi++) supply_register (S390_FIRST_CR + regi, NULL); *************** *** 284,295 **** for (regi = 0; regi < S390_NUM_GPRS; regi++) regcache_collect (S390_GP0_REGNUM + regi, &gregp[S390_GP0_REGNUM + regi]); for (regi = 0; regi < S390_NUM_ACRS; regi++) regcache_collect (S390_FIRST_ACR + regi, &gregp[S390_FIRST_ACR + regi]); } ! else if (regno >= S390_PSWM_REGNUM && regno <= S390_LAST_ACR) regcache_collect (regno, &gregp[regno]); } /* Given a pointer to a floating point register set in /proc format --- 301,335 ---- for (regi = 0; regi < S390_NUM_GPRS; regi++) regcache_collect (S390_GP0_REGNUM + regi, &gregp[S390_GP0_REGNUM + regi]); + #if defined (CONFIG_ARCH_S390X) + /* See the comments about the access registers in + supply_gregset, above. */ + { + unsigned int *acrs = (unsigned int *) &gregp[S390_FIRST_ACR]; + + for (regi = 0; regi < S390_NUM_ACRS; regi++) + regcache_collect (S390_FIRST_ACR + regi, &acrs[regi]); + } + #else for (regi = 0; regi < S390_NUM_ACRS; regi++) regcache_collect (S390_FIRST_ACR + regi, &gregp[S390_FIRST_ACR + regi]); + #endif } ! else if (regno >= S390_PSWM_REGNUM && regno < S390_FIRST_ACR) regcache_collect (regno, &gregp[regno]); + else if (regno >= S390_FIRST_ACR && regno <= S390_LAST_ACR) + { + #if defined (CONFIG_ARCH_S390X) + /* See the comments about the access registers in + supply_gregset, above. */ + unsigned int *acrs = (unsigned int *) &gregp[S390_FIRST_ACR]; + + regcache_collect (regno, &acrs[regno - S390_FIRST_ACR]); + #else + regcache_collect (regno, &gregp[regno]); + #endif + } } /* Given a pointer to a floating point register set in /proc format