From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 707 invoked by alias); 30 Apr 2005 00:50:07 -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 32410 invoked from network); 30 Apr 2005 00:49:18 -0000 Received: from unknown (HELO mx1.redhat.com) (66.187.233.31) by sourceware.org with SMTP; 30 Apr 2005 00:49:18 -0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.11/8.12.11) with ESMTP id j3U0nI2v010060 for ; Fri, 29 Apr 2005 20:49:18 -0400 Received: from potter.sfbay.redhat.com (potter.sfbay.redhat.com [172.16.27.15]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id j3U0nHO06086 for ; Fri, 29 Apr 2005 20:49:17 -0400 Received: from [172.16.24.50] (bluegiant.sfbay.redhat.com [172.16.24.50]) by potter.sfbay.redhat.com (8.12.8/8.12.8) with ESMTP id j3U0nGth032134 for ; Fri, 29 Apr 2005 20:49:16 -0400 Message-ID: <4272D60B.5050709@sonic.net> Date: Sat, 30 Apr 2005 00:50:00 -0000 From: Michael Snyder User-Agent: Mozilla Thunderbird (X11/20050322) MIME-Version: 1.0 To: gdb-patches@sources.redhat.com Subject: [RFA] New target am33-linux (mn10300) Content-Type: multipart/mixed; boundary="------------070708050303050902040808" X-SW-Source: 2005-04/txt/msg00442.txt.bz2 This is a multi-part message in MIME format. --------------070708050303050902040808 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-length: 181 This is an embedded linux target for am33 (mn10300). The rest of the toolchain (gcc, binutils) has already been contributed. This bit has been languishing untended for a while. --------------070708050303050902040808 Content-Type: text/plain; name="mn10300-linux" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="mn10300-linux" Content-length: 11758 2005-04-29 Michael Snyder * mn10300-linux-tdep.c: New file. * Makefile.in: Add rule for mn10300-linux-tdep.o. * configure.tgt: Add rule for am33 / mn10300-linux. * mn10300-tdep.h: Add E_FPCR_REGNUM, E_FS0_REGNUM. Index: Makefile.in =================================================================== RCS file: /cvs/src/src/gdb/Makefile.in,v retrieving revision 1.724 diff -p -r1.724 Makefile.in *** Makefile.in 29 Apr 2005 14:21:21 -0000 1.724 --- Makefile.in 30 Apr 2005 00:27:09 -0000 *************** mips-tdep.o: mips-tdep.c $(defs_h) $(gdb *** 2300,2305 **** --- 2300,2307 ---- $(floatformat_h) mipsv4-nat.o: mipsv4-nat.c $(defs_h) $(inferior_h) $(gdbcore_h) $(target_h) \ $(regcache_h) $(gregset_h) + mn10300-linux-tdep.o: mn10300-linux-tdep.c $(defs_h) $(gdbcore_h) \ + $(gdb_string_h) $(regcache_h) $(mn10300_tdep_h) mn10300-tdep.o: mn10300-tdep.c $(defs_h) $(arch_utils_h) $(dis_asm_h) \ $(gdbtypes_h) $(regcache_h) $(gdb_string_h) $(gdb_assert_h) \ $(frame_h) $(frame_unwind_h) $(frame_base_h) $(trad_frame_h) \ Index: configure.tgt =================================================================== RCS file: /cvs/src/src/gdb/configure.tgt,v retrieving revision 1.163 diff -p -r1.163 configure.tgt *** configure.tgt 26 Apr 2005 21:47:21 -0000 1.163 --- configure.tgt 30 Apr 2005 00:27:09 -0000 *************** *** 11,16 **** --- 11,17 ---- case "${target_cpu}" in alpha*) gdb_target_cpu=alpha ;; + am33_2.0*) gdb_target_cpu=mn10300 ;; arm*) gdb_target_cpu=arm ;; avr*) gdb_target_cpu=avr ;; hppa*) gdb_target_cpu=pa ;; *************** alpha*-*-netbsd* | alpha*-*-knetbsd*-gnu *** 47,52 **** --- 48,56 ---- alpha*-*-openbsd*) gdb_target=nbsd ;; alpha*-*-*) gdb_target=alpha ;; + # mn10300 / am33 liunux + am33_2.0*-*-linux*) gdb_target=linux ;; + arm*-wince-pe) gdb_target=wince ;; arm*-*-linux*) gdb_target=linux build_gdbserver=yes Index: mn10300-tdep.h =================================================================== RCS file: /cvs/src/src/gdb/mn10300-tdep.h,v retrieving revision 1.3 diff -p -r1.3 mn10300-tdep.h *** mn10300-tdep.h 18 Apr 2005 23:14:33 -0000 1.3 --- mn10300-tdep.h 30 Apr 2005 00:27:09 -0000 *************** enum { *** 47,53 **** E_MCRH_REGNUM = 26, E_MCRL_REGNUM = 27, E_MCVF_REGNUM = 28, ! E_NUM_REGS = 32 }; enum movm_register_bits { --- 47,55 ---- E_MCRH_REGNUM = 26, E_MCRL_REGNUM = 27, E_MCVF_REGNUM = 28, ! E_FPCR_REGNUM = 29, ! E_NUM_REGS = 32, ! E_FS0_REGNUM = 32 }; enum movm_register_bits { Index: mn10300-linux-tdep.c =================================================================== RCS file: mn10300-linux-tdep.c diff -N mn10300-linux-tdep.c *** /dev/null 1 Jan 1970 00:00:00 -0000 --- mn10300-linux-tdep.c 30 Apr 2005 00:28:15 -0000 *************** *** 0 **** --- 1,221 ---- + /* Target-dependent code for the Matsushita MN10300 for GDB, the GNU debugger. + Copyright 2003 + Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of 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. + + This program 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 a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + + #include "defs.h" + #include "gdbcore.h" + #include "gdb_string.h" + #include "regcache.h" + #include "mn10300-tdep.h" + + #include + + /* Transliterated from ... */ + #define ELF_NGREG 27 + #define ELF_NFPREG 32 + + typedef unsigned char elf_greg_t[4]; + typedef elf_greg_t elf_gregset_t[ELF_NGREG]; + + typedef unsigned char elf_fpreg_t[4]; + typedef struct + { + elf_fpreg_t fpregs[ELF_NFPREG]; + unsigned char fpcr[4]; + } elf_fpregset_t; + + /* elf_gregset_t register indices stolen from include/asm-mn10300/ptrace.h. */ + #define ELF_GREGSET_T_REG_INDEX_A3 0 + #define ELF_GREGSET_T_REG_INDEX_A2 1 + #define ELF_GREGSET_T_REG_INDEX_D3 2 + #define ELF_GREGSET_T_REG_INDEX_D2 3 + #define ELF_GREGSET_T_REG_INDEX_MCVF 4 + #define ELF_GREGSET_T_REG_INDEX_MCRL 5 + #define ELF_GREGSET_T_REG_INDEX_MCRH 6 + #define ELF_GREGSET_T_REG_INDEX_MDRQ 7 + #define ELF_GREGSET_T_REG_INDEX_E1 8 + #define ELF_GREGSET_T_REG_INDEX_E0 9 + #define ELF_GREGSET_T_REG_INDEX_E7 10 + #define ELF_GREGSET_T_REG_INDEX_E6 11 + #define ELF_GREGSET_T_REG_INDEX_E5 12 + #define ELF_GREGSET_T_REG_INDEX_E4 13 + #define ELF_GREGSET_T_REG_INDEX_E3 14 + #define ELF_GREGSET_T_REG_INDEX_E2 15 + #define ELF_GREGSET_T_REG_INDEX_SP 16 + #define ELF_GREGSET_T_REG_INDEX_LAR 17 + #define ELF_GREGSET_T_REG_INDEX_LIR 18 + #define ELF_GREGSET_T_REG_INDEX_MDR 19 + #define ELF_GREGSET_T_REG_INDEX_A1 20 + #define ELF_GREGSET_T_REG_INDEX_A0 21 + #define ELF_GREGSET_T_REG_INDEX_D1 22 + #define ELF_GREGSET_T_REG_INDEX_D0 23 + #define ELF_GREGSET_T_REG_INDEX_ORIG_D0 24 + #define ELF_GREGSET_T_REG_INDEX_EPSW 25 + #define ELF_GREGSET_T_REG_INDEX_PC 26 + + /* Unpack an elf_gregset_t into GDB's register cache. */ + + static void + supply_gregset (elf_gregset_t *gregsetp) + { + elf_greg_t *regp = *gregsetp; + char zerobuf[MAX_REGISTER_SIZE]; + int regi; + + memset (zerobuf, 0, MAX_REGISTER_SIZE); + + regcache_raw_supply (current_regcache, E_D0_REGNUM, + (void *) (regp + ELF_GREGSET_T_REG_INDEX_D0)); + regcache_raw_supply (current_regcache, E_D1_REGNUM, + (void *) (regp + ELF_GREGSET_T_REG_INDEX_D1)); + regcache_raw_supply (current_regcache, E_D2_REGNUM, + (void *) (regp + ELF_GREGSET_T_REG_INDEX_D2)); + regcache_raw_supply (current_regcache, E_D3_REGNUM, + (void *) (regp + ELF_GREGSET_T_REG_INDEX_D3)); + regcache_raw_supply (current_regcache, E_A0_REGNUM, + (void *) (regp + ELF_GREGSET_T_REG_INDEX_A0)); + regcache_raw_supply (current_regcache, E_A0_REGNUM, + (void *) (regp + ELF_GREGSET_T_REG_INDEX_A1)); + regcache_raw_supply (current_regcache, E_A2_REGNUM, + (void *) (regp + ELF_GREGSET_T_REG_INDEX_A2)); + regcache_raw_supply (current_regcache, E_A3_REGNUM, + (void *) (regp + ELF_GREGSET_T_REG_INDEX_A3)); + regcache_raw_supply (current_regcache, E_SP_REGNUM, + (void *) (regp + ELF_GREGSET_T_REG_INDEX_SP)); + regcache_raw_supply (current_regcache, E_PC_REGNUM, + (void *) (regp + ELF_GREGSET_T_REG_INDEX_PC)); + regcache_raw_supply (current_regcache, E_MDR_REGNUM, + (void *) (regp + ELF_GREGSET_T_REG_INDEX_MDR)); + regcache_raw_supply (current_regcache, E_PSW_REGNUM, + (void *) (regp + ELF_GREGSET_T_REG_INDEX_EPSW)); + regcache_raw_supply (current_regcache, E_LIR_REGNUM, + (void *) (regp + ELF_GREGSET_T_REG_INDEX_LIR)); + regcache_raw_supply (current_regcache, E_LAR_REGNUM, + (void *) (regp + ELF_GREGSET_T_REG_INDEX_LAR)); + regcache_raw_supply (current_regcache, E_MDRQ_REGNUM, + (void *) (regp + ELF_GREGSET_T_REG_INDEX_MDRQ)); + regcache_raw_supply (current_regcache, E_E0_REGNUM, + (void *) (regp + ELF_GREGSET_T_REG_INDEX_E0)); + regcache_raw_supply (current_regcache, E_E0_REGNUM + 1, + (void *) (regp + ELF_GREGSET_T_REG_INDEX_E1)); + regcache_raw_supply (current_regcache, E_E0_REGNUM + 2, + (void *) (regp + ELF_GREGSET_T_REG_INDEX_E2)); + regcache_raw_supply (current_regcache, E_E0_REGNUM + 3, + (void *) (regp + ELF_GREGSET_T_REG_INDEX_E3)); + regcache_raw_supply (current_regcache, E_E0_REGNUM + 4, + (void *) (regp + ELF_GREGSET_T_REG_INDEX_E4)); + regcache_raw_supply (current_regcache, E_E0_REGNUM + 5, + (void *) (regp + ELF_GREGSET_T_REG_INDEX_E5)); + regcache_raw_supply (current_regcache, E_E0_REGNUM + 6, + (void *) (regp + ELF_GREGSET_T_REG_INDEX_E6)); + regcache_raw_supply (current_regcache, E_E0_REGNUM + 7, + (void *) (regp + ELF_GREGSET_T_REG_INDEX_E7)); + + /* ssp, msp, and usp are inaccessible. */ + regcache_raw_supply (current_regcache, E_E0_REGNUM + 8, zerobuf); + regcache_raw_supply (current_regcache, E_E0_REGNUM + 9, zerobuf); + regcache_raw_supply (current_regcache, E_E0_REGNUM + 10, zerobuf); + + regcache_raw_supply (current_regcache, E_MCRH_REGNUM, + (void *) (regp + ELF_GREGSET_T_REG_INDEX_MCRH)); + regcache_raw_supply (current_regcache, E_MCRL_REGNUM, + (void *) (regp + ELF_GREGSET_T_REG_INDEX_MCRL)); + regcache_raw_supply (current_regcache, E_MCVF_REGNUM, + (void *) (regp + ELF_GREGSET_T_REG_INDEX_MCVF)); + + /* The two unused registers beyond fpcr are inaccessible. */ + regcache_raw_supply (current_regcache, E_FPCR_REGNUM + 1, zerobuf); + regcache_raw_supply (current_regcache, E_FPCR_REGNUM + 2, zerobuf); + } + + /* Unpack an elf_fpregset_t into GDB's register cache. */ + + static void + supply_fpregset (elf_fpregset_t *fpregsetp) + { + register int regi; + + for (regi = 0; regi < ELF_NFPREG; regi++) + regcache_raw_supply (current_regcache, E_FS0_REGNUM + regi, + (void *) &fpregsetp->fpregs[regi]); + + regcache_raw_supply (current_regcache, E_FPCR_REGNUM, + (void *) &fpregsetp->fpcr); + + } + + /* Use a local version of this function to get the correct types for + regsets, until multi-arch core support is ready. */ + + static void + fetch_core_registers (char *core_reg_sect, unsigned core_reg_size, + int which, CORE_ADDR reg_addr) + { + elf_gregset_t gregset; + elf_fpregset_t fpregset; + + if (which == 0) + { + if (core_reg_size == sizeof (gregset)) + { + memcpy ((void *) &gregset, core_reg_sect, sizeof (gregset)); + supply_gregset (&gregset); + } + else + { + warning ("wrong size gregset struct in core file"); + } + } + else if (which == 2) + { + if (NUM_REGS <= E_FS0_REGNUM + 31) + { + warning ("Wrong mn10300 architecture for core file.\n" + "Hint: try \"set architecture am33-2\" before loading core file."); + } + else if (core_reg_size == sizeof (fpregset)) + { + memcpy ((void *) &fpregset, core_reg_sect, sizeof (fpregset)); + supply_fpregset (&fpregset); + } + else + { + warning ("wrong size fpregset struct in core file"); + } + } + } + + /* Register that we are able to handle ELF file formats using standard + procfs "regset" structures. */ + + static struct core_fns regset_core_fns = + { + bfd_target_elf_flavour, /* core_flavour */ + default_check_format, /* check_format */ + default_core_sniffer, /* core_sniffer */ + fetch_core_registers, /* core_read_registers */ + NULL /* next */ + }; + + void + _initialize_mn10300_linux_tdep (void) + { + deprecated_add_core_fns (®set_core_fns); + } Index: config/mn10300/linux.mt =================================================================== RCS file: config/mn10300/linux.mt diff -N config/mn10300/linux.mt *** /dev/null 1 Jan 1970 00:00:00 -0000 --- config/mn10300/linux.mt 30 Apr 2005 00:28:15 -0000 *************** *** 0 **** --- 1,6 ---- + # Target: Matsushita mn10300 running Linux + TDEPFILES= mn10300-tdep.o mn10300-linux-tdep.o corelow.o solib.o solib-svr4.o + DEPRECATED_TM_FILE= tm-linux.h + + # SIM_OBS = remote-sim.o + # SIM = ../sim/mn10300/libsim.a --------------070708050303050902040808--