diff --git a/include/oaknut/impl/offset.hpp b/include/oaknut/impl/offset.hpp index fb6ca87..a9634ac 100644 --- a/include/oaknut/impl/offset.hpp +++ b/include/oaknut/impl/offset.hpp @@ -78,7 +78,7 @@ struct PageOffset { static std::uint32_t encode(std::uintptr_t current_addr, std::uintptr_t target) { - std::uint64_t diff = (static_cast(target) >> shift_amount) - (static_cast(current_addr) >> shift_amount); + std::uint64_t diff = static_cast((static_cast(target - current_addr) >> shift_amount)); if (detail::sign_extend(diff) != diff) throw OaknutException{ExceptionType::OffsetOutOfRange}; diff &= detail::mask_from_size(bitsize); diff --git a/tests/basic.cpp b/tests/basic.cpp index 7b401f6..32395c6 100644 --- a/tests/basic.cpp +++ b/tests/basic.cpp @@ -138,6 +138,11 @@ TEST_CASE("ADR") } } +TEST_CASE("PageOffset") +{ + REQUIRE(PageOffset<21, 12>::encode(0x0000000088e74000, 0xffffffffd167dece) == 0xd2202); +} + TEST_CASE("ADRP") { CodeBlock mem{4096};