|
@@ -424,17 +424,46 @@ void unxlate_dev_mem_ptr(phys_addr_t phys, void *addr)
|
|
* Examine the physical address to determine if it is an area of memory
|
|
* Examine the physical address to determine if it is an area of memory
|
|
* that should be mapped decrypted. If the memory is not part of the
|
|
* that should be mapped decrypted. If the memory is not part of the
|
|
* kernel usable area it was accessed and created decrypted, so these
|
|
* kernel usable area it was accessed and created decrypted, so these
|
|
- * areas should be mapped decrypted.
|
|
|
|
|
|
+ * areas should be mapped decrypted. And since the encryption key can
|
|
|
|
+ * change across reboots, persistent memory should also be mapped
|
|
|
|
+ * decrypted.
|
|
*/
|
|
*/
|
|
static bool memremap_should_map_decrypted(resource_size_t phys_addr,
|
|
static bool memremap_should_map_decrypted(resource_size_t phys_addr,
|
|
unsigned long size)
|
|
unsigned long size)
|
|
{
|
|
{
|
|
|
|
+ int is_pmem;
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Check if the address is part of a persistent memory region.
|
|
|
|
+ * This check covers areas added by E820, EFI and ACPI.
|
|
|
|
+ */
|
|
|
|
+ is_pmem = region_intersects(phys_addr, size, IORESOURCE_MEM,
|
|
|
|
+ IORES_DESC_PERSISTENT_MEMORY);
|
|
|
|
+ if (is_pmem != REGION_DISJOINT)
|
|
|
|
+ return true;
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Check if the non-volatile attribute is set for an EFI
|
|
|
|
+ * reserved area.
|
|
|
|
+ */
|
|
|
|
+ if (efi_enabled(EFI_BOOT)) {
|
|
|
|
+ switch (efi_mem_type(phys_addr)) {
|
|
|
|
+ case EFI_RESERVED_TYPE:
|
|
|
|
+ if (efi_mem_attributes(phys_addr) & EFI_MEMORY_NV)
|
|
|
|
+ return true;
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
/* Check if the address is outside kernel usable area */
|
|
/* Check if the address is outside kernel usable area */
|
|
switch (e820__get_entry_type(phys_addr, phys_addr + size - 1)) {
|
|
switch (e820__get_entry_type(phys_addr, phys_addr + size - 1)) {
|
|
case E820_TYPE_RESERVED:
|
|
case E820_TYPE_RESERVED:
|
|
case E820_TYPE_ACPI:
|
|
case E820_TYPE_ACPI:
|
|
case E820_TYPE_NVS:
|
|
case E820_TYPE_NVS:
|
|
case E820_TYPE_UNUSABLE:
|
|
case E820_TYPE_UNUSABLE:
|
|
|
|
+ case E820_TYPE_PRAM:
|
|
return true;
|
|
return true;
|
|
default:
|
|
default:
|
|
break;
|
|
break;
|