From b8cd58e6a5ee05c723907c210043cbe687e2d0fd Mon Sep 17 00:00:00 2001 From: Stefan Kalkowski Date: Fri, 18 Aug 2017 13:44:35 +0200 Subject: [PATCH] hw: enable mappings beyond 4G on x86_64 Fix #2498 --- repos/base-hw/src/lib/hw/spec/x86_64/page_table.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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);