mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-22 21:24:35 +02:00
UefiCpuPkg: VTF0 Linear-Address Translation to a 1-GByte Page till 512GB
REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3473 X64 Reset Vector Code can access the memory range till 4GB using the Linear-Address Translation to a 2-MByte Page, when user wants to use more than 4G using 2M Page it will leads to use more number of Page table entries. using the 1-GByte Page table user can use more than 4G Memory by reducing the page table entries using 1-GByte Page, this patch attached can access memory range till 512GByte via Linear- Address Translation to a 1-GByte Page. Build Tool: if the nasm is not found it will throw Build errors like FileNotFoundError: [WinError 2]The system cannot find the file specified run the command wil try except block to get meaningful error message Test Result: Tested in both Simulation environment and Hardware both works fine without any issues. Reviewed-by: Ray Ni <ray.ni@intel.com> Cc: Rahul Kumar <rahul1.kumar@intel.com> Cc: Debkumar De <debkumar.de@intel.com> Cc: Harry Han <harry.han@intel.com> Cc: Catharine West <catharine.west@intel.com> Cc: Sangeetha V <sangeetha.v@intel.com> Cc: Rangasai V Chaganty <rangasai.v.chaganty@intel.com> Cc: Sahil Dureja <sahil.dureja@intel.com> Signed-off-by: Ashraf Ali S <ashraf.ali.s@intel.com>
This commit is contained in:
parent
89f7ed8b29
commit
60d8bb9f28
BIN
UefiCpuPkg/ResetVector/Vtf0/Bin/IA32/ResetVector.ia32.port80.raw
Normal file
BIN
UefiCpuPkg/ResetVector/Vtf0/Bin/IA32/ResetVector.ia32.port80.raw
Normal file
Binary file not shown.
BIN
UefiCpuPkg/ResetVector/Vtf0/Bin/IA32/ResetVector.ia32.raw
Normal file
BIN
UefiCpuPkg/ResetVector/Vtf0/Bin/IA32/ResetVector.ia32.raw
Normal file
Binary file not shown.
BIN
UefiCpuPkg/ResetVector/Vtf0/Bin/IA32/ResetVector.ia32.serial.raw
Normal file
BIN
UefiCpuPkg/ResetVector/Vtf0/Bin/IA32/ResetVector.ia32.serial.raw
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -22,10 +22,10 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
[Binaries.Ia32]
|
[Binaries.Ia32]
|
||||||
RAW|ResetVector.ia32.raw|*
|
RAW|IA32/ResetVector.ia32.raw|*
|
||||||
|
|
||||||
[Binaries.X64]
|
[Binaries.X64]
|
||||||
RAW|ResetVector.x64.raw|*
|
RAW|X64/PageTable2M/ResetVector.x64.raw|*
|
||||||
|
|
||||||
[UserExtensions.TianoCore."ExtraFiles"]
|
[UserExtensions.TianoCore."ExtraFiles"]
|
||||||
ResetVectorExtra.uni
|
ResetVectorExtra.uni
|
||||||
|
31
UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector1G.inf
Normal file
31
UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector1G.inf
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
## @file
|
||||||
|
# Reset Vector binary
|
||||||
|
#
|
||||||
|
# Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
|
||||||
|
#
|
||||||
|
# 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
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -6,45 +6,84 @@
|
|||||||
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
#
|
#
|
||||||
|
|
||||||
import glob
|
|
||||||
import os
|
import os
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
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):
|
def RunCommand(commandLine):
|
||||||
#print ' '.join(commandLine)
|
|
||||||
return subprocess.call(commandLine)
|
return subprocess.call(commandLine)
|
||||||
|
|
||||||
for filename in glob.glob(os.path.join('Bin', '*.raw')):
|
# Check for all raw binaries and delete them
|
||||||
os.remove(filename)
|
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 arch in ('ia32', 'x64'):
|
||||||
for debugType in (None, 'port80', 'serial'):
|
for debugType in (None, 'port80', 'serial'):
|
||||||
output = os.path.join('Bin', 'ResetVector')
|
for pageTable in PAGE_TABLES.keys():
|
||||||
output += '.' + arch
|
ret = True
|
||||||
if debugType is not None:
|
if arch.lower() == X64.lower():
|
||||||
output += '.' + debugType
|
directory = os.path.join('Bin', X64, pageTable)
|
||||||
output += '.raw'
|
else:
|
||||||
commandLine = (
|
directory = os.path.join('Bin', IA32)
|
||||||
'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)
|
|
||||||
|
|
||||||
commandLine = (
|
# output raw binary name with arch type
|
||||||
'python',
|
fileName = 'ResetVector' + '.' + arch
|
||||||
'Tools/FixupForRawSection.py',
|
|
||||||
output,
|
if debugType is not None:
|
||||||
)
|
fileName += '.' + debugType
|
||||||
print('\tFIXUP\t' + output)
|
fileName += FILE_FORMAT
|
||||||
ret = RunCommand(commandLine)
|
|
||||||
if ret != 0: sys.exit(ret)
|
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)
|
||||||
|
|
||||||
|
20
UefiCpuPkg/ResetVector/Vtf0/PageTables.inc
Normal file
20
UefiCpuPkg/ResetVector/Vtf0/PageTables.inc
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
;------------------------------------------------------------------------------
|
||||||
|
; @file
|
||||||
|
; Definitions of Page Table Entry for the reset vector module
|
||||||
|
;
|
||||||
|
; Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
|
||||||
|
; 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
|
||||||
|
|
@ -29,7 +29,7 @@ EBP/RBP - Pointer to the start of the Boot Firmware Volume
|
|||||||
=== HOW TO BUILD VTF0 ===
|
=== HOW TO BUILD VTF0 ===
|
||||||
|
|
||||||
Dependencies:
|
Dependencies:
|
||||||
* Python 2.5~2.7
|
* Python 3 or newer
|
||||||
* Nasm 2.03 or newer
|
* Nasm 2.03 or newer
|
||||||
|
|
||||||
To rebuild the VTF0 binaries:
|
To rebuild the VTF0 binaries:
|
||||||
|
@ -35,8 +35,14 @@
|
|||||||
|
|
||||||
%include "PostCodes.inc"
|
%include "PostCodes.inc"
|
||||||
|
|
||||||
|
%include "PageTables.inc"
|
||||||
|
|
||||||
%ifdef ARCH_X64
|
%ifdef ARCH_X64
|
||||||
%include "X64/PageTables.asm"
|
%ifdef PAGE_TABLE_1G
|
||||||
|
%include "X64/PageTables1G.asm"
|
||||||
|
%else
|
||||||
|
%include "X64/PageTables2M.asm"
|
||||||
|
%endif
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
%ifdef DEBUG_PORT80
|
%ifdef DEBUG_PORT80
|
||||||
|
53
UefiCpuPkg/ResetVector/Vtf0/X64/PageTables1G.asm
Normal file
53
UefiCpuPkg/ResetVector/Vtf0/X64/PageTables1G.asm
Normal file
@ -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.<BR>
|
||||||
|
; 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:
|
@ -11,19 +11,7 @@ BITS 64
|
|||||||
|
|
||||||
%define ALIGN_TOP_TO_4K_FOR_PAGING
|
%define ALIGN_TOP_TO_4K_FOR_PAGING
|
||||||
|
|
||||||
%define PAGE_PRESENT 0x01
|
%define PAGE_2M_PDE_ATTR (PAGE_SIZE + \
|
||||||
%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 + \
|
|
||||||
PAGE_ACCESSED + \
|
PAGE_ACCESSED + \
|
||||||
PAGE_DIRTY + \
|
PAGE_DIRTY + \
|
||||||
PAGE_READ_WRITE + \
|
PAGE_READ_WRITE + \
|
@ -48,7 +48,8 @@
|
|||||||
"DscPath": "UefiCpuPkg.dsc",
|
"DscPath": "UefiCpuPkg.dsc",
|
||||||
"IgnoreInf": [
|
"IgnoreInf": [
|
||||||
"UefiCpuPkg/ResetVector/FixupVtf/Vtf.inf",
|
"UefiCpuPkg/ResetVector/FixupVtf/Vtf.inf",
|
||||||
"UefiCpuPkg/ResetVector/Vtf0/Vtf0.inf"
|
"UefiCpuPkg/ResetVector/Vtf0/Vtf0.inf",
|
||||||
|
"UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector1G.inf"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"HostUnitTestDscCompleteCheck": {
|
"HostUnitTestDscCompleteCheck": {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user