mirror of
https://github.com/vortexgpgpu/vortex.git
synced 2025-04-23 13:27:29 -04:00
Binary compatibility with Harmonica.
This commit is contained in:
parent
ae11d80d36
commit
1eb574650f
4 changed files with 40 additions and 16 deletions
|
@ -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());
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
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));
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue