Received: by 2002:a05:7412:d8a:b0:e2:908c:2ebd with SMTP id b10csp3420809rdg; Tue, 17 Oct 2023 14:24:10 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHyQmPASoM484fezAjWhwTHva51kAjXt3By44lW+VRaVxgqymKuZSgsclg2QSNZn1uto0qK X-Received: by 2002:a17:902:ea02:b0:1c5:6f43:9502 with SMTP id s2-20020a170902ea0200b001c56f439502mr4656356plg.14.1697577850207; Tue, 17 Oct 2023 14:24:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1697577850; cv=none; d=google.com; s=arc-20160816; b=TAZ0LYL8uJl56LW6vFzr5eUv7fLiHRjhY4y6rJTe9Iyslu5eTrUoIcg7L8PYKUV9ew 86nx8XBahbdCpQrqEpjbmgQ/QfOYQAV7S0UEkAXoB/JQEtAKJYkMOiCdUnd7TStvk94o qaQuFaL6PIBc46e3aQP+cOCVg3WJkmXjZmb2JqNDRbG11GprLdqA4wgQGINc/eQh5iVj 9ECVxSIxoEMjuGgG0bkyjvmjIYX+eWq0E7W52vJpj024NFZLp3wvWIW/iPzFDjcArpdC ymlEuD5QwNw4es54kS+/ya2/slUVhHsOxGC3Udf24sSDrBIrSp2H9mhgO6LkfqrxvmHP mHKg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:date:mime-version:references:subject:cc:to:from :dkim-signature:dkim-signature:message-id; bh=3mXXYCmv0bVfMYDZcEO6X7VusLAPyknFMuG5E+/gL3Y=; fh=8iy+GLBXZdpcs/hIddJ7mbUapYjefwP9Gb111pAzFms=; b=nU8b/GMnqQ48xKEZRvDTqtoSJoEHN+nhZG78gLASsiX4iSt/jlxCzEICGGZiy6Wyry 7xdSj1zOazYNMxYAu5xvBgpnfPtYvwQKcdRWELUS0xOPEJckksLjnsG5759MUZehfGg1 b3JqsO5YJO32f29kANTH90TFC8gyKcn6/EKiMt+muda11PpOKvILT889ciQ2uyasx1GU KGGys8iKq/L2oq5jp5atyvPLAhFntMNI19e6vgerLd9tgSxjKu6FOmNVB6Gq1jacEmwv 64emPYxAYgUu6o5bOHQtrHBcq5cwv+IpHSHsPqpYchhXkhcWBZHXoIXdxI2dzP1+3635 eU1A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b="UMzh/2po"; dkim=neutral (no key) header.i=@linutronix.de; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.31 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=linutronix.de Return-Path: Received: from morse.vger.email (morse.vger.email. [23.128.96.31]) by mx.google.com with ESMTPS id x8-20020a170902a38800b001bbc138af0dsi2512149pla.163.2023.10.17.14.24.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Oct 2023 14:24:10 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.31 as permitted sender) client-ip=23.128.96.31; Authentication-Results: mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b="UMzh/2po"; dkim=neutral (no key) header.i=@linutronix.de; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.31 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=linutronix.de Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by morse.vger.email (Postfix) with ESMTP id 91E5D801B7B7; Tue, 17 Oct 2023 14:24:06 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at morse.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1343995AbjJQVXq (ORCPT + 99 others); Tue, 17 Oct 2023 17:23:46 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33378 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344159AbjJQVXl (ORCPT ); Tue, 17 Oct 2023 17:23:41 -0400 Received: from galois.linutronix.de (Galois.linutronix.de [IPv6:2a0a:51c0:0:12e:550::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D1B15F9 for ; Tue, 17 Oct 2023 14:23:32 -0700 (PDT) Message-ID: <20231017211722.292291436@linutronix.de> DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1697577811; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: references:references; bh=3mXXYCmv0bVfMYDZcEO6X7VusLAPyknFMuG5E+/gL3Y=; b=UMzh/2po3KoQQqnSV6luxMPgcv444x4N2N/4ZTRckWYVxEFL2VCfk5jhwgeoQmi1toPAnK taYhXCK0D1NI7A2UBdB5Kr+Ocgdged/jskGRUUo2mMJNiAgGO2QGWKsQWlA7EzAaNsoffe o/77rAUYNMlU3cjhtU4sDLYuwvL/raPveabrkTUVgdUjLZJbxGwLTT3AGX1C168GGE2oc/ /XbfMir2sYhRpgLZgj7LFPVlgiMA2cglYN8wKsLdiEBrkdfhaKydzabgHCzLSs8ohdQbwR fTF5cU1EYQYnfOB8QELImP2w7Dt2BUG1OWl8OIjGmCYmvYVNeBSiif2FSElPqQ== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1697577811; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: references:references; bh=3mXXYCmv0bVfMYDZcEO6X7VusLAPyknFMuG5E+/gL3Y=; b=P0F1MWymNHMHaSxSJWrKIHU/uV/2nB6ASFkvWkJEcGt+JlEB+2bcEmTFf16fce202//iIx b7o0g/iHUj0VHWAg== From: Thomas Gleixner To: LKML Cc: x86@kernel.org, Borislav Petkov Subject: [patch V5 06/39] x86/boot/32: Temporarily map initrd for microcode loading References: <20231017200758.877560658@linutronix.de> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Date: Tue, 17 Oct 2023 23:23:31 +0200 (CEST) X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on morse.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (morse.vger.email [0.0.0.0]); Tue, 17 Oct 2023 14:24:06 -0700 (PDT) From: Thomas Gleixner Early microcode loading on 32-bit runs in physical address mode because the initrd is not covered by the initial page tables. That results in a horrible mess all over the microcode loader code. Provide a temporary mapping for the initrd in the initial page tables by appending it to the actual initial mapping starting with a new PGD or PMD depending on the configured page table levels ([non-]PAE). The page table entries are located after _brk_end so they are not permanently using memory space. The mapping is invalidated right away in i386_start_kernel() after the early microcode loader has run. This prepares for removing the physical address mode oddities from all over the microcode loader code, which in turn allows further cleanups. Provide the map and unmap code and document the place where the microcode loader needs to be invoked with a comment. Signed-off-by: Thomas Gleixner --- V5: New patch --- arch/x86/include/asm/microcode.h | 2 + arch/x86/kernel/head32.c | 54 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 54 insertions(+), 2 deletions(-) --- --- a/arch/x86/include/asm/microcode.h +++ b/arch/x86/include/asm/microcode.h @@ -23,6 +23,8 @@ static inline void load_ucode_ap(void) { static inline void microcode_bsp_resume(void) { } #endif +extern unsigned long initrd_start_early; + #ifdef CONFIG_CPU_SUP_INTEL /* Intel specific microcode defines. Public for IFS */ struct microcode_header_intel { --- a/arch/x86/kernel/head32.c +++ b/arch/x86/kernel/head32.c @@ -29,11 +29,33 @@ static void __init i386_default_early_se x86_init.mpparse.setup_ioapic_ids = setup_ioapic_ids_from_mpc; } +#ifdef CONFIG_MICROCODE_INITRD32 +unsigned long __initdata initrd_start_early; +static pte_t __initdata *initrd_pl2p_start, *initrd_pl2p_end; + +static void zap_early_initrd_mapping(void) +{ + pte_t *pl2p = initrd_pl2p_start; + + for (; pl2p < initrd_pl2p_end; pl2p++) { + *pl2p = (pte_t){ .pte = 0 }; + + if (!IS_ENABLED(CONFIG_X86_PAE)) + *(pl2p + ((PAGE_OFFSET >> PGDIR_SHIFT))) = (pte_t) {.pte = 0}; + } +} +#else +static inline void zap_early_initrd_mapping(void) { } +#endif + asmlinkage __visible void __init __noreturn i386_start_kernel(void) { /* Make sure IDT is set up before any exception happens */ idt_setup_early_handler(); + /* load_ucode_bsp() */ + zap_early_initrd_mapping(); + cr4_init_shadow(); sanitize_boot_params(&boot_params); @@ -107,9 +129,9 @@ static __init __no_stack_protector pte_t void __init __no_stack_protector mk_early_pgtbl_32(void) { /* Enough space to fit pagetables for the low memory linear map */ - const unsigned long limit = __pa_nodebug(_end) + - (PAGE_TABLE_SIZE(LOWMEM_PAGES) << PAGE_SHIFT); + unsigned long limit = __pa_nodebug(_end) + (PAGE_TABLE_SIZE(LOWMEM_PAGES) << PAGE_SHIFT); pte_t pte, *ptep = (pte_t *)__pa_nodebug(__brk_base); + struct boot_params __maybe_unused *params; pl2_t *pl2p = (pl2_t *)__pa_nodebug(pl2_base); unsigned long *ptr; @@ -122,4 +144,32 @@ void __init __no_stack_protector mk_earl ptr = (unsigned long *)__pa_nodebug(&_brk_end); *ptr = (unsigned long)ptep + PAGE_OFFSET; + +#ifdef CONFIG_MICROCODE_INITRD32 + /* Running on a hypervisor? */ + if (native_cpuid_ecx(1) & BIT(31)) + return; + + params = (struct boot_params *)__pa_nodebug(&boot_params); + if (!params->hdr.ramdisk_size || !params->hdr.ramdisk_image) + return; + + /* Save the virtual start address */ + ptr = (unsigned long *)__pa_nodebug(&initrd_start_early); + *ptr = (pte.pte & PTE_PFN_MASK) + PAGE_OFFSET; + *ptr += ((unsigned long)params->hdr.ramdisk_image) & ~PAGE_MASK; + + /* Save PLP2 for cleanup */ + ptr = (unsigned long *)__pa_nodebug(&initrd_pl2p_start); + *ptr = (unsigned long)pl2p + PAGE_OFFSET; + + limit = (unsigned long)params->hdr.ramdisk_image; + pte.pte = PTE_IDENT_ATTR | PFN_ALIGN(limit); + limit = (unsigned long)params->hdr.ramdisk_image + params->hdr.ramdisk_size; + + init_map(pte, &ptep, &pl2p, limit); + + ptr = (unsigned long *)__pa_nodebug(&initrd_pl2p_end); + *ptr = (unsigned long)pl2p + PAGE_OFFSET; +#endif }