From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752989AbcILQzf (ORCPT ); Mon, 12 Sep 2016 12:55:35 -0400 Received: from mail-vk0-f42.google.com ([209.85.213.42]:35349 "EHLO mail-vk0-f42.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751290AbcILQzb (ORCPT ); Mon, 12 Sep 2016 12:55:31 -0400 MIME-Version: 1.0 In-Reply-To: <20160822223738.29880.6909.stgit@tlendack-t1.amdoffice.net> References: <20160822223529.29880.50884.stgit@tlendack-t1.amdoffice.net> <20160822223738.29880.6909.stgit@tlendack-t1.amdoffice.net> From: Andy Lutomirski Date: Mon, 12 Sep 2016 09:55:09 -0700 Message-ID: Subject: Re: [RFC PATCH v2 11/20] mm: Access BOOT related data in the clear To: Tom Lendacky , Matt Fleming Cc: kasan-dev , "linux-efi@vger.kernel.org" , linux-arch , Thomas Gleixner , Paolo Bonzini , Ingo Molnar , Borislav Petkov , iommu@lists.linux-foundation.org, "linux-doc@vger.kernel.org" , Jonathan Corbet , =?UTF-8?B?UmFkaW0gS3LEjW3DocWZ?= , Konrad Rzeszutek Wilk , "linux-mm@kvack.org" , Matt Fleming , Alexander Potapenko , "linux-kernel@vger.kernel.org" , Dmitry Vyukov , Arnd Bergmann , Joerg Roedel , Andrey Ryabinin , "H. Peter Anvin" , X86 ML , kvm list Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Aug 22, 2016 6:53 PM, "Tom Lendacky" wrote: > > BOOT data (such as EFI related data) is not encyrpted when the system is > booted and needs to be accessed as non-encrypted. Add support to the > early_memremap API to identify the type of data being accessed so that > the proper encryption attribute can be applied. Currently, two types > of data are defined, KERNEL_DATA and BOOT_DATA. What happens when you memremap boot services data outside of early boot? Matt just added code that does this. IMO this API is not so great. It scatters a specialized consideration all over the place. Could early_memremap not look up the PA to figure out what to do? --Andy [leaving the rest here for Matt's benefit] > unsigned long size, > + enum memremap_owner owner, > + pgprot_t prot) > +{ > + return prot; > +} > + > void __init early_ioremap_reset(void) > { > early_ioremap_shutdown(); > @@ -213,16 +221,23 @@ early_ioremap(resource_size_t phys_addr, unsigned long size) > > /* Remap memory */ > void __init * > -early_memremap(resource_size_t phys_addr, unsigned long size) > +early_memremap(resource_size_t phys_addr, unsigned long size, > + enum memremap_owner owner) > { > - return (__force void *)__early_ioremap(phys_addr, size, > - FIXMAP_PAGE_NORMAL); > + pgprot_t prot = early_memremap_pgprot_adjust(phys_addr, size, owner, > + FIXMAP_PAGE_NORMAL); > + > + return (__force void *)__early_ioremap(phys_addr, size, prot); > } > #ifdef FIXMAP_PAGE_RO > void __init * > -early_memremap_ro(resource_size_t phys_addr, unsigned long size) > +early_memremap_ro(resource_size_t phys_addr, unsigned long size, > + enum memremap_owner owner) > { > - return (__force void *)__early_ioremap(phys_addr, size, FIXMAP_PAGE_RO); > + pgprot_t prot = early_memremap_pgprot_adjust(phys_addr, size, owner, > + FIXMAP_PAGE_RO); > + > + return (__force void *)__early_ioremap(phys_addr, size, prot); > } > #endif > > @@ -236,7 +251,8 @@ early_memremap_prot(resource_size_t phys_addr, unsigned long size, > > #define MAX_MAP_CHUNK (NR_FIX_BTMAPS << PAGE_SHIFT) > > -void __init copy_from_early_mem(void *dest, phys_addr_t src, unsigned long size) > +void __init copy_from_early_mem(void *dest, phys_addr_t src, unsigned long size, > + enum memremap_owner owner) > { > unsigned long slop, clen; > char *p; > @@ -246,7 +262,7 @@ void __init copy_from_early_mem(void *dest, phys_addr_t src, unsigned long size) > clen = size; > if (clen > MAX_MAP_CHUNK - slop) > clen = MAX_MAP_CHUNK - slop; > - p = early_memremap(src & PAGE_MASK, clen + slop); > + p = early_memremap(src & PAGE_MASK, clen + slop, owner); > memcpy(dest, p + slop, clen); > early_memunmap(p, clen + slop); > dest += clen; > @@ -265,12 +281,14 @@ early_ioremap(resource_size_t phys_addr, unsigned long size) > > /* Remap memory */ > void __init * > -early_memremap(resource_size_t phys_addr, unsigned long size) > +early_memremap(resource_size_t phys_addr, unsigned long size, > + enum memremap_owner owner) > { > return (void *)phys_addr; > } > void __init * > -early_memremap_ro(resource_size_t phys_addr, unsigned long size) > +early_memremap_ro(resource_size_t phys_addr, unsigned long size, > + enum memremap_owner owner) > { > return (void *)phys_addr; > } >