From nobody Tue Feb 10 03:16:19 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+98421+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+98421+1787277+3901457@groups.io ARC-Seal: i=1; a=rsa-sha256; t=1673575545; cv=none; d=zohomail.com; s=zohoarc; b=iN59r6010hSvFp+d8twblDCrqWq7NPgds0CRwvPWRAyhwfcGYtWb5F+B/i9jDoSwoqUVIB0m776YsConoKiLLyExU0cXQMLq9/ogTtW+uv0WcQ3X1A1/0xhL0OMjTU05hg/6NhxmBRAXQ2KW/wVNQxpkQ2jkmsYuyO2ZWDJCis0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1673575545; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=mT4/6JiwNJWCyfDE+cQbW+wDWwu3NRpbRxD083XKoc0=; b=iPlWUTUUrJkkawiE9PIomvl9W/7xz8nGo2b3I1NsT3gzgOic6Yj3MIxZ25IciA7mI9XojaJOoS57atb9OEH0yFv2o05tVgtm9sKzwEoymhTPetub1ahaQN5SrlZPwVG9uInM45LjBJJ6RtMAqC11YcBtQ4IzjUtvBHZdsYfWCSA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+98421+1787277+3901457@groups.io Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1673575545815952.9313995537407; Thu, 12 Jan 2023 18:05:45 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id N06oYY1788612xg4dAVqXWzz; Thu, 12 Jan 2023 18:05:45 -0800 X-Received: from loongson.cn (loongson.cn [114.242.206.163]) by mx.groups.io with SMTP id smtpd.web11.76177.1673575544427616505 for ; Thu, 12 Jan 2023 18:05:44 -0800 X-Received: from loongson.cn (unknown [10.2.5.185]) by gateway (Coremail) with SMTP id _____8CxIfB3vMBjkl4BAA--.4648S3; Fri, 13 Jan 2023 10:05:43 +0800 (CST) X-Received: from localhost.localdomain (unknown [10.2.5.185]) by localhost.localdomain (Coremail) with SMTP id AQAAf8Cxnb5ZvMBjTroYAA--.49812S9; Fri, 13 Jan 2023 10:05:43 +0800 (CST) From: "xianglai" To: devel@edk2.groups.io Cc: Ard Biesheuvel , Bibo Mao , Chao Li , Leif Lindholm , Liming Gao , Michael D Kinney Subject: [edk2-devel] [edk2-platforms][PATCH V3 7/8] Platform/Loongson: Optimize the huge page and page entry conversion. Date: Fri, 13 Jan 2023 10:05:11 +0800 Message-Id: In-Reply-To: References: MIME-Version: 1.0 X-CM-TRANSID: AQAAf8Cxnb5ZvMBjTroYAA--.49812S9 X-CM-SenderInfo: 5ol0xt5qjotxo6or00hjvr0hdfq/ X-Coremail-Antispam: 1Uk129KBjvJXoW3Gr1ftr1UZF17GFyUCF15urg_yoWxJFy5pr 9xCayxK3yUtrZrXFWkXwsI9r4DCr98Wa48Jr42yw1Fy3s8Xwn3uryqkr10qr47JFyfta1U Xay3tw47CFZ5X37anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUj1kv1TuYvTs0mT0YCTnIWj qI5I8CrVACY4xI64kE6c02F40Ex7xfYxn0WfASr-VFAUDa7-sFnT9fnUUIcSsGvfJTRUUU bnxFc2x0x2IEx4CE42xK8VAvwI8IcIk0rVWrJVCq3wA2ocxC64kIII0Yj41l84x0c7CEw4 AK67xGY2AK021l84ACjcxK6xIIjxv20xvE14v26ryj6F1UM28EF7xvwVC0I7IYx2IY6xkF 7I0E14v26r4j6F4UM28EF7xvwVC2z280aVAFwI0_Gr1j6F4UJwA2z4x0Y4vEx4A2jsIEc7 CjxVAFwI0_Gr1j6F4UJwAS0I0E0xvYzxvE52x082IY62kv0487Mc804VCY07AIYIkI8VC2 zVCFFI0UMc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VCjz48v1sIEY20_WwAm72CE4IkC6x 0Yz7v_Jr0_Gr1lF7xvr2IYc2Ij64vIr41l42xK82IYc2Ij64vIr41l42xK82IY6x8ErcxF aVAv8VWrMxC20s026xCaFVCjc4AY6r1j6r4UMI8I3I0E5I8CrVAFwI0_Jr0_Jr4lx2IqxV Cjr7xvwVAFwI0_JrI_JrWlx4CE17CEb7AF67AKxVWUAVWUtwCIc40Y0x0EwIxGrwCI42IY 6xIIjxv20xvE14v26ryj6F1UMIIF0xvE2Ix0cI8IcVCY1x0267AKxVW8JVWxJwCI42IY6x AIw20EY4v20xvaj40_Jr0_JF4lIxAIcVC2z280aVAFwI0_Gr0_Cr1lIxAIcVC2z280aVCY 1x0267AKxVW8JVW8JrUvcSsGvfC2KfnxnUUI43ZEXa7xRE6wZ7UUUUU== Precedence: Bulk List-Unsubscribe: List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,lixianglai@loongson.cn X-Gm-Message-State: LmAYwTFkGG7w9tsfq4CNtJLzx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1673575545; bh=GMrR95IeiavAFVOoAUN/OqmN10dlVZYU7Nztvpv35Ok=; h=Cc:Date:From:Reply-To:Subject:To; b=XtJZ+xIb1SmL+AY731Ei16Bq31kjFXLwtCv5TGGPJeEZYHyoHOeevR5RtTHY2hmBH6y gT7upLE7oTPNvJdb4zGbIcSShI0vztQ7Nwjuu2Yaa+5IbQpk7Aezg38pzrU7jK7mqWM51 WFBb7T9Uh+m8wdTUkt/4+OfmlmHRDvFzmVs= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1673575546757100002 Content-Type: text/plain; charset="utf-8" Optimize the process of converting huge pages to page table entries. Cc: Ard Biesheuvel Cc: Bibo Mao Cc: Chao Li Cc: Leif Lindholm Cc: Liming Gao Cc: Michael D Kinney Signed-off-by: xianglai li --- .../Library/MmuLib/MmuLibCore.c | 109 +++++++++++++----- .../LoongArchQemuPkg/Library/MmuLib/page.h | 3 + 2 files changed, 82 insertions(+), 30 deletions(-) diff --git a/Platform/Loongson/LoongArchQemuPkg/Library/MmuLib/MmuLibCore.c= b/Platform/Loongson/LoongArchQemuPkg/Library/MmuLib/MmuLibCore.c index 9e2bd3344a..dac38c63f2 100644 --- a/Platform/Loongson/LoongArchQemuPkg/Library/MmuLib/MmuLibCore.c +++ b/Platform/Loongson/LoongArchQemuPkg/Library/MmuLib/MmuLibCore.c @@ -449,6 +449,29 @@ GetPteAddress ( return PteOffset (Pmd, Address); } =20 +/** + Gets the Attributes of Huge Page. + + @param Pmd A pointer to the page middle directory. + + @retval Value of Attributes. +**/ +UINTN +GetHugePageAttributes ( + IN PMD *Pmd + ) +{ + UINTN Attributes; + UINTN GlobalFlag; + UINTN HugeVal =3D PMD_VAL(*Pmd); + + Attributes =3D HugeVal & (~HUGEP_PAGE_MASK); + GlobalFlag =3D ((Attributes & (1 << PAGE_HGLOBAL_SHIFT)) >> PAGE_HGLOBAL= _SHIFT) << PAGE_GLOBAL_SHIFT; + Attributes &=3D ~(1 << PAGE_HGLOBAL_SHIFT); + Attributes |=3D GlobalFlag; + return Attributes; +} + /** Establishes a page table entry based on the specified memory region. =20 @@ -477,13 +500,13 @@ MemoryMapPteRange ( return EFI_OUT_OF_RESOURCES; } =20 + DEBUG ((DEBUG_VERBOSE, + "%a %d Address %p End %p Attributes %llx\n", + __func__, __LINE__, Address, End, Attributes)); + do { UpDate =3D FALSE; PteVal =3D MAKE_PTE (Address, Attributes); - DEBUG ((DEBUG_VERBOSE, - "%a %d Address %p PGD_INDEX %p PUD_INDEX %p PMD_INDEX %p PTE_IND= EX %p MAKE_PTE %p\n", - __func__, __LINE__, Address, PGD_INDEX (Address), PUD_INDEX (Addres= s), PMD_INDEX (Address), - PTE_INDEX (Address), PteVal)); =20 if ((!pte_none (*Pte)) && (PTE_VAL(*Pte) !=3D PTE_VAL(PteVal))) @@ -500,6 +523,55 @@ MemoryMapPteRange ( return EFI_SUCCESS; } =20 +/** + Convert Huge Page to Page. + + @param Pmd A pointer to the page middle directory. + @param Address The memory space start address. + @param End The end address of the memory space. + @param Attributes Memory space Attributes. + + @retval EFI_SUCCESS The page table entry was created successfully. + @retval EFI_OUT_OF_RESOURCES Page table entry establishment failed due= to resource exhaustion. +**/ +EFI_STATUS +ConvertHugePageToPage ( + IN PMD *Pmd, + IN UINTN Address, + IN UINTN End, + IN UINTN Attributes + ) +{ + UINTN OldAttributes; + UINTN HugePageEnd; + UINTN HugePageStart; + EFI_STATUS Status; + + if ((pmd_none (*Pmd)) || + (!IS_HUGE_PAGE (Pmd->PmdVal))) + { + Status |=3D MemoryMapPteRange (Pmd, Address, End, Attributes); + } else { + OldAttributes =3D GetHugePageAttributes(Pmd); + SetPmd (Pmd, (PTE *)PcdGet64 (PcdInvalidPte)); + HugePageStart =3D Address & PMD_MASK; + HugePageEnd =3D HugePageStart + HUGE_PAGE_SIZE; + ASSERT (HugePageEnd >=3D End); + + if (Address > HugePageStart) { + Status |=3D MemoryMapPteRange (Pmd, HugePageStart, Address, OldAttri= butes); + } + + Status |=3D MemoryMapPteRange (Pmd, Address, End, Attributes); + + if (End < HugePageEnd) { + Status |=3D MemoryMapPteRange (Pmd, End, HugePageEnd, OldAttributes); + } + } + + return Status; +} + /** Establishes a page middle directory based on the specified memory region. =20 @@ -520,10 +592,7 @@ MemoryMapPmdRange ( ) { PMD *Pmd; - PTE *Pte; UINTN Next; - UINTN AddressStart_HugePage; - UINTN AddressEnd_HugePage; =20 Pmd =3D PmdAllocGet (Pud, Address); if (!Pmd) { @@ -534,7 +603,7 @@ MemoryMapPmdRange ( Next =3D PMD_ADDRESS_END (Address, End); if (((Address & (~PMD_MASK)) =3D=3D 0) && ((Next & (~PMD_MASK)) =3D=3D 0) && - (pmd_none (*Pmd))) + (pmd_none (*Pmd) || IS_HUGE_PAGE (Pmd->PmdVal))) { DEBUG ((DEBUG_VERBOSE, "%a %d Address %p PGD_INDEX %p PUD_INDEX %p PMD_INDEX %p MAKE_= HUGE_PTE %p\n", @@ -543,28 +612,7 @@ MemoryMapPmdRange ( =20 SetPmd (Pmd, (PTE *)MAKE_HUGE_PTE (Address, Attributes)); } else { - if ((pmd_none (*Pmd)) || - ((!pmd_none (*Pmd)) && - (!IS_HUGE_PAGE (Pmd->PmdVal)))) - { - if (MemoryMapPteRange (Pmd, Address, Next, Attributes)) { - return EFI_OUT_OF_RESOURCES; - } - } else { - SetPmd (Pmd, (PTE *)PcdGet64 (PcdInvalidPte)); - AddressStart_HugePage =3D Address & PMD_MASK; - AddressEnd_HugePage =3D AddressStart_HugePage + HUGE_PAGE_SIZE; - if (MemoryMapPteRange (Pmd, AddressStart_HugePage, AddressEnd_Hug= ePage, Attributes)) { - return EFI_OUT_OF_RESOURCES; - } - Pte =3D GetPteAddress (AddressStart_HugePage); - if (Pte =3D=3D NULL) { - continue ; - } - if (AddressEnd_HugePage > End) { - Next =3D End; - } - } + ConvertHugePageToPage (Pmd, Address, Next, Attributes); } } while (Pmd++, Address =3D Next, Address !=3D End); =20 @@ -788,6 +836,7 @@ LoongArchSetMemoryAttributes ( Attributes =3D EfiAttributeToLoongArchAttribute (Attributes); DEBUG ((DEBUG_VERBOSE, "%a %d %p %p %p.\n", __func__, __LINE__, BaseAddr= ess , Length, Attributes)); MemoryMapPageRange (BaseAddress, BaseAddress + Length, Attributes); + DEBUG ((DEBUG_VERBOSE, "%a %d end.\n", __func__, __LINE__)); =20 return EFI_SUCCESS; } diff --git a/Platform/Loongson/LoongArchQemuPkg/Library/MmuLib/page.h b/Pla= tform/Loongson/LoongArchQemuPkg/Library/MmuLib/page.h index 84c7c13919..927aeb018d 100644 --- a/Platform/Loongson/LoongArchQemuPkg/Library/MmuLib/page.h +++ b/Platform/Loongson/LoongArchQemuPkg/Library/MmuLib/page.h @@ -42,6 +42,9 @@ #define PFN_MASK (~(((UINTN)(1) << (EFI_PAGE_SH= IFT)) - 1) & \ (((UINTN)(1) << (PAGE_PFN_END= _SHIFT)) - 1)) =20 +#define HUGEP_PAGE_MASK (~(((UINTN)(1) << (PMD_SHIFT))= - 1) & \ + (((UINTN)(1) << (PAGE_PFN_END= _SHIFT)) - 1)) + typedef struct { UINTN PgdVal; } PGD; typedef struct { UINTN PudVal; } PUD; typedef struct { UINTN PmdVal; } PMD; --=20 2.31.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#98421): https://edk2.groups.io/g/devel/message/98421 Mute This Topic: https://groups.io/mt/96238017/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-