1
0
mirror of https://github.com/wfjm/w11.git synced 2026-03-09 12:40:38 +00:00

Rw11VirtDiskRam: add ram: scheme for ram-only-disk

This commit is contained in:
wfjm
2018-11-10 12:24:43 +01:00
parent 341cf23e76
commit dd3a253dbc
8 changed files with 461 additions and 24 deletions

View File

@@ -1,4 +1,4 @@
# $Id: Makefile 859 2017-03-11 22:36:45Z mueller $
# $Id: Makefile 1063 2018-10-29 18:37:42Z mueller $
#
# Revision History:
# Date Rev Version Comment
@@ -21,29 +21,30 @@ LDLIBS = -L${RETROBASE}/tools/lib -lrtools -lrlink
#
# Object files to be included
#
OBJ_all = Rw11.o Rw11Cpu.o Rw11CpuW11a.o
OBJ_all = Rw11.o Rw11Cpu.o Rw11CpuW11a.o
OBJ_all += Rw11Probe.o
OBJ_all += Rw11Cntl.o Rw11Unit.o
OBJ_all += Rw11UnitTerm.o
OBJ_all += Rw11UnitDisk.o
OBJ_all += Rw11UnitTape.o
OBJ_all += Rw11UnitStream.o
OBJ_all += Rw11CntlDL11.o Rw11UnitDL11.o
OBJ_all += Rw11CntlLP11.o Rw11UnitLP11.o
OBJ_all += Rw11CntlPC11.o Rw11UnitPC11.o
OBJ_all += Rw11UnitTerm.o
OBJ_all += Rw11UnitDisk.o
OBJ_all += Rw11UnitTape.o
OBJ_all += Rw11UnitStream.o
OBJ_all += Rw11CntlDL11.o Rw11UnitDL11.o
OBJ_all += Rw11CntlLP11.o Rw11UnitLP11.o
OBJ_all += Rw11CntlPC11.o Rw11UnitPC11.o
OBJ_all += Rw11CntlRL11.o Rw11UnitRL11.o
OBJ_all += Rw11CntlRK11.o Rw11UnitRK11.o
OBJ_all += Rw11CntlRHRP.o Rw11UnitRHRP.o
OBJ_all += Rw11CntlTM11.o Rw11UnitTM11.o
OBJ_all += Rw11CntlDEUNA.o Rw11UnitDEUNA.o
OBJ_all += Rw11Virt.o
OBJ_all += Rw11VirtTerm.o Rw11VirtTermPty.o Rw11VirtTermTcp.o
OBJ_all += Rw11Virt.o
OBJ_all += Rw11VirtTerm.o Rw11VirtTermPty.o Rw11VirtTermTcp.o
OBJ_all += Rw11VirtDiskBuffer.o
OBJ_all += Rw11VirtDisk.o Rw11VirtDiskFile.o Rw11VirtDiskOver.o
OBJ_all += Rw11VirtTape.o Rw11VirtTapeTap.o
OBJ_all += Rw11VirtEth.o Rw11VirtEthTap.o
OBJ_all += Rw11VirtStream.o
OBJ_all += Rw11Rdma.o Rw11RdmaDisk.o
OBJ_all += Rw11VirtDisk.o Rw11VirtDiskFile.o
OBJ_all += Rw11VirtDiskOver.o Rw11VirtDiskRam.o
OBJ_all += Rw11VirtTape.o Rw11VirtTapeTap.o
OBJ_all += Rw11VirtEth.o Rw11VirtEthTap.o
OBJ_all += Rw11VirtStream.o
OBJ_all += Rw11Rdma.o Rw11RdmaDisk.o
OBJ_all += RethTools.o RethBuf.o
#
DEP_all = $(OBJ_all:.o=.dep)

View File

@@ -1,4 +1,4 @@
// $Id: Rw11VirtDisk.cpp 1061 2018-10-27 17:39:11Z mueller $
// $Id: Rw11VirtDisk.cpp 1066 2018-11-10 11:21:53Z mueller $
//
// Copyright 2013-2018 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
@@ -57,7 +57,10 @@ std::string Rw11VirtDisk::sDefaultScheme("file");
Rw11VirtDisk::Rw11VirtDisk(Rw11Unit* punit)
: Rw11Virt(punit),
fBlkSize(0),
fNBlock(0)
fNBlock(0),
fNCyl(0),
fNHead(0),
fNSect(0)
{
fStats.Define(kStatNVDRead, "NVDRead", "Read() calls");
fStats.Define(kStatNVDReadBlk, "NVDReadBlk", "blocks read");

View File

@@ -0,0 +1,226 @@
// $Id: Rw11VirtDiskRam.cpp 1063 2018-10-29 18:37:42Z mueller $
//
// Copyright 2018- 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
// Software Foundation, either version 3, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for complete details.
//
// Revision History:
// Date Rev Version Comment
// 2018-10-28 1063 1.0 Initial version
// 2018-10-27 1061 0.1 First draft
// ---------------------------------------------------------------------------
/*!
\file
\brief Implemenation of Rw11VirtDiskRam.
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include "librtools/RosFill.hpp"
#include "librtools/RosPrintf.hpp"
#include "Rw11VirtDiskRam.hpp"
using namespace std;
/*!
\class Retro::Rw11VirtDiskRam
\brief FIXME_docs
*/
// all method definitions in namespace Retro
namespace Retro {
//------------------------------------------+-----------------------------------
//! Default constructor
Rw11VirtDiskRam::Rw11VirtDiskRam(Rw11Unit* punit)
: Rw11VirtDisk(punit),
fPatTyp(kPatZero),
fBlkMap()
{
fStats.Define(kStatNVDReadRam, "NVDReadRam", "ram: blocks read from ram");
fStats.Define(kStatNVDWriteOver, "NVDWriteOver", "ram: blocks overwritten");
}
//------------------------------------------+-----------------------------------
//! Destructor
Rw11VirtDiskRam::~Rw11VirtDiskRam()
{}
//------------------------------------------+-----------------------------------
//! FIXME_docs
bool Rw11VirtDiskRam::Open(const std::string& url, RerrMsg& emsg)
{
return Open(url, "file", emsg);
}
//------------------------------------------+-----------------------------------
//! FIXME_docs
bool Rw11VirtDiskRam::Open(const std::string& url, const std::string& scheme,
RerrMsg& emsg)
{
if (!fUrl.Set(url, "|wpro|pat=|", scheme, emsg)) return false;
fWProt = fUrl.FindOpt("wpro");
string pat;
fPatTyp = kPatZero;
if (fUrl.FindOpt("pat", pat)) {
if (pat == "zero") {
fPatTyp = kPatZero;
} else if (pat == "ones") {
fPatTyp = kPatOnes;
} else if (pat == "dead") {
fPatTyp = kPatDead;
} else if (pat == "test") {
fPatTyp = kPatTest;
} else {
emsg.Init("Rw11VirtDiskRam::Open()",
string("invalid pattern name '") + pat + "'");
return false;
}
}
return true;
}
//------------------------------------------+-----------------------------------
//! FIXME_docs
bool Rw11VirtDiskRam::Read(size_t lba, size_t nblk, uint8_t* data,
RerrMsg& /*emsg*/)
{
fStats.Inc(kStatNVDRead);
fStats.Inc(kStatNVDReadBlk, double(nblk));
for (size_t i=0; i<nblk; i++) {
auto it = fBlkMap.find(lba+i);
if (it == fBlkMap.end()) {
ReadPattern(lba+i, data+i*fBlkSize);
} else {
fStats.Inc(kStatNVDReadRam);
(it->second).Read(data+i*fBlkSize);
}
}
return true;
}
//------------------------------------------+-----------------------------------
//! FIXME_docs
bool Rw11VirtDiskRam::Write(size_t lba, size_t nblk, const uint8_t* data,
RerrMsg& /*emsg*/)
{
fStats.Inc(kStatNVDWrite);
fStats.Inc(kStatNVDWriteBlk, double(nblk));
for (size_t i=0; i<nblk; i++) {
auto it = fBlkMap.find(lba+i);
if (it == fBlkMap.end()) {
auto rc = fBlkMap.emplace(lba+i, Rw11VirtDiskBuffer(fBlkSize));
it = rc.first;
} else {
fStats.Inc(kStatNVDWriteOver, double(nblk));
}
(it->second).Write(data+i*fBlkSize);
}
return true;
}
//------------------------------------------+-----------------------------------
//! FIXME_docs
void Rw11VirtDiskRam::List(std::ostream& os) const
{
if (fBlkMap.empty()) return;
uint32_t lbabeg = fBlkMap.begin()->first; // first lba
uint32_t nwrite = 0;
for (auto it=fBlkMap.begin(); it!=fBlkMap.end(); ) {
nwrite += (it->second).NWrite();
auto itnext = next(it);
if (itnext == fBlkMap.end() || itnext->first != (it->first)+1) {
os << RosPrintf(lbabeg,"d",8)
<< " .. " << RosPrintf(it->first,"d",8)
<< " : nb=" << RosPrintf(it->first-lbabeg+1,"d",8)
<< " nw=" << RosPrintf(nwrite,"d",8) << endl;
if (itnext != fBlkMap.end()) lbabeg = itnext->first;
nwrite = 0;
}
it = itnext;
}
return;
}
//------------------------------------------+-----------------------------------
//! FIXME_docs
void Rw11VirtDiskRam::Dump(std::ostream& os, int ind, const char* text,
int detail) const
{
RosFill bl(ind);
os << bl << (text?text:"--") << "Rw11VirtDiskRam @ " << this << endl;
os << bl << " fPatTyp: " << fPatTyp << endl;
os << bl << " fBlkMap.size: " << fBlkMap.size() << endl;
Rw11VirtDisk::Dump(os, ind, " ^", detail);
return;
}
//------------------------------------------+-----------------------------------
//! FIXME_doc
void Rw11VirtDiskRam::ReadPattern(size_t lba, uint8_t* data)
{
uint16_t* p = reinterpret_cast<uint16_t*>(data);
uint16_t* pend = reinterpret_cast<uint16_t*>(data+fBlkSize);
size_t addr = lba*fBlkSize;
switch (fPatTyp) {
case kPatZero:
while (p < pend) { *p++ = 0x0000; }
break;
case kPatOnes:
while (p < pend) { *p++ = 0xffff; }
break;
case kPatDead:
while (p < pend) { *p++ = 0xdead; *p++ = 0xbeaf; }
break;
case kPatTest:
while(p < pend) {
*p++ = addr & 0xffff; // byte address, LSB
*p++ = (addr>>16) & 0xffff; // byte address, MSB
*p++ = lba / (fNSect*fNHead); // current cylinder
*p++ = (lba/fNSect) % fNHead; // current head
*p++ = lba % fNSect; // current sector
*p++ = fNCyl; // total number of cylinders
*p++ = fNHead; // total number of heads
*p++ = fNSect; // total number of sectors
addr += 16;
}
break;
default:
break;
}
return;
}
} // end namespace Retro

View File

@@ -0,0 +1,88 @@
// $Id: Rw11VirtDiskRam.hpp 1063 2018-10-29 18:37:42Z mueller $
//
// Copyright 2018- 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
// Software Foundation, either version 3, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for complete details.
//
// Revision History:
// Date Rev Version Comment
// 2018-10-28 1063 1.0 Initial version
// 2018-10-27 1061 0.1 First draft
// ---------------------------------------------------------------------------
/*!
\file
\brief Declaration of class Rw11VirtDiskRam.
*/
#ifndef included_Retro_Rw11VirtDiskRam
#define included_Retro_Rw11VirtDiskRam 1
#include <map>
#include "Rw11VirtDiskBuffer.hpp"
#include "Rw11VirtDisk.hpp"
namespace Retro {
class Rw11VirtDiskRam : public Rw11VirtDisk {
public:
typedef std::map<uint32_t,Rw11VirtDiskBuffer> bmap_t;
typedef bmap_t::iterator bmap_it_t;
typedef bmap_t::const_iterator bmap_cit_t;
typedef bmap_t::value_type bmap_val_t;
explicit Rw11VirtDiskRam(Rw11Unit* punit);
~Rw11VirtDiskRam();
virtual bool Open(const std::string& url, RerrMsg& emsg);
bool Open(const std::string& url, const std::string& scheme,
RerrMsg& emsg);
virtual bool Read(size_t lba, size_t nblk, uint8_t* data,
RerrMsg& emsg);
virtual bool Write(size_t lba, size_t nblk, const uint8_t* data,
RerrMsg& emsg);
void List(std::ostream& os) const;
virtual void Dump(std::ostream& os, int ind=0, const char* text=0,
int detail=0) const;
// statistics counter indices (now new)
enum stats {
kStatNVDReadRam = Rw11VirtDisk::kDimStat,
kStatNVDWriteOver,
kDimStat
};
protected:
void ReadPattern(size_t lba, uint8_t* data);
protected:
enum pattyp {
kPatZero = 0,
kPatOnes,
kPatDead,
kPatTest
};
pattyp fPatTyp; //!< pattern type
bmap_t fBlkMap;
};
} // end namespace Retro
//#include "Rw11VirtDiskRam.ipp"
#endif

View File

@@ -1,4 +1,4 @@
# $Id: Makefile 859 2017-03-11 22:36:45Z mueller $
# $Id: Makefile 1063 2018-10-29 18:37:42Z mueller $
#
# Revision History:
# Date Rev Version Comment
@@ -25,9 +25,9 @@ LDLIBS += -lrlinktpp
#
# Object files to be included
#
OBJ_all = Rwxxtpp_Init.o RtclRw11.o
OBJ_all = Rwxxtpp_Init.o RtclRw11.o
OBJ_all += RtclRw11Cpu.o RtclRw11CpuW11a.o
OBJ_all += RtclRw11Cntl.o RtclRw11CntlFactory.o
OBJ_all += RtclRw11Cntl.o RtclRw11CntlFactory.o
OBJ_all += RtclRw11Unit.o
OBJ_all += RtclRw11UnitTerm.o
OBJ_all += RtclRw11UnitDisk.o
@@ -42,8 +42,8 @@ OBJ_all += RtclRw11CntlRHRP.o RtclRw11UnitRHRP.o
OBJ_all += RtclRw11CntlTM11.o RtclRw11UnitTM11.o
OBJ_all += RtclRw11CntlDEUNA.o RtclRw11UnitDEUNA.o
OBJ_all += RtclRw11Virt.o
OBJ_all += RtclRw11VirtFactory.o
OBJ_all += RtclRw11VirtDiskOver.o
OBJ_all += RtclRw11VirtFactory.o
OBJ_all += RtclRw11VirtDiskOver.o RtclRw11VirtDiskRam.o
#
DEP_all = $(OBJ_all:.o=.dep)
#

View File

@@ -0,0 +1,66 @@
// $Id: RtclRw11VirtDiskRam.cpp 1063 2018-10-29 18:37:42Z mueller $
//
// Copyright 2018- 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
// Software Foundation, either version 3, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for complete details.
//
// Revision History:
// Date Rev Version Comment
// 2018-10-28 1063 1.0 Initial version
// ---------------------------------------------------------------------------
/*!
\file
\brief Implemenation of RtclRw11VirtDiskRam.
*/
#include "RtclRw11VirtDiskRam.hpp"
using namespace std;
/*!
\class Retro::RtclRw11VirtDiskRam
\brief FIXME_docs
*/
// all method definitions in namespace Retro
namespace Retro {
//------------------------------------------+-----------------------------------
//! Constructor
RtclRw11VirtDiskRam::RtclRw11VirtDiskRam(Rw11VirtDiskRam* pobj)
: RtclRw11VirtBase<Rw11VirtDiskRam>(pobj)
{
AddMeth("list", boost::bind(&RtclRw11VirtDiskRam::M_list, this, _1));
}
//------------------------------------------+-----------------------------------
//! Destructor
RtclRw11VirtDiskRam::~RtclRw11VirtDiskRam()
{}
//------------------------------------------+-----------------------------------
//! FIXME_docs
int RtclRw11VirtDiskRam::M_list(RtclArgs& args)
{
if (!args.AllDone()) return kERR;
ostringstream sos;
// synchronize with server thread
boost::lock_guard<RlinkConnect> lock(Obj().Cpu().Connect());
Obj().List(sos);
args.SetResult(sos);
return kOK;
}
} // end namespace Retro

View File

@@ -0,0 +1,47 @@
// $Id: RtclRw11VirtDiskRam.hpp 1063 2018-10-29 18:37:42Z mueller $
//
// Copyright 2018- 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
// Software Foundation, either version 3, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for complete details.
//
// Revision History:
// Date Rev Version Comment
// 2018-10-28 1063 1.0 Initial version
// ---------------------------------------------------------------------------
/*!
\file
\brief Declaration of class RtclRw11VirtDiskRam.
*/
#ifndef included_Retro_RtclRw11VirtDiskRam
#define included_Retro_RtclRw11VirtDiskRam 1
#include "librw11/Rw11VirtDiskRam.hpp"
#include "RtclRw11VirtBase.hpp"
namespace Retro {
class RtclRw11VirtDiskRam : public RtclRw11VirtBase<Rw11VirtDiskRam> {
public:
RtclRw11VirtDiskRam(Rw11VirtDiskRam* pobj);
~RtclRw11VirtDiskRam();
protected:
int M_list(RtclArgs& args);
};
} // end namespace Retro
//#include "RtclRw11VirtDiskRam.ipp"
#endif

View File

@@ -1,4 +1,4 @@
// $Id: RtclRw11VirtFactory.cpp 983 2018-01-02 20:35:59Z mueller $
// $Id: RtclRw11VirtFactory.cpp 1063 2018-10-29 18:37:42Z mueller $
//
// Copyright 2017- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
@@ -22,8 +22,10 @@
*/
#include "librw11/Rw11VirtDiskOver.hpp"
#include "librw11/Rw11VirtDiskRam.hpp"
#include "RtclRw11VirtDiskOver.hpp"
#include "RtclRw11VirtDiskRam.hpp"
#include "RtclRw11VirtFactory.hpp"
@@ -43,6 +45,10 @@ RtclRw11Virt* RtclRw11VirtFactory(Rw11Virt* pobj)
if (pdiskover) {
return new RtclRw11VirtDiskOver(pdiskover);
}
Rw11VirtDiskRam* pdiskram = dynamic_cast<Rw11VirtDiskRam*>(pobj);
if (pdiskram) {
return new RtclRw11VirtDiskRam(pdiskram);
}
return nullptr;
}