diff --git a/repos/base-hw/src/lib/hw/spec/x86_64/page_table.h b/repos/base-hw/src/lib/hw/spec/x86_64/page_table.h index 02692b7a4f..163accce43 100644 --- a/repos/base-hw/src/lib/hw/spec/x86_64/page_table.h +++ b/repos/base-hw/src/lib/hw/spec/x86_64/page_table.h @@ -515,6 +515,7 @@ class Hw::Pml4_table static constexpr size_t PAGE_SIZE_LOG2 = SIZE_LOG2_512GB; static constexpr size_t SIZE_LOG2 = SIZE_LOG2_256TB; + static constexpr size_t SIZE_MASK = (1UL << SIZE_LOG2) - 1; static constexpr size_t MAX_ENTRIES = 512; static constexpr size_t PAGE_SIZE = 1UL << PAGE_SIZE_LOG2; static constexpr size_t PAGE_MASK = ~((1UL << PAGE_SIZE_LOG2) - 1); @@ -593,8 +594,8 @@ class Hw::Pml4_table template void _range_op(addr_t vo, addr_t pa, size_t size, FUNC &&func) { - for (size_t i = vo >> PAGE_SIZE_LOG2; size > 0; - i = vo >> PAGE_SIZE_LOG2) { + for (size_t i = (vo & SIZE_MASK) >> PAGE_SIZE_LOG2; size > 0; + i = (vo & SIZE_MASK) >> PAGE_SIZE_LOG2) { assert (i < MAX_ENTRIES); addr_t end = (vo + PAGE_SIZE) & PAGE_MASK; size_t sz = Genode::min(size, end-vo);