From 333c927454489ddd18b3c42646daab3eff62a845 Mon Sep 17 00:00:00 2001 From: Nav Date: Tue, 28 Jan 2025 00:08:38 +0000 Subject: [PATCH] New alignment service --- src/CMakeLists.txt | 1 + .../Wch/WchLinkDebugInterface.cpp | 1 + src/Services/AlignmentService.cpp | 36 +++++++++++++++++++ src/Services/AlignmentService.hpp | 26 ++++++++++++++ 4 files changed, 64 insertions(+) create mode 100644 src/Services/AlignmentService.cpp create mode 100644 src/Services/AlignmentService.hpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fe5a298b..6bbac338 100755 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -11,6 +11,7 @@ target_sources( ${CMAKE_CURRENT_SOURCE_DIR}/Services/ProcessService.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Services/StringService.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Services/IntegerService.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Services/AlignmentService.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Services/Avr8InstructionService.cpp # Helpers & other diff --git a/src/DebugToolDrivers/Wch/WchLinkDebugInterface.cpp b/src/DebugToolDrivers/Wch/WchLinkDebugInterface.cpp index b3cb74ff..50940081 100644 --- a/src/DebugToolDrivers/Wch/WchLinkDebugInterface.cpp +++ b/src/DebugToolDrivers/Wch/WchLinkDebugInterface.cpp @@ -12,6 +12,7 @@ #include "src/Targets/RiscV/Opcodes/Opcode.hpp" +#include "src/Services/AlignmentService.hpp" #include "src/Services/StringService.hpp" #include "src/Exceptions/InternalFatalErrorException.hpp" diff --git a/src/Services/AlignmentService.cpp b/src/Services/AlignmentService.cpp new file mode 100644 index 00000000..9d0a29b8 --- /dev/null +++ b/src/Services/AlignmentService.cpp @@ -0,0 +1,36 @@ +#include "AlignmentService.hpp" + +#include + +namespace Services +{ + Targets::TargetMemoryAddress AlignmentService::alignMemoryAddress( + Targets::TargetMemoryAddress address, + Targets::TargetMemorySize alignTo + ) { + return (address / alignTo) * alignTo; + } + + Targets::TargetMemorySize AlignmentService::alignMemorySize( + Targets::TargetMemorySize size, + Targets::TargetMemorySize alignTo + ) { + return (size % alignTo) != 0 + ? static_cast( + std::ceil(static_cast(size) / static_cast(alignTo)) * alignTo + ) + : size; + } + + Targets::TargetMemoryAddressRange AlignmentService::alignAddressRange( + const Targets::TargetMemoryAddressRange& from, + Targets::TargetMemorySize alignTo + ) { + const auto alignedStartAddress = AlignmentService::alignMemoryAddress(from.startAddress, alignTo); + return Targets::TargetMemoryAddressRange{ + alignedStartAddress, + alignedStartAddress + AlignmentService::alignMemorySize(from.size() + + (from.startAddress - alignedStartAddress), alignTo) - 1 + }; + } +} diff --git a/src/Services/AlignmentService.hpp b/src/Services/AlignmentService.hpp new file mode 100644 index 00000000..ec519227 --- /dev/null +++ b/src/Services/AlignmentService.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include "src/Targets/TargetMemory.hpp" +#include "src/Targets/TargetMemoryAddressRange.hpp" + +namespace Services +{ + class AlignmentService + { + public: + static Targets::TargetMemoryAddress alignMemoryAddress( + Targets::TargetMemoryAddress address, + Targets::TargetMemorySize alignTo + ); + + static Targets::TargetMemorySize alignMemorySize( + Targets::TargetMemorySize size, + Targets::TargetMemorySize alignTo + ); + + static Targets::TargetMemoryAddressRange alignAddressRange( + const Targets::TargetMemoryAddressRange& from, + Targets::TargetMemorySize alignTo + ); + }; +}