From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 1866 invoked by alias); 28 Jun 2004 21:18:18 -0000 Mailing-List: contact sid-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: sid-owner@sources.redhat.com Received: (qmail 1851 invoked from network); 28 Jun 2004 21:18:16 -0000 Received: from unknown (HELO mx1.redhat.com) (66.187.233.31) by sourceware.org with SMTP; 28 Jun 2004 21:18:16 -0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i5SLIFe1031844 for ; Mon, 28 Jun 2004 17:18:15 -0400 Received: from pobox.toronto.redhat.com (pobox.toronto.redhat.com [172.16.14.4]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i5SLID001146 for ; Mon, 28 Jun 2004 17:18:14 -0400 Received: from redhat.com (IDENT:eeRospuDa3of5YUYM2q1dYFvt9rlEoWh@topaz.toronto.redhat.com [172.16.14.227]) by pobox.toronto.redhat.com (8.12.8/8.12.8) with ESMTP id i5SLIBvU002203 for ; Mon, 28 Jun 2004 17:18:11 -0400 Message-ID: <40E08B13.7000404@redhat.com> Date: Mon, 28 Jun 2004 21:18:00 -0000 From: Dave Brolley Organization: Red Hat Canada, Ltd User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7b) Gecko/20040421 MIME-Version: 1.0 To: sid@sources.redhat.com Subject: Misaligned read/write of memory by GDB Content-Type: multipart/mixed; boundary="------------010807090707000906070703" X-SW-Source: 2004-q2/txt/msg00051.txt.bz2 This is a multi-part message in MIME format. --------------010807090707000906070703 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Content-length: 568 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 --------------010807090707000906070703 Content-Type: text/plain; name="sid-gdb-align.ChangeLog" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="sid-gdb-align.ChangeLog" Content-length: 157 2004-06-28 Dave Brolley * gdb.cxx (process_get_mem): Use byte-at-a-time access for unaligned requests. (process_set_mem): Ditto. --------------010807090707000906070703 Content-Type: text/plain; name="sid-gdb.patch.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="sid-gdb.patch.txt" Content-length: 6825 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 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"))); --------------010807090707000906070703--