public inbox for sid@sourceware.org
 help / color / mirror / Atom feed
* Misaligned read/write of memory by GDB
@ 2004-06-28 21:18 Dave Brolley
  2004-06-28 22:50 ` Dave Brolley
  0 siblings, 1 reply; 7+ messages in thread
From: Dave Brolley @ 2004-06-28 21:18 UTC (permalink / raw)
  To: sid

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

Hi,

Some sid components don't support misaligned reads/writes. The current 
cache components are the example which caused my particular problem. 
They punt on misaligned reads/writes, presumably so that they don't have 
to worry about accesses which cross cache line boundaries. This causes a 
problem when GDB attempts to read memory at unaligned addresses.

This patch to gdb::process_get_mem and gdb::process_set_mem forces any 
unaligned requests to use the existing byte-at-a-time method.

I've committed this patch. Let me know if there are any problems.

Dave

[-- Attachment #2: sid-gdb-align.ChangeLog --]
[-- Type: text/plain, Size: 157 bytes --]

2004-06-28  Dave Brolley  <brolley@redhat.com>

	* gdb.cxx (process_get_mem): Use byte-at-a-time access for unaligned
	requests.
	(process_set_mem): Ditto.


[-- Attachment #3: sid-gdb.patch.txt --]
[-- Type: text/plain, Size: 6825 bytes --]

Index: sid/component/consoles/socketio.cxx
===================================================================
RCS file: /cvs/src/src/sid/component/consoles/socketio.cxx,v
retrieving revision 1.5
diff -c -p -r1.5 socketio.cxx
*** sid/component/consoles/socketio.cxx	4 Mar 2002 20:38:56 -0000	1.5
--- sid/component/consoles/socketio.cxx	22 Mar 2004 18:48:32 -0000
***************
*** 1,7 ****
  // socketio.cxx - A console that uses a socket to do its I/O.
  // -*- C++ -*-
  
! // Copyright (C) 1999, 2000, 2002 Red Hat.
  // This file is part of SID and is licensed under the GPL.
  // See the file COPYING.SID for conditions for redistribution.
  
--- 1,7 ----
  // socketio.cxx - A console that uses a socket to do its I/O.
  // -*- C++ -*-
  
! // Copyright (C) 1999-2002, 2004 Red Hat.
  // This file is part of SID and is licensed under the GPL.
  // See the file COPYING.SID for conditions for redistribution.
  
*************** void 
*** 297,302 ****
--- 297,306 ----
  socketio::fini_handler (host_int_4)
  {
    this->poll_control.cancel ();
+ 
+   // Flush out any remaining data
+   if (this->connected_p)
+     this->poll_transmit ();
  
    if (this->connected_p)
      {
Index: sid/component/gdb/gdb.cxx
===================================================================
RCS file: /cvs/src/src/sid/component/gdb/gdb.cxx,v
retrieving revision 1.10
diff -c -p -r1.10 gdb.cxx
*** sid/component/gdb/gdb.cxx	8 May 2002 19:15:30 -0000	1.10
--- sid/component/gdb/gdb.cxx	22 Mar 2004 18:48:32 -0000
***************
*** 1,6 ****
  // gdb.cxx - GDB stub implementation.  -*- C++ -*-
  
! // Copyright (C) 1999-2002 Red Hat.
  // This file is part of SID and is licensed under the GPL.
  // See the file COPYING.SID for conditions for redistribution.
  
--- 1,6 ----
  // gdb.cxx - GDB stub implementation.  -*- C++ -*-
  
! // Copyright (C) 1999-2002, 2004 Red Hat.
  // This file is part of SID and is licensed under the GPL.
  // See the file COPYING.SID for conditions for redistribution.
  
*************** gdb::deinit_handler (host_int_4) 
*** 1550,1556 ****
  {
    // disconnect if needed
    if (this->connected_p)
!     this->remote_rx_eof_handler ();
  }
  
  
--- 1550,1562 ----
  {
    // disconnect if needed
    if (this->connected_p)
!     {
!       // shut down target
!       target_power (false);
!       // signal gdb
!       gdbserv_fromtarget_exit (gdbserv, 0);
!       this->remote_rx_eof_handler ();
!     }
  }
  
  
Index: sid/main/dynamic/commonCfg.cxx
===================================================================
RCS file: /cvs/src/src/sid/main/dynamic/commonCfg.cxx,v
retrieving revision 1.6
diff -c -p -r1.6 commonCfg.cxx
*** sid/main/dynamic/commonCfg.cxx	27 Oct 2003 18:55:34 -0000	1.6
--- sid/main/dynamic/commonCfg.cxx	22 Mar 2004 18:48:34 -0000
*************** SessionCfg::SessionCfg (const string nam
*** 530,536 ****
      tcl_bridge (NULL),
      loader (NULL),
      verbose (false),
!     use_stdio (true)
  {
    add_child (host_sched);
    add_child (sim_sched);
--- 530,538 ----
      tcl_bridge (NULL),
      loader (NULL),
      verbose (false),
!     use_stdio (true),
!     board_count (0),
!     gdb_count (0)
  {
    add_child (host_sched);
    add_child (sim_sched);
*************** void SessionCfg::use_tcl_bridge ()
*** 657,662 ****
--- 659,684 ----
    init_seq->add_output (7, tcl_bridge, "!event");
  }
  
+ void SessionCfg::write_config (Writer &w)
+ {
+   AggregateCfg::write_config (w);
+ 
+   // Stop the host scheduler if all of the GDB stubs are stopped
+   if (gdb_count)
+     {
+       assert (host_sched);
+       Setting (host_sched, "yield-host-time-threshold",
+ 	       sidutil::make_attribute (gdb_count)).write_to (w);
+       Setting (host_sched, "yield-host-time?", "0").write_to (w);
+     }
+ 
+   // Stop the sim scheduler if any of the GDB stubs are stopped
+   assert (sim_sched);
+   Setting (sim_sched, "enable-threshold",
+ 	   sidutil::make_attribute (board_count)).write_to (w);
+   Setting (sim_sched, "enabled?",
+ 	   sidutil::make_attribute (board_count)).write_to (w);
+ }
  
  // LoaderCfg 
  LoaderCfg::~LoaderCfg () {}
*************** void BoardCfg::set_gdb (const string por
*** 920,925 ****
--- 942,948 ----
    gdb = new GdbCfg ("gdb", port, cpu, this, sess);
    add_child (gdb);
    sess->use_no_stdio ();
+   sess->add_gdb ();
  }
  
  
Index: sid/main/dynamic/commonCfg.h
===================================================================
RCS file: /cvs/src/src/sid/main/dynamic/commonCfg.h,v
retrieving revision 1.3
diff -c -p -r1.3 commonCfg.h
*** sid/main/dynamic/commonCfg.h	21 Oct 2003 21:39:04 -0000	1.3
--- sid/main/dynamic/commonCfg.h	22 Mar 2004 18:48:34 -0000
*************** struct UlogCfg
*** 182,187 ****
--- 182,188 ----
  
  // you should really only make one of these, with an empty name,
  // unless you want some crazy multi-session support.
+ class BoardCfg;
  class LoaderCfg;
  
  struct SessionCfg :
*************** struct SessionCfg :
*** 214,219 ****
--- 215,226 ----
    bool use_stdio;
    void add_ulog_file (const string filename);
    map<const string, AtomicCfg *> ulog_map;
+   void add_gdb () { ++gdb_count; }
+   void add_board (ComponentCfg *b) { ++board_count; add_child (b); }
+   virtual void write_config (Writer &w);
+ private:
+   sid::host_int_4 board_count;
+   sid::host_int_4 gdb_count;
  };
  
  class CpuCfg :
*************** public:
*** 277,283 ****
    virtual ~GprofCfg ();
  };
  
- class BoardCfg;
  class GdbCfg :
    virtual public AggregateCfg
  {
--- 284,289 ----
Index: sid/main/dynamic/mainDynamic.cxx
===================================================================
RCS file: /cvs/src/src/sid/main/dynamic/mainDynamic.cxx,v
retrieving revision 1.5
diff -c -p -r1.5 mainDynamic.cxx
*** sid/main/dynamic/mainDynamic.cxx	21 Oct 2003 21:39:04 -0000	1.5
--- sid/main/dynamic/mainDynamic.cxx	22 Mar 2004 18:48:34 -0000
*************** main(int argc, char* argv[])
*** 617,623 ****
  	      {
  		need_sess (sess);
  		if (curr_board)
! 		  sess->add_child (curr_board);
  		curr_board = NULL;
  		string new_board_type = optstring();
  		string new_board_name (new_board_type + "-" + 
--- 617,623 ----
  	      {
  		need_sess (sess);
  		if (curr_board)
! 		  sess->add_board (curr_board);
  		curr_board = NULL;
  		string new_board_type = optstring();
  		string new_board_name (new_board_type + "-" + 
*************** main(int argc, char* argv[])
*** 878,884 ****
      }
  
    if (sess && curr_board)
!     sess->add_child (curr_board);
  
    if (persistent_p)
      config_items.push_back (make_pair (false, string("set main persistent? true")));
--- 878,884 ----
      }
  
    if (sess && curr_board)
!     sess->add_board (curr_board);
  
    if (persistent_p)
      config_items.push_back (make_pair (false, string("set main persistent? true")));

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

* Re: Misaligned read/write of memory by GDB
  2004-06-28 21:18 Misaligned read/write of memory by GDB Dave Brolley
@ 2004-06-28 22:50 ` Dave Brolley
  2004-06-29 18:27   ` Frank Ch. Eigler
  0 siblings, 1 reply; 7+ messages in thread
From: Dave Brolley @ 2004-06-28 22:50 UTC (permalink / raw)
  To: Dave Brolley; +Cc: sid

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

Ooops, sent the wrong patch......

Dave Brolley wrote:

> Hi,
>
> Some sid components don't support misaligned reads/writes. The current 
> cache components are the example which caused my particular problem. 
> They punt on misaligned reads/writes, presumably so that they don't 
> have to worry about accesses which cross cache line boundaries. This 
> causes a problem when GDB attempts to read memory at unaligned addresses.
>
> This patch to gdb::process_get_mem and gdb::process_set_mem forces any 
> unaligned requests to use the existing byte-at-a-time method.
>
> I've committed this patch. Let me know if there are any problems.
>
> Dave
>

[-- Attachment #2: sid-gdb-align.patch.txt --]
[-- Type: text/plain, Size: 4924 bytes --]

Index: sid/component/gdb/gdb.cxx
===================================================================
RCS file: /cvs/src/src/sid/component/gdb/gdb.cxx,v
retrieving revision 1.11
diff -c -p -r1.11 gdb.cxx
*** sid/component/gdb/gdb.cxx	22 Mar 2004 21:27:23 -0000	1.11
--- sid/component/gdb/gdb.cxx	28 Jun 2004 21:10:43 -0000
*************** gdb::process_get_mem (struct gdbserv_reg
*** 620,642 ****
      }
    host_int_4 addr = addr8; // truncate
  
!   if (len==1 && e==endian_big) 
!     read_bus_word (gdbserv, memory, addr, big_int_1());
!   else if (len==1 && e==endian_little)
!     read_bus_word (gdbserv, memory, addr, little_int_1());
!   else if (len==2 && e==endian_big) 
!     read_bus_word (gdbserv, memory, addr, big_int_2());
!   else if (len==2 && e==endian_little)
!     read_bus_word (gdbserv, memory, addr, little_int_2());
!   else if (len==4 && e==endian_big) 
!     read_bus_word (gdbserv, memory, addr, big_int_4());
!   else if (len==4 && e==endian_little)
!     read_bus_word (gdbserv, memory, addr, little_int_4());
!   else if (len==8 && e==endian_big) 
!     read_bus_word (gdbserv, memory, addr, big_int_8());
!   else if (len==8 && e==endian_little)
!     read_bus_word (gdbserv, memory, addr, little_int_8());
!   else if (e==endian_little)
      {
        for (unsigned long i=0; i<len; i++)
  	read_bus_word (gdbserv, memory, addr + i, little_int_1());
--- 620,647 ----
      }
    host_int_4 addr = addr8; // truncate
  
!   if (addr % len == 0)
!     {
!       if (len==1 && e==endian_big) 
! 	{ read_bus_word (gdbserv, memory, addr, big_int_1()); return; }
!       if (len==1 && e==endian_little)
! 	{ read_bus_word (gdbserv, memory, addr, little_int_1()); return; }
!       if (len==2 && e==endian_big) 
! 	{ read_bus_word (gdbserv, memory, addr, big_int_2()); return; }
!       if (len==2 && e==endian_little)
! 	{ read_bus_word (gdbserv, memory, addr, little_int_2()); return; }
!       if (len==4 && e==endian_big) 
! 	{ read_bus_word (gdbserv, memory, addr, big_int_4()); return; }
!       if (len==4 && e==endian_little)
! 	{ read_bus_word (gdbserv, memory, addr, little_int_4()); return; }
!       if (len==8 && e==endian_big) 
! 	{ read_bus_word (gdbserv, memory, addr, big_int_8()); return; }
!       if (len==8 && e==endian_little)
! 	{ read_bus_word (gdbserv, memory, addr, little_int_8()); return; }
!     }
! 
!   // Unaligned access or unsupported size.
!   if (e==endian_little)
      {
        for (unsigned long i=0; i<len; i++)
  	read_bus_word (gdbserv, memory, addr + i, little_int_1());
*************** gdb::process_set_mem (struct gdbserv_reg
*** 700,722 ****
      }
    host_int_4 addr = addr8; // truncate
  
!   if (len==1 && e==endian_big) 
!     write_bus_word (gdbserv, binary, memory, addr, big_int_1());
!   else if (len==1 && e==endian_little)
!     write_bus_word (gdbserv, binary, memory, addr, little_int_1());
!   else if (len==2 && e==endian_big) 
!     write_bus_word (gdbserv, binary, memory, addr, big_int_2());
!   else if (len==2 && e==endian_little)
!     write_bus_word (gdbserv, binary, memory, addr, little_int_2());
!   else if (len==4 && e==endian_big) 
!     write_bus_word (gdbserv, binary, memory, addr, big_int_4());
!   else if (len==4 && e==endian_little)
!     write_bus_word (gdbserv, binary, memory, addr, little_int_4());
!   else if (len==8 && e==endian_big) 
!     write_bus_word (gdbserv, binary, memory, addr, big_int_8());
!   else if (len==8 && e==endian_little)
!     write_bus_word (gdbserv, binary, memory, addr, little_int_8());
!   else if (e==endian_little)
      {
        for (unsigned long i=0; i<len; i++)
  	write_bus_word (gdbserv, binary, memory, addr + i, little_int_1());
--- 705,732 ----
      }
    host_int_4 addr = addr8; // truncate
  
!   if (addr % len == 0)
!     {
!       if (len==1 && e==endian_big) 
! 	{ write_bus_word (gdbserv, binary, memory, addr, big_int_1()); return; }
!       if (len==1 && e==endian_little)
! 	{ write_bus_word (gdbserv, binary, memory, addr, little_int_1()); return; }
!       if (len==2 && e==endian_big) 
! 	{ write_bus_word (gdbserv, binary, memory, addr, big_int_2()); return; }
!       if (len==2 && e==endian_little)
! 	{ write_bus_word (gdbserv, binary, memory, addr, little_int_2()); return; }
!       if (len==4 && e==endian_big) 
! 	{ write_bus_word (gdbserv, binary, memory, addr, big_int_4()); return; }
!       if (len==4 && e==endian_little)
! 	{ write_bus_word (gdbserv, binary, memory, addr, little_int_4()); return; }
!       if (len==8 && e==endian_big) 
! 	{ write_bus_word (gdbserv, binary, memory, addr, big_int_8()); return; }
!       if (len==8 && e==endian_little)
! 	{ write_bus_word (gdbserv, binary, memory, addr, little_int_8()); return; }
!     }
! 
!   // Unaligned access or unsupported size.
!   if (e==endian_little)
      {
        for (unsigned long i=0; i<len; i++)
  	write_bus_word (gdbserv, binary, memory, addr + i, little_int_1());

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

* Re: Misaligned read/write of memory by GDB
  2004-06-28 22:50 ` Dave Brolley
@ 2004-06-29 18:27   ` Frank Ch. Eigler
  2004-06-29 19:14     ` Dave Brolley
  0 siblings, 1 reply; 7+ messages in thread
From: Frank Ch. Eigler @ 2004-06-29 18:27 UTC (permalink / raw)
  To: Dave Brolley; +Cc: sid

OK, but did you consider an alternate of having a memory target that
is unable to handle an unaligned access return sid::bus::misaligned,
and then have gdb back down to byte-by-byte access?

- FChE

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

* Re: Misaligned read/write of memory by GDB
  2004-06-29 18:27   ` Frank Ch. Eigler
@ 2004-06-29 19:14     ` Dave Brolley
  2004-06-29 19:18       ` Frank Ch. Eigler
  0 siblings, 1 reply; 7+ messages in thread
From: Dave Brolley @ 2004-06-29 19:14 UTC (permalink / raw)
  To: Frank Ch. Eigler; +Cc: sid

Frank Ch. Eigler wrote:

>OK, but did you consider an alternate of having a memory target that
>is unable to handle an unaligned access return sid::bus::misaligned,
>and then have gdb back down to byte-by-byte access?
>  
>
I thought about the possibility of fixing existing memory targets to 
handle misaligned access, either by implementing support, returning 
sid::bus::misaligned, or whatever else might be appropriate. However it 
occurred to me that this would require implementors of all future memory 
targets to be aware of potential GDB access of this type. This just 
seemed like something that will always work regardless of the 
implementation of the downstream memory.

Dave


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

* Re: Misaligned read/write of memory by GDB
  2004-06-29 19:14     ` Dave Brolley
@ 2004-06-29 19:18       ` Frank Ch. Eigler
  2004-06-29 20:40         ` Dave Brolley
  0 siblings, 1 reply; 7+ messages in thread
From: Frank Ch. Eigler @ 2004-06-29 19:18 UTC (permalink / raw)
  To: Dave Brolley; +Cc: sid

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

Hi -


> >OK, but did you consider an alternate of having a memory target that
> >is unable to handle an unaligned access return sid::bus::misaligned,
> >and then have gdb back down to byte-by-byte access?
> >
> I thought about the possibility of fixing existing memory targets to 
> handle misaligned access, either by implementing support, returning 
> sid::bus::misaligned, or whatever else might be appropriate. 

How many offenders (that did neither) did you encounter?

> However it occurred to me that this would require implementors of all
> future memory targets to be aware of potential GDB access of this
> type. [...]

True, except that such accesses could originate elsewhere - a simulated
CPU, or a gloss component, for example.


- FChE

[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]

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

* Re: Misaligned read/write of memory by GDB
  2004-06-29 19:18       ` Frank Ch. Eigler
@ 2004-06-29 20:40         ` Dave Brolley
  2004-07-01 17:02           ` Dave Brolley
  0 siblings, 1 reply; 7+ messages in thread
From: Dave Brolley @ 2004-06-29 20:40 UTC (permalink / raw)
  To: Frank Ch. Eigler; +Cc: sid

Frank Ch. Eigler wrote:

>>I thought about the possibility of fixing existing memory targets to 
>>handle misaligned access, either by implementing support, returning 
>>sid::bus::misaligned, or whatever else might be appropriate. 
>>    
>>
>
>How many offenders (that did neither) did you encounter?
>
Just one. The cache component. It silently reads directly from the 
backing memory, thus (potentially) returning the wrong value.

>>However it occurred to me that this would require implementors of all
>>future memory targets to be aware of potential GDB access of this
>>type. [...]
>>    
>>
>
>True, except that such accesses could originate elsewhere - a simulated
>CPU, or a gloss component, for example.
>  
>
I guess one could argue that all complete component implementations 
should handle all possible input possibilities. The failure was not 
obvious in my case because of the silent misbehavior of the cache 
component. I guess I was just wanting to prevent a similar misfortune 
from happening to someone else (or me again!) in the future.

Your gloss example convinces me that the cache component should be 
fixed, however. Once done, I can implement the GDB access in the way 
you've suggested.

Dave


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

* RE: Misaligned read/write of memory by GDB
  2004-06-29 20:40         ` Dave Brolley
@ 2004-07-01 17:02           ` Dave Brolley
  0 siblings, 0 replies; 7+ messages in thread
From: Dave Brolley @ 2004-07-01 17:02 UTC (permalink / raw)
  To: 'Dave Brolley', 'Frank Ch. Eigler'; +Cc: sid

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

In response to Frank's comments, I have removed my previous patch and
committed this one in its place.

The cache component now handles misaligned accesses except those which cross
a cache line boundary. For those it returns bus::misaligned

The GDB component reverts to the byte-at-a-time method of access if
bus::misaligned is returned from downstream.

Dave


[-- Attachment #2: sid-gdbalign.ChangeLog --]
[-- Type: application/octet-stream, Size: 659 bytes --]

2004-07-01  Dave Brolley  <brolley@redhat.com>

	* gdb.cxx (read_bus_word): Now returns bus::status. Return status
	from bus->read.
	(write_bus_word): Ditto for status from bus->write.
	(process_get_mem): Back out previous patch. Retry access
	one byte at a time if bus::misaligned is returned from downstream.
	(process_set_mem): Ditto.

2004-07-01  Dave Brolley  <brolley@redhat.com>

	* cache.cxx (write_any): Allow misaligned access. Return
	bus::misaligned for accesses which cross line boundary.
	(read_any): Ditto.

2004-07-01  Dave Brolley  <brolley@redhat.com>

	* sidcomp.cache/misaligned.exp: 16 bit access should now be a hit.


[-- Attachment #3: sid-gdbalign.patch.txt --]
[-- Type: text/plain, Size: 6797 bytes --]

Index: sid/component/gdb/gdb.cxx
===================================================================
RCS file: /cvs/src/src/sid/component/gdb/gdb.cxx,v
retrieving revision 1.11
diff -c -p -r1.11 gdb.cxx
*** sid/component/gdb/gdb.cxx	22 Mar 2004 21:27:23 -0000	1.11
--- sid/component/gdb/gdb.cxx	1 Jul 2004 16:46:54 -0000
*************** gdb::process_get_exp_regs ()
*** 532,538 ****
  // Helper functions
  
  template <class Type>
! void 
  read_bus_word(gdbserv* gdbserv, 
  	      sid::bus* bus,
  	      host_int_4 address,
--- 532,538 ----
  // Helper functions
  
  template <class Type>
! bus::status
  read_bus_word(gdbserv* gdbserv, 
  	      sid::bus* bus,
  	      host_int_4 address,
*************** read_bus_word(gdbserv* gdbserv, 
*** 545,557 ****
        for (unsigned i=0; i < sizeof(typename Type::value_type); i++)
  	gdbserv_output_byte (gdbserv, value.read_byte(i));
      }
!   else
      gdbserv_output_string (gdbserv, "E05");
  }
  
  
  template <class Type>
! void 
  write_bus_word(gdbserv* gdbserv, 
  	       int binary,
  	       sid::bus* bus,
--- 545,559 ----
        for (unsigned i=0; i < sizeof(typename Type::value_type); i++)
  	gdbserv_output_byte (gdbserv, value.read_byte(i));
      }
!   // misaligned will be handled by the caller
!   else if (s != bus::misaligned)
      gdbserv_output_string (gdbserv, "E05");
+   return s;
  }
  
  
  template <class Type>
! bus::status
  write_bus_word(gdbserv* gdbserv, 
  	       int binary,
  	       sid::bus* bus,
*************** write_bus_word(gdbserv* gdbserv, 
*** 572,581 ****
      }
  
    bus::status s = bus->write (address, value);
!   if (s == bus::ok)
!     ; // No response means "OK"
    else
      gdbserv_output_string (gdbserv, "E05");
  }
  
  
--- 574,584 ----
      }
  
    bus::status s = bus->write (address, value);
!   if (s == bus::ok || s == bus::misaligned)
!     ; // No response means "OK" -- misaligned will be handled by the caller
    else
      gdbserv_output_string (gdbserv, "E05");
+   return s;
  }
  
  
*************** gdb::process_get_mem (struct gdbserv_reg
*** 620,642 ****
      }
    host_int_4 addr = addr8; // truncate
  
    if (len==1 && e==endian_big) 
!     read_bus_word (gdbserv, memory, addr, big_int_1());
    else if (len==1 && e==endian_little)
!     read_bus_word (gdbserv, memory, addr, little_int_1());
    else if (len==2 && e==endian_big) 
!     read_bus_word (gdbserv, memory, addr, big_int_2());
    else if (len==2 && e==endian_little)
!     read_bus_word (gdbserv, memory, addr, little_int_2());
    else if (len==4 && e==endian_big) 
!     read_bus_word (gdbserv, memory, addr, big_int_4());
    else if (len==4 && e==endian_little)
!     read_bus_word (gdbserv, memory, addr, little_int_4());
    else if (len==8 && e==endian_big) 
!     read_bus_word (gdbserv, memory, addr, big_int_8());
    else if (len==8 && e==endian_little)
!     read_bus_word (gdbserv, memory, addr, little_int_8());
!   else if (e==endian_little)
      {
        for (unsigned long i=0; i<len; i++)
  	read_bus_word (gdbserv, memory, addr + i, little_int_1());
--- 623,651 ----
      }
    host_int_4 addr = addr8; // truncate
  
+   bus::status b = bus::misaligned;
    if (len==1 && e==endian_big) 
!     b = read_bus_word (gdbserv, memory, addr, big_int_1());
    else if (len==1 && e==endian_little)
!     b = read_bus_word (gdbserv, memory, addr, little_int_1());
    else if (len==2 && e==endian_big) 
!     b = read_bus_word (gdbserv, memory, addr, big_int_2());
    else if (len==2 && e==endian_little)
!     b = read_bus_word (gdbserv, memory, addr, little_int_2());
    else if (len==4 && e==endian_big) 
!     b = read_bus_word (gdbserv, memory, addr, big_int_4());
    else if (len==4 && e==endian_little)
!     b = read_bus_word (gdbserv, memory, addr, little_int_4());
    else if (len==8 && e==endian_big) 
!     b = read_bus_word (gdbserv, memory, addr, big_int_8());
    else if (len==8 && e==endian_little)
!     b = read_bus_word (gdbserv, memory, addr, little_int_8());
! 
!   if (b != bus::misaligned)
!     return;
!   
!   // Unaligned access or unsupported size.
!   if (e==endian_little)
      {
        for (unsigned long i=0; i<len; i++)
  	read_bus_word (gdbserv, memory, addr + i, little_int_1());
*************** gdb::process_set_mem (struct gdbserv_reg
*** 700,722 ****
      }
    host_int_4 addr = addr8; // truncate
  
    if (len==1 && e==endian_big) 
!     write_bus_word (gdbserv, binary, memory, addr, big_int_1());
!   else if (len==1 && e==endian_little)
!     write_bus_word (gdbserv, binary, memory, addr, little_int_1());
!   else if (len==2 && e==endian_big) 
!     write_bus_word (gdbserv, binary, memory, addr, big_int_2());
!   else if (len==2 && e==endian_little)
!     write_bus_word (gdbserv, binary, memory, addr, little_int_2());
!   else if (len==4 && e==endian_big) 
!     write_bus_word (gdbserv, binary, memory, addr, big_int_4());
!   else if (len==4 && e==endian_little)
!     write_bus_word (gdbserv, binary, memory, addr, little_int_4());
!   else if (len==8 && e==endian_big) 
!     write_bus_word (gdbserv, binary, memory, addr, big_int_8());
!   else if (len==8 && e==endian_little)
!     write_bus_word (gdbserv, binary, memory, addr, little_int_8());
!   else if (e==endian_little)
      {
        for (unsigned long i=0; i<len; i++)
  	write_bus_word (gdbserv, binary, memory, addr + i, little_int_1());
--- 709,737 ----
      }
    host_int_4 addr = addr8; // truncate
  
+   bus::status b = bus::misaligned;
    if (len==1 && e==endian_big) 
!     b = write_bus_word (gdbserv, binary, memory, addr, big_int_1());
!   if (len==1 && e==endian_little)
!     b = write_bus_word (gdbserv, binary, memory, addr, little_int_1());
!   if (len==2 && e==endian_big) 
!     b = write_bus_word (gdbserv, binary, memory, addr, big_int_2());
!   if (len==2 && e==endian_little)
!     b = write_bus_word (gdbserv, binary, memory, addr, little_int_2());
!   if (len==4 && e==endian_big) 
!     b = write_bus_word (gdbserv, binary, memory, addr, big_int_4());
!   if (len==4 && e==endian_little)
!     b = write_bus_word (gdbserv, binary, memory, addr, little_int_4());
!   if (len==8 && e==endian_big) 
!     b = write_bus_word (gdbserv, binary, memory, addr, big_int_8());
!   if (len==8 && e==endian_little)
!     b = write_bus_word (gdbserv, binary, memory, addr, little_int_8());
! 
!   if (b != bus::misaligned)
!     return;
! 
!   // Unaligned access or unsupported size.
!   if (e==endian_little)
      {
        for (unsigned long i=0; i<len; i++)
  	write_bus_word (gdbserv, binary, memory, addr + i, little_int_1());

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

end of thread, other threads:[~2004-07-01 17:02 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-06-28 21:18 Misaligned read/write of memory by GDB Dave Brolley
2004-06-28 22:50 ` Dave Brolley
2004-06-29 18:27   ` Frank Ch. Eigler
2004-06-29 19:14     ` Dave Brolley
2004-06-29 19:18       ` Frank Ch. Eigler
2004-06-29 20:40         ` Dave Brolley
2004-07-01 17:02           ` Dave Brolley

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).