Binary compatibility with Harmonica.
This commit is contained in:
@@ -207,13 +207,14 @@ int disasm_main(int argc, char **argv) {
|
|||||||
|
|
||||||
int emu_main(int argc, char **argv) {
|
int emu_main(int argc, char **argv) {
|
||||||
string archString("8w32/32/8/8"), imgFileName("a.out.bin");
|
string archString("8w32/32/8/8"), imgFileName("a.out.bin");
|
||||||
bool showHelp, showStats;
|
bool showHelp, showStats, basicMachine;
|
||||||
|
|
||||||
/* Read the command line arguments. */
|
/* Read the command line arguments. */
|
||||||
CommandLineArgFlag fh("-h", "--help", "", showHelp);
|
CommandLineArgFlag fh("-h", "--help", "", showHelp);
|
||||||
CommandLineArgSetter<string>fc("-c", "--core", "", imgFileName);
|
CommandLineArgSetter<string>fc("-c", "--core", "", imgFileName);
|
||||||
CommandLineArgSetter<string>fa("-a", "--arch", "", archString);
|
CommandLineArgSetter<string>fa("-a", "--arch", "", archString);
|
||||||
CommandLineArgFlag fs("-s", "--stats", "", showStats);
|
CommandLineArgFlag fs("-s", "--stats", "", showStats);
|
||||||
|
CommandLineArgFlag fb("-b", "--basic", "", basicMachine);
|
||||||
|
|
||||||
CommandLineArg::readArgs(argc, argv);
|
CommandLineArg::readArgs(argc, argv);
|
||||||
|
|
||||||
@@ -235,7 +236,7 @@ int emu_main(int argc, char **argv) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
MemoryUnit mu(4096, arch.getWordSize());
|
MemoryUnit mu(4096, arch.getWordSize(), basicMachine);
|
||||||
Core core(arch, *dec, mu/*, ID in multicore implementations*/);
|
Core core(arch, *dec, mu/*, ID in multicore implementations*/);
|
||||||
|
|
||||||
RamMemDevice mem(imgFileName.c_str(), arch.getWordSize());
|
RamMemDevice mem(imgFileName.c_str(), arch.getWordSize());
|
||||||
|
|||||||
@@ -17,7 +17,9 @@ namespace HarpTools {
|
|||||||
" Display contextual help.\n",
|
" Display contextual help.\n",
|
||||||
*emuHelp = "HARP Emulator command line arguments:\n"
|
*emuHelp = "HARP Emulator command line arguments:\n"
|
||||||
" -c, --core <filename> RAM image\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"
|
*asmHelp = "HARP Assembler command line arguments:\n"
|
||||||
" -a, --arch <arch string>\n"
|
" -a, --arch <arch string>\n"
|
||||||
" -o, --output <filename>\n",
|
" -o, --output <filename>\n",
|
||||||
|
|||||||
@@ -106,10 +106,11 @@ namespace Harp {
|
|||||||
|
|
||||||
class MemoryUnit {
|
class MemoryUnit {
|
||||||
public:
|
public:
|
||||||
MemoryUnit(Size pageSize, Size addrBytes) :
|
MemoryUnit(Size pageSize, Size addrBytes, bool disableVm = false) :
|
||||||
pageSize(pageSize), addrBytes(addrBytes), ad()
|
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);
|
void attach(MemDevice &m, Addr base);
|
||||||
|
|
||||||
@@ -162,6 +163,8 @@ namespace Harp {
|
|||||||
TLBEntry tlbLookup(Addr vAddr, Word flagMask);
|
TLBEntry tlbLookup(Addr vAddr, Word flagMask);
|
||||||
|
|
||||||
Size pageSize, addrBytes;
|
Size pageSize, addrBytes;
|
||||||
|
|
||||||
|
bool disableVm;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
38
src/mem.cpp
38
src/mem.cpp
@@ -80,6 +80,7 @@ Byte *MemoryUnit::ADecoder::getPtr(Addr a, Size sz, Size wordSize) {
|
|||||||
MemDevice &m(doLookup(a, bit));
|
MemDevice &m(doLookup(a, bit));
|
||||||
a &= (2<<bit)-1;
|
a &= (2<<bit)-1;
|
||||||
if (a + sz <= m.size()) return m.base() + a;
|
if (a + sz <= m.size()) return m.base() + a;
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
Word MemoryUnit::ADecoder::read(Addr a, bool sup, Size wordSize) {
|
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) {
|
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) {
|
void MemoryUnit::attach(MemDevice &m, Addr base) {
|
||||||
@@ -127,23 +128,40 @@ Addr MemoryUnit::virtToPhys(Addr vAddr) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
Word MemoryUnit::read(Addr vAddr, bool sup) {
|
Word MemoryUnit::read(Addr vAddr, bool sup) {
|
||||||
Word flagMask = sup?8:1;
|
Addr pAddr;
|
||||||
TLBEntry t = tlbLookup(vAddr, flagMask);
|
if (disableVm) {
|
||||||
Addr pAddr = t.pfn*pageSize + vAddr%pageSize;
|
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);
|
return ad.read(pAddr, sup, 8*addrBytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
Word MemoryUnit::fetch(Addr vAddr, bool sup) {
|
Word MemoryUnit::fetch(Addr vAddr, bool sup) {
|
||||||
Word flagMask = sup?32:4;
|
Addr pAddr;
|
||||||
TLBEntry t = tlbLookup(vAddr, flagMask);
|
|
||||||
Addr pAddr = t.pfn*pageSize + vAddr%pageSize;
|
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);
|
return ad.read(pAddr, sup, 8*addrBytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MemoryUnit::write(Addr vAddr, Word w, bool sup) {
|
void MemoryUnit::write(Addr vAddr, Word w, bool sup) {
|
||||||
Word flagMask = sup?16:2;
|
Addr pAddr;
|
||||||
TLBEntry t = tlbLookup(vAddr, flagMask);
|
|
||||||
Addr pAddr = t.pfn*pageSize + vAddr%pageSize;
|
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);
|
ad.write(pAddr, w, sup, 8*addrBytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user