1bb16d227Schristos /* gdb.c --- sim interface to GDB. 2bb16d227Schristos 3*8b657b07Schristos Copyright (C) 2005-2023 Free Software Foundation, Inc. 4bb16d227Schristos Contributed by Red Hat, Inc. 5bb16d227Schristos 6bb16d227Schristos This file is part of the GNU simulators. 7bb16d227Schristos 8bb16d227Schristos This program is free software; you can redistribute it and/or modify 9bb16d227Schristos it under the terms of the GNU General Public License as published by 10bb16d227Schristos the Free Software Foundation; either version 3 of the License, or 11bb16d227Schristos (at your option) any later version. 12bb16d227Schristos 13bb16d227Schristos This program is distributed in the hope that it will be useful, 14bb16d227Schristos but WITHOUT ANY WARRANTY; without even the implied warranty of 15bb16d227Schristos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16bb16d227Schristos GNU General Public License for more details. 17bb16d227Schristos 18bb16d227Schristos You should have received a copy of the GNU General Public License 19bb16d227Schristos along with this program. If not, see <http://www.gnu.org/licenses/>. */ 20bb16d227Schristos 21*8b657b07Schristos /* This must come before any other includes. */ 22*8b657b07Schristos #include "defs.h" 23*8b657b07Schristos 24bb16d227Schristos #include <stdio.h> 25bb16d227Schristos #include <assert.h> 26bb16d227Schristos #include <signal.h> 27bb16d227Schristos #include <stdlib.h> 28bb16d227Schristos #include <string.h> 29bb16d227Schristos #include <ctype.h> 30bb16d227Schristos 31bb16d227Schristos #include "ansidecl.h" 32*8b657b07Schristos #include "libiberty.h" 33*8b657b07Schristos #include "sim/callback.h" 34*8b657b07Schristos #include "sim/sim.h" 35bb16d227Schristos #include "gdb/signals.h" 36bb16d227Schristos #include "gdb/sim-m32c.h" 37bb16d227Schristos 38bb16d227Schristos #include "cpu.h" 39bb16d227Schristos #include "mem.h" 40bb16d227Schristos #include "load.h" 41bb16d227Schristos #include "syscalls.h" 42bb16d227Schristos #ifdef TIMER_A 43bb16d227Schristos #include "timer_a.h" 44bb16d227Schristos #endif 45bb16d227Schristos 46bb16d227Schristos /* I don't want to wrap up all the minisim's data structures in an 47bb16d227Schristos object and pass that around. That'd be a big change, and neither 48bb16d227Schristos GDB nor run needs that ability. 49bb16d227Schristos 50bb16d227Schristos So we just have one instance, that lives in global variables, and 51bb16d227Schristos each time we open it, we re-initialize it. */ 52bb16d227Schristos struct sim_state 53bb16d227Schristos { 54bb16d227Schristos const char *message; 55bb16d227Schristos }; 56bb16d227Schristos 57bb16d227Schristos static struct sim_state the_minisim = { 58bb16d227Schristos "This is the sole m32c minisim instance. See libsim.a's global variables." 59bb16d227Schristos }; 60bb16d227Schristos 61*8b657b07Schristos static int is_open; 62bb16d227Schristos 63bb16d227Schristos SIM_DESC 64bb16d227Schristos sim_open (SIM_OPEN_KIND kind, 65bb16d227Schristos struct host_callback_struct *callback, 66e5cb852cSchristos struct bfd *abfd, char * const *argv) 67bb16d227Schristos { 68bb16d227Schristos setbuf (stdout, 0); 69*8b657b07Schristos if (is_open) 70bb16d227Schristos fprintf (stderr, "m32c minisim: re-opened sim\n"); 71bb16d227Schristos 72bb16d227Schristos /* The 'run' interface doesn't use this function, so we don't care 73bb16d227Schristos about KIND; it's always SIM_OPEN_DEBUG. */ 74bb16d227Schristos if (kind != SIM_OPEN_DEBUG) 75bb16d227Schristos fprintf (stderr, "m32c minisim: sim_open KIND != SIM_OPEN_DEBUG: %d\n", 76bb16d227Schristos kind); 77bb16d227Schristos 78bb16d227Schristos if (abfd) 79bb16d227Schristos m32c_set_mach (bfd_get_mach (abfd)); 80bb16d227Schristos 81bb16d227Schristos /* We can use ABFD, if non-NULL to select the appropriate 82bb16d227Schristos architecture. But we only support the r8c right now. */ 83bb16d227Schristos 84bb16d227Schristos set_callbacks (callback); 85bb16d227Schristos 86bb16d227Schristos /* We don't expect any command-line arguments. */ 87bb16d227Schristos 88bb16d227Schristos init_mem (); 89bb16d227Schristos init_regs (); 90bb16d227Schristos 91*8b657b07Schristos is_open = 1; 92bb16d227Schristos return &the_minisim; 93bb16d227Schristos } 94bb16d227Schristos 95bb16d227Schristos static void 96bb16d227Schristos check_desc (SIM_DESC sd) 97bb16d227Schristos { 98bb16d227Schristos if (sd != &the_minisim) 99bb16d227Schristos fprintf (stderr, "m32c minisim: desc != &the_minisim\n"); 100bb16d227Schristos } 101bb16d227Schristos 102bb16d227Schristos void 103bb16d227Schristos sim_close (SIM_DESC sd, int quitting) 104bb16d227Schristos { 105bb16d227Schristos check_desc (sd); 106bb16d227Schristos 107bb16d227Schristos /* Not much to do. At least free up our memory. */ 108bb16d227Schristos init_mem (); 109bb16d227Schristos 110*8b657b07Schristos is_open = 0; 111bb16d227Schristos } 112bb16d227Schristos 113bb16d227Schristos static bfd * 114bb16d227Schristos open_objfile (const char *filename) 115bb16d227Schristos { 116bb16d227Schristos bfd *prog = bfd_openr (filename, 0); 117bb16d227Schristos 118bb16d227Schristos if (!prog) 119bb16d227Schristos { 120bb16d227Schristos fprintf (stderr, "Can't read %s\n", filename); 121bb16d227Schristos return 0; 122bb16d227Schristos } 123bb16d227Schristos 124bb16d227Schristos if (!bfd_check_format (prog, bfd_object)) 125bb16d227Schristos { 126bb16d227Schristos fprintf (stderr, "%s not a m32c program\n", filename); 127bb16d227Schristos return 0; 128bb16d227Schristos } 129bb16d227Schristos 130bb16d227Schristos return prog; 131bb16d227Schristos } 132bb16d227Schristos 133bb16d227Schristos 134bb16d227Schristos SIM_RC 135bb16d227Schristos sim_load (SIM_DESC sd, const char *prog, struct bfd * abfd, int from_tty) 136bb16d227Schristos { 137bb16d227Schristos check_desc (sd); 138bb16d227Schristos 139bb16d227Schristos if (!abfd) 140bb16d227Schristos abfd = open_objfile (prog); 141bb16d227Schristos if (!abfd) 142bb16d227Schristos return SIM_RC_FAIL; 143bb16d227Schristos 144bb16d227Schristos m32c_load (abfd); 145bb16d227Schristos 146bb16d227Schristos return SIM_RC_OK; 147bb16d227Schristos } 148bb16d227Schristos 149bb16d227Schristos SIM_RC 150e5cb852cSchristos sim_create_inferior (SIM_DESC sd, struct bfd * abfd, 151e5cb852cSchristos char * const *argv, char * const *env) 152bb16d227Schristos { 153bb16d227Schristos check_desc (sd); 154bb16d227Schristos 155bb16d227Schristos if (abfd) 156bb16d227Schristos m32c_load (abfd); 157bb16d227Schristos 158bb16d227Schristos return SIM_RC_OK; 159bb16d227Schristos } 160bb16d227Schristos 161bb16d227Schristos int 162*8b657b07Schristos sim_read (SIM_DESC sd, SIM_ADDR mem, void *buf, int length) 163bb16d227Schristos { 164bb16d227Schristos check_desc (sd); 165bb16d227Schristos 166bb16d227Schristos if (mem == 0) 167bb16d227Schristos return 0; 168bb16d227Schristos 169bb16d227Schristos mem_get_blk ((int) mem, buf, length); 170bb16d227Schristos 171bb16d227Schristos return length; 172bb16d227Schristos } 173bb16d227Schristos 174bb16d227Schristos int 175*8b657b07Schristos sim_write (SIM_DESC sd, SIM_ADDR mem, const void *buf, int length) 176bb16d227Schristos { 177bb16d227Schristos check_desc (sd); 178bb16d227Schristos 179bb16d227Schristos mem_put_blk ((int) mem, buf, length); 180bb16d227Schristos 181bb16d227Schristos return length; 182bb16d227Schristos } 183bb16d227Schristos 184bb16d227Schristos 185bb16d227Schristos /* Read the LENGTH bytes at BUF as an little-endian value. */ 186bb16d227Schristos static DI 187*8b657b07Schristos get_le (const unsigned char *buf, int length) 188bb16d227Schristos { 189bb16d227Schristos DI acc = 0; 190bb16d227Schristos while (--length >= 0) 191bb16d227Schristos acc = (acc << 8) + buf[length]; 192bb16d227Schristos 193bb16d227Schristos return acc; 194bb16d227Schristos } 195bb16d227Schristos 196bb16d227Schristos /* Store VAL as a little-endian value in the LENGTH bytes at BUF. */ 197bb16d227Schristos static void 198bb16d227Schristos put_le (unsigned char *buf, int length, DI val) 199bb16d227Schristos { 200bb16d227Schristos int i; 201bb16d227Schristos 202bb16d227Schristos for (i = 0; i < length; i++) 203bb16d227Schristos { 204bb16d227Schristos buf[i] = val & 0xff; 205bb16d227Schristos val >>= 8; 206bb16d227Schristos } 207bb16d227Schristos } 208bb16d227Schristos 209bb16d227Schristos static int 210bb16d227Schristos check_regno (enum m32c_sim_reg regno) 211bb16d227Schristos { 212bb16d227Schristos return 0 <= regno && regno < m32c_sim_reg_num_regs; 213bb16d227Schristos } 214bb16d227Schristos 215bb16d227Schristos static size_t 216bb16d227Schristos mask_size (int addr_mask) 217bb16d227Schristos { 218bb16d227Schristos switch (addr_mask) 219bb16d227Schristos { 220bb16d227Schristos case 0xffff: 221bb16d227Schristos return 2; 222bb16d227Schristos case 0xfffff: 223bb16d227Schristos case 0xffffff: 224bb16d227Schristos return 3; 225bb16d227Schristos default: 226bb16d227Schristos fprintf (stderr, 227bb16d227Schristos "m32c minisim: addr_mask_size: unexpected mask 0x%x\n", 228bb16d227Schristos addr_mask); 229bb16d227Schristos return sizeof (addr_mask); 230bb16d227Schristos } 231bb16d227Schristos } 232bb16d227Schristos 233bb16d227Schristos static size_t 234bb16d227Schristos reg_size (enum m32c_sim_reg regno) 235bb16d227Schristos { 236bb16d227Schristos switch (regno) 237bb16d227Schristos { 238bb16d227Schristos case m32c_sim_reg_r0_bank0: 239bb16d227Schristos case m32c_sim_reg_r1_bank0: 240bb16d227Schristos case m32c_sim_reg_r2_bank0: 241bb16d227Schristos case m32c_sim_reg_r3_bank0: 242bb16d227Schristos case m32c_sim_reg_r0_bank1: 243bb16d227Schristos case m32c_sim_reg_r1_bank1: 244bb16d227Schristos case m32c_sim_reg_r2_bank1: 245bb16d227Schristos case m32c_sim_reg_r3_bank1: 246bb16d227Schristos case m32c_sim_reg_flg: 247bb16d227Schristos case m32c_sim_reg_svf: 248bb16d227Schristos return 2; 249bb16d227Schristos 250bb16d227Schristos case m32c_sim_reg_a0_bank0: 251bb16d227Schristos case m32c_sim_reg_a1_bank0: 252bb16d227Schristos case m32c_sim_reg_fb_bank0: 253bb16d227Schristos case m32c_sim_reg_sb_bank0: 254bb16d227Schristos case m32c_sim_reg_a0_bank1: 255bb16d227Schristos case m32c_sim_reg_a1_bank1: 256bb16d227Schristos case m32c_sim_reg_fb_bank1: 257bb16d227Schristos case m32c_sim_reg_sb_bank1: 258bb16d227Schristos case m32c_sim_reg_usp: 259bb16d227Schristos case m32c_sim_reg_isp: 260bb16d227Schristos return mask_size (addr_mask); 261bb16d227Schristos 262bb16d227Schristos case m32c_sim_reg_pc: 263bb16d227Schristos case m32c_sim_reg_intb: 264bb16d227Schristos case m32c_sim_reg_svp: 265bb16d227Schristos case m32c_sim_reg_vct: 266bb16d227Schristos return mask_size (membus_mask); 267bb16d227Schristos 268bb16d227Schristos case m32c_sim_reg_dmd0: 269bb16d227Schristos case m32c_sim_reg_dmd1: 270bb16d227Schristos return 1; 271bb16d227Schristos 272bb16d227Schristos case m32c_sim_reg_dct0: 273bb16d227Schristos case m32c_sim_reg_dct1: 274bb16d227Schristos case m32c_sim_reg_drc0: 275bb16d227Schristos case m32c_sim_reg_drc1: 276bb16d227Schristos return 2; 277bb16d227Schristos 278bb16d227Schristos case m32c_sim_reg_dma0: 279bb16d227Schristos case m32c_sim_reg_dma1: 280bb16d227Schristos case m32c_sim_reg_dsa0: 281bb16d227Schristos case m32c_sim_reg_dsa1: 282bb16d227Schristos case m32c_sim_reg_dra0: 283bb16d227Schristos case m32c_sim_reg_dra1: 284bb16d227Schristos return 3; 285bb16d227Schristos 286bb16d227Schristos default: 287bb16d227Schristos fprintf (stderr, "m32c minisim: unrecognized register number: %d\n", 288bb16d227Schristos regno); 289bb16d227Schristos return -1; 290bb16d227Schristos } 291bb16d227Schristos } 292bb16d227Schristos 293bb16d227Schristos int 294*8b657b07Schristos sim_fetch_register (SIM_DESC sd, int regno, void *buf, int length) 295bb16d227Schristos { 296bb16d227Schristos size_t size; 297bb16d227Schristos 298bb16d227Schristos check_desc (sd); 299bb16d227Schristos 300bb16d227Schristos if (!check_regno (regno)) 301bb16d227Schristos return 0; 302bb16d227Schristos 303bb16d227Schristos size = reg_size (regno); 304bb16d227Schristos if (length == size) 305bb16d227Schristos { 306bb16d227Schristos DI val; 307bb16d227Schristos 308bb16d227Schristos switch (regno) 309bb16d227Schristos { 310bb16d227Schristos case m32c_sim_reg_r0_bank0: 311bb16d227Schristos val = regs.r[0].r_r0; 312bb16d227Schristos break; 313bb16d227Schristos case m32c_sim_reg_r1_bank0: 314bb16d227Schristos val = regs.r[0].r_r1; 315bb16d227Schristos break; 316bb16d227Schristos case m32c_sim_reg_r2_bank0: 317bb16d227Schristos val = regs.r[0].r_r2; 318bb16d227Schristos break; 319bb16d227Schristos case m32c_sim_reg_r3_bank0: 320bb16d227Schristos val = regs.r[0].r_r3; 321bb16d227Schristos break; 322bb16d227Schristos case m32c_sim_reg_a0_bank0: 323bb16d227Schristos val = regs.r[0].r_a0; 324bb16d227Schristos break; 325bb16d227Schristos case m32c_sim_reg_a1_bank0: 326bb16d227Schristos val = regs.r[0].r_a1; 327bb16d227Schristos break; 328bb16d227Schristos case m32c_sim_reg_fb_bank0: 329bb16d227Schristos val = regs.r[0].r_fb; 330bb16d227Schristos break; 331bb16d227Schristos case m32c_sim_reg_sb_bank0: 332bb16d227Schristos val = regs.r[0].r_sb; 333bb16d227Schristos break; 334bb16d227Schristos case m32c_sim_reg_r0_bank1: 335bb16d227Schristos val = regs.r[1].r_r0; 336bb16d227Schristos break; 337bb16d227Schristos case m32c_sim_reg_r1_bank1: 338bb16d227Schristos val = regs.r[1].r_r1; 339bb16d227Schristos break; 340bb16d227Schristos case m32c_sim_reg_r2_bank1: 341bb16d227Schristos val = regs.r[1].r_r2; 342bb16d227Schristos break; 343bb16d227Schristos case m32c_sim_reg_r3_bank1: 344bb16d227Schristos val = regs.r[1].r_r3; 345bb16d227Schristos break; 346bb16d227Schristos case m32c_sim_reg_a0_bank1: 347bb16d227Schristos val = regs.r[1].r_a0; 348bb16d227Schristos break; 349bb16d227Schristos case m32c_sim_reg_a1_bank1: 350bb16d227Schristos val = regs.r[1].r_a1; 351bb16d227Schristos break; 352bb16d227Schristos case m32c_sim_reg_fb_bank1: 353bb16d227Schristos val = regs.r[1].r_fb; 354bb16d227Schristos break; 355bb16d227Schristos case m32c_sim_reg_sb_bank1: 356bb16d227Schristos val = regs.r[1].r_sb; 357bb16d227Schristos break; 358bb16d227Schristos 359bb16d227Schristos case m32c_sim_reg_usp: 360bb16d227Schristos val = regs.r_usp; 361bb16d227Schristos break; 362bb16d227Schristos case m32c_sim_reg_isp: 363bb16d227Schristos val = regs.r_isp; 364bb16d227Schristos break; 365bb16d227Schristos case m32c_sim_reg_pc: 366bb16d227Schristos val = regs.r_pc; 367bb16d227Schristos break; 368bb16d227Schristos case m32c_sim_reg_intb: 369bb16d227Schristos val = regs.r_intbl * 65536 + regs.r_intbl; 370bb16d227Schristos break; 371bb16d227Schristos case m32c_sim_reg_flg: 372bb16d227Schristos val = regs.r_flags; 373bb16d227Schristos break; 374bb16d227Schristos 375bb16d227Schristos /* These registers aren't implemented by the minisim. */ 376bb16d227Schristos case m32c_sim_reg_svf: 377bb16d227Schristos case m32c_sim_reg_svp: 378bb16d227Schristos case m32c_sim_reg_vct: 379bb16d227Schristos case m32c_sim_reg_dmd0: 380bb16d227Schristos case m32c_sim_reg_dmd1: 381bb16d227Schristos case m32c_sim_reg_dct0: 382bb16d227Schristos case m32c_sim_reg_dct1: 383bb16d227Schristos case m32c_sim_reg_drc0: 384bb16d227Schristos case m32c_sim_reg_drc1: 385bb16d227Schristos case m32c_sim_reg_dma0: 386bb16d227Schristos case m32c_sim_reg_dma1: 387bb16d227Schristos case m32c_sim_reg_dsa0: 388bb16d227Schristos case m32c_sim_reg_dsa1: 389bb16d227Schristos case m32c_sim_reg_dra0: 390bb16d227Schristos case m32c_sim_reg_dra1: 391bb16d227Schristos return 0; 392bb16d227Schristos 393bb16d227Schristos default: 394bb16d227Schristos fprintf (stderr, "m32c minisim: unrecognized register number: %d\n", 395bb16d227Schristos regno); 396bb16d227Schristos return -1; 397bb16d227Schristos } 398bb16d227Schristos 399bb16d227Schristos put_le (buf, length, val); 400bb16d227Schristos } 401bb16d227Schristos 402bb16d227Schristos return size; 403bb16d227Schristos } 404bb16d227Schristos 405bb16d227Schristos int 406*8b657b07Schristos sim_store_register (SIM_DESC sd, int regno, const void *buf, int length) 407bb16d227Schristos { 408bb16d227Schristos size_t size; 409bb16d227Schristos 410bb16d227Schristos check_desc (sd); 411bb16d227Schristos 412bb16d227Schristos if (!check_regno (regno)) 413bb16d227Schristos return -1; 414bb16d227Schristos 415bb16d227Schristos size = reg_size (regno); 416bb16d227Schristos 417bb16d227Schristos if (length == size) 418bb16d227Schristos { 419bb16d227Schristos DI val = get_le (buf, length); 420bb16d227Schristos 421bb16d227Schristos switch (regno) 422bb16d227Schristos { 423bb16d227Schristos case m32c_sim_reg_r0_bank0: 424bb16d227Schristos regs.r[0].r_r0 = val & 0xffff; 425bb16d227Schristos break; 426bb16d227Schristos case m32c_sim_reg_r1_bank0: 427bb16d227Schristos regs.r[0].r_r1 = val & 0xffff; 428bb16d227Schristos break; 429bb16d227Schristos case m32c_sim_reg_r2_bank0: 430bb16d227Schristos regs.r[0].r_r2 = val & 0xffff; 431bb16d227Schristos break; 432bb16d227Schristos case m32c_sim_reg_r3_bank0: 433bb16d227Schristos regs.r[0].r_r3 = val & 0xffff; 434bb16d227Schristos break; 435bb16d227Schristos case m32c_sim_reg_a0_bank0: 436bb16d227Schristos regs.r[0].r_a0 = val & addr_mask; 437bb16d227Schristos break; 438bb16d227Schristos case m32c_sim_reg_a1_bank0: 439bb16d227Schristos regs.r[0].r_a1 = val & addr_mask; 440bb16d227Schristos break; 441bb16d227Schristos case m32c_sim_reg_fb_bank0: 442bb16d227Schristos regs.r[0].r_fb = val & addr_mask; 443bb16d227Schristos break; 444bb16d227Schristos case m32c_sim_reg_sb_bank0: 445bb16d227Schristos regs.r[0].r_sb = val & addr_mask; 446bb16d227Schristos break; 447bb16d227Schristos case m32c_sim_reg_r0_bank1: 448bb16d227Schristos regs.r[1].r_r0 = val & 0xffff; 449bb16d227Schristos break; 450bb16d227Schristos case m32c_sim_reg_r1_bank1: 451bb16d227Schristos regs.r[1].r_r1 = val & 0xffff; 452bb16d227Schristos break; 453bb16d227Schristos case m32c_sim_reg_r2_bank1: 454bb16d227Schristos regs.r[1].r_r2 = val & 0xffff; 455bb16d227Schristos break; 456bb16d227Schristos case m32c_sim_reg_r3_bank1: 457bb16d227Schristos regs.r[1].r_r3 = val & 0xffff; 458bb16d227Schristos break; 459bb16d227Schristos case m32c_sim_reg_a0_bank1: 460bb16d227Schristos regs.r[1].r_a0 = val & addr_mask; 461bb16d227Schristos break; 462bb16d227Schristos case m32c_sim_reg_a1_bank1: 463bb16d227Schristos regs.r[1].r_a1 = val & addr_mask; 464bb16d227Schristos break; 465bb16d227Schristos case m32c_sim_reg_fb_bank1: 466bb16d227Schristos regs.r[1].r_fb = val & addr_mask; 467bb16d227Schristos break; 468bb16d227Schristos case m32c_sim_reg_sb_bank1: 469bb16d227Schristos regs.r[1].r_sb = val & addr_mask; 470bb16d227Schristos break; 471bb16d227Schristos 472bb16d227Schristos case m32c_sim_reg_usp: 473bb16d227Schristos regs.r_usp = val & addr_mask; 474bb16d227Schristos break; 475bb16d227Schristos case m32c_sim_reg_isp: 476bb16d227Schristos regs.r_isp = val & addr_mask; 477bb16d227Schristos break; 478bb16d227Schristos case m32c_sim_reg_pc: 479bb16d227Schristos regs.r_pc = val & membus_mask; 480bb16d227Schristos break; 481bb16d227Schristos case m32c_sim_reg_intb: 482bb16d227Schristos regs.r_intbl = (val & membus_mask) & 0xffff; 483bb16d227Schristos regs.r_intbh = (val & membus_mask) >> 16; 484bb16d227Schristos break; 485bb16d227Schristos case m32c_sim_reg_flg: 486bb16d227Schristos regs.r_flags = val & 0xffff; 487bb16d227Schristos break; 488bb16d227Schristos 489bb16d227Schristos /* These registers aren't implemented by the minisim. */ 490bb16d227Schristos case m32c_sim_reg_svf: 491bb16d227Schristos case m32c_sim_reg_svp: 492bb16d227Schristos case m32c_sim_reg_vct: 493bb16d227Schristos case m32c_sim_reg_dmd0: 494bb16d227Schristos case m32c_sim_reg_dmd1: 495bb16d227Schristos case m32c_sim_reg_dct0: 496bb16d227Schristos case m32c_sim_reg_dct1: 497bb16d227Schristos case m32c_sim_reg_drc0: 498bb16d227Schristos case m32c_sim_reg_drc1: 499bb16d227Schristos case m32c_sim_reg_dma0: 500bb16d227Schristos case m32c_sim_reg_dma1: 501bb16d227Schristos case m32c_sim_reg_dsa0: 502bb16d227Schristos case m32c_sim_reg_dsa1: 503bb16d227Schristos case m32c_sim_reg_dra0: 504bb16d227Schristos case m32c_sim_reg_dra1: 505bb16d227Schristos return 0; 506bb16d227Schristos 507bb16d227Schristos default: 508bb16d227Schristos fprintf (stderr, "m32c minisim: unrecognized register number: %d\n", 509bb16d227Schristos regno); 510bb16d227Schristos return 0; 511bb16d227Schristos } 512bb16d227Schristos } 513bb16d227Schristos 514bb16d227Schristos return size; 515bb16d227Schristos } 516bb16d227Schristos 517bb16d227Schristos static volatile int stop; 518bb16d227Schristos static enum sim_stop reason; 519bb16d227Schristos static int siggnal; 520bb16d227Schristos 521bb16d227Schristos 522bb16d227Schristos /* Given a signal number used by the M32C bsp (that is, newlib), 523bb16d227Schristos return a target signal number used by GDB. */ 524bb16d227Schristos static int 525bb16d227Schristos m32c_signal_to_target (int m32c) 526bb16d227Schristos { 527bb16d227Schristos switch (m32c) 528bb16d227Schristos { 529bb16d227Schristos case 4: 530bb16d227Schristos return GDB_SIGNAL_ILL; 531bb16d227Schristos 532bb16d227Schristos case 5: 533bb16d227Schristos return GDB_SIGNAL_TRAP; 534bb16d227Schristos 535bb16d227Schristos case 10: 536bb16d227Schristos return GDB_SIGNAL_BUS; 537bb16d227Schristos 538bb16d227Schristos case 11: 539bb16d227Schristos return GDB_SIGNAL_SEGV; 540bb16d227Schristos 541bb16d227Schristos case 24: 542bb16d227Schristos return GDB_SIGNAL_XCPU; 543bb16d227Schristos 544bb16d227Schristos case 2: 545bb16d227Schristos return GDB_SIGNAL_INT; 546bb16d227Schristos 547bb16d227Schristos case 8: 548bb16d227Schristos return GDB_SIGNAL_FPE; 549bb16d227Schristos 550bb16d227Schristos case 6: 551bb16d227Schristos return GDB_SIGNAL_ABRT; 552bb16d227Schristos } 553bb16d227Schristos 554bb16d227Schristos return 0; 555bb16d227Schristos } 556bb16d227Schristos 557bb16d227Schristos 558bb16d227Schristos /* Take a step return code RC and set up the variables consulted by 559bb16d227Schristos sim_stop_reason appropriately. */ 560bb16d227Schristos static void 561bb16d227Schristos handle_step (int rc) 562bb16d227Schristos { 563bb16d227Schristos if (M32C_STEPPED (rc) || M32C_HIT_BREAK (rc)) 564bb16d227Schristos { 565bb16d227Schristos reason = sim_stopped; 566bb16d227Schristos siggnal = GDB_SIGNAL_TRAP; 567bb16d227Schristos } 568bb16d227Schristos else if (M32C_STOPPED (rc)) 569bb16d227Schristos { 570bb16d227Schristos reason = sim_stopped; 571bb16d227Schristos siggnal = m32c_signal_to_target (M32C_STOP_SIG (rc)); 572bb16d227Schristos } 573bb16d227Schristos else 574bb16d227Schristos { 575bb16d227Schristos assert (M32C_EXITED (rc)); 576bb16d227Schristos reason = sim_exited; 577bb16d227Schristos siggnal = M32C_EXIT_STATUS (rc); 578bb16d227Schristos } 579bb16d227Schristos } 580bb16d227Schristos 581bb16d227Schristos 582bb16d227Schristos void 583bb16d227Schristos sim_resume (SIM_DESC sd, int step, int sig_to_deliver) 584bb16d227Schristos { 585bb16d227Schristos check_desc (sd); 586bb16d227Schristos 587bb16d227Schristos if (sig_to_deliver != 0) 588bb16d227Schristos { 589bb16d227Schristos fprintf (stderr, 590bb16d227Schristos "Warning: the m32c minisim does not implement " 591bb16d227Schristos "signal delivery yet.\n" "Resuming with no signal.\n"); 592bb16d227Schristos } 593bb16d227Schristos 594bb16d227Schristos if (step) 595bb16d227Schristos { 596bb16d227Schristos handle_step (decode_opcode ()); 597bb16d227Schristos #ifdef TIMER_A 598bb16d227Schristos update_timer_a (); 599bb16d227Schristos #endif 600bb16d227Schristos } 601bb16d227Schristos else 602bb16d227Schristos { 603bb16d227Schristos /* We don't clear 'stop' here, because then we would miss 604bb16d227Schristos interrupts that arrived on the way here. Instead, we clear 605bb16d227Schristos the flag in sim_stop_reason, after GDB has disabled the 606bb16d227Schristos interrupt signal handler. */ 607bb16d227Schristos for (;;) 608bb16d227Schristos { 609bb16d227Schristos int rc; 610bb16d227Schristos 611bb16d227Schristos if (stop) 612bb16d227Schristos { 613bb16d227Schristos stop = 0; 614bb16d227Schristos reason = sim_stopped; 615bb16d227Schristos siggnal = GDB_SIGNAL_INT; 616bb16d227Schristos break; 617bb16d227Schristos } 618bb16d227Schristos 619bb16d227Schristos rc = decode_opcode (); 620bb16d227Schristos #ifdef TIMER_A 621bb16d227Schristos update_timer_a (); 622bb16d227Schristos #endif 623bb16d227Schristos 624bb16d227Schristos if (!M32C_STEPPED (rc)) 625bb16d227Schristos { 626bb16d227Schristos handle_step (rc); 627bb16d227Schristos break; 628bb16d227Schristos } 629bb16d227Schristos } 630bb16d227Schristos } 631bb16d227Schristos m32c_sim_restore_console (); 632bb16d227Schristos } 633bb16d227Schristos 634bb16d227Schristos int 635bb16d227Schristos sim_stop (SIM_DESC sd) 636bb16d227Schristos { 637bb16d227Schristos stop = 1; 638bb16d227Schristos 639bb16d227Schristos return 1; 640bb16d227Schristos } 641bb16d227Schristos 642bb16d227Schristos void 643bb16d227Schristos sim_stop_reason (SIM_DESC sd, enum sim_stop *reason_p, int *sigrc_p) 644bb16d227Schristos { 645bb16d227Schristos check_desc (sd); 646bb16d227Schristos 647bb16d227Schristos *reason_p = reason; 648bb16d227Schristos *sigrc_p = siggnal; 649bb16d227Schristos } 650bb16d227Schristos 651bb16d227Schristos void 652bb16d227Schristos sim_do_command (SIM_DESC sd, const char *cmd) 653bb16d227Schristos { 654*8b657b07Schristos const char *arg; 655*8b657b07Schristos char **argv = buildargv (cmd); 656bb16d227Schristos 657bb16d227Schristos check_desc (sd); 658bb16d227Schristos 659*8b657b07Schristos cmd = arg = ""; 660*8b657b07Schristos if (argv != NULL) 661bb16d227Schristos { 662*8b657b07Schristos if (argv[0] != NULL) 663*8b657b07Schristos cmd = argv[0]; 664*8b657b07Schristos if (argv[1] != NULL) 665*8b657b07Schristos arg = argv[1]; 666bb16d227Schristos } 667bb16d227Schristos 668bb16d227Schristos if (strcmp (cmd, "trace") == 0) 669bb16d227Schristos { 670*8b657b07Schristos if (strcmp (arg, "on") == 0) 671bb16d227Schristos trace = 1; 672*8b657b07Schristos else if (strcmp (arg, "off") == 0) 673bb16d227Schristos trace = 0; 674bb16d227Schristos else 675bb16d227Schristos printf ("The 'sim trace' command expects 'on' or 'off' " 676bb16d227Schristos "as an argument.\n"); 677bb16d227Schristos } 678bb16d227Schristos else if (strcmp (cmd, "verbose") == 0) 679bb16d227Schristos { 680*8b657b07Schristos if (strcmp (arg, "on") == 0) 681bb16d227Schristos verbose = 1; 682*8b657b07Schristos else if (strcmp (arg, "off") == 0) 683bb16d227Schristos verbose = 0; 684bb16d227Schristos else 685bb16d227Schristos printf ("The 'sim verbose' command expects 'on' or 'off'" 686bb16d227Schristos " as an argument.\n"); 687bb16d227Schristos } 688bb16d227Schristos else 689bb16d227Schristos printf ("The 'sim' command expects either 'trace' or 'verbose'" 690bb16d227Schristos " as a subcommand.\n"); 691bb16d227Schristos 692*8b657b07Schristos freeargv (argv); 693bb16d227Schristos } 694bb16d227Schristos 695bb16d227Schristos char ** 696bb16d227Schristos sim_complete_command (SIM_DESC sd, const char *text, const char *word) 697bb16d227Schristos { 698bb16d227Schristos return NULL; 699bb16d227Schristos } 700e5cb852cSchristos 701*8b657b07Schristos char * 702*8b657b07Schristos sim_memory_map (SIM_DESC sd) 703*8b657b07Schristos { 704*8b657b07Schristos return NULL; 705*8b657b07Schristos } 706*8b657b07Schristos 707e5cb852cSchristos void 708e5cb852cSchristos sim_info (SIM_DESC sd, int verbose) 709e5cb852cSchristos { 710e5cb852cSchristos printf ("The m32c minisim doesn't collect any statistics.\n"); 711e5cb852cSchristos } 712