|
@@ -512,6 +512,17 @@ static int free_ram_pages_type(u64 start, u64 end)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static u64 sanitize_phys(u64 address)
|
|
|
+{
|
|
|
+ /*
|
|
|
+ * When changing the memtype for pages containing poison allow
|
|
|
+ * for a "decoy" virtual address (bit 63 clear) passed to
|
|
|
+ * set_memory_X(). __pa() on a "decoy" address results in a
|
|
|
+ * physical address with bit 63 set.
|
|
|
+ */
|
|
|
+ return address & __PHYSICAL_MASK;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* req_type typically has one of the:
|
|
|
* - _PAGE_CACHE_MODE_WB
|
|
@@ -533,6 +544,8 @@ int reserve_memtype(u64 start, u64 end, enum page_cache_mode req_type,
|
|
|
int is_range_ram;
|
|
|
int err = 0;
|
|
|
|
|
|
+ start = sanitize_phys(start);
|
|
|
+ end = sanitize_phys(end);
|
|
|
BUG_ON(start >= end); /* end is exclusive */
|
|
|
|
|
|
if (!pat_enabled()) {
|
|
@@ -609,6 +622,9 @@ int free_memtype(u64 start, u64 end)
|
|
|
if (!pat_enabled())
|
|
|
return 0;
|
|
|
|
|
|
+ start = sanitize_phys(start);
|
|
|
+ end = sanitize_phys(end);
|
|
|
+
|
|
|
/* Low ISA region is always mapped WB. No need to track */
|
|
|
if (x86_platform.is_untracked_pat_range(start, end))
|
|
|
return 0;
|