From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 657 invoked by alias); 9 Oct 2003 21:23:49 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 638 invoked from network); 9 Oct 2003 21:23:44 -0000 Received: from unknown (HELO mx1.redhat.com) (66.187.233.31) by sources.redhat.com with SMTP; 9 Oct 2003 21:23:44 -0000 Received: from int-mx2.corp.redhat.com (nat-pool-rdu-dmz.redhat.com [172.16.52.200] (may be forged)) by mx1.redhat.com (8.11.6/8.11.6) with ESMTP id h99LNhM21340 for ; Thu, 9 Oct 2003 17:23:43 -0400 Received: from potter.sfbay.redhat.com (potter.sfbay.redhat.com [172.16.27.15]) by int-mx2.corp.redhat.com (8.11.6/8.11.6) with ESMTP id h99LNeD30615; Thu, 9 Oct 2003 17:23:40 -0400 Received: from redhat.com (reddwarf.sfbay.redhat.com [172.16.24.50]) by potter.sfbay.redhat.com (8.11.6/8.11.6) with ESMTP id h99LNdi05571; Thu, 9 Oct 2003 14:23:40 -0700 Message-ID: <3F85D1DB.5030807@redhat.com> Date: Thu, 09 Oct 2003 21:23:00 -0000 From: Michael Snyder Organization: Red Hat, Inc. User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030624 X-Accept-Language: en-us, en MIME-Version: 1.0 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 References: <69595093233BB547BB70CF5E492B63F201F7240B@sohm.kpit.com> In-Reply-To: <69595093233BB547BB70CF5E492B63F201F7240B@sohm.kpit.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-SW-Source: 2003-10/txt/msg00318.txt.bz2 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 > * 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; > > =====================================================================