Binary compatibility with Harmonica.

This commit is contained in:
cdkersey 2015-09-15 13:02:02 -06:00
parent ae11d80d36
commit 1eb574650f
4 changed files with 40 additions and 16 deletions

View file

@ -207,13 +207,14 @@ int disasm_main(int argc, char **argv) {
int emu_main(int argc, char **argv) {
string archString("8w32/32/8/8"), imgFileName("a.out.bin");
bool showHelp, showStats;
bool showHelp, showStats, basicMachine;
/* Read the command line arguments. */
CommandLineArgFlag fh("-h", "--help", "", showHelp);
CommandLineArgSetter<string>fc("-c", "--core", "", imgFileName);
CommandLineArgSetter<string>fa("-a", "--arch", "", archString);
CommandLineArgFlag fs("-s", "--stats", "", showStats);
CommandLineArgFlag fb("-b", "--basic", "", basicMachine);
CommandLineArg::readArgs(argc, argv);
@ -235,7 +236,7 @@ int emu_main(int argc, char **argv) {
return 1;
}
MemoryUnit mu(4096, arch.getWordSize());
MemoryUnit mu(4096, arch.getWordSize(), basicMachine);
Core core(arch, *dec, mu/*, ID in multicore implementations*/);
RamMemDevice mem(imgFileName.c_str(), arch.getWordSize());

View file

@ -17,7 +17,9 @@ namespace HarpTools {
" Display contextual help.\n",
*emuHelp = "HARP Emulator command line arguments:\n"
" -c, --core <filename> RAM image\n"
" -a, --arch <arch string> Architecture string\n",
" -a, --arch <arch string> Architecture string\n"
" -s, --stats Print stats on exit.\n"
" -b, --basic Disable virtual memory.\n",
*asmHelp = "HARP Assembler command line arguments:\n"
" -a, --arch <arch string>\n"
" -o, --output <filename>\n",

View file

@ -106,10 +106,11 @@ namespace Harp {
class MemoryUnit {
public:
MemoryUnit(Size pageSize, Size addrBytes) :
pageSize(pageSize), addrBytes(addrBytes), ad()
MemoryUnit(Size pageSize, Size addrBytes, bool disableVm = false) :
pageSize(pageSize), addrBytes(addrBytes), ad(), disableVm(disableVm)
{
tlb[0] = TLBEntry(0, 077);
if (!disableVm)
tlb[0] = TLBEntry(0, 077);
}
void attach(MemDevice &m, Addr base);
@ -162,6 +163,8 @@ namespace Harp {
TLBEntry tlbLookup(Addr vAddr, Word flagMask);
Size pageSize, addrBytes;
bool disableVm;
};
};

View file

@ -80,6 +80,7 @@ Byte *MemoryUnit::ADecoder::getPtr(Addr a, Size sz, Size wordSize) {
MemDevice &m(doLookup(a, bit));
a &= (2<<bit)-1;
if (a + sz <= m.size()) return m.base() + a;
return NULL;
}
Word MemoryUnit::ADecoder::read(Addr a, bool sup, Size wordSize) {
@ -97,7 +98,7 @@ void MemoryUnit::ADecoder::write(Addr a, Word w, bool sup, Size wordSize) {
}
Byte *MemoryUnit::getPtr(Addr a, Size s) {
ad.getPtr(a, s, addrBytes*8);
return ad.getPtr(a, s, addrBytes*8);
}
void MemoryUnit::attach(MemDevice &m, Addr base) {
@ -127,23 +128,40 @@ Addr MemoryUnit::virtToPhys(Addr vAddr) {
#endif
Word MemoryUnit::read(Addr vAddr, bool sup) {
Word flagMask = sup?8:1;
TLBEntry t = tlbLookup(vAddr, flagMask);
Addr pAddr = t.pfn*pageSize + vAddr%pageSize;
Addr pAddr;
if (disableVm) {
pAddr = vAddr;
} else {
Word flagMask = sup?8:1;
TLBEntry t = tlbLookup(vAddr, flagMask);
pAddr = t.pfn*pageSize + vAddr%pageSize;
}
return ad.read(pAddr, sup, 8*addrBytes);
}
Word MemoryUnit::fetch(Addr vAddr, bool sup) {
Word flagMask = sup?32:4;
TLBEntry t = tlbLookup(vAddr, flagMask);
Addr pAddr = t.pfn*pageSize + vAddr%pageSize;
Addr pAddr;
if (disableVm) {
pAddr = vAddr;
} else {
Word flagMask = sup?32:4;
TLBEntry t = tlbLookup(vAddr, flagMask);
pAddr = t.pfn*pageSize + vAddr%pageSize;
}
return ad.read(pAddr, sup, 8*addrBytes);
}
void MemoryUnit::write(Addr vAddr, Word w, bool sup) {
Word flagMask = sup?16:2;
TLBEntry t = tlbLookup(vAddr, flagMask);
Addr pAddr = t.pfn*pageSize + vAddr%pageSize;
Addr pAddr;
if (disableVm) {
pAddr = vAddr;
} else {
Word flagMask = sup?16:2;
TLBEntry t = tlbLookup(vAddr, flagMask);
pAddr = t.pfn*pageSize + vAddr%pageSize;
}
ad.write(pAddr, w, sup, 8*addrBytes);
}