diff --git a/UefiCpuPkg/ResetVector/Vtf0/Bin/IA32/ResetVector.ia32.port80.raw b/UefiCpuPkg/ResetVector/Vtf0/Bin/IA32/ResetVector.ia32.port80.raw new file mode 100644 index 0000000000..79b23c047b Binary files /dev/null and b/UefiCpuPkg/ResetVector/Vtf0/Bin/IA32/ResetVector.ia32.port80.raw differ diff --git a/UefiCpuPkg/ResetVector/Vtf0/Bin/IA32/ResetVector.ia32.raw b/UefiCpuPkg/ResetVector/Vtf0/Bin/IA32/ResetVector.ia32.raw new file mode 100644 index 0000000000..ce7faa502b Binary files /dev/null and b/UefiCpuPkg/ResetVector/Vtf0/Bin/IA32/ResetVector.ia32.raw differ diff --git a/UefiCpuPkg/ResetVector/Vtf0/Bin/IA32/ResetVector.ia32.serial.raw b/UefiCpuPkg/ResetVector/Vtf0/Bin/IA32/ResetVector.ia32.serial.raw new file mode 100644 index 0000000000..6503a988ab Binary files /dev/null and b/UefiCpuPkg/ResetVector/Vtf0/Bin/IA32/ResetVector.ia32.serial.raw differ diff --git a/UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector.ia32.port80.raw b/UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector.ia32.port80.raw deleted file mode 100644 index 2c6ff655de..0000000000 Binary files a/UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector.ia32.port80.raw and /dev/null differ diff --git a/UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector.ia32.raw b/UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector.ia32.raw deleted file mode 100644 index e34780a3a2..0000000000 Binary files a/UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector.ia32.raw and /dev/null differ diff --git a/UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector.ia32.serial.raw b/UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector.ia32.serial.raw deleted file mode 100644 index 6dfa68eabb..0000000000 Binary files a/UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector.ia32.serial.raw and /dev/null differ diff --git a/UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector.inf b/UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector.inf index 8fc9564ebb..47ac07798b 100644 --- a/UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector.inf +++ b/UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector.inf @@ -22,10 +22,10 @@ # [Binaries.Ia32] - RAW|ResetVector.ia32.raw|* + RAW|IA32/ResetVector.ia32.raw|* [Binaries.X64] - RAW|ResetVector.x64.raw|* + RAW|X64/PageTable2M/ResetVector.x64.raw|* [UserExtensions.TianoCore."ExtraFiles"] ResetVectorExtra.uni diff --git a/UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector1G.inf b/UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector1G.inf new file mode 100644 index 0000000000..75705cd344 --- /dev/null +++ b/UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector1G.inf @@ -0,0 +1,31 @@ +## @file +# Reset Vector binary +# +# Copyright (c) 2021, Intel Corporation. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = ResetVector + MODULE_UNI_FILE = ResetVector.uni + FILE_GUID = 1BA0062E-C779-4582-8566-336AE8F78F09 + MODULE_TYPE = SEC + VERSION_STRING = 1.1 + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Binaries.Ia32] + RAW|IA32/ResetVector.ia32.raw|* + +[Binaries.X64] + RAW|X64/PageTable1G/ResetVector.x64.raw|* + +[UserExtensions.TianoCore."ExtraFiles"] + ResetVectorExtra.uni diff --git a/UefiCpuPkg/ResetVector/Vtf0/Bin/X64/PageTable1G/ResetVector.x64.port80.raw b/UefiCpuPkg/ResetVector/Vtf0/Bin/X64/PageTable1G/ResetVector.x64.port80.raw new file mode 100644 index 0000000000..279ba03b0c Binary files /dev/null and b/UefiCpuPkg/ResetVector/Vtf0/Bin/X64/PageTable1G/ResetVector.x64.port80.raw differ diff --git a/UefiCpuPkg/ResetVector/Vtf0/Bin/X64/PageTable1G/ResetVector.x64.raw b/UefiCpuPkg/ResetVector/Vtf0/Bin/X64/PageTable1G/ResetVector.x64.raw new file mode 100644 index 0000000000..9b09a80f22 Binary files /dev/null and b/UefiCpuPkg/ResetVector/Vtf0/Bin/X64/PageTable1G/ResetVector.x64.raw differ diff --git a/UefiCpuPkg/ResetVector/Vtf0/Bin/X64/PageTable1G/ResetVector.x64.serial.raw b/UefiCpuPkg/ResetVector/Vtf0/Bin/X64/PageTable1G/ResetVector.x64.serial.raw new file mode 100644 index 0000000000..d9b051ff06 Binary files /dev/null and b/UefiCpuPkg/ResetVector/Vtf0/Bin/X64/PageTable1G/ResetVector.x64.serial.raw differ diff --git a/UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector.x64.port80.raw b/UefiCpuPkg/ResetVector/Vtf0/Bin/X64/PageTable2M/ResetVector.x64.port80.raw similarity index 56% rename from UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector.x64.port80.raw rename to UefiCpuPkg/ResetVector/Vtf0/Bin/X64/PageTable2M/ResetVector.x64.port80.raw index 6c0bcc47eb..0e53a574fa 100644 Binary files a/UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector.x64.port80.raw and b/UefiCpuPkg/ResetVector/Vtf0/Bin/X64/PageTable2M/ResetVector.x64.port80.raw differ diff --git a/UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector.x64.raw b/UefiCpuPkg/ResetVector/Vtf0/Bin/X64/PageTable2M/ResetVector.x64.raw similarity index 56% rename from UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector.x64.raw rename to UefiCpuPkg/ResetVector/Vtf0/Bin/X64/PageTable2M/ResetVector.x64.raw index a78d5b407c..865846da42 100644 Binary files a/UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector.x64.raw and b/UefiCpuPkg/ResetVector/Vtf0/Bin/X64/PageTable2M/ResetVector.x64.raw differ diff --git a/UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector.x64.serial.raw b/UefiCpuPkg/ResetVector/Vtf0/Bin/X64/PageTable2M/ResetVector.x64.serial.raw similarity index 56% rename from UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector.x64.serial.raw rename to UefiCpuPkg/ResetVector/Vtf0/Bin/X64/PageTable2M/ResetVector.x64.serial.raw index 61c71349a8..f1d6536cec 100644 Binary files a/UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector.x64.serial.raw and b/UefiCpuPkg/ResetVector/Vtf0/Bin/X64/PageTable2M/ResetVector.x64.serial.raw differ diff --git a/UefiCpuPkg/ResetVector/Vtf0/Build.py b/UefiCpuPkg/ResetVector/Vtf0/Build.py index b791d32762..3f1d5cd2c8 100644 --- a/UefiCpuPkg/ResetVector/Vtf0/Build.py +++ b/UefiCpuPkg/ResetVector/Vtf0/Build.py @@ -6,45 +6,84 @@ # SPDX-License-Identifier: BSD-2-Clause-Patent # -import glob import os import subprocess import sys +PAGE_TABLE_2M = 'PageTable2M' +PAGE_TABLE_1G = 'PageTable1G' +FILE_FORMAT = '.raw' +ALL_RAW_FORMAT = '*' + FILE_FORMAT +IA32 = 'IA32' +X64 = 'X64' + +# Pre-Define a Macros for Page Table +PAGE_TABLES = { + PAGE_TABLE_2M : "PAGE_TABLE_2M", + PAGE_TABLE_1G : "PAGE_TABLE_1G" +} + def RunCommand(commandLine): - #print ' '.join(commandLine) return subprocess.call(commandLine) -for filename in glob.glob(os.path.join('Bin', '*.raw')): - os.remove(filename) +# Check for all raw binaries and delete them +for root, dirs, files in os.walk('Bin'): + for file in files: + if file.endswith(FILE_FORMAT): + os.remove(os.path.join(root, file)) for arch in ('ia32', 'x64'): for debugType in (None, 'port80', 'serial'): - output = os.path.join('Bin', 'ResetVector') - output += '.' + arch - if debugType is not None: - output += '.' + debugType - output += '.raw' - commandLine = ( - 'nasm', - '-D', 'ARCH_%s' % arch.upper(), - '-D', 'DEBUG_%s' % str(debugType).upper(), - '-o', output, - 'Vtf0.nasmb', - ) - print(f"Command : {' '.join(commandLine)}") - ret = RunCommand(commandLine) - if ret != 0: - print(f"something went wrong while executing {commandLine[-1]}") - sys.exit() - print('\tASM\t' + output) + for pageTable in PAGE_TABLES.keys(): + ret = True + if arch.lower() == X64.lower(): + directory = os.path.join('Bin', X64, pageTable) + else: + directory = os.path.join('Bin', IA32) - commandLine = ( - 'python', - 'Tools/FixupForRawSection.py', - output, - ) - print('\tFIXUP\t' + output) - ret = RunCommand(commandLine) - if ret != 0: sys.exit(ret) + # output raw binary name with arch type + fileName = 'ResetVector' + '.' + arch + + if debugType is not None: + fileName += '.' + debugType + fileName += FILE_FORMAT + + output = os.path.join(directory, fileName) + + # if the directory not exists then create it + if not os.path.isdir(directory): + os.makedirs(directory) + + # Prepare the command to execute the nasmb + commandLine = ( + 'nasm', + '-D', 'ARCH_%s' % arch.upper(), + '-D', 'DEBUG_%s' % str(debugType).upper(), + '-D', PAGE_TABLES[pageTable].upper(), + '-o', output, + 'Vtf0.nasmb', + ) + + print(f"Command : {' '.join(commandLine)}") + + try: + ret = RunCommand(commandLine) + except FileNotFoundError: + print("NASM not found") + except: + pass + + if ret != 0: + print(f"something went wrong while executing {commandLine[-1]}") + sys.exit() + print('\tASM\t' + output) + + commandLine = ( + 'python', + 'Tools/FixupForRawSection.py', + output, + ) + print('\tFIXUP\t' + output) + ret = RunCommand(commandLine) + if ret != 0: sys.exit(ret) diff --git a/UefiCpuPkg/ResetVector/Vtf0/PageTables.inc b/UefiCpuPkg/ResetVector/Vtf0/PageTables.inc new file mode 100644 index 0000000000..31958ae878 --- /dev/null +++ b/UefiCpuPkg/ResetVector/Vtf0/PageTables.inc @@ -0,0 +1,20 @@ +;------------------------------------------------------------------------------ +; @file +; Definitions of Page Table Entry for the reset vector module +; +; Copyright (c) 2021, Intel Corporation. All rights reserved.
+; SPDX-License-Identifier: BSD-2-Clause-Patent +; +;------------------------------------------------------------------------------ + +%define PAGE_PRESENT 0x01 +%define PAGE_READ_WRITE 0x02 +%define PAGE_USER_SUPERVISOR 0x04 +%define PAGE_WRITE_THROUGH 0x08 +%define PAGE_CACHE_DISABLE 0x010 +%define PAGE_ACCESSED 0x020 +%define PAGE_DIRTY 0x040 +%define PAGE_SIZE 0x080 +%define PAGE_GLOBAL 0x0100 +%define PAGE_2M_PAT 0x01000 + diff --git a/UefiCpuPkg/ResetVector/Vtf0/ReadMe.txt b/UefiCpuPkg/ResetVector/Vtf0/ReadMe.txt index e6e5b54243..97f4600968 100644 --- a/UefiCpuPkg/ResetVector/Vtf0/ReadMe.txt +++ b/UefiCpuPkg/ResetVector/Vtf0/ReadMe.txt @@ -29,7 +29,7 @@ EBP/RBP - Pointer to the start of the Boot Firmware Volume === HOW TO BUILD VTF0 === Dependencies: -* Python 2.5~2.7 +* Python 3 or newer * Nasm 2.03 or newer To rebuild the VTF0 binaries: diff --git a/UefiCpuPkg/ResetVector/Vtf0/Vtf0.nasmb b/UefiCpuPkg/ResetVector/Vtf0/Vtf0.nasmb index 493738c79c..bdea1fb875 100644 --- a/UefiCpuPkg/ResetVector/Vtf0/Vtf0.nasmb +++ b/UefiCpuPkg/ResetVector/Vtf0/Vtf0.nasmb @@ -35,8 +35,14 @@ %include "PostCodes.inc" +%include "PageTables.inc" + %ifdef ARCH_X64 -%include "X64/PageTables.asm" + %ifdef PAGE_TABLE_1G + %include "X64/PageTables1G.asm" + %else + %include "X64/PageTables2M.asm" + %endif %endif %ifdef DEBUG_PORT80 diff --git a/UefiCpuPkg/ResetVector/Vtf0/X64/PageTables1G.asm b/UefiCpuPkg/ResetVector/Vtf0/X64/PageTables1G.asm new file mode 100644 index 0000000000..19bd3d5a92 --- /dev/null +++ b/UefiCpuPkg/ResetVector/Vtf0/X64/PageTables1G.asm @@ -0,0 +1,53 @@ +;------------------------------------------------------------------------------ +; @file +; Emits Page Tables for 1:1 mapping of the addresses 0 - 0x8000000000 (512GB) +; +; Copyright (c) 2021, Intel Corporation. All rights reserved.
+; SPDX-License-Identifier: BSD-2-Clause-Patent +; Linear-Address Translation to a 1-GByte Page +; +;------------------------------------------------------------------------------ + +BITS 64 + +%define ALIGN_TOP_TO_4K_FOR_PAGING + +%define PAGE_PDP_ATTR (PAGE_ACCESSED + \ + PAGE_READ_WRITE + \ + PAGE_PRESENT) + +%define PAGE_PDP_1G_ATTR (PAGE_ACCESSED + \ + PAGE_READ_WRITE + \ + PAGE_DIRTY + \ + PAGE_PRESENT + \ + PAGE_SIZE) + +%define PGTBLS_OFFSET(x) ((x) - TopLevelPageDirectory) +%define PGTBLS_ADDR(x) (ADDR_OF(TopLevelPageDirectory) + (x)) + +%define PDP(offset) (ADDR_OF(TopLevelPageDirectory) + (offset) + \ + PAGE_PDP_ATTR) + +%define PDP_1G(x) ((x << 30) + PAGE_PDP_1G_ATTR) + +ALIGN 16 + +TopLevelPageDirectory: + + ; + ; Top level Page Directory Pointers (1 * 512GB entry) + ; + DQ PDP(0x1000) + + TIMES 0x1000-PGTBLS_OFFSET($) DB 0 + ; + ; Next level Page Directory Pointers (512 * 1GB entries => 512GB) + ; +%assign i 0 +%rep 512 + DQ PDP_1G(i) + %assign i i+1 +%endrep + TIMES 0x2000-PGTBLS_OFFSET($) DB 0 + +EndOfPageTables: diff --git a/UefiCpuPkg/ResetVector/Vtf0/X64/PageTables.asm b/UefiCpuPkg/ResetVector/Vtf0/X64/PageTables2M.asm similarity index 74% rename from UefiCpuPkg/ResetVector/Vtf0/X64/PageTables.asm rename to UefiCpuPkg/ResetVector/Vtf0/X64/PageTables2M.asm index 5bc3093f90..b97df384ac 100644 --- a/UefiCpuPkg/ResetVector/Vtf0/X64/PageTables.asm +++ b/UefiCpuPkg/ResetVector/Vtf0/X64/PageTables2M.asm @@ -11,19 +11,7 @@ BITS 64 %define ALIGN_TOP_TO_4K_FOR_PAGING -%define PAGE_PRESENT 0x01 -%define PAGE_READ_WRITE 0x02 -%define PAGE_USER_SUPERVISOR 0x04 -%define PAGE_WRITE_THROUGH 0x08 -%define PAGE_CACHE_DISABLE 0x010 -%define PAGE_ACCESSED 0x020 -%define PAGE_DIRTY 0x040 -%define PAGE_PAT 0x080 -%define PAGE_GLOBAL 0x0100 -%define PAGE_2M_MBO 0x080 -%define PAGE_2M_PAT 0x01000 - -%define PAGE_2M_PDE_ATTR (PAGE_2M_MBO + \ +%define PAGE_2M_PDE_ATTR (PAGE_SIZE + \ PAGE_ACCESSED + \ PAGE_DIRTY + \ PAGE_READ_WRITE + \ diff --git a/UefiCpuPkg/UefiCpuPkg.ci.yaml b/UefiCpuPkg/UefiCpuPkg.ci.yaml index e32facd76e..6e0ab95fd8 100644 --- a/UefiCpuPkg/UefiCpuPkg.ci.yaml +++ b/UefiCpuPkg/UefiCpuPkg.ci.yaml @@ -48,7 +48,8 @@ "DscPath": "UefiCpuPkg.dsc", "IgnoreInf": [ "UefiCpuPkg/ResetVector/FixupVtf/Vtf.inf", - "UefiCpuPkg/ResetVector/Vtf0/Vtf0.inf" + "UefiCpuPkg/ResetVector/Vtf0/Vtf0.inf", + "UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector1G.inf" ] }, "HostUnitTestDscCompleteCheck": {