1
0
mirror of https://github.com/wfjm/w11.git synced 2026-03-27 10:41:30 +00:00

integrate rbus monitor in w11 shell; setup procs idempotent

- RlinkConnect: add rbus monitor probe, add HasRbmon()
- RtclRlinkConnect: M_amap: -testname opt addr check; add hasrbmon get
- RtclRw11Cpu: M_(imap|rmap): -testname optional addr check
- ti_rri: setup rbus monitor if detected
- rw11/shell.tcl: integrate rbmon: add .rme,.rmd,.rmf,.rml
- ibd_ibmon/util.tcl: setup: now idempotent; move out imap_reg2addr
- rbmoni/util.tcl: setup: now idempotent; add procs filter,rme,rmf
- rlink/util.tcl: add amap_reg2addr
- rw11/util.tcl: move in imap_reg2addr; add imap_range2addr
- rw11/shell.tcl: integrate rbmon: add .rme,.rmd,.rmf,.rml
- rw11/dmhbpt.tcl: hb_set: use imap_range2addr, allow regnam and range
- */util.tcl: setup: now idempotent
This commit is contained in:
Walter F.J. Mueller
2017-04-22 15:33:04 +02:00
parent c7f1b3d077
commit 509c3719bd
21 changed files with 559 additions and 130 deletions

View File

@@ -11,12 +11,38 @@
<!-- --------------------------------------------------------------------- -->
---
## HEAD <a name="head"></a>
### Proviso
_The HEAD version shows the current development. No guarantees that
### General Proviso
The HEAD version shows the current development. No guarantees that
software or firmware builds or that the documentation is consistent.
The full set of tests is only run for tagged releases.
### Special Provisos
- DEUNA still with very limited functionality and testing
- no buffer chaining
- no loopback
- no memory access error checking
- works with 211bsd, ping and telnet login tested
- DEUNA and nexys3 shows rlink aborts
- unlikely that it's a DEUNA issue
- more likely this revealed a hidden flaw in the fx2 based transport
- all works fine with nexys4 !
### Summary
- integrate rbus monitor in w11 shell
- ti_rri: setup rbus monitor if detected
- rw11/shell.tcl: add .rme,.rmd,.rmf,.rml
- ibd_ibmon/util.tcl: move out imap_reg2addr
- rbmoni/util.tcl: add procs filter,rme,rmf
- rlink/util.tcl: add amap_reg2addr
- rw11/util.tcl: move in imap_reg2addr; add imap_range2addr
- rw11/shell.tcl: integrate rbmon: add .rme,.rmd,.rmf,.rml
- make setup procs idempotent
- RlinkConnect: add rbus monitor probe, add HasRbmon()
- RtclRlinkConnect: M_amap: -testname opt addr check; add hasrbmon get
- RtclRw11Cpu: M_(imap|rmap): -testname optional addr check
- */util.tcl: setup: now idempotent
- w11 shell .bs now support ibus register names and ranges
- rw11/dmhbpt.tcl: hb_set: use imap_range2addr, allow regnam and range
- add DEUNA (ethernet) support
- add DEUNA device (xu) for ibus
- add DEUNA to all sys_w11a systems

View File

@@ -1,6 +1,6 @@
#! /usr/bin/env tclshcpp
# -*- tcl -*-
# $Id: ti_rri 843 2017-01-08 18:15:27Z mueller $
# $Id: ti_rri 883 2017-04-22 11:57:38Z mueller $
#
# Copyright 2011-2017 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
#
@@ -15,6 +15,7 @@
#
# Revision History:
# Date Rev Version Comment
# 2017-04-22 883 1.4.4 setup rbus monitor if detected
# 2017-01-08 843 1.4.3 allow --term=USBD for Digilent autodetect
# 2015-01-09 776 1.2.2 add --tout option to setup rlc timeout before connect
# 2015-01-09 631 1.2.1 use rlc get/set rather config
@@ -214,7 +215,6 @@ if { $opts(pack_) ne "" } {
}
}
# setup logging
if { $opts(log_) ne "-" } {
rlc set logfile $opts(log_)
@@ -369,6 +369,14 @@ foreach cmd $clist {
}
}
# setup rbus monitor if detected
# must be done after all command line commands are processed to allow
# defered initialization and 'rlc init' hacks.
if {[rlc get hasrbmon]} {
package require rbmoni
rbmoni::setup
}
if { $tcl_interactive && $tirri_interactive } {
::tclreadline::Loop
} else {

View File

@@ -1,4 +1,4 @@
// $Id: RlinkConnect.cpp 868 2017-04-07 20:09:33Z mueller $
// $Id: RlinkConnect.cpp 883 2017-04-22 11:57:38Z mueller $
//
// Copyright 2011-2017 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
@@ -13,6 +13,7 @@
//
// Revision History:
// Date Rev Version Comment
// 2017-04-22 883 2.6.2 add rbus monitor probe, add HasRbmon()
// 2017-04-07 868 2.6.1 Dump(): add detail arg
// 2017-02-20 854 2.6 use Rtime, drop TimeOfDayAsDouble
// 2016-04-02 758 2.5 add USR_ACCESS register support (RLUA0/RLUA1)
@@ -40,7 +41,7 @@
/*!
\file
\version $Id: RlinkConnect.cpp 868 2017-04-07 20:09:33Z mueller $
\version $Id: RlinkConnect.cpp 883 2017-04-22 11:57:38Z mueller $
\brief Implemenation of RlinkConnect.
*/
@@ -78,6 +79,7 @@ const uint16_t RlinkConnect::kRbaddr_RLID1;
const uint16_t RlinkConnect::kRbaddr_RLID0;
const uint16_t RlinkConnect::kRbaddr_RLUA1;
const uint16_t RlinkConnect::kRbaddr_RLUA0;
const uint16_t RlinkConnect::kRbaddr_RMBASE;
const uint16_t RlinkConnect::kRLCNTL_M_AnEna;
const uint16_t RlinkConnect::kRLCNTL_M_AtoEna;
@@ -121,7 +123,8 @@ RlinkConnect::RlinkConnect()
fTsLastAttnNoti(),
fSysId(0xffffffff),
fUsrAcc(0x00000000),
fRbufSize(2048)
fRbufSize(2048),
fHasRbmon(false)
{
for (size_t i=0; i<8; i++) fSeqNumber[i] = 0;
@@ -221,14 +224,17 @@ bool RlinkConnect::LinkInit(RerrMsg& emsg)
if (fLinkInitDone) return true;
RlinkCommandList clist;
clist.AddRreg(kRbaddr_RLSTAT);
clist.AddRreg(kRbaddr_RLID1);
clist.AddRreg(kRbaddr_RLID0);
int ista = clist.AddRreg(kRbaddr_RLSTAT);
int iid1 = clist.AddRreg(kRbaddr_RLID1);
int iid0 = clist.AddRreg(kRbaddr_RLID0);
// RLUA0/1 are optional registers, available for 7Series and higher
clist.AddRreg(kRbaddr_RLUA1);
int iua1 = clist.AddRreg(kRbaddr_RLUA1);
clist.SetLastExpectStatus(0,0); // disable stat check
clist.AddRreg(kRbaddr_RLUA0);
int iua0 = clist.AddRreg(kRbaddr_RLUA0);
clist.SetLastExpectStatus(0,0); // disable stat check
// probe for rbus monitor
int irbm = clist.AddRreg(kRbaddr_RMBASE);
clist.SetLastExpectStatus(0,0); // disable stat check
if (!Exec(clist, emsg)) return false;
@@ -241,19 +247,19 @@ bool RlinkConnect::LinkInit(RerrMsg& emsg)
AddrMapInsert("rl.id1", kRbaddr_RLID1);
AddrMapInsert("rl.id0", kRbaddr_RLID0);
uint16_t rlstat = clist[0].Data();
uint16_t rlid1 = clist[1].Data();
uint16_t rlid0 = clist[2].Data();
uint16_t rlstat = clist[ista].Data();
uint16_t rlid1 = clist[iid1].Data();
uint16_t rlid0 = clist[iid0].Data();
fRbufSize = size_t(1) << (10 + (rlstat & kRLSTAT_M_RBSize));
fSysId = uint32_t(rlid1)<<16 | uint32_t(rlid0);
// handle rlink optional registers: USR_ACCESS
// handle rlink optional registers: USR_ACCESS and rbus monitor probe
const uint8_t staterr = RlinkCommand::kStat_M_RbTout |
RlinkCommand::kStat_M_RbNak |
RlinkCommand::kStat_M_RbErr;
if ((clist[3].Status() & staterr) == 0 && // RLUA1 ok
(clist[4].Status() & staterr) == 0) { // RLUA0 ok
if ((clist[iua1].Status() & staterr) == 0 && // RLUA1 ok
(clist[iua0].Status() & staterr) == 0) { // RLUA0 ok
AddrMapInsert("rl.ua1", kRbaddr_RLUA1);
AddrMapInsert("rl.ua0", kRbaddr_RLUA0);
@@ -263,6 +269,10 @@ bool RlinkConnect::LinkInit(RerrMsg& emsg)
fUsrAcc = uint32_t(rlua1)<<16 | uint32_t(rlua0);
}
if ((clist[irbm].Status() & staterr) == 0) { // rbus monitor found
fHasRbmon = true; // just remember
}
return true;
}

View File

@@ -1,4 +1,4 @@
// $Id: RlinkConnect.hpp 871 2017-04-09 15:19:11Z mueller $
// $Id: RlinkConnect.hpp 883 2017-04-22 11:57:38Z mueller $
//
// Copyright 2011-2017 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
@@ -13,6 +13,7 @@
//
// Revision History:
// Date Rev Version Comment
// 2017-04-22 883 2.6.3 add rbus monitor probe, add HasRbmon()
// 2017-04-09 871 2.6.2 LogFileName(): returns now const std::string&
// 2017-04-07 868 2.6.1 Dump(): add detail arg
// 2017-02-20 854 2.6 use Rtime, drop TimeOfDayAsDouble
@@ -42,7 +43,7 @@
/*!
\file
\version $Id: RlinkConnect.hpp 871 2017-04-09 15:19:11Z mueller $
\version $Id: RlinkConnect.hpp 883 2017-04-22 11:57:38Z mueller $
\brief Declaration of class \c RlinkConnect.
*/
@@ -120,6 +121,7 @@ namespace Retro {
size_t RbufSize() const;
size_t BlockSizeMax() const;
size_t BlockSizePrudent() const;
bool HasRbmon() const;
bool AddrMapInsert(const std::string& name, uint16_t addr);
bool AddrMapErase(const std::string& name);
@@ -169,6 +171,7 @@ namespace Retro {
static const uint16_t kRbaddr_RLID0 = 0xfffc; //!< rlink core reg RLID0
static const uint16_t kRbaddr_RLUA1 = 0xfffb; //!< rlink opt. reg RLUA1
static const uint16_t kRbaddr_RLUA0 = 0xfffa; //!< rlink opt. reg RLUA0
static const uint16_t kRbaddr_RMBASE = 0xffe8; //!< rlink opt. rbd_rbmon
static const uint16_t kRLCNTL_M_AnEna = kWBit15;//!< RLCNTL: an enable
static const uint16_t kRLCNTL_M_AtoEna= kWBit14;//!< RLCNTL: ato enable
@@ -257,6 +260,7 @@ namespace Retro {
uint32_t fSysId; //!< SYSID of connected device
uint32_t fUsrAcc; //!< USR_ACCESS of connected device
size_t fRbufSize; //!< Rbuf size (in bytes)
bool fHasRbmon; //!< has rbd_rbmon (rbus monitor)
};
} // end namespace Retro

View File

@@ -1,4 +1,4 @@
// $Id: RlinkConnect.ipp 871 2017-04-09 15:19:11Z mueller $
// $Id: RlinkConnect.ipp 883 2017-04-22 11:57:38Z mueller $
//
// Copyright 2011-2017 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
@@ -13,6 +13,7 @@
//
// Revision History:
// Date Rev Version Comment
// 2017-04-22 883 2.5.2 add rbus monitor probe, add HasRbmon()
// 2017-04-09 871 2.5.1 LogFileName(): returns now const std::string&
// 2017-02-20 854 2.5 use Rtime, drop TimeOfDayAsDouble
// 2016-04-02 758 2.4 add USR_ACCESS register support (RLUA0/RLUA1)
@@ -30,7 +31,7 @@
/*!
\file
\version $Id: RlinkConnect.ipp 871 2017-04-09 15:19:11Z mueller $
\version $Id: RlinkConnect.ipp 883 2017-04-22 11:57:38Z mueller $
\brief Implemenation (inline) of RlinkConnect.
*/
@@ -136,6 +137,13 @@ inline size_t RlinkConnect::BlockSizePrudent() const
return (fRbufSize-kRbufPrudentDelta)/2;
}
//------------------------------------------+-----------------------------------
//! FIXME_docs
inline bool RlinkConnect::HasRbmon() const
{
return fHasRbmon;
}
//------------------------------------------+-----------------------------------
//! FIXME_docs

View File

@@ -1,4 +1,4 @@
// $Id: RtclRlinkConnect.cpp 868 2017-04-07 20:09:33Z mueller $
// $Id: RtclRlinkConnect.cpp 883 2017-04-22 11:57:38Z mueller $
//
// Copyright 2011-2017 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
@@ -13,6 +13,7 @@
//
// Revision History:
// Date Rev Version Comment
// 2017-04-22 883 1.5.2 M_amap: -testname opt addr check; add hasrbmon get
// 2017-04-02 865 1.5.1 M_dump: use GetArgsDump and Dump detail
// 2017-02-20 854 1.5 use Rtime
// 2016-04-02 758 1.4.6 add USR_ACCESS register support (UsrAcc->usracc)
@@ -42,7 +43,7 @@
/*!
\file
\version $Id: RtclRlinkConnect.cpp 868 2017-04-07 20:09:33Z mueller $
\version $Id: RtclRlinkConnect.cpp 883 2017-04-22 11:57:38Z mueller $
\brief Implemenation of class RtclRlinkConnect.
*/
@@ -136,6 +137,8 @@ RtclRlinkConnect::RtclRlinkConnect(Tcl_Interp* interp, const char* name)
boost::bind(&RlinkConnect::BlockSizeMax, pobj));
fGets.Add<size_t> ("bsizeprudent",
boost::bind(&RlinkConnect::BlockSizePrudent, pobj));
fGets.Add<bool> ("hasrbmon",
boost::bind(&RlinkConnect::HasRbmon, pobj));
fSets.Add<uint32_t> ("baseaddr",
boost::bind(&RlinkConnect::SetLogBaseAddr, pobj, _1));
@@ -467,11 +470,16 @@ int RtclRlinkConnect::M_amap(RtclArgs& args)
"' not mapped");
}
} else if (opt == "-testname") { // amap -testname name
} else if (opt == "-testname") { // amap -testname name ?addr
if (!args.GetArg("name", name)) return kERR;
if (!args.GetArg("?addr", addr)) return kERR;
if (!args.AllDone()) return kERR;
uint16_t tstaddr;
args.SetResult(int(addrmap.Find(name, tstaddr)));
bool found = addrmap.Find(name, tstaddr);
if (found && args.NOptMiss()==0) { // if specified addr
if (tstaddr != addr) found = false; // verify addr
}
args.SetResult(int(found));
} else if (opt == "-testaddr") { // amap -testaddr addr
if (!args.GetArg("addr", addr)) return kERR;

View File

@@ -1,4 +1,4 @@
// $Id: RtclRw11Cpu.cpp 876 2017-04-16 08:01:37Z mueller $
// $Id: RtclRw11Cpu.cpp 883 2017-04-22 11:57:38Z mueller $
//
// Copyright 2013-2017 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
@@ -13,6 +13,7 @@
//
// Revision History:
// Date Rev Version Comment
// 2017-04-22 883 1.2.17 M_(imap|rmap): -testname optional addr check
// 2017-04-15 876 1.2.16 add ControllerCommands()
// 2017-04-15 875 1.2.15 M_default: add attached units summary
// 2017-04-07 868 1.2.14 M_dump: use GetArgsDump and Dump detail
@@ -45,7 +46,7 @@
/*!
\file
\version $Id: RtclRw11Cpu.cpp 876 2017-04-16 08:01:37Z mueller $
\version $Id: RtclRw11Cpu.cpp 883 2017-04-22 11:57:38Z mueller $
\brief Implemenation of RtclRw11Cpu.
*/
@@ -160,11 +161,16 @@ int RtclRw11Cpu::M_imap(RtclArgs& args)
"' not mapped");
}
} else if (opt == "-testname") { // imap -testname name
} else if (opt == "-testname") { // imap -testname name ?addr
if (!args.GetArg("name", name)) return kERR;
if (!args.GetArg("?addr", addr)) return kERR;
if (!args.AllDone()) return kERR;
uint16_t tstaddr;
args.SetResult(int(addrmap.Find(name, tstaddr)));
bool found = addrmap.Find(name, tstaddr);
if (found && args.NOptMiss()==0) { // if specified addr
if (tstaddr != addr) found = false; // verify addr
}
args.SetResult(int(found));
} else if (opt == "-testaddr") { // imap -testaddr addr
if (!args.GetArg("addr", addr)) return kERR;
@@ -258,11 +264,16 @@ int RtclRw11Cpu::M_rmap(RtclArgs& args)
"' not mapped");
}
} else if (opt == "-testname") { // rmap -testname name
} else if (opt == "-testname") { // rmap -testname name ?addr
if (!args.GetArg("name", name)) return kERR;
if (!args.GetArg("?addr", addr)) return kERR;
if (!args.AllDone()) return kERR;
uint16_t tstaddr;
args.SetResult(int(lmap.Find(name, tstaddr)));
bool found = lmap.Find(name, tstaddr);
if (found && args.NOptMiss()==0) { // if specified addr
if (tstaddr != addr) found = false; // verify addr
}
args.SetResult(int(found));
} else if (opt == "-testaddr") { // rmap -testaddr addr
if (!args.GetArg("addr", addr)) return kERR;

View File

@@ -1,4 +1,4 @@
# $Id: util.tcl 872 2017-04-09 20:48:05Z mueller $
# $Id: util.tcl 883 2017-04-22 11:57:38Z mueller $
#
# Copyright 2015-2017 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
#
@@ -13,7 +13,8 @@
#
# Revision History:
# Date Rev Version Comment
# 2017-04-09 872 2.0 revised interface, add suspend and repeat collect
# 2017-04-22 883 2.0.1 setup: now idempotent; move out imap_reg2addr
# 2017-04-16 880 2.0 revised interface, add suspend and repeat collect
# 2017-01-02 837 1.1.1 add procs ime,imf
# 2016-12-30 833 1.1 add proc filter
# 2015-12-28 721 1.0.2 add regmap_add defs; add symbolic register dump
@@ -25,6 +26,7 @@ package provide ibd_ibmon 1.0
package require rutil
package require rlink
package require rw11
package require rw11util
namespace eval ibd_ibmon {
@@ -55,6 +57,7 @@ namespace eval ibd_ibmon {
# setup: amap definitions for ibd_ibmon ------------------------------------
#
proc setup {{cpu "cpu0"} {base 0160000}} {
if {[$cpu imap -testname im.cntl $base]} {return ""}
$cpu imap -insert im.cntl [expr {$base + 000}]
$cpu imap -insert im.stat [expr {$base + 002}]
$cpu imap -insert im.hilim [expr {$base + 004}]
@@ -75,7 +78,13 @@ namespace eval ibd_ibmon {
#
# start: setup filter window -----------------------------------------------
#
proc filter {{cpu "cpu0"} {lolim 0} {hilim 0177776}} {
proc filter {{cpu "cpu0"} {lolim 0160000} {hilim 0177776}} {
if {$lolim < 0160000 || $hilim < 0160000} {
error "filter-E: bad lolim or hilim, must be >= 0160000"
}
if {$lolim > $hilim} {
error "filter-E: bad lolim.hilim, must be lolim <= hilim"
}
$cpu cp -wibr im.lolim $lolim \
-wibr im.hilim $hilim
}
@@ -100,11 +109,28 @@ namespace eval ibd_ibmon {
$cpu cp -wibr im.cntl [regbld ibd_ibmon::CNTL {func "STO"}]
}
#
# suspend: suspend the ibmon -----------------------------------------------
# returns 1 if already suspended
# that allows to implement nested suspend/resume properly
#
proc suspend {{cpu "cpu0"}} {
$cpu cp -ribr im.stat rstat \
-wibr im.cntl [regbld ibd_ibmon::CNTL {func "SUS"}]
return [regget ibd_ibmon::STAT(susp) $rstat]
}
#
# resume: resume the ibmon -------------------------------------------------
#
proc resume {{cpu "cpu0"}} {
$cpu cp -wibr im.cntl [regbld ibd_ibmon::CNTL {func "RES"}]
}
#
# read: read nent last entries (by default all) ----------------------------
#
proc read {{cpu "cpu0"} {nent -1}} {
# suspend and get address and status
$cpu cp -wibr im.cntl [regbld ibd_ibmon::CNTL {func "SUS"}] \
$cpu cp -rreg im.stat rstatpre \
-wibr im.cntl [regbld ibd_ibmon::CNTL {func "SUS"}] \
-ribr im.cntl rcntl \
-ribr im.addr raddr \
-ribr im.stat rstat
@@ -180,9 +206,11 @@ namespace eval ibd_ibmon {
set nrest [expr {$nrest - ( $nblk >> 2 ) }]
}
# resume and restore address
# restore address and resume
# resume only if not already suspended before
set rfu [expr {[regget ibd_ibmon::::STAT(susp) $rstatpre] ? "NOOP" : "RES"}]
$cpu cp -wibr im.addr $raddr \
-wibr im.cntl [regbld ibd_ibmon::CNTL {func "RES"}]
-wibr im.cntl [regbldkv ibd_ibmon::CNTL func $rfu]
return $rval
}
@@ -258,7 +286,11 @@ namespace eval ibd_ibmon {
set ename [$cpu imap -name $eaddr]
set eam "l${prw}"
if {$fracc} { set eam "r${prw}"}
set etext [rw11util::regmap_txt $ename $eam $edata]
# mask out high/low byte for byte writes for regmap_txt
set edatamsk $edata
if {$pwe1 eq "0"} {set edatamsk [expr { $edatamsk & 0x00ff } ]}
if {$pwe0 eq "0"} {set edatamsk [expr { $edatamsk & 0xff00 } ]}
set etext [rw11util::regmap_txt $ename $eam $edatamsk]
}
set comment ""
@@ -356,40 +388,16 @@ namespace eval ibd_ibmon {
# imf: ibmon filter --------------------------------------------------------
#
proc imf {{cpu "cpu0"} {lo ""} {hi ""}} {
set lolim 0
set lolim 0160000
set hilim 0177776
if {$lo ne ""} {
set lolist [split $lo "/"]
if {[llength $lolist] > 2} {
error "imf-E: bad lo specifier '$lo', use val or val/len"
}
set lolim [imap_reg2addr $cpu [lindex $lolist 0]]
if {[llength $lolist] == 2} {
set hilim [expr {$lolim + 2*([lindex $lolist 1]-1)}]
}
set aran [rw11::imap_range2addr $cpu $lo $hi]
set lolim [lindex $aran 0]
set hilim [lindex $aran 1]
}
if {$hi ne ""} {
set hilim [imap_reg2addr $cpu $hi]
}
if {$lolim > $hilim} {error "imf-E: hilim must be >= lolim"}
ibd_ibmon::filter $cpu $lolim $hilim
}
#
# imap_reg2addr: convert register to address -------------------------------
#
proc imap_reg2addr {cpu reg} {
if {[$cpu imap -testname $reg]} {
return [$cpu imap $reg]
} elseif {[string is integer $reg]} {
return $reg
} else {
error "imap_reg2addr-E: unknown register '$reg'"
}
}
}

View File

@@ -1,6 +1,6 @@
# $Id: util.tcl 603 2014-11-09 22:50:26Z mueller $
# $Id: util.tcl 883 2017-04-22 11:57:38Z mueller $
#
# Copyright 2011-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
# Copyright 2011-2017 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
#
# This program is free software; you may redistribute and/or modify it under
# the terms of the GNU General Public License as published by the Free
@@ -13,6 +13,7 @@
#
# Revision History:
# Date Rev Version Comment
# 2017-04-22 883 2.0.1 setup: now idempotent
# 2014-11-09 603 2.0 use rlink v4 address layout
# 2011-03-19 372 1.0 Initial version
#
@@ -28,6 +29,7 @@ namespace eval rbbram {
# setup: amap definitions for rbd_bram
#
proc setup {base} {
if {[rlc amap -testname br.cntl $base]} {return ""}
rlc amap -insert br.cntl [expr {$base + 0x00}]
rlc amap -insert br.data [expr {$base + 0x01}]
}

View File

@@ -1,6 +1,6 @@
# $Id: util.tcl 643 2015-02-07 17:41:53Z mueller $
# $Id: util.tcl 883 2017-04-22 11:57:38Z mueller $
#
# Copyright 2011-2013 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
# Copyright 2011-2017 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
#
# This program is free software; you may redistribute and/or modify it under
# the terms of the GNU General Public License as published by the Free
@@ -13,6 +13,7 @@
#
# Revision History:
# Date Rev Version Comment
# 2017-04-22 883 1.1.1 setup: now idempotent
# 2015-02-07 642 1.1 add print()
# 2011-04-17 376 1.0.1 add proc read
# 2011-04-02 375 1.0 Initial version
@@ -34,6 +35,7 @@ namespace eval rbemon {
# setup: amap definitions for rbd_eyemon
#
proc setup {{base 0xffd0}} {
if {[rlc amap -testname em.cntl $base]} {return ""}
rlc amap -insert em.cntl [expr {$base + 0x00}]
rlc amap -insert em.rdiv [expr {$base + 0x01}]
rlc amap -insert em.addr [expr {$base + 0x02}]

View File

@@ -1,4 +1,4 @@
# $Id: test_rbtest.tcl 872 2017-04-09 20:48:05Z mueller $
# $Id: test_rbtest.tcl 873 2017-04-14 11:56:29Z mueller $
#
# Copyright 2011-2017 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
#
@@ -13,7 +13,7 @@
#
# Revision History:
# Date Rev Version Comment
# 2017-04-09 872 3.0 adopt to revised interface
# 2017-04-14 873 3.0 adopt to revised interface
# 2015-04-03 661 2.1 drop estatdef; fix test 5 (wrong regs accessed)
# 2014-12-22 619 2.0 adopt to new rbd_rbmon and rlink v4
# 2011-03-27 374 1.0 Initial version
@@ -333,10 +333,10 @@ namespace eval rbmoni {
#
#-------------------------------------------------------------------------
rlc log " test 6: test repeat collapse read with wreg,rreg "
rlc log " test 6: test repeat collapse read with wreg,rreg"
#-----------------------------------------------------------------
rlc log " test 6a: dry run, no collapse active"
set vteinit [regbld rbtest::INIT cntl]
set vteinit [regbld rbtest::INIT cntl data fifo]
# build expect list: list of {eflag eaddr edata enbusy} sublists
raw_edata edat emsk \
[list [regbld rbmoni::FLAGS nak init] $atecntl $vteinit 0] \
@@ -451,12 +451,72 @@ namespace eval rbmoni {
if {$print} {puts [print]}
raw_check $edat $emsk
#-----------------------------------------------------------------
rlc log " test 6e: verify non-collapse of alternating write-read same addr"
# build expect list: list of {eflag eaddr edata enbusy} sublists
raw_edata edat emsk \
[list [regbld rbmoni::FLAGS nak init] $atecntl $vteinit 0] \
[list [regbld rbmoni::FLAGS ack we] $atefifo 0x0001 0] \
[list [regbld rbmoni::FLAGS ack ] $atefifo 0x0001 0] \
[list [regbld rbmoni::FLAGS ack we] $atefifo 0x0002 0] \
[list [regbld rbmoni::FLAGS ack ] $atefifo 0x0002 0] \
[list [regbld rbmoni::FLAGS ack we] $atefifo 0x0003 0] \
[list [regbld rbmoni::FLAGS ack ] $atefifo 0x0003 0] \
[list [regbld rbmoni::FLAGS ack we] $atefifo 0x0004 0] \
[list [regbld rbmoni::FLAGS ack ] $atefifo 0x0004 0] \
[list [regbld rbmoni::FLAGS nak init] $atecntl $vteinit 0]
#
rbmoni::start rcolw 1 rcolr 1
rlc exec \
-init te.cntl $vteinit \
-wreg te.fifo 0x0001 \
-rreg te.fifo -edata 0x0001 \
-wreg te.fifo 0x0002 \
-rreg te.fifo -edata 0x0002 \
-wreg te.fifo 0x0003 \
-rreg te.fifo -edata 0x0003 \
-wreg te.fifo 0x0004 \
-rreg te.fifo -edata 0x0004 \
-init te.cntl $vteinit
rbmoni::stop
if {$print} {puts [print]}
raw_check $edat $emsk
#-----------------------------------------------------------------
rlc log " test 6f: verify non-collapse of reads to different addr"
# build expect list: list of {eflag eaddr edata enbusy} sublists
raw_edata edat emsk \
[list [regbld rbmoni::FLAGS nak init] $atecntl $vteinit 0] \
[list [regbld rbmoni::FLAGS ack we] $atedata 0x1230 0] \
[list [regbld rbmoni::FLAGS ack ] $atedata 0x1230 0] \
[list [regbld rbmoni::FLAGS ack ] $atedinc 0x1230 0] \
[list [regbld rbmoni::FLAGS ack ] $atedata 0x1231 0] \
[list [regbld rbmoni::FLAGS ack ] $atedinc 0x1231 0] \
[list [regbld rbmoni::FLAGS ack ] $atedata 0x1232 0] \
[list [regbld rbmoni::FLAGS ack ] $atedinc 0x1232 0] \
[list [regbld rbmoni::FLAGS nak init] $atecntl $vteinit 0]
#
rbmoni::start rcolw 1 rcolr 1
rlc exec \
-init te.cntl $vteinit \
-wreg te.data 0x1230 \
-rreg te.data -edata 0x1230 \
-rreg te.dinc -edata 0x1230 \
-rreg te.data -edata 0x1231 \
-rreg te.dinc -edata 0x1231 \
-rreg te.data -edata 0x1232 \
-rreg te.dinc -edata 0x1232 \
-init te.cntl $vteinit
rbmoni::stop
if {$print} {puts [print]}
raw_check $edat $emsk
#
#-------------------------------------------------------------------------
rlc log " test 7: test repeat collapse read with wblk,rblk "
rlc log " test 7: test repeat collapse read with wblk,rblk"
#-----------------------------------------------------------------
rlc log " test 7a: dry run, no collapse active"
set vteinit [regbld rbtest::INIT cntl]
set vteinit [regbld rbtest::INIT cntl data fifo]
set vtefifo {0x1101 0x2202 0x3303 0x4404}
# build expect list: list of {eflag eaddr edata enbusy} sublists
raw_edata edat emsk \
@@ -551,6 +611,87 @@ namespace eval rbmoni {
if {$print} {puts [print]}
raw_check $edat $emsk
#-------------------------------------------------------------------------
rlc log " test 8: test repeat collapse with lolim,hilim "
#-----------------------------------------------------------------
# set window to te.ncyc to te.dinc, thus exclude cntl,stat,attn,fifo,lnak
rlc exec -wreg rm.lolim $atencyc \
-wreg rm.hilim $atedinc
#-----------------------------------------------------------------
rlc log " test 8a: read collapse interrupted by out-of-window read"
raw_edata edat emsk \
[list [regbld rbmoni::FLAGS ack we] $atedata 0x2000 0] \
[list [regbld rbmoni::FLAGS ack ] $atedinc 0x2000 0] \
[list [regbld rbmoni::FLAGS ack ] $atedinc 0x2003 0] \
[list [regbld rbmoni::FLAGS ack ] $atedinc 0x2004 0] \
[list [regbld rbmoni::FLAGS ack ] $atedinc 0x2007 0]
#
rbmoni::start rcolw 1 rcolr 1
rlc exec -wreg te.data 0x2000 \
-rreg te.dinc -edata 0x2000 \
-rreg te.dinc -edata 0x2001 \
-rreg te.dinc -edata 0x2002 \
-rreg te.dinc -edata 0x2003 \
-rreg te.stat \
-rreg te.dinc -edata 0x2004 \
-rreg te.dinc -edata 0x2005 \
-rreg te.dinc -edata 0x2006 \
-rreg te.dinc -edata 0x2007
rbmoni::stop
if {$print} {puts [print]}
raw_check $edat $emsk
#-----------------------------------------------------------------
rlc log " test 8b: write collapse interrupted by out-of-window write"
raw_edata edat emsk \
[list [regbld rbmoni::FLAGS ack we] $atedata 0x3000 0] \
[list [regbld rbmoni::FLAGS ack we] $atedinc 0x3001 0] \
[list [regbld rbmoni::FLAGS ack we] $atedinc 0x3003 0] \
[list [regbld rbmoni::FLAGS ack we] $atedinc 0x3004 0] \
[list [regbld rbmoni::FLAGS ack we] $atedinc 0x3007 0]
#
rbmoni::start rcolw 1 rcolr 1
rlc exec -wreg te.data 0x3000 \
-wreg te.dinc 0x3001 \
-wreg te.dinc 0x3002 \
-wreg te.dinc 0x3003 \
-wreg te.stat 0x0000 \
-wreg te.dinc 0x3004 \
-wreg te.dinc 0x3005 \
-wreg te.dinc 0x3006 \
-wreg te.dinc 0x3007
rbmoni::stop
if {$print} {puts [print]}
raw_check $edat $emsk
rbmoni::init
#-----------------------------------------------------------------
rlc log " test 8c: read collapse interrupted by init (which recorded)"
set vteinit [regbld rbtest::INIT data]
raw_edata edat emsk \
[list [regbld rbmoni::FLAGS ack we ] $atedata 0x4000 0] \
[list [regbld rbmoni::FLAGS ack ] $atedinc 0x4000 0] \
[list [regbld rbmoni::FLAGS ack ] $atedinc 0x4003 0] \
[list [regbld rbmoni::FLAGS nak init] $atecntl $vteinit 0] \
[list [regbld rbmoni::FLAGS ack ] $atedinc 0x0000 0] \
[list [regbld rbmoni::FLAGS ack ] $atedinc 0x0003 0]
#
rbmoni::start rcolw 1 rcolr 1
rlc exec -wreg te.data 0x4000 \
-rreg te.dinc -edata 0x4000 \
-rreg te.dinc -edata 0x4001 \
-rreg te.dinc -edata 0x4002 \
-rreg te.dinc -edata 0x4003 \
-init te.cntl $vteinit \
-rreg te.dinc -edata 0x0000 \
-rreg te.dinc -edata 0x0001 \
-rreg te.dinc -edata 0x0002 \
-rreg te.dinc -edata 0x0003
rbmoni::stop
if {$print} {puts [print]}
raw_check $edat $emsk
#-------------------------------------------------------------------------
rlc log "rbmoni::test_rbtest - cleanup:"
rbtest::init

View File

@@ -1,4 +1,4 @@
# $Id: test_regs.tcl 872 2017-04-09 20:48:05Z mueller $
# $Id: test_regs.tcl 873 2017-04-14 11:56:29Z mueller $
#
# Copyright 2011-2017 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
#
@@ -13,7 +13,7 @@
#
# Revision History:
# Date Rev Version Comment
# 2017-04-09 872 3.0 adopt to revised interface
# 2017-04-13 873 3.0 adopt to revised interface
# 2015-04-03 661 2.1 drop estatdef (stat err check default now)
# 2014-12-27 622 2.0 rbd_rbmon reorganized, supports now 16 bit addresses
# 2011-03-27 374 1.0 Initial version
@@ -80,12 +80,15 @@ namespace eval rbmoni {
-rreg rm.stat -edata [regbld rbmoni::STAT susp run] \
-wreg rm.cntl [regbld rbmoni::CNTL {func "STA"}] \
-rreg rm.stat -edata [regbld rbmoni::STAT run]
# test that suspend of a suspended system is a noop
# test that stop of a suspended system clears suspend
rlc exec \
-wreg rm.cntl [regbld rbmoni::CNTL {func "STA"}] \
-rreg rm.stat -edata [regbld rbmoni::STAT run] \
-wreg rm.cntl [regbld rbmoni::CNTL {func "SUS"}] \
-rreg rm.stat -edata [regbld rbmoni::STAT susp run] \
-wreg rm.cntl [regbld rbmoni::CNTL {func "SUS"}] \
-rreg rm.stat -edata [regbld rbmoni::STAT susp run] \
-wreg rm.cntl [regbld rbmoni::CNTL {func "STO"}] \
-rreg rm.stat -edata [regbld rbmoni::STAT]
# get amax for later usage

View File

@@ -1,4 +1,4 @@
# $Id: util.tcl 872 2017-04-09 20:48:05Z mueller $
# $Id: util.tcl 883 2017-04-22 11:57:38Z mueller $
#
# Copyright 2011-2017 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
#
@@ -13,7 +13,8 @@
#
# Revision History:
# Date Rev Version Comment
# 2017-04-09 872 4.0 revised interface, add suspend and repeat collect
# 2017-04-22 883 4.0.1 setup: now idempotent; add procs filter,rme,rmf
# 2017-04-13 873 4.0 revised interface, add suspend and repeat collect
# 2015-04-03 661 3.1 drop estatdef; invert mask in raw_edata
# 2014-12-23 619 3.0 rbd_rbmon reorganized, supports now 16 bit addresses
# 2014-11-09 603 2.0 use rlink v4 address layout
@@ -44,9 +45,10 @@ namespace eval rbmoni {
regdsc FLAGS {bnext 8} {burst 7} {tout 6} {nak 5} {ack 4} \
{busy 3} {err 2} {we 1} {init 0}
#
# setup: amap definitions for rbd_rbmon
# setup: amap definitions for rbd_rbmon ------------------------------------
#
proc setup {{base 0xffe8}} {
if {[rlc amap -testname rm.cntl $base]} {return ""}
rlc amap -insert rm.cntl [expr {$base + 0x00}]
rlc amap -insert rm.stat [expr {$base + 0x01}]
rlc amap -insert rm.hilim [expr {$base + 0x02}]
@@ -55,7 +57,7 @@ namespace eval rbmoni {
rlc amap -insert rm.data [expr {$base + 0x05}]
}
#
# init: reset rbd_rbmon (stop, reset alim)
# init: reset rbd_rbmon (stop, reset alim) ---------------------------------
#
proc init {} {
rlc exec \
@@ -65,7 +67,15 @@ namespace eval rbmoni {
-wreg rm.addr 0x0000
}
#
# start: start the rbmon
# start: setup filter window -----------------------------------------------
#
proc filter {{lolim 0160000} {hilim 0177776}} {
rlc exec \
-wreg rm.lolim $lolim \
-wreg rm.hilim $hilim
}
#
# start: start the rbmon ---------------------------------------------------
#
proc start {args} {
args2opts opts {rcolw 0 rcolr 0 wstop 0} {*}$args
@@ -76,16 +86,33 @@ namespace eval rbmoni {
]
}
#
# stop: stop the rbmon
# stop: stop the rbmon -----------------------------------------------------
#
proc stop {} {
rlc exec -wreg rm.cntl [regbld rbmoni::CNTL {func "STO"}]
}
#
# read: read nent last entries (by default all)
# suspend: suspend the rbmon -----------------------------------------------
# returns 1 if already suspended
# that allows to implement nested suspend/resume properly
#
proc suspend {} {
rlc exec -rreg rm.stat rstat \
-wreg rm.cntl [regbld rbmoni::CNTL {func "SUS"}]
return [regget rbmoni::STAT(susp) $rstat]
}
#
# resume: resume the rbmon -------------------------------------------------
#
proc resume {} {
rlc exec -wreg rm.cntl [regbld rbmoni::CNTL {func "RES"}]
}
#
# read: read nent last entries (by default all) ----------------------------
#
proc read {{nent -1}} {
rlc exec -wreg rm.cntl [regbld rbmoni::CNTL {func "SUS"}] \
rlc exec -rreg rm.stat rstatpre \
-wreg rm.cntl [regbld rbmoni::CNTL {func "SUS"}] \
-rreg rm.cntl rcntl \
-rreg rm.addr raddr \
-rreg rm.stat rstat
@@ -134,9 +161,11 @@ namespace eval rbmoni {
set nrest [expr {$nrest - ( $nblk >> 2 ) }]
}
# resume and restore address
# restore address and resume
# resume only if not already suspended before
set rfu [expr {[regget rbmoni::STAT(susp) $rstatpre] ? "NOOP" : "RES"}]
rlc exec -wreg rm.addr $raddr \
-wreg rm.cntl [regbld rbmoni::CNTL {func "RES"}]
-wreg rm.cntl [regbldkv rbmoni::CNTL func $rfu]
set mbnext [regbld rbmoni::FLAGS bnext]
set mburst [regbld rbmoni::FLAGS burst]
@@ -152,7 +181,7 @@ namespace eval rbmoni {
return $rval
}
#
# print: print rbmon data (optionally also read them)
# print: print rbmon data (optionally also read them) -----------------------
#
proc print {{mondat -1}} {
@@ -229,7 +258,7 @@ namespace eval rbmoni {
}
#
# raw_edata: prepare edata lists for raw data reads in tests
# raw_edata: prepare edata lists for raw data reads in tests ---------------
# args is list of {eflag eaddr edata enbusy} sublists
proc raw_edata {edat emsk args} {
@@ -264,7 +293,7 @@ namespace eval rbmoni {
}
#
# raw_check: check raw data against expect values prepared by raw_edata
# raw_check: check raw data against expect values prepared by raw_edata ----
#
proc raw_check {edat emsk} {
@@ -275,5 +304,49 @@ namespace eval rbmoni {
-rreg rm.addr -edata [llength $edat]
return ""
}
#
# === high level procs: compact usage (also by rw11:shell) =================
#
# rme: rbmon enable --------------------------------------------------------
#
proc rme {{mode ""}} {
if {![regexp {^[nRW]*$} $mode]} {
error "rme-E: bad mode '$mode', use \[nRW\]*"
}
set wstop [string match *n* $mode]
set rcolr [string match *R* $mode]
set rcolw [string match *W* $mode]
rbmoni::start wstop $wstop rcolr $rcolr rcolw $rcolw
return ""
}
#
# rmf: rbmon filter --------------------------------------------------------
#
proc rmf {{lo ""} {hi ""}} {
set lolim 0
set hilim 0177773
if {$lo ne ""} {
set lolist [split $lo "/"]
if {[llength $lolist] > 2} {
error "imf-E: bad lo specifier '$lo', use val or val/len"
}
set lolim [rlink::amap_reg2addr [lindex $lolist 0]]
set hilim $lolim
if {[llength $lolist] == 2} {
set hilim [expr {$lolim + ([lindex $lolist 1]-1)}]
}
}
if {$hi ne ""} {
set hilim [rlink::amap_reg2addr $hi]
}
if {$lolim > $hilim} {error "rmf-E: hilim must be >= lolim"}
rbmoni::filter $lolim $hilim
}
}

View File

@@ -1,6 +1,6 @@
# $Id: util.tcl 640 2015-02-01 09:56:53Z mueller $
# $Id: util.tcl 883 2017-04-22 11:57:38Z mueller $
#
# Copyright 2011-2015 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
# Copyright 2011-2017 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
#
# This program is free software; you may redistribute and/or modify it under
# the terms of the GNU General Public License as published by the Free
@@ -13,6 +13,7 @@
#
# Revision History:
# Date Rev Version Comment
# 2017-04-22 883 1.1.1 setup: now idempotent
# 2015-01-31 640 1.1 adopt to new register layout
# 2011-08-14 406 1.0.2 adopt to common register layout
# 2011-04-17 376 1.0.1 print: show also switch values; add proc disptest
@@ -36,6 +37,7 @@ namespace eval rbs3hio {
# setup: amap definitions for s3_humanio_rbus
#
proc setup {{base 0xfef0}} {
if {[rlc amap -testname hi.stat $base]} {return ""}
rlc amap -insert hi.stat [expr {$base + 0x00}]
rlc amap -insert hi.cntl [expr {$base + 0x01}]
rlc amap -insert hi.btn [expr {$base + 0x02}]

View File

@@ -1,6 +1,6 @@
# $Id: util.tcl 661 2015-04-03 18:28:41Z mueller $
# $Id: util.tcl 883 2017-04-22 11:57:38Z mueller $
#
# Copyright 2011-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
# Copyright 2011-2017 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
#
# This program is free software; you may redistribute and/or modify it under
# the terms of the GNU General Public License as published by the Free
@@ -13,6 +13,7 @@
#
# Revision History:
# Date Rev Version Comment
# 2017-04-22 883 2.0.2 setup: now idempotent
# 2014-12-21 617 2.0.1 use rbtout stat bit for timeout
# 2014-11-09 603 2.0 use rlink v4 address layout and iface with 8 regs
# 2011-03-27 374 1.0 Initial version
@@ -35,6 +36,7 @@ namespace eval rbtest {
# setup: amap definitions for rbd_tester
#
proc setup {{base 0xffe0}} {
if {[rlc amap -testname te.cntl $base]} {return ""}
rlc amap -insert te.cntl [expr {$base + 0x00}]
rlc amap -insert te.stat [expr {$base + 0x01}]
rlc amap -insert te.attn [expr {$base + 0x02}]

View File

@@ -1,6 +1,6 @@
# $Id: util.tcl 758 2016-04-02 18:01:39Z mueller $
# $Id: util.tcl 883 2017-04-22 11:57:38Z mueller $
#
# Copyright 2011-2016 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
# Copyright 2011-2017 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
#
# This program is free software; you may redistribute and/or modify it under
# the terms of the GNU General Public License as published by the Free
@@ -13,6 +13,7 @@
#
# Revision History:
# Date Rev Version Comment
# 2017-04-22 883 2.1.1 add amap_reg2addr
# 2016-04-02 758 2.1 add USR_ACCESS register support (RLUA0/RLUA1)
# 2014-12-21 617 2.0.1 add rbtout definition in STAT
# 2014-12-07 609 2.0 use new rlink v4 iface; remove SINIT again
@@ -127,5 +128,17 @@ namespace eval rlink {
return $rval
}
#
# amap_reg2addr: convert register to address -------------------------------
#
proc amap_reg2addr {reg} {
if {[rlc amap -testname $reg]} {
return [rlc amap $reg]
} elseif {[string is integer $reg]} {
return $reg
} else {
error "amap_reg2addr-E: unknown register '$reg'"
}
}
}

View File

@@ -1,6 +1,6 @@
# $Id: dmhbpt.tcl 701 2015-07-19 12:58:29Z mueller $
# $Id: dmhbpt.tcl 883 2017-04-22 11:57:38Z mueller $
#
# Copyright 2015- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
# Copyright 2015-2017 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
#
# This program is free software; you may redistribute and/or modify it under
# the terms of the GNU General Public License as published by the Free
@@ -13,6 +13,7 @@
#
# Revision History:
# Date Rev Version Comment
# 2017-04-22 833 1.0.1 hb_set: use imap_range2addr, allow regnam and range
# 2015-07-17 701 1.0 Initial version
# 2015-07-05 697 0.1 First draft
#
@@ -32,7 +33,7 @@ namespace eval rw11 {
#
# hb_set: set breakpoint
#
proc hb_set {cpu unit type lolim {hilim 0} } {
proc hb_set {cpu unit type lo {hi ""} } {
hb_ucheck $cpu $unit
if {![regexp {^[ksu]?[rwi]+$} $type]} {
error "hb_set-E: bad type '$type', only ksu and iwr allowed"
@@ -44,7 +45,10 @@ namespace eval rw11 {
if {[string match *k* $type]} {set mode 0}
if {[string match *s* $type]} {set mode 1}
if {[string match *u* $type]} {set mode 3}
if {$hilim < $lolim} {set hilim $lolim}
set aran [rw11::imap_range2addr $cpu $lo $hi]
set lolim [lindex $aran 0]
set hilim [lindex $aran 1]
$cpu cp -wreg "hb${unit}.cntl" \
[regbld rw11::HB_CNTL [list mode $mode] \

View File

@@ -1,4 +1,4 @@
# $Id: shell.tcl 872 2017-04-09 20:48:05Z mueller $
# $Id: shell.tcl 883 2017-04-22 11:57:38Z mueller $
#
# Copyright 2015-2017 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
#
@@ -13,6 +13,8 @@
#
# Revision History:
# Date Rev Version Comment
# 2017-04-22 883 2.2.3 integrate rbmon: add .rme,.rmd,.rmf,.rml
# 2017-04-16 879 2.2.2 rename .cres->.crst and .cr->.cres (more intuitive)
# 2017-04-09 872 2.2.1 adopt .ime to new interface
# 2017-01-02 837 2.2 code re-shuffle; add cpu status in prompt
# 2016-12-31 834 2.1 add '@' command
@@ -26,6 +28,7 @@ package provide rw11 1.0
package require rlink
package require rwxxtpp
package require ibd_ibmon
package require rbmoni
namespace eval rw11 {
@@ -170,10 +173,10 @@ namespace eval rw11 {
.c3 {set rval [shell_setcpu $cname]}
.cs {set rval [shell_cs {*}$cargs]}
.cr {set rval [shell_cr {*}$cargs]}
.cres {set rval [shell_cres {*}$cargs]}
.csus {set rval [shell_csus {*}$cargs]}
.csto {set rval [shell_csto {*}$cargs]}
.cres {set rval [shell_cres {*}$cargs]}
.crst {set rval [shell_crst {*}$cargs]}
.csta {set rval [shell_csta {*}$cargs]}
.bs {set rval [rw11::hb_set $shell_cpu {*}$cargs]}
@@ -189,6 +192,11 @@ namespace eval rw11 {
.imf {set rval [shell_imf {*}$cargs]}
.iml {set rval [shell_iml {*}$cargs]}
.rme {set rval [shell_rme {*}$cargs]}
.rmd {set rval [shell_rmd {*}$cargs]}
.rmf {set rval [shell_rmf {*}$cargs]}
.rml {set rval [shell_rml {*}$cargs]}
. {set rval [shell_cls {*}$cargs]}
? {set rval [shell_clb {*}$cargs]}
?m {set rval [shell_clm {*}$cargs]}
@@ -251,9 +259,9 @@ namespace eval rw11 {
}
#
# shell_cr: cpu resume -----------------------------------------------------
# shell_cres: cpu resume ---------------------------------------------------
#
proc shell_cr {} {
proc shell_cres {} {
variable shell_cpu
variable shell_cpu_stat
@@ -286,9 +294,9 @@ namespace eval rw11 {
}
#
# shell_cres: cpu reset ----------------------------------------------------
# shell_crst: cpu reset ----------------------------------------------------
#
proc shell_cres {} {
proc shell_crst {} {
variable shell_cpu
$shell_cpu cp -stop
$shell_cpu cp -creset
@@ -340,7 +348,7 @@ namespace eval rw11 {
variable shell_cme_pend
variable shell_cme_mode
if {![shell_test_device $shell_cpu "cme" "cm.cntl" "dmcmon"]} {return ""}
if {![shell_test_cpurmap $shell_cpu "cme" "cm.cntl" "dmcmon"]} {return ""}
rw11::cme $shell_cpu $mode
set shell_cme_pend 0
@@ -355,7 +363,7 @@ namespace eval rw11 {
variable shell_cpu
variable shell_cme_pend
if {![shell_test_device $shell_cpu "cmd" "cm.cntl" "dmcmon"]} {return ""}
if {![shell_test_cpurmap $shell_cpu "cmd" "cm.cntl" "dmcmon"]} {return ""}
set shell_cme_pend 0
rw11::cm_stop $shell_cpu
@@ -368,7 +376,7 @@ namespace eval rw11 {
proc shell_cml {{nent -1}} {
variable shell_cpu
variable shell_cme_pend
if {![shell_test_device $shell_cpu "cml" "cm.cntl" "dmcmon"]} {return ""}
if {![shell_test_cpurmap $shell_cpu "cml" "cm.cntl" "dmcmon"]} {return ""}
set shell_cme_pend 1
return [rw11::cml $shell_cpu $nent]
@@ -379,7 +387,7 @@ namespace eval rw11 {
#
proc shell_ime {{mode "lrc"}} {
variable shell_cpu
if {![shell_test_device $shell_cpu "ime" "im.cntl" "ibmon"]} {return ""}
if {![shell_test_cpurmap $shell_cpu "ime" "im.cntl" "ibmon"]} {return ""}
ibd_ibmon::ime $shell_cpu $mode
return ""
@@ -390,7 +398,7 @@ namespace eval rw11 {
#
proc shell_imd {} {
variable shell_cpu
if {![shell_test_device $shell_cpu "imd" "im.cntl" "ibmon"]} {return ""}
if {![shell_test_cpurmap $shell_cpu "imd" "im.cntl" "ibmon"]} {return ""}
ibd_ibmon::stop $shell_cpu
return ""
@@ -401,7 +409,7 @@ namespace eval rw11 {
#
proc shell_imf {{lo ""} {hi ""}} {
variable shell_cpu
if {![shell_test_device $shell_cpu "imf" "im.cntl" "ibmon"]} {return ""}
if {![shell_test_cpurmap $shell_cpu "imf" "im.cntl" "ibmon"]} {return ""}
ibd_ibmon::imf $shell_cpu $lo $hi
return ""
@@ -412,12 +420,49 @@ namespace eval rw11 {
#
proc shell_iml {{nent -1}} {
variable shell_cpu
if {![shell_test_device $shell_cpu "iml" "im.cntl" "ibmon"]} {return ""}
if {![shell_test_cpurmap $shell_cpu "iml" "im.cntl" "ibmon"]} {return ""}
set mondat [ibd_ibmon::read $shell_cpu $nent]
if {![llength $mondat]} {return ""}
return [ibd_ibmon::print $shell_cpu $mondat]
}
#
# shell_rme: rbmon enable --------------------------------------------------
#
proc shell_rme {{mode ""}} {
if {![shell_test_rlcamap "rme" "rm.cntl" "rbmon"]} {return ""}
rbmoni::rme $mode
return ""
}
#
# shell_rmd: rbmon diasable -------------------------------------------------
#
proc shell_rmd {} {
if {![shell_test_rlcamap "rmd" "rm.cntl" "rbmon"]} {return ""}
rbmoni::stop
return ""
}
#
# shell_rmf: rbmon filter ---------------------------------------------------
#
proc shell_rmf {{lo ""} {hi ""}} {
if {![shell_test_rlcamap "rmf" "rm.cntl" "rbmon"]} {return ""}
rbmoni::rmf $lo $hi
return ""
}
#
# shell_rml: rbmon list -----------------------------------------------------
#
proc shell_rml {{nent -1}} {
if {![shell_test_rlcamap "rml" "rm.cntl" "rbmon"]} {return ""}
set mondat [rbmoni::read $nent]
if {![llength $mondat]} {return ""}
return [rbmoni::print $mondat]
}
#
# shell_cls: cpu short status ----------------------------------------------
#
@@ -541,11 +586,11 @@ namespace eval rw11 {
}
}
append rval "\n .cs ?nstep? ; cpu step"
append rval "\n .cr ; cpu resume"
append rval "\n .cres ; cpu resume"
append rval "\n .csus ; cpu suspend"
append rval "\n .csto ; cpu stop"
append rval "\n .cres ; cpu reset"
append rval "\n .csta ?addr? ; cpu start"
append rval "\n .crst ; cpu reset"
append rval "\n . ; short cpu state (pc+psw)"
append rval "\n ? ; brief cpu state (all regs)"
append rval "\n ?m ; mmu status"
@@ -560,19 +605,26 @@ namespace eval rw11 {
append rval "\n .bs ind typ lo hi ; set bpt"
append rval "\n .br ?ind? ; remove bpt"
append rval "\n .bl ; list bpt"
if {[$shell_cpu rmap -testname "cm.cntl"]} {
if {[$shell_cpu get hascmon]} {
append rval "\nCPU monitor:"
append rval "\n .cme ?mode? ; cmon enable; mode:\[is\]?n?"
append rval "\n .cmd ; cmon disable"
append rval "\n .cml ?nent? ; cmon list"
}
if {[$shell_cpu rmap -testname "im.cntl"]} {
if {[$shell_cpu get hasibmon]} {
append rval "\nibus monitor:"
append rval "\n .ime ; ibmon enable; mode: \[lrcnRW\]*"
append rval "\n .imd ; ibmon disable"
append rval "\n .imf ?lo? ?hi? ; ibmon filter"
append rval "\n .iml ?nent? ; ibmon list"
}
if {[rlc get hasrbmon]} {
append rval "\nrbus monitor:"
append rval "\n .rme ; rbmon enable; mode: \[nRW\]*"
append rval "\n .rmd ; rbmon disable"
append rval "\n .rmf ?lo? ?hi? ; rbmon filter"
append rval "\n .rml ?nent? ; rbmon list"
}
append rval "\nconsole (tta0) direct input:"
append rval "\n ( ?text? ; tta0 input without cr"
append rval "\n < ?text? ; tta0 input with cr"
@@ -626,9 +678,9 @@ namespace eval rw11 {
}
#
# shell_test_device: test whether cpu option available ---------------------
# shell_test_cpurmap: test whether cpu option available ---------------------
#
proc shell_test_device {cpu cmd regnam optnam} {
proc shell_test_cpurmap {cpu cmd regnam optnam} {
if {[$cpu rmap -testname $regnam]} {
return 1;
}
@@ -636,6 +688,17 @@ namespace eval rw11 {
return 0;
}
#
# shell_test_rlcamap: test whether rbus option available --------------------
#
proc shell_test_rlcamap {cmd regnam optnam} {
if {[rlc amap -testname $regnam]} {
return 1;
}
puts "shell-W: '$cmd' command ignored, '$optnam' rbus option not available"
return 0;
}
#
# shell_update_cpu_stat ----------------------------------------------------
#

View File

@@ -1,4 +1,4 @@
# $Id: util.tcl 849 2017-02-05 22:30:03Z mueller $
# $Id: util.tcl 883 2017-04-22 11:57:38Z mueller $
#
# Copyright 2013-2017 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
#
@@ -13,6 +13,7 @@
#
# Revision History:
# Date Rev Version Comment
# 2017-04-22 83 1.3.8 move in imap_reg2addr; add imap_range2addr
# 2017-02-04 848 1.3.7 add DEUNA; setup_cntl: handle not found devices
# 2015-12-30 721 1.3.6 BUGFIX: setup_ostr: adopt to use args2opts
# 2015-07-25 704 1.3.5 use args2opts
@@ -224,4 +225,40 @@ namespace eval rw11 {
append p_cc [expr {$ps_c ? "c" : "."}]
return "${p_cmode}${p_pmode}${ps_rset}${ps_pri}${p_tflag}${p_cc}"
}
#
# imap_reg2addr: convert register to address -------------------------------
#
proc imap_reg2addr {cpu reg} {
if {[$cpu imap -testname $reg]} {
return [$cpu imap $reg]
} elseif {[string is integer $reg]} {
return $reg
} else {
error "imap_reg2addr-E: unknown register '$reg'"
}
}
#
# imap_range2addr: convert register range to address range -----------------
# Note: also used for general address ranges, so no check on >= 0160000
#
proc imap_range2addr {cpu lo {hi ""}} {
set lolist [split $lo "/"]
if {[llength $lolist] > 2} {
error "imap_range2addr-E: bad lo specifier '$lo', use val or val/len"
}
set lolim [imap_reg2addr $cpu [lindex $lolist 0]]
set hilim $lolim
if {[llength $lolist] == 2} {
set hilim [expr {$lolim + 2*([lindex $lolist 1]-1)}]
}
if {$hi ne ""} {
set hilim [imap_reg2addr $cpu $hi]
}
if {$lolim > $hilim} {error "imap_range2addr-E: hilim must be >= lolim"}
return [list $lolim $hilim]
}
}

View File

@@ -1,6 +1,6 @@
# $Id: util.tcl 603 2014-11-09 22:50:26Z mueller $
# $Id: util.tcl 883 2017-04-22 11:57:38Z mueller $
#
# Copyright 2011-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
# Copyright 2011-2017 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
#
# This program is free software; you may redistribute and/or modify it under
# the terms of the GNU General Public License as published by the Free
@@ -13,6 +13,7 @@
#
# Revision History:
# Date Rev Version Comment
# 2017-04-22 883 2.0.1 setup: now idempotent
# 2014-11-09 603 2.0 use rlink v4 address layout
# 2011-04-17 376 1.0.1 add proc scan_baud
# 2011-04-02 375 1.0 Initial version
@@ -33,14 +34,15 @@ namespace eval tst_rlink {
# setup: amap definitions for tst_rlink
#
proc setup {} {
rlc amap -clear; # clear first to allow re-run
rlink::setup;
rbtest::setup 0xffe0;
rbmoni::setup 0xffe8;
rbemon::setup 0xffd0;
rbbram::setup 0xfe00;
rlc amap -insert timer.1 0xfe11;
rlc amap -insert timer.0 0xfe10;
if {![rlc amap -testname timer.0]} {
rlc amap -insert timer.1 0xfe11;
rlc amap -insert timer.0 0xfe10;
}
rbs3hio::setup 0xfef0;
}

View File

@@ -1,6 +1,6 @@
# $Id: util.tcl 785 2016-07-10 12:22:41Z mueller $
# $Id: util.tcl 883 2017-04-22 11:57:38Z mueller $
#
# Copyright 2011-2016 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
# Copyright 2011-2017 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
#
# This program is free software; you may redistribute and/or modify it under
# the terms of the GNU General Public License as published by the Free
@@ -13,6 +13,7 @@
#
# Revision History:
# Date Rev Version Comment
# 2017-04-22 883 1.2.1 setup: now idempotent
# 2016-07-09 784 1.2 22bit support: mask sstat(wide); add iswide
# 2015-04-03 661 1.1 drop estatdef (stat err check default now)
# 2014-08-14 582 1.0.1 add srun* procs; add nscmd and tout variables
@@ -43,6 +44,7 @@ namespace eval tst_sram {
# setup: amap definitions for tst_sram core design -------------------------
#
proc setup {{base 0x0000}} {
if {[rlc amap -testname sr.mdih $base]} {return ""}
rlc amap -insert sr.mdih [expr {$base + 0x00}]
rlc amap -insert sr.mdil [expr {$base + 0x01}]
rlc amap -insert sr.mdoh [expr {$base + 0x02}]