summaryrefslogtreecommitdiff
path: root/tb/avalon.impl.hpp
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2022-12-06 13:04:15 -0600
committerAlejandro Soto <alejandro@34project.org>2022-12-06 13:04:15 -0600
commit064b72ae4eb22336438288a9664a37c0dd07f4bc (patch)
treebfbe072702b667299979d6ceb76a3ef444fb9c1a /tb/avalon.impl.hpp
parentdf69f7b7c73be01968ba767ab112b227533bbd70 (diff)
Implement gdbstub
Diffstat (limited to '')
-rw-r--r--tb/avalon.impl.hpp42
1 files changed, 31 insertions, 11 deletions
diff --git a/tb/avalon.impl.hpp b/tb/avalon.impl.hpp
index 5ba514f..3af60d0 100644
--- a/tb/avalon.impl.hpp
+++ b/tb/avalon.impl.hpp
@@ -128,25 +128,45 @@ namespace taller::avalon
std::uint32_t interconnect<Platform>::dump(std::uint32_t addr)
{
std::uint32_t avl_address = addr << 2;
+ auto &dev = resolve_external(avl_address);
+ auto pos = (avl_address & ~dev.address_mask()) >> dev.word_bits();
+
+ std::uint32_t readdata;
+ while(!dev.read(pos, readdata))
+ {
+ continue;
+ }
+
+ return readdata;
+ }
+
+ 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();
+
+ while(!dev.write(pos, writedata, 0b1111))
+ {
+ continue;
+ }
+ }
+
+ template<class Platform>
+ slave& interconnect<Platform>::resolve_external(std::uint32_t avl_address)
+ {
for(auto &binding : devices)
{
if((avl_address & binding.mask) == binding.base)
{
- auto &dev = binding.dev;
- auto pos = (avl_address & ~dev.address_mask()) >> 2;
-
- std::uint32_t readdata;
- while(!dev.read(pos, readdata))
- {
- continue;
- }
-
- return readdata;
+ return binding.dev;
}
}
- fprintf(stderr, "[avl] attempt to dump memory hole at 0x%08x\n", addr);
+ fprintf(stderr, "[avl] attempt to access hole at 0x%08x\n", avl_address);
assert(false);
}
}