Misaligned read/write of memory by GDB

Dave Brolley <[email protected]>
Newsgroups gmane.comp.emulators.sid.devel
Organization Red Hat Canada, Ltd
Message-ID <[email protected]>
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
sid-gdb-align.ChangeLog (text/plain, 157 B)
2004-06-28  Dave Brolley  <[email protected]>

	* gdb.cxx (process_get_mem): Use byte-at-a-time access for unaligned
	requests.
	(process_set_mem): Ditto.
sid-gdb.patch.txt (text/plain, 6.7 KB)
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")));
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.