Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* RFA - PATCH - Support  H8/300H and H8S Normal Mode for GDB
@ 2003-09-15  8:59 Shrinivas Atre
  2003-09-22 17:27 ` Corinna Vinschen
                   ` (3 more replies)
  0 siblings, 4 replies; 6+ messages in thread
From: Shrinivas Atre @ 2003-09-15  8:59 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 19124 bytes --]

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

=====================================================================
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;

=====================================================================

[-- Attachment #2: h8300-tdep.diff --]
[-- Type: application/octet-stream, Size: 4560 bytes --]

--- 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;

[-- Attachment #3: compile.diff --]
[-- Type: application/octet-stream, Size: 10142 bytes --]

--- 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;

[-- Attachment #4: tm-h8300.diff --]
[-- Type: application/octet-stream, Size: 360 bytes --]

--- 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
 

[-- Attachment #5: coff-h8300.diff --]
[-- Type: application/octet-stream, Size: 1706 bytes --]

--- 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)

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: RFA - PATCH - Support  H8/300H and H8S Normal Mode for GDB
  2003-09-15  8:59 RFA - PATCH - Support H8/300H and H8S Normal Mode for GDB Shrinivas Atre
@ 2003-09-22 17:27 ` Corinna Vinschen
  2003-10-09 21:23 ` Michael Snyder
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 6+ messages in thread
From: Corinna Vinschen @ 2003-09-22 17:27 UTC (permalink / raw)
  To: gdb-patches

On Mon, Sep 15, 2003 at 02:25:20PM +0530, 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 ?

Do you have an FSF copyright assignment?  AFAIK you need that.

> --- 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 */

Please don't use UpperCase but only lower case and underscore for
variable names.  This variable should be named normal_mode.
In this very case, the variable is extern so the name should be much
less ambiguous.  Probably "h8300_normal_mode" would fit.

> -    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;

Is it necessary to duplicate all set_gdbarch_XXX calls?  Wouldn't
it be more clear to set "h8300_normal_mode" separately to show that
it's the same machine, just another mode?  E. g.

	case bfd_mach_h8300h:
	case bfd_mach_h8300hn:
	  if (info.bfd_arch_info->mach)
	    h8300_normal_mode = 1;

> @@ -510,6 +510,7 @@ enum { POLL_QUIT_INTERVAL = 0x80000 };
>  
>  int h8300hmode  = 0;
>  int h8300smode  = 0;
> +int NormalMode  = 0;

As above, "h8300_normal_mode" would be better.

Otherwise it looks ok but I guess we need a word from the h8300 sim
expert.  Michael?

Corinna

-- 
Corinna Vinschen
Cygwin Developer
Red Hat, Inc.


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: RFA - PATCH - Support  H8/300H and H8S Normal Mode for GDB
  2003-09-15  8:59 RFA - PATCH - Support H8/300H and H8S Normal Mode for GDB Shrinivas Atre
  2003-09-22 17:27 ` Corinna Vinschen
@ 2003-10-09 21:23 ` Michael Snyder
  2003-10-09 21:24 ` Michael Snyder
  2003-10-09 21:27 ` Michael Snyder
  3 siblings, 0 replies; 6+ messages in thread
From: Michael Snyder @ 2003-10-09 21:23 UTC (permalink / raw)
  To: Shrinivas Atre; +Cc: gdb-patches, nickc

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;
> 
> =====================================================================



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: RFA - PATCH - Support  H8/300H and H8S Normal Mode for GDB
  2003-09-15  8:59 RFA - PATCH - Support H8/300H and H8S Normal Mode for GDB Shrinivas Atre
  2003-09-22 17:27 ` Corinna Vinschen
  2003-10-09 21:23 ` Michael Snyder
@ 2003-10-09 21:24 ` Michael Snyder
  2003-10-09 21:27 ` Michael Snyder
  3 siblings, 0 replies; 6+ messages in thread
From: Michael Snyder @ 2003-10-09 21:24 UTC (permalink / raw)
  To: Shrinivas Atre; +Cc: gdb-patches

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

Oops, I forgot to add -- I would prefer the idiom "!h8300_normal_mode"
instead of "0 == h8300_normal_mode", especially when it's not by itself
but part of an expression.

Thanks,
Michael



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: RFA - PATCH - Support  H8/300H and H8S Normal Mode for GDB
  2003-09-15  8:59 RFA - PATCH - Support H8/300H and H8S Normal Mode for GDB Shrinivas Atre
                   ` (2 preceding siblings ...)
  2003-10-09 21:24 ` Michael Snyder
@ 2003-10-09 21:27 ` Michael Snyder
  3 siblings, 0 replies; 6+ messages in thread
From: Michael Snyder @ 2003-10-09 21:27 UTC (permalink / raw)
  To: Shrinivas Atre; +Cc: gdb-patches

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

Err... and I meant to approve the updated version of your patch,
including the changes made in response to Corinna's suggestions.
;-/



^ permalink raw reply	[flat|nested] 6+ messages in thread

* RE: RFA - PATCH - Support  H8/300H and H8S Normal Mode for GDB
@ 2003-10-17 12:53 Shrinivas Atre
  0 siblings, 0 replies; 6+ messages in thread
From: Shrinivas Atre @ 2003-10-17 12:53 UTC (permalink / raw)
  To: gdb-patches; +Cc: nickc, Michael Snyder

Hi,

Committed with changes suggested.
http://sources.redhat.com/ml/gdb-cvs/2003-10/msg00144.html
http://sources.redhat.com/ml/gdb-cvs/2003-10/msg00145.html

Regards,
Shrinivas

> -----Original Message-----
> From: Michael Snyder [mailto:msnyder@redhat.com]
> Sent: Friday, October 10, 2003 2:54 AM
> To: Shrinivas Atre
> Cc: gdb-patches@sources.redhat.com; nickc@redhat.com
> Subject: Re: RFA - PATCH - Support H8/300H and H8S Normal Mode for GDB
> 
> 
> 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
> 
> Oops, I forgot to add -- I would prefer the idiom "!h8300_normal_mode"
> instead of "0 == h8300_normal_mode", especially when it's not 
> by itself
> but part of an expression.
> 
> Thanks,
> Michael
> 
> 

> Err... and I meant to approve the updated version of your patch,
> including the changes made in response to Corinna's suggestions.
> ;-/


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2003-10-17 12:53 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-09-15  8:59 RFA - PATCH - Support H8/300H and H8S Normal Mode for GDB Shrinivas Atre
2003-09-22 17:27 ` Corinna Vinschen
2003-10-09 21:23 ` Michael Snyder
2003-10-09 21:24 ` Michael Snyder
2003-10-09 21:27 ` Michael Snyder
2003-10-17 12:53 Shrinivas Atre

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox