From 064b72ae4eb22336438288a9664a37c0dd07f4bc Mon Sep 17 00:00:00 2001 From: Alejandro Soto Date: Tue, 6 Dec 2022 13:04:15 -0600 Subject: Implement gdbstub --- tb/avalon.impl.hpp | 42 +++++++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 11 deletions(-) (limited to 'tb/avalon.impl.hpp') 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::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 + void interconnect::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 + slave& interconnect::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); } } -- cgit v1.2.3