Received: by 2002:ac0:aa62:0:0:0:0:0 with SMTP id w31-v6csp1745911ima; Sun, 21 Oct 2018 20:01:29 -0700 (PDT) X-Google-Smtp-Source: AJdET5cw4wdTAbvV3SY9ZyzFs6jYO0tmtBZ8ybgCGinEZVAdWsV0DiQFfyng5k6vi+5iKPssnYeo X-Received: by 2002:a17:902:854b:: with SMTP id d11-v6mr6778941plo.72.1540177289044; Sun, 21 Oct 2018 20:01:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1540177289; cv=none; d=google.com; s=arc-20160816; b=o0M3IJ3pf6/XeWlJ2sv4LznW5+VpYUTzHvr4kIVkZVDhZyz65DBwpF8qYG4WtBeGDK 3fO1knXVM88pWXGfF7Hbvsc6t8OYkWANclgVl8n60rjoyDoC2kzBkeIUqxmVvOOITz2H Zycwzqm9AuopH/V6FZjf1CZN4PxrQw3JvXYa6af4WR0FrlGY2av1m4UGFlokG4Xt3/99 83I9w2I0/SYRX9JI502LWF+ZlqRoBgRB8+Cetw2JIXoRJMp1lVpnihHbHot+hekPYVD9 zBbyjMm+cKLg9fWgi16Oys55JGSGQvo1kTO1azogLqW/XlAF1TX/5mwT0TC/yHo/ejQg B0tg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:content-transfer-encoding :dlp-reaction:dlp-version:dlp-product:content-language :accept-language:in-reply-to:references:message-id:date:thread-index :thread-topic:subject:cc:to:from; bh=16pohy9pneC3nfc9vlBd9fCTuPPWL8ieM8q625mTOhs=; b=oorFe1+RWT1Xt4de8BW1oNCigbca8Py7TXa+gtHD0gXbQNhRCWa6L81i1PqguQnG/O pQofcdyg177m2FBwA2Waf+xD0ffpab9pVS1wjcOaFhnR7323ESG7i246b0+RPdCofMp+ Un4ybqQSIzl9ALIY65kGINEfos2rfjb+oUNxEHE1ZZUY6Cy1w9VxlYHHAWel9b9iJfw5 KjPl1JXx7VZLqlF/XK6j19DMdVJfmOS+PyeCW+jHXbXEEYZaMc6c3IVOUYRwQ4PtvV3m HIXDOIthaqGxJ8awNuRy5GJdyb4ExIyBp8H5BhuBBX3Zd3Qmuvivue5lXLLhwz+y2Usv 5paw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id v8-v6si7676217pgo.220.2018.10.21.20.01.13; Sun, 21 Oct 2018 20:01:29 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727182AbeJVLRU convert rfc822-to-8bit (ORCPT + 99 others); Mon, 22 Oct 2018 07:17:20 -0400 Received: from mga09.intel.com ([134.134.136.24]:3755 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726784AbeJVLRU (ORCPT ); Mon, 22 Oct 2018 07:17:20 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga004.jf.intel.com ([10.7.209.38]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 21 Oct 2018 20:00:43 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.54,410,1534834800"; d="scan'208";a="243203100" Received: from orsmsx106.amr.corp.intel.com ([10.22.225.133]) by orsmga004.jf.intel.com with ESMTP; 21 Oct 2018 20:00:43 -0700 Received: from orsmsx158.amr.corp.intel.com (10.22.240.20) by ORSMSX106.amr.corp.intel.com (10.22.225.133) with Microsoft SMTP Server (TLS) id 14.3.319.2; Sun, 21 Oct 2018 20:00:43 -0700 Received: from orsmsx114.amr.corp.intel.com ([169.254.8.194]) by ORSMSX158.amr.corp.intel.com ([169.254.10.68]) with mapi id 14.03.0319.002; Sun, 21 Oct 2018 20:00:42 -0700 From: "Prakhya, Sai Praneeth" To: Ingo Molnar CC: "linux-efi@vger.kernel.org" , "linux-kernel@vger.kernel.org" , "x86@kernel.org" , Borislav Petkov , "Andy Lutomirski" , "Hansen, Dave" , Bhupesh Sharma , Thomas Gleixner , Peter Zijlstra , Ard Biesheuvel , Peter Zijlstra Subject: RE: [PATCH 1/2] x86/efi: Unmap efi boot services code/data regions from efi_pgd Thread-Topic: [PATCH 1/2] x86/efi: Unmap efi boot services code/data regions from efi_pgd Thread-Index: AQHUaae1+/df8a0vpkCawzkqjxdfr6Uq90AA//+XirA= Date: Mon, 22 Oct 2018 03:00:42 +0000 Message-ID: References: <1540172145-17134-1-git-send-email-sai.praneeth.prakhya@intel.com> <1540172145-17134-2-git-send-email-sai.praneeth.prakhya@intel.com> <20181022015738.GB24095@gmail.com> In-Reply-To: <20181022015738.GB24095@gmail.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiNjdiZDk5NWUtZmVlMi00Y2NmLTgwZjgtNzUzNTdmODMwNDIwIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjEwLjE4MDQuNDkiLCJUcnVzdGVkTGFiZWxIYXNoIjoiYzgzenpNWmphbk0xOUpSY0pwMXBUZXMzK05LZ0J2MnlPOVk0OURBZEUydFcrMXVrdzcwanBWeHFFYnBHT0xwMSJ9 x-ctpclassification: CTP_NT dlp-product: dlpe-windows dlp-version: 11.0.400.15 dlp-reaction: no-action x-originating-ip: [10.22.254.139] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 8BIT MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org > > +int kernel_unmap_pages_in_pgd(pgd_t *pgd, u64 pfn, unsigned long address, > > + unsigned long numpages) > > +{ > > + int retval; > > + > > + struct cpa_data cpa = { > > + .vaddr = &address, > > + .pfn = pfn, > > + .pgd = pgd, > > + .numpages = numpages, > > + .mask_set = __pgprot(0), > > + .mask_clr = __pgprot(_PAGE_PRESENT | _PAGE_RW), > > + .flags = 0, > > + }; > > + > > + retval = __change_page_attr_set_clr(&cpa, 0); > > + __flush_tlb_all(); > > + > > + return retval; > > +} > > That's certainly a creative use of __change_page_attr_set_clr() by EFI used for > mapping in pages so far (kernel_map_pages_in_pgd()), and now used for > unmapping as well. Doesn't look wrong, just a bit weird as part of CPA. > Haha.. yes.. I copied from kernel_map_pages_in_pgd() > Could you please write the initializer in an easier to read fashion: > > struct cpa_data cpa = { > .vaddr = &address, > .pfn = pfn, > .pgd = pgd, > .numpages = numpages, > .mask_set = __pgprot(0), > .mask_clr = __pgprot(_PAGE_PRESENT | _PAGE_RW), > .flags = 0, > }; > > ? Sure! > > The one bit that is odd is the cpa->pfn field - for unmapped pages that's totally > uninteresting and I'm wondering whether setting it to 0 wouldn't be better. > > Does the CPU _ever_ look look at the PFN if the page is !_PAGE_PRESENT, for > example speculatively? If yes then what is the recommended value for the pfn - > zero perhaps? > > Also note that if for whatever reason the PFN range of the EFI boot area gets > hot-unplugged, we'd have outright invalid PFNs - although this is probably very > unlikely from a platform perspective. > > > +/* > > + * Apart from having VA mappings for efi boot services code/data > > +regions, > > + * (duplicate) 1:1 mappings were also created as a catch for buggy > > +firmware. So, > > + * unmap both 1:1 and VA mappings. > > + */ > > Speling nits: > > - please capitalize 'EFI' consistently. > - s/catch/quirk ? > Sure! I will fix them > BTW., are the 1:1 'boot mappings' a buggy firmware quirk, or something > required by the EFI spec? (or both? ;-) > It's a quirk for buggy firmware. According to EFI spec, EFI Boot Services code/data regions shouldn't be accessed after calling exit_boot_services(). This call is typically performed by bootloader (grub) or efi_stub. > > +static void __init efi_unmap_pages(efi_memory_desc_t *md) { > > + pgd_t *pgd = efi_mm.pgd; > > + u64 pfn = md->phys_addr >> PAGE_SHIFT; > > Note that this md->phys_addr isn't really meaningful once it gets unmapped. > Yes, makes sense. In efi_free_boot_services(), after freeing up the memory and unmapping, a new memory map is created (which has only EFI Runtime regions) and hence we can safely assume that this memory descriptor and md->phys_addr would never be used. > > + > > + if (kernel_unmap_pages_in_pgd(pgd, pfn, md->phys_addr, md- > >num_pages)) > > + pr_err("Failed to unmap 1:1 mapping: PA 0x%llx -> VA > 0x%llx!\n", > > + md->phys_addr, md->virt_addr); > > + > > + if (kernel_unmap_pages_in_pgd(pgd, pfn, md->virt_addr, md- > >num_pages)) > > + pr_err("Failed to unmap VA mapping: PA 0x%llx -> VA > 0x%llx!\n", > > + md->phys_addr, md->virt_addr); > > Please keep pr_err()'s in a single line. (and ignore checkpatch.) > Sure! > > +} > > + > > void __init efi_free_boot_services(void) { > > phys_addr_t new_phys, new_size; > > @@ -415,6 +434,13 @@ void __init efi_free_boot_services(void) > > } > > > > free_bootmem_late(start, size); > > + > > + /* > > + * Before calling set_virtual_address_map(), boot services > > + * code/data regions were mapped as a catch for buggy > firmware. > > + * Unmap them from efi_pgd as they have already been freed. > > + */ > > + efi_unmap_pages(md); > > Ditto. > > BTW., the ordering here is wrong: we should unmap any virtual aliases from > pagetables _before_ we free the underlying memory. The ordering is probably > harmless in this case but overall a good practice. Sure! Makes sense. I will fix it in V2. Regards, Sai