From 0a729dcacfa9e2bfaa52e32b06d8b475e3741068 Mon Sep 17 00:00:00 2001 From: Kelvin Sherlock Date: Fri, 5 Jul 2013 13:54:15 -0400 Subject: [PATCH] AddressMap / ToolMap class --- bin/CMakeLists.txt | 2 +- bin/address_map.cpp | 79 +++++++++++++++++++++++++++++++++++++ bin/address_map.h | 42 ++++++++++++++++++++ bin/debugger.cpp | 95 ++++++--------------------------------------- 4 files changed, 133 insertions(+), 85 deletions(-) create mode 100644 bin/address_map.cpp create mode 100644 bin/address_map.h diff --git a/bin/CMakeLists.txt b/bin/CMakeLists.txt index a8c5db6..23b2f78 100644 --- a/bin/CMakeLists.txt +++ b/bin/CMakeLists.txt @@ -6,7 +6,7 @@ SET(CMAKE_EXE_LINKER_FLAGS "-framework Carbon") add_definitions(-I ${CMAKE_SOURCE_DIR}/) -add_executable(mpw loader.cpp debugger.cpp) +add_executable(mpw loader.cpp debugger.cpp address_map.cpp) target_link_libraries(mpw CPU_LIB) target_link_libraries(mpw DEBUGGER_LIB) target_link_libraries(mpw TOOLBOX_LIB) diff --git a/bin/address_map.cpp b/bin/address_map.cpp new file mode 100644 index 0000000..f2ed10b --- /dev/null +++ b/bin/address_map.cpp @@ -0,0 +1,79 @@ +#include "address_map.h" + +AddressMap::AddressMap() +{ +} +AddressMap::~AddressMap() +{ +} + +void AddressMap::add(uint32_t address) +{ + unsigned page = address >> 12; + if (page >= pageMap.size()) return; + pageMap[page]++; + + map.emplace(address, 0); +} + +void AddressMap::remove(uint32_t address) +{ + unsigned page = address >> 12; + if (page >= pageMap.size()) return; + + // erase(key) returns # of elements erased. + pageMap[page] -= map.erase(address); +} + +bool AddressMap::lookup(uint32_t address) +{ + unsigned page = address >> 12; + if (page >= pageMap.size()) return false; + if (!pageMap[page]) return false; + + return map.find(address) != map.end(); +} + +void AddressMap::clear() +{ + pageMap.fill(0); + map.clear(); +} + + +ToolMap::ToolMap() +{ +} + +ToolMap::~ToolMap() +{ +} + +void ToolMap::clear() +{ + map.clear(); +} + +bool ToolMap::lookup(uint16_t tool) +{ + if ((tool & 0xf000) != 0xa000) return false; + return map.find(tool) != map.end(); +} + +void ToolMap::add(uint16_t tool) +{ + if ((tool & 0xf000) != 0xa000) return; + + // return std::pair + map.emplace(tool, 0); +} + +void ToolMap::remove(uint16_t tool) +{ + if ((tool & 0xf000) != 0xa000) return; + + map.erase(tool); +} + + + diff --git a/bin/address_map.h b/bin/address_map.h new file mode 100644 index 0000000..1ca124b --- /dev/null +++ b/bin/address_map.h @@ -0,0 +1,42 @@ +#ifndef __address_map__ +#define __address_map__ + +#include +#include + +class AddressMap +{ +public: + AddressMap(); + ~AddressMap(); + + void add(uint32_t address); + void remove(uint32_t address); + bool lookup(uint32_t address); + + void clear(); + +private: + std::array pageMap; + std::unordered_map map; +}; + +class ToolMap +{ +public: + + ToolMap(); + ~ToolMap(); + + void add(uint16_t tool); + void remove(uint16_t tool); + bool lookup(uint16_t tool); + + void clear(); + +private: + std::unordered_map map; + +}; + +#endif \ No newline at end of file diff --git a/bin/debugger.cpp b/bin/debugger.cpp index 2fdad47..fe01ff2 100644 --- a/bin/debugger.cpp +++ b/bin/debugger.cpp @@ -18,6 +18,7 @@ #include "loader.h" +#include "address_map.h" #include @@ -74,85 +75,11 @@ namespace { sigInt = true; } - // any reason to have enable/disable flag - // vs deleting it? - std::unordered_map tbrkMap; - - std::unordered_map brkMap; - std::array brkPageMap; // bloom filter on a page-level. + AddressMap brkMap; // address breaks + AddressMap rbrkMap; // read breaks. + AddressMap wbrkMap; // write breaks. + ToolMap tbrkMap; // tool breaks. - void tbrkAdd(uint16_t tool) - { - auto iter = tbrkMap.find(tool); - if (iter == tbrkMap.end()) - { - tbrkMap.emplace(tool, true); - } - } - - void tbrkRemove(uint16_t tool) - { - auto iter = tbrkMap.find(tool); - if (iter == tbrkMap.end()) return; - - tbrkMap.erase(iter); - } - - void tbrkRemoveAll() - { - tbrkMap.clear(); - } - - bool tbrkLookup(uint16_t tool) - { - if ((tool & 0xf000) != 0xa000) return false; - - return tbrkMap.find(tool) != tbrkMap.end(); - } - - - void brkRemoveAll() - { - brkPageMap.fill(0); - brkMap.clear(); - } - - void brkRemove(uint32_t address) - { - uint32_t page = address >> 12; - if (page >= brkPageMap.size()) return; - - auto iter = brkMap.find(address); - if (iter == brkMap.end()) - return; - - brkPageMap[page]--; - brkMap.erase(iter); - } - - void brkAdd(uint32_t address) - { - uint32_t page = address >> 12; - if (page >= brkPageMap.size()) return; - - auto iter = brkMap.find(address); - if (iter == brkMap.end()) - { - brkPageMap[page]++; - brkMap.emplace(address, 0); - } - - } - - bool brkLookup(uint32_t address) - { - uint32_t page = address >> 12; - if (page >= brkPageMap.size()) return false; - - if (!brkPageMap[page]) return false; - - return brkMap.find(address) != brkMap.end(); - } void hexdump(const uint8_t *data, ssize_t size, uint32_t address = 0) @@ -273,7 +200,7 @@ namespace { // check for pc breaks - if (brkLookup(pc)) + if (brkMap.lookup(pc)) { if (!trace) disasm(pc); printf("Address break: $%08x\n", pc); @@ -285,7 +212,7 @@ namespace { // check for toolbreaks. if ((op & 0xf000) == 0xa000) { - if (tbrkLookup(op)) + if (tbrkMap.lookup(op)) { if (!trace) disasm(pc); printf("Tool break: $%04x\n", op); @@ -451,8 +378,8 @@ void DebugToolBreak(Command &cmd) if (tool >= 0xa000 && tool <= 0xafff) { - if (remove) tbrkRemove(tool); - else tbrkAdd(tool); + if (remove) tbrkMap.remove(tool); + else tbrkMap.add(tool); } else { @@ -477,8 +404,8 @@ void DebugBreak(Command &cmd) if ((address & 0xff000000) == 0) { - if (remove) brkRemove(address); - else brkAdd(address); + if (remove) brkMap.remove(address); + else brkMap.add(address); } else {