|
@@ -24,6 +24,8 @@
|
|
|
#include <linux/vmalloc.h>
|
|
|
#include <linux/pagemap.h>
|
|
|
#include <linux/uaccess.h>
|
|
|
+#include <linux/mem_encrypt.h>
|
|
|
+#include <asm/pgtable.h>
|
|
|
#include <asm/io.h>
|
|
|
#include "internal.h"
|
|
|
|
|
@@ -98,7 +100,8 @@ static int pfn_is_ram(unsigned long pfn)
|
|
|
|
|
|
/* Reads a page from the oldmem device from given offset. */
|
|
|
static ssize_t read_from_oldmem(char *buf, size_t count,
|
|
|
- u64 *ppos, int userbuf)
|
|
|
+ u64 *ppos, int userbuf,
|
|
|
+ bool encrypted)
|
|
|
{
|
|
|
unsigned long pfn, offset;
|
|
|
size_t nr_bytes;
|
|
@@ -120,8 +123,15 @@ static ssize_t read_from_oldmem(char *buf, size_t count,
|
|
|
if (pfn_is_ram(pfn) == 0)
|
|
|
memset(buf, 0, nr_bytes);
|
|
|
else {
|
|
|
- tmp = copy_oldmem_page(pfn, buf, nr_bytes,
|
|
|
- offset, userbuf);
|
|
|
+ if (encrypted)
|
|
|
+ tmp = copy_oldmem_page_encrypted(pfn, buf,
|
|
|
+ nr_bytes,
|
|
|
+ offset,
|
|
|
+ userbuf);
|
|
|
+ else
|
|
|
+ tmp = copy_oldmem_page(pfn, buf, nr_bytes,
|
|
|
+ offset, userbuf);
|
|
|
+
|
|
|
if (tmp < 0)
|
|
|
return tmp;
|
|
|
}
|
|
@@ -155,7 +165,7 @@ void __weak elfcorehdr_free(unsigned long long addr)
|
|
|
*/
|
|
|
ssize_t __weak elfcorehdr_read(char *buf, size_t count, u64 *ppos)
|
|
|
{
|
|
|
- return read_from_oldmem(buf, count, ppos, 0);
|
|
|
+ return read_from_oldmem(buf, count, ppos, 0, false);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -163,7 +173,7 @@ ssize_t __weak elfcorehdr_read(char *buf, size_t count, u64 *ppos)
|
|
|
*/
|
|
|
ssize_t __weak elfcorehdr_read_notes(char *buf, size_t count, u64 *ppos)
|
|
|
{
|
|
|
- return read_from_oldmem(buf, count, ppos, 0);
|
|
|
+ return read_from_oldmem(buf, count, ppos, 0, sme_active());
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -173,6 +183,7 @@ int __weak remap_oldmem_pfn_range(struct vm_area_struct *vma,
|
|
|
unsigned long from, unsigned long pfn,
|
|
|
unsigned long size, pgprot_t prot)
|
|
|
{
|
|
|
+ prot = pgprot_encrypted(prot);
|
|
|
return remap_pfn_range(vma, from, pfn, size, prot);
|
|
|
}
|
|
|
|
|
@@ -351,7 +362,8 @@ static ssize_t __read_vmcore(char *buffer, size_t buflen, loff_t *fpos,
|
|
|
m->offset + m->size - *fpos,
|
|
|
buflen);
|
|
|
start = m->paddr + *fpos - m->offset;
|
|
|
- tmp = read_from_oldmem(buffer, tsz, &start, userbuf);
|
|
|
+ tmp = read_from_oldmem(buffer, tsz, &start,
|
|
|
+ userbuf, sme_active());
|
|
|
if (tmp < 0)
|
|
|
return tmp;
|
|
|
buflen -= tsz;
|