Skip to content

Commit 8458bf9

Browse files
tlendackyIngo Molnar
authored andcommitted
x86/mm: Use proper encryption attributes with /dev/mem
When accessing memory using /dev/mem (or /dev/kmem) use the proper encryption attributes when mapping the memory. To insure the proper attributes are applied when reading or writing /dev/mem, update the xlate_dev_mem_ptr() function to use memremap() which will essentially perform the same steps of applying __va for RAM or using ioremap() if not RAM. To insure the proper attributes are applied when mmapping /dev/mem, update the phys_mem_access_prot() to call phys_mem_access_encrypted(), a new function which will check if the memory should be mapped encrypted or not. If it is not to be mapped encrypted then the VMA protection value is updated to remove the encryption bit. Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com> Reviewed-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Borislav Petkov <bp@suse.de> Cc: Alexander Potapenko <glider@google.com> Cc: Andrey Ryabinin <aryabinin@virtuozzo.com> Cc: Andy Lutomirski <luto@kernel.org> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Borislav Petkov <bp@alien8.de> Cc: Brijesh Singh <brijesh.singh@amd.com> Cc: Dave Young <dyoung@redhat.com> Cc: Dmitry Vyukov <dvyukov@google.com> Cc: Jonathan Corbet <corbet@lwn.net> Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> Cc: Larry Woodman <lwoodman@redhat.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Matt Fleming <matt@codeblueprint.co.uk> Cc: Michael S. Tsirkin <mst@redhat.com> Cc: Paolo Bonzini <pbonzini@redhat.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Radim Krčmář <rkrcmar@redhat.com> Cc: Rik van Riel <riel@redhat.com> Cc: Toshimitsu Kani <toshi.kani@hpe.com> Cc: kasan-dev@googlegroups.com Cc: kvm@vger.kernel.org Cc: linux-arch@vger.kernel.org Cc: linux-doc@vger.kernel.org Cc: linux-efi@vger.kernel.org Cc: linux-mm@kvack.org Link: http://lkml.kernel.org/r/c917f403ab9f61cbfd455ad6425ed8429a5e7b54.1500319216.git.thomas.lendacky@amd.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
1 parent f2f931c commit 8458bf9

File tree

3 files changed

+15
-9
lines changed

3 files changed

+15
-9
lines changed

arch/x86/include/asm/io.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,4 +386,7 @@ extern bool arch_memremap_can_ram_remap(resource_size_t offset,
386386
unsigned long flags);
387387
#define arch_memremap_can_ram_remap arch_memremap_can_ram_remap
388388

389+
extern bool phys_mem_access_encrypted(unsigned long phys_addr,
390+
unsigned long size);
391+
389392
#endif /* _ASM_X86_IO_H */

arch/x86/mm/ioremap.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -400,12 +400,10 @@ void *xlate_dev_mem_ptr(phys_addr_t phys)
400400
unsigned long offset = phys & ~PAGE_MASK;
401401
void *vaddr;
402402

403-
/* If page is RAM, we can use __va. Otherwise ioremap and unmap. */
404-
if (page_is_ram(start >> PAGE_SHIFT))
405-
return __va(phys);
403+
/* memremap() maps if RAM, otherwise falls back to ioremap() */
404+
vaddr = memremap(start, PAGE_SIZE, MEMREMAP_WB);
406405

407-
vaddr = ioremap_cache(start, PAGE_SIZE);
408-
/* Only add the offset on success and return NULL if the ioremap() failed: */
406+
/* Only add the offset on success and return NULL if memremap() failed */
409407
if (vaddr)
410408
vaddr += offset;
411409

@@ -414,10 +412,7 @@ void *xlate_dev_mem_ptr(phys_addr_t phys)
414412

415413
void unxlate_dev_mem_ptr(phys_addr_t phys, void *addr)
416414
{
417-
if (page_is_ram(phys >> PAGE_SHIFT))
418-
return;
419-
420-
iounmap((void __iomem *)((unsigned long)addr & PAGE_MASK));
415+
memunmap((void *)((unsigned long)addr & PAGE_MASK));
421416
}
422417

423418
/*
@@ -626,6 +621,11 @@ pgprot_t __init early_memremap_pgprot_adjust(resource_size_t phys_addr,
626621
return prot;
627622
}
628623

624+
bool phys_mem_access_encrypted(unsigned long phys_addr, unsigned long size)
625+
{
626+
return arch_memremap_can_ram_remap(phys_addr, size, 0);
627+
}
628+
629629
#ifdef CONFIG_ARCH_USE_MEMREMAP_PROT
630630
/* Remap memory with encryption */
631631
void __init *early_memremap_encrypted(resource_size_t phys_addr,

arch/x86/mm/pat.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -744,6 +744,9 @@ EXPORT_SYMBOL(arch_io_free_memtype_wc);
744744
pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,
745745
unsigned long size, pgprot_t vma_prot)
746746
{
747+
if (!phys_mem_access_encrypted(pfn << PAGE_SHIFT, size))
748+
vma_prot = pgprot_decrypted(vma_prot);
749+
747750
return vma_prot;
748751
}
749752

0 commit comments

Comments
 (0)