Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Michael Snyder <msnyder@redhat.com>
To: Shrinivas Atre <ShrinivasA@KPITCummins.com>
Cc: gdb-patches@sources.redhat.com, nickc@redhat.com
Subject: Re: RFA - PATCH - Support  H8/300H and H8S Normal Mode for GDB
Date: Thu, 09 Oct 2003 21:23:00 -0000	[thread overview]
Message-ID: <3F85D1DB.5030807@redhat.com> (raw)
In-Reply-To: <69595093233BB547BB70CF5E492B63F201F7240B@sohm.kpit.com>

Shrinivas Atre wrote:
> Hi,
> 
> The attached patch enables debugging and simulation of H8/300H and H8S 
> Normal Mode binaries in GDB.
> 
> Is that OK for mainline and 6.0 branch ?
> 
> The patches are attached as well as included inline.
> 
> Regards,
> Shrinivas

Hi Shrinivas,

I'm sorry for the delay.  Yes, these are fine -- except that I can't
approve the BFD part.  Please submit that separately to
binutils@sources.redhat.com, it should be approved as a matter
of course.  Then you can check everything in -- and thanks.

Michael

> 
> =====================================================================
> Changelog:
> 
> 2003-09-15  Shrinivas Atre  <shrinivasa@KPITCummins.com>
>       * bfd/coff-h8300.c (funcvec_hash_newfunc): Handle normal mode
>         (h8300_reloc16_extra_cases) : Ditto
>         (h8300_bfd_link_add_symbols) : Ditto
>       * gdb/config/h8300/tm-h8300.h : Addition of extern variable Normalmode 
>       * gdb/h8300-tdep.c (BINWORD): Update BINWORD for Normalmode
>         (h8300_examine_prologue): Use Normalmode flag
>         (h8300_gdbarch_init): Set architecture info for normal mode
>       * sim/h8300/compile.c : Addition of extern variable Normalmode 
>         (SP) : Handle normal mode 
>         (bitfrom) : Use normal mode flag to return suitable value
>         (lvalue) : Use normal mode flag to return command line location
>         (decode) : Decode instruction correctly for normal mode
>         (init_pointers) : Initialise memory correctly for normal mode
>         (sim_resume) : Handle cases for normal mode using normal mode flag
>         (sim_store_register) : Handle 2 byte PC for normal mode 
>         (sim_fetch_register) : Handle 2 byte PC for normal mode
>         (set_h8300h) : Set normal mode flag as per architechture
>         (sim_load) : Allocate 64K for normal mode instead of bigger memory
> 
> =====================================================================
> 
> --- src/bfd/coff-h8300.c.orig	Mon Sep 15 14:14:58 2003
> +++ src/bfd/coff-h8300.c	Mon Sep 15 14:10:22 2003
> @@ -154,7 +154,9 @@ funcvec_hash_newfunc (struct bfd_hash_en
>    /* Bump the offset at which we store entries in the function
>       vector.  We'd like to bump up the size of the vectors section,
>       but it's not easily available here.  */
> -  if (bfd_get_mach (table->abfd) == bfd_mach_h8300)
> +  if (bfd_get_mach (table->abfd) == bfd_mach_h8300
> +    || bfd_get_mach (table->abfd) == bfd_mach_h8300hn
> +    || bfd_get_mach (table->abfd) == bfd_mach_h8300sn)
>      table->offset += 2;
>    else if (bfd_get_mach (table->abfd) == bfd_mach_h8300h
>  	   || bfd_get_mach (table->abfd) == bfd_mach_h8300s)
> @@ -1124,7 +1126,9 @@ h8300_reloc16_extra_cases (bfd *abfd, st
>  	src_address++;
>  
>  	/* Now create an entry in the function vector itself.  */
> -	if (bfd_get_mach (input_section->owner) == bfd_mach_h8300)
> +	if (bfd_get_mach (input_section->owner) == bfd_mach_h8300
> +	  || bfd_get_mach (input_section->owner) == bfd_mach_h8300hn
> +	  || bfd_get_mach (input_section->owner) == bfd_mach_h8300sn)
>  	  bfd_put_16 (abfd,
>  		      bfd_coff_reloc16_get_value (reloc,
>  						  link_info,
> @@ -1304,7 +1308,9 @@ h8300_bfd_link_add_symbols (bfd *abfd, s
>  
>  		  /* Bump the size of the vectors section.  Each vector
>  		     takes 2 bytes on the h8300 and 4 bytes on the h8300h.  */
> -		  if (bfd_get_mach (abfd) == bfd_mach_h8300)
> +		  if (bfd_get_mach (abfd) == bfd_mach_h8300
> +		    || bfd_get_mach (abfd) == bfd_mach_h8300hn
> +		    || bfd_get_mach (abfd) == bfd_mach_h8300sn)
>  		    htab->vectors_sec->_raw_size += 2;
>  		  else if (bfd_get_mach (abfd) == bfd_mach_h8300h
>  			   || bfd_get_mach (abfd) == bfd_mach_h8300s)
> 
> ---------------------------------------------------------------------
> 
> --- src/gdb/config/h8300/tm-h8300.h.orig	Mon Sep 15 10:46:23 2003
> +++ src/gdb/config/h8300/tm-h8300.h	Mon Sep 15 13:32:23 2003
> @@ -26,6 +26,7 @@
>     GDB_TARGET_IS_H8300 in remote-e7000.c */
>  extern int h8300hmode;
>  extern int h8300smode;
> +extern int NormalMode; /* 1 - Normal Mode , 0 - Advanced mode */
>  extern int h8300sxmode;
>  #define GDB_TARGET_IS_H8300
>  
> ---------------------------------------------------------------------
> 
> --- src/gdb/h8300-tdep.c.orig	Mon Sep 15 10:43:31 2003
> +++ src/gdb/h8300-tdep.c	Mon Sep 15 13:32:30 2003
> @@ -49,7 +49,7 @@ enum
>    h8300h_reg_size = 4,
>    h8300_max_reg_size = 4,
>  };
> -#define BINWORD (h8300hmode ? h8300h_reg_size : h8300_reg_size)
> +#define BINWORD (h8300hmode && 0 == NormalMode ? h8300h_reg_size : h8300_reg_size)
>  
>  enum gdb_regnum
>  {
> @@ -350,7 +350,7 @@ h8300_examine_prologue (register CORE_AD
>      }
>  
>    /* If the PC isn't valid, quit now.  */
> -  if (ip == 0 || ip & (h8300hmode ? ~0xffffff : ~0xffff))
> +  if (ip == 0 || ip & (h8300hmode && 0 == NormalMode ? ~0xffffff : ~0xffff))
>      return 0;
>  
>    next_ip = h8300_next_prologue_insn (ip, limit, &insn_word);
> @@ -1214,8 +1214,26 @@ h8300_gdbarch_init (struct gdbarch_info 
>        set_gdbarch_store_return_value (gdbarch, h8300_store_return_value);
>        set_gdbarch_print_insn (gdbarch, print_insn_h8300);
>        break;
> -    case bfd_mach_h8300h:
>      case bfd_mach_h8300hn:
> +      NormalMode = 1;
> +      h8300sxmode = 0;
> +      h8300smode = 0;
> +      h8300hmode = 1;
> +      set_gdbarch_num_regs (gdbarch, 13);
> +      set_gdbarch_num_pseudo_regs (gdbarch, 1);
> +      set_gdbarch_ecoff_reg_to_regnum (gdbarch, h8300_dbg_reg_to_regnum);
> +      set_gdbarch_dwarf_reg_to_regnum (gdbarch, h8300_dbg_reg_to_regnum);
> +      set_gdbarch_dwarf2_reg_to_regnum (gdbarch, h8300_dbg_reg_to_regnum);
> +      set_gdbarch_stab_reg_to_regnum (gdbarch, h8300_dbg_reg_to_regnum);
> +      set_gdbarch_register_name (gdbarch, h8300_register_name);
> +      set_gdbarch_ptr_bit (gdbarch, 2 * TARGET_CHAR_BIT);
> +      set_gdbarch_addr_bit (gdbarch, 2 * TARGET_CHAR_BIT);
> +      set_gdbarch_extract_return_value (gdbarch, h8300h_extract_return_value);
> +      set_gdbarch_store_return_value (gdbarch, h8300h_store_return_value);
> +      set_gdbarch_print_insn (gdbarch, print_insn_h8300h);
> +      break;
> +    case bfd_mach_h8300h:
> +      NormalMode = 0;
>        h8300sxmode = 0;
>        h8300smode = 0;
>        h8300hmode = 1;
> @@ -1232,8 +1250,26 @@ h8300_gdbarch_init (struct gdbarch_info 
>        set_gdbarch_store_return_value (gdbarch, h8300h_store_return_value);
>        set_gdbarch_print_insn (gdbarch, print_insn_h8300h);
>        break;
> -    case bfd_mach_h8300s:
>      case bfd_mach_h8300sn:
> +      NormalMode = 1;
> +      h8300sxmode = 0;
> +      h8300smode = 1;
> +      h8300hmode = 1;
> +      set_gdbarch_num_regs (gdbarch, 16);
> +      set_gdbarch_num_pseudo_regs (gdbarch, 2);
> +      set_gdbarch_ecoff_reg_to_regnum (gdbarch, h8300s_dbg_reg_to_regnum);
> +      set_gdbarch_dwarf_reg_to_regnum (gdbarch, h8300s_dbg_reg_to_regnum);
> +      set_gdbarch_dwarf2_reg_to_regnum (gdbarch, h8300s_dbg_reg_to_regnum);
> +      set_gdbarch_stab_reg_to_regnum (gdbarch, h8300s_dbg_reg_to_regnum);
> +      set_gdbarch_register_name (gdbarch, h8300s_register_name);
> +      set_gdbarch_ptr_bit (gdbarch, 2 * TARGET_CHAR_BIT);
> +      set_gdbarch_addr_bit (gdbarch, 2 * TARGET_CHAR_BIT);
> +      set_gdbarch_extract_return_value (gdbarch, h8300h_extract_return_value);
> +      set_gdbarch_store_return_value (gdbarch, h8300h_store_return_value);
> +      set_gdbarch_print_insn (gdbarch, print_insn_h8300s);
> +      break;
> +    case bfd_mach_h8300s:
> +      NormalMode = 0;
>        h8300sxmode = 0;
>        h8300smode = 1;
>        h8300hmode = 1;
> @@ -1250,8 +1286,26 @@ h8300_gdbarch_init (struct gdbarch_info 
>        set_gdbarch_store_return_value (gdbarch, h8300h_store_return_value);
>        set_gdbarch_print_insn (gdbarch, print_insn_h8300s);
>        break;
> -    case bfd_mach_h8300sx:
>      case bfd_mach_h8300sxn:
> +      NormalMode = 1;
> +      h8300sxmode = 1;
> +      h8300smode = 1;
> +      h8300hmode = 1;
> +      set_gdbarch_num_regs (gdbarch, 18);
> +      set_gdbarch_num_pseudo_regs (gdbarch, 2);
> +      set_gdbarch_ecoff_reg_to_regnum (gdbarch, h8300s_dbg_reg_to_regnum);
> +      set_gdbarch_dwarf_reg_to_regnum (gdbarch, h8300s_dbg_reg_to_regnum);
> +      set_gdbarch_dwarf2_reg_to_regnum (gdbarch, h8300s_dbg_reg_to_regnum);
> +      set_gdbarch_stab_reg_to_regnum (gdbarch, h8300s_dbg_reg_to_regnum);
> +      set_gdbarch_register_name (gdbarch, h8300sx_register_name);
> +      set_gdbarch_ptr_bit (gdbarch, 2 * TARGET_CHAR_BIT);
> +      set_gdbarch_addr_bit (gdbarch, 2 * TARGET_CHAR_BIT);
> +      set_gdbarch_extract_return_value (gdbarch, h8300h_extract_return_value);
> +      set_gdbarch_store_return_value (gdbarch, h8300h_store_return_value);
> +      set_gdbarch_print_insn (gdbarch, print_insn_h8300s);
> +      break;
> +    case bfd_mach_h8300sx:
> +      NormalMode = 0;
>        h8300sxmode = 1;
>        h8300smode = 1;
>        h8300hmode = 1;
> 
> ---------------------------------------------------------------------
> 
> --- src/sim/h8300/compile.c.orig	Mon Sep 15 14:00:52 2003
> +++ src/sim/h8300/compile.c	Mon Sep 15 14:07:27 2003
> @@ -53,7 +53,7 @@ static void set_simcache_size (SIM_DESC,
>  
>  #define X(op, size)  (op * 4 + size)
>  
> -#define SP (h8300hmode ? SL : SW)
> +#define SP (h8300hmode && 0 == NormalMode ? SL : SW)
>  
>  #define h8_opcodes ops
>  #define DEFINE_TABLE
> @@ -510,6 +510,7 @@ enum { POLL_QUIT_INTERVAL = 0x80000 };
>  
>  int h8300hmode  = 0;
>  int h8300smode  = 0;
> +int NormalMode  = 0;
>  int h8300sxmode = 0;
>  
>  static int memory_size;
> @@ -539,7 +540,7 @@ bitfrom (int x)
>      case L_32:
>        return SL;
>      case L_P:
> -      return h8300hmode ? SL : SW;
> +      return (h8300hmode && 0 == NormalMode)? SL : SW;
>      }
>    return 0;
>  }
> @@ -575,9 +576,9 @@ lvalue (SIM_DESC sd, int x, int rn, unsi
>  static int
>  cmdline_location()
>  {
> -  if (h8300smode)
> +  if (h8300smode && 0 == NormalMode)
>      return 0xffff00L;
> -  else if (h8300hmode)
> +  else if (h8300hmode && 0 == NormalMode)
>      return 0x2ff00L;
>    else
>      return 0xff00L;
> @@ -837,8 +838,10 @@ decode (SIM_DESC sd, int addr, unsigned 
>  		}
>  	      else if ((looking_for & MODE) == VECIND)
>  		{
> -		  /* FIXME: Multiplier should be 2 for "normal" mode.  */
> -		  cst[opnum] = ((data[1] & 0x7f) + 0x80) * 4;
> +		  if(NormalMode)
> +		    cst[opnum] = ((data[1] & 0x7f) + 0x80) * 2;
> +		  else
> +		    cst[opnum] = ((data[1] & 0x7f) + 0x80) * 4;
>  		  cst[opnum] += h8_get_vbr (sd); /* Add vector base reg.  */
>  		}
>  	      else if ((looking_for & SIZE) == L_32)
> @@ -1774,9 +1777,9 @@ init_pointers (SIM_DESC sd)
>  
>        littleendian.i = 1;
>  
> -      if (h8300smode)
> +      if (h8300smode && 0 == NormalMode)
>  	memory_size = H8300S_MSIZE;
> -      else if (h8300hmode)
> +      else if (h8300hmode && 0 == NormalMode)
>  	memory_size = H8300H_MSIZE;
>        else
>  	memory_size = H8300_MSIZE;
> @@ -1950,7 +1953,7 @@ sim_resume (SIM_DESC sd, int step, int s
>      }
>  
>    oldmask = h8_get_mask (sd);
> -  if (!h8300hmode)
> +  if (!h8300hmode || NormalMode)
>      h8_set_mask (sd, 0xffff);
>    do
>      {
> @@ -2790,7 +2793,7 @@ sim_resume (SIM_DESC sd, int step, int s
>  
>  	    /* Setting char_ptr_size to the sizeof (char *) on the different
>  	       architectures.  */
> -	    if (h8300hmode || h8300smode)
> +	    if ((h8300hmode || h8300smode) && 0 == NormalMode)
>  	      {
>  		char_ptr_size = 4;
>  	      }
> @@ -2859,7 +2862,7 @@ sim_resume (SIM_DESC sd, int step, int s
>  	    for (i = 0; i < no_of_args; i++)
>  	      {
>  		/* Saving the argv pointer.  */
> -		if (h8300hmode || h8300smode)
> +		if ((h8300hmode || h8300smode) && 0 == NormalMode)
>  		  {
>  		    SET_MEMORY_L (argv_ptrs_location, argv_ptrs[i]);
>  		  }
> @@ -2875,7 +2878,7 @@ sim_resume (SIM_DESC sd, int step, int s
>  
>  	    /* Required by POSIX, Setting 0x0 at the end of the list of argv
>  	       pointers.  */
> -	    if (h8300hmode || h8300smode)
> +	    if ((h8300hmode || h8300smode) && 0 == NormalMode)
>  	      {
>  		SET_MEMORY_L (old_sp, 0x0);
>  	      }
> @@ -2914,7 +2917,7 @@ sim_resume (SIM_DESC sd, int step, int s
>  
>  	    /* Setting filename_ptr to first argument of open,  */
>  	    /* and trying to get mode.  */
> -	    if (h8300sxmode || h8300hmode || h8300smode)
> +	    if ((h8300sxmode || h8300hmode || h8300smode) && 0 == NormalMode)
>  	      {
>  		filename_ptr = GET_L_REG (0);
>  		mode = GET_MEMORY_L (h8_get_reg (sd, SP_REGNUM) + 4);
> @@ -2965,8 +2968,8 @@ sim_resume (SIM_DESC sd, int step, int s
>  	    int read_return = 0;	/* Return value from callback to
>  					   read.  */
>  
> -	    fd = h8300hmode ? GET_L_REG (0) : GET_W_REG (0);
> -	    buf_size = h8300hmode ? GET_L_REG (2) : GET_W_REG (2);
> +	    fd = (h8300hmode && 0 == NormalMode) ? GET_L_REG (0) : GET_W_REG (0);
> +	    buf_size = (h8300hmode && 0 == NormalMode) ? GET_L_REG (2) : GET_W_REG (2);
>  
>  	    char_ptr = (char *) malloc (sizeof (char) * buf_size);
>  
> @@ -3000,9 +3003,9 @@ sim_resume (SIM_DESC sd, int step, int s
>  	    int write_return;	/* Return value from callback to write.  */
>  	    int i = 0;		/* Loop counter */
>  
> -	    fd = h8300hmode ? GET_L_REG (0) : GET_W_REG (0);
> -	    char_ptr = h8300hmode ? GET_L_REG (1) : GET_W_REG (1);
> -	    len = h8300hmode ? GET_L_REG (2) : GET_W_REG (2);
> +	    fd = (h8300hmode && 0 == NormalMode) ? GET_L_REG (0) : GET_W_REG (0);
> +	    char_ptr = (h8300hmode && 0 == NormalMode) ? GET_L_REG (1) : GET_W_REG (1);
> +	    len = (h8300hmode && 0 == NormalMode) ? GET_L_REG (2) : GET_W_REG (2);
>  
>  	    /* Allocating space for the characters to be written.  */
>  	    ptr = (char *) malloc (sizeof (char) * len);
> @@ -3032,9 +3035,9 @@ sim_resume (SIM_DESC sd, int step, int s
>  	    int origin;		/* Origin */
>  	    int lseek_return;	/* Return value from callback to lseek.  */
>  
> -	    fd = h8300hmode ? GET_L_REG (0) : GET_W_REG (0);
> -	    offset = h8300hmode ? GET_L_REG (1) : GET_W_REG (1);
> -	    origin = h8300hmode ? GET_L_REG (2) : GET_W_REG (2);
> +	    fd = (h8300hmode && 0 == NormalMode) ? GET_L_REG (0) : GET_W_REG (0);
> +	    offset = (h8300hmode && 0 == NormalMode) ? GET_L_REG (1) : GET_W_REG (1);
> +	    origin = (h8300hmode && 0 == NormalMode) ? GET_L_REG (2) : GET_W_REG (2);
>  
>  	    /* Callback lseek and return offset.  */
>  	    lseek_return =
> @@ -3050,7 +3053,7 @@ sim_resume (SIM_DESC sd, int step, int s
>  	    int fd;		/* File descriptor */
>  	    int close_return;	/* Return value from callback to close.  */
>  
> -	    fd = h8300hmode ? GET_L_REG (0) : GET_W_REG (0);
> +	    fd = (h8300hmode && 0 == NormalMode) ? GET_L_REG (0) : GET_W_REG (0);
>  
>  	    /* Callback close and return.  */
>  	    close_return = sim_callback->close (sim_callback, fd);
> @@ -3068,10 +3071,10 @@ sim_resume (SIM_DESC sd, int step, int s
>  	    int stat_ptr;	/* Pointer to stat record.  */
>  	    char *temp_stat_ptr;	/* Temporary stat_rec pointer.  */
>  
> -	    fd = h8300hmode ? GET_L_REG (0) : GET_W_REG (0);
> +	    fd = (h8300hmode && 0 == NormalMode) ? GET_L_REG (0) : GET_W_REG (0);
>  
>  	    /* Setting stat_ptr to second argument of stat.  */
> -	    stat_ptr = h8300hmode ? GET_L_REG (1) : GET_W_REG (1);
> +	    stat_ptr = (h8300hmode && 0 == NormalMode) ? GET_L_REG (1) : GET_W_REG (1);
>  
>  	    /* Callback stat and return.  */
>  	    fstat_return = sim_callback->fstat (sim_callback, fd, &stat_rec);
> @@ -3120,7 +3123,7 @@ sim_resume (SIM_DESC sd, int step, int s
>  	    int i = 0;		/* Loop Counter */
>  
>  	    /* Setting filename_ptr to first argument of open.  */
> -	    filename_ptr = h8300hmode ? GET_L_REG (0) : GET_W_REG (0);
> +	    filename_ptr = (h8300hmode && 0 == NormalMode) ? GET_L_REG (0) : GET_W_REG (0);
>  
>  	    /* Trying to find the length of the filename.  */
>  	    temp_char = GET_MEMORY_B (h8_get_reg (sd, 0));
> @@ -3144,7 +3147,7 @@ sim_resume (SIM_DESC sd, int step, int s
>  
>  	    /* Setting stat_ptr to second argument of stat.  */
>  	    /* stat_ptr = h8_get_reg (sd, 1); */
> -	    stat_ptr = h8300hmode ? GET_L_REG (1) : GET_W_REG (1);
> +	    stat_ptr = (h8300hmode && 0 == NormalMode) ? GET_L_REG (1) : GET_W_REG (1);
>  
>  	    /* Callback stat and return.  */
>  	    stat_return =
> @@ -3552,7 +3555,7 @@ sim_resume (SIM_DESC sd, int step, int s
>  	call:
>  	  tmp = h8_get_reg (sd, SP_REGNUM);
>  
> -	  if (h8300hmode)
> +	  if (h8300hmode && 0 == NormalMode)
>  	    {
>  	      tmp -= 4;
>  	      SET_MEMORY_L (tmp, code->next_pc);
> @@ -3584,7 +3587,7 @@ sim_resume (SIM_DESC sd, int step, int s
>  	      h8_set_exr (sd, GET_MEMORY_L (tmp));
>  	      tmp += 4;
>  	    }
> -	  if (h8300hmode)
> +	  if (h8300hmode && 0 == NormalMode)
>  	    {
>  	      h8_set_ccr (sd, GET_MEMORY_L (tmp));
>  	      tmp += 4;
> @@ -3607,7 +3610,7 @@ sim_resume (SIM_DESC sd, int step, int s
>  	rts:
>  	  tmp = h8_get_reg (sd, SP_REGNUM);
>  
> -	  if (h8300hmode)
> +	  if (h8300hmode && 0 == NormalMode)
>  	    {
>  	      pc = GET_MEMORY_L (tmp);
>  	      tmp += 4;
> @@ -3658,10 +3661,20 @@ sim_resume (SIM_DESC sd, int step, int s
>  	    goto end;			/* res is vector number.  */
>  
>  	  tmp = h8_get_reg (sd, SP_REGNUM);
> -	  tmp -= 4;
> -	  SET_MEMORY_L (tmp, code->next_pc);
> -	  tmp -= 4; 
> -	  SET_MEMORY_L (tmp, h8_get_ccr (sd));
> + 	  if(NormalMode)
> + 	    {
> + 	      tmp -= 2;
> + 	      SET_MEMORY_W (tmp, code->next_pc);
> + 	      tmp -= 2;
> + 	      SET_MEMORY_W (tmp, h8_get_ccr (sd));
> + 	    }
> + 	  else
> + 	    {
> + 	      tmp -= 4;
> + 	      SET_MEMORY_L (tmp, code->next_pc);
> + 	      tmp -= 4;
> + 	      SET_MEMORY_L (tmp, h8_get_ccr (sd));
> + 	    }
>  	  intMaskBit = 1;
>  	  BUILDSR (sd);
>  
> @@ -3673,8 +3686,10 @@ sim_resume (SIM_DESC sd, int step, int s
>  
>  	  h8_set_reg (sd, SP_REGNUM, tmp);
>  
> -	  /* FIXME: "normal" mode should use 2-byte ptrs.  */
> -	  pc = GET_MEMORY_L (0x20 + res * 4);
> +	  if(NormalMode)
> +	    pc = GET_MEMORY_L (0x10 + res * 2); /* Vector addresses are 0x10,0x12,0x14 and 0x16 */
> +	  else
> +	    pc = GET_MEMORY_L (0x20 + res * 4);
>  	  goto end;
>  
>  	case O (O_BPT, SN):
> @@ -4703,7 +4718,10 @@ sim_store_register (SIM_DESC sd, int rn,
>    switch (rn)
>      {
>      case PC_REGNUM:
> -      h8_set_pc (sd, intval);
> +      if(NormalMode)
> +        h8_set_pc (sd, shortval); /* PC for Normal mode is 2 bytes */
> +      else
> +        h8_set_pc (sd, intval);
>        break;
>      default:
>        (*sim_callback->printf_filtered) (sim_callback, 
> @@ -4814,7 +4832,8 @@ sim_fetch_register (SIM_DESC sd, int rn,
>        longreg = 1;
>        break;
>      }
> -  if (h8300hmode || longreg)
> +  /* In Normal mode PC is 2 byte, but other registers are 4 byte */
> +  if ((h8300hmode || longreg) && !(rn == PC_REGNUM && NormalMode))
>      {
>        buf[0] = v >> 24;
>        buf[1] = v >> 16;
> @@ -4919,6 +4938,9 @@ set_h8300h (unsigned long machine)
>  
>    if (machine == bfd_mach_h8300h || machine == bfd_mach_h8300hn || h8300smode)
>      h8300hmode = 1;
> +
> +  if(machine == bfd_mach_h8300hn || machine == bfd_mach_h8300sn || machine == bfd_mach_h8300sxn)
> +    NormalMode = 1;
>  }
>  
>  /* Cover function of sim_state_free to free the cpu buffers as well.  */
> @@ -5054,9 +5076,9 @@ sim_load (SIM_DESC sd, char *prog, bfd *
>       switching between H8/300 and H8/300H programs without exiting
>       gdb.  */
>  
> -  if (h8300smode)
> +  if (h8300smode && 0 == NormalMode)
>      memory_size = H8300S_MSIZE;
> -  else if (h8300hmode)
> +  else if (h8300hmode && 0 == NormalMode)
>      memory_size = H8300H_MSIZE;
>    else
>      memory_size = H8300_MSIZE;
> 
> =====================================================================



  parent reply	other threads:[~2003-10-09 21:23 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-09-15  8:59 Shrinivas Atre
2003-09-22 17:27 ` Corinna Vinschen
2003-10-09 21:23 ` Michael Snyder [this message]
2003-10-09 21:24 ` Michael Snyder
2003-10-09 21:27 ` Michael Snyder
2003-10-17 12:53 Shrinivas Atre

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3F85D1DB.5030807@redhat.com \
    --to=msnyder@redhat.com \
    --cc=ShrinivasA@KPITCummins.com \
    --cc=gdb-patches@sources.redhat.com \
    --cc=nickc@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox