]> git.proxmox.com Git - mirror_edk2.git/blame - UefiCpuPkg/Library/MpInitLib/X64/CreatePageTable.c
UefiCpuPkg: Has APs in 64 bit long-mode before booting to OS.
[mirror_edk2.git] / UefiCpuPkg / Library / MpInitLib / X64 / CreatePageTable.c
CommitLineData
73ccde8f
XY
1/** @file\r
2 Function to create page talbe.\r
3 Only create page table for x64, and leave the CreatePageTable empty for Ia32.\r
4\r
5 Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>\r
6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
7\r
8**/\r
9#include <Library/CpuPageTableLib.h>\r
10#include <Library/MemoryAllocationLib.h>\r
11#include <Base.h>\r
12#include <Library/BaseMemoryLib.h>\r
13#include <Library/DebugLib.h>\r
14\r
15/**\r
16 Create 1:1 mapping page table in reserved memory to map the specified address range.\r
17\r
18 @param[in] LinearAddress The start of the linear address range.\r
19 @param[in] Length The length of the linear address range.\r
20\r
21 @return The page table to be created.\r
22**/\r
23UINTN\r
24CreatePageTable (\r
25 IN UINTN Address,\r
26 IN UINTN Length\r
27 )\r
28{\r
29 EFI_STATUS Status;\r
30 VOID *PageTableBuffer;\r
31 UINTN PageTableBufferSize;\r
32 UINTN PageTable;\r
33\r
34 IA32_MAP_ATTRIBUTE MapAttribute;\r
35 IA32_MAP_ATTRIBUTE MapMask;\r
36\r
37 MapAttribute.Uint64 = Address;\r
38 MapAttribute.Bits.Present = 1;\r
39 MapAttribute.Bits.ReadWrite = 1;\r
40\r
41 MapMask.Bits.PageTableBaseAddress = 1;\r
42 MapMask.Bits.Present = 1;\r
43 MapMask.Bits.ReadWrite = 1;\r
44\r
45 PageTable = 0;\r
46 PageTableBufferSize = 0;\r
47\r
48 Status = PageTableMap (\r
49 &PageTable,\r
50 Paging4Level,\r
51 NULL,\r
52 &PageTableBufferSize,\r
53 Address,\r
54 Length,\r
55 &MapAttribute,\r
56 &MapMask\r
57 );\r
58 ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
59 DEBUG ((DEBUG_INFO, "AP Page Table Buffer Size = %x\n", PageTableBufferSize));\r
60\r
61 PageTableBuffer = AllocateReservedPages (EFI_SIZE_TO_PAGES (PageTableBufferSize));\r
62 ASSERT (PageTableBuffer != NULL);\r
63 Status = PageTableMap (\r
64 &PageTable,\r
65 Paging4Level,\r
66 PageTableBuffer,\r
67 &PageTableBufferSize,\r
68 Address,\r
69 Length,\r
70 &MapAttribute,\r
71 &MapMask\r
72 );\r
73 ASSERT_EFI_ERROR (Status);\r
74 return PageTable;\r
75}\r