summaryrefslogtreecommitdiff
path: root/tb/avalon.impl.hpp
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2022-12-10 19:18:21 -0600
committerAlejandro Soto <alejandro@34project.org>2022-12-16 16:27:19 -0600
commit6fee344b754464b1fd17f7c0429e6597e51dc74d (patch)
treea31913d054bbf83772fa29e256be750092256d8f /tb/avalon.impl.hpp
parent6b163a88179ac3073d22622be4991f332529c8bd (diff)
Implement hardware virtual memory
Diffstat (limited to 'tb/avalon.impl.hpp')
-rw-r--r--tb/avalon.impl.hpp30
1 files changed, 18 insertions, 12 deletions
diff --git a/tb/avalon.impl.hpp b/tb/avalon.impl.hpp
index 3af60d0..4dee4f2 100644
--- a/tb/avalon.impl.hpp
+++ b/tb/avalon.impl.hpp
@@ -125,49 +125,55 @@ namespace taller::avalon
}
template<class Platform>
- std::uint32_t interconnect<Platform>::dump(std::uint32_t addr)
+ bool interconnect<Platform>::dump(std::uint32_t addr, std::uint32_t &word)
{
std::uint32_t avl_address = addr << 2;
- auto &dev = resolve_external(avl_address);
- auto pos = (avl_address & ~dev.address_mask()) >> dev.word_bits();
+ auto *dev = resolve_external(avl_address);
+ if(!dev)
+ {
+ return false;
+ }
+
+ auto pos = (avl_address & ~dev->address_mask()) >> dev->word_bits();
- std::uint32_t readdata;
- while(!dev.read(pos, readdata))
+ while(!dev->read(pos, word))
{
continue;
}
- return readdata;
+ return true;
}
template<class Platform>
void interconnect<Platform>::patch(std::uint32_t addr, std::uint32_t writedata)
{
std::uint32_t avl_address = addr << 2;
- auto &dev = resolve_external(avl_address);
- auto pos = (avl_address & ~dev.address_mask()) >> dev.word_bits();
+ auto *dev = resolve_external(avl_address);
+ assert(dev);
+
+ auto pos = (avl_address & ~dev->address_mask()) >> dev->word_bits();
- while(!dev.write(pos, writedata, 0b1111))
+ while(!dev->write(pos, writedata, 0b1111))
{
continue;
}
}
template<class Platform>
- slave& interconnect<Platform>::resolve_external(std::uint32_t avl_address)
+ slave* interconnect<Platform>::resolve_external(std::uint32_t avl_address)
{
for(auto &binding : devices)
{
if((avl_address & binding.mask) == binding.base)
{
- return binding.dev;
+ return &binding.dev;
}
}
fprintf(stderr, "[avl] attempt to access hole at 0x%08x\n", avl_address);
- assert(false);
+ return nullptr;
}
}