Compare commits
100 Commits
edk2-stabl
...
system76
Author | SHA1 | Date | |
---|---|---|---|
|
9ca522ba15 | ||
|
3005ff4237 | ||
|
d3bcf7e60e | ||
|
85f3fc6654 | ||
|
88f5720e16 | ||
|
27585e73da | ||
|
42a443d5cd | ||
|
c466cc2ca5 | ||
|
5c49aca613 | ||
|
99891bd41e | ||
|
3485d55709 | ||
|
c1a7127e01 | ||
|
2f21eddfb8 | ||
|
860c29c923 | ||
|
8cfead2839 | ||
|
30f6b2f3c7 | ||
|
4de32568fa | ||
|
ff91020528 | ||
|
943773983d | ||
|
e91ea5561d | ||
|
5e86b202de | ||
|
b764882195 | ||
|
a2abc5e15f | ||
|
a618e43977 | ||
|
bbc04972bc | ||
|
61a7f360d9 | ||
|
fc1c47ccad | ||
|
fec64b04eb | ||
|
05aa27ef23 | ||
|
06cc698885 | ||
|
cb870a1ce9 | ||
|
90e04a7e31 | ||
|
1d01d2a9a7 | ||
|
70e9b22f5c | ||
|
e9d6369050 | ||
|
58d6aae969 | ||
|
4e0fcaba18 | ||
|
2d04a62512 | ||
|
8a0955dfa8 | ||
|
06f4583ea5 | ||
|
9daa69a59e | ||
|
9030464a1b | ||
|
bcfe7a54aa | ||
|
600c565eb2 | ||
|
aae506ce44 | ||
|
bf2ca74bb6 | ||
|
654e5958cd | ||
|
9657bbe08f | ||
|
10cbbe06d3 | ||
|
802391f1fe | ||
|
db04386fd9 | ||
|
7d5abcd016 | ||
|
d296a36cc4 | ||
|
bdb15bf9ba | ||
|
25af751320 | ||
|
7f99fae217 | ||
|
c134065066 | ||
|
eec38fd383 | ||
|
b9564773f1 | ||
|
8c767bb014 | ||
|
7386ad5ae3 | ||
|
e727453a97 | ||
|
553bda4d8e | ||
|
3e7febc83c | ||
|
b664a5352c | ||
|
b376a7d60f | ||
|
3fb944f925 | ||
|
1d70aa7a9b | ||
|
0bef9ccd43 | ||
|
d3b38ea28a | ||
|
69ae47ba5d | ||
|
95c492569f | ||
|
d996a4bc9f | ||
|
9f528fb4c0 | ||
|
bbab5b95b4 | ||
|
5e84cc0714 | ||
|
2af54dd5bd | ||
|
00283317d8 | ||
|
232f661f99 | ||
|
552ca5cc88 | ||
|
94e7cfc7e7 | ||
|
de7030ed26 | ||
|
587653cd8b | ||
|
e167ed1a3d | ||
|
003534f8f0 | ||
|
a363907bc9 | ||
|
530cc53f96 | ||
|
112268c70d | ||
|
726280b214 | ||
|
b1ab82d4c8 | ||
|
2e16857f3d | ||
|
308f9a49b0 | ||
|
7ab09015b1 | ||
|
d1c0828262 | ||
|
b4dd94c217 | ||
|
f428f538b6 | ||
|
75b91c0b9f | ||
|
9f1dd0acb1 | ||
|
6db1a5555a | ||
|
72f8b9d80b |
@@ -27,7 +27,7 @@ steps:
|
||||
|
||||
- task: UsePythonVersion@0
|
||||
inputs:
|
||||
versionSpec: '3.8.x'
|
||||
versionSpec: '3.7.x'
|
||||
architecture: 'x64'
|
||||
|
||||
- script: |
|
||||
|
@@ -16,5 +16,5 @@ jobs:
|
||||
- template: templates/pr-gate-build-job.yml
|
||||
parameters:
|
||||
tool_chain_tag: 'VS2019'
|
||||
vm_image: 'windows-2019'
|
||||
vm_image: 'windows-latest'
|
||||
arch_list: "IA32,X64"
|
||||
|
@@ -17,7 +17,7 @@ parameters:
|
||||
jobs:
|
||||
|
||||
- job: Build_${{ parameters.tool_chain_tag }}
|
||||
timeoutInMinutes: 120
|
||||
|
||||
#Use matrix to speed up the build process
|
||||
strategy:
|
||||
matrix:
|
||||
@@ -35,10 +35,10 @@ jobs:
|
||||
Build.Targets: 'RELEASE,NO-TARGET'
|
||||
TARGET_NETWORK:
|
||||
Build.Pkgs: 'NetworkPkg,RedfishPkg'
|
||||
Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT'
|
||||
Build.Targets: 'DEBUG,RELEASE,NO-TARGET'
|
||||
TARGET_OTHER:
|
||||
Build.Pkgs: 'PcAtChipsetPkg,PrmPkg,ShellPkg,StandaloneMmPkg'
|
||||
Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT'
|
||||
Build.Pkgs: 'PcAtChipsetPkg,ShellPkg,StandaloneMmPkg'
|
||||
Build.Targets: 'DEBUG,RELEASE,NO-TARGET'
|
||||
TARGET_FMP_FAT_TEST:
|
||||
Build.Pkgs: 'FmpDevicePkg,FatPkg,UnitTestFrameworkPkg,DynamicTablesPkg'
|
||||
Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT'
|
||||
@@ -47,15 +47,12 @@ jobs:
|
||||
Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT'
|
||||
TARGET_SECURITY:
|
||||
Build.Pkgs: 'SecurityPkg'
|
||||
Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT'
|
||||
TARGET_UEFIPAYLOAD:
|
||||
Build.Pkgs: 'UefiPayloadPkg'
|
||||
Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT'
|
||||
Build.Targets: 'DEBUG,RELEASE,NO-TARGET'
|
||||
TARGET_PLATFORMS:
|
||||
# For Platforms only check code. Leave it to Platform CI
|
||||
# to build them.
|
||||
Build.Pkgs: 'ArmVirtPkg,EmulatorPkg,OvmfPkg'
|
||||
Build.Targets: 'NO-TARGET,NOOPT'
|
||||
Build.Targets: 'NO-TARGET'
|
||||
|
||||
workspace:
|
||||
clean: all
|
||||
|
@@ -65,11 +65,9 @@ class Settings(CiBuildSettingsManager, UpdateSettingsManager, SetupSettingsManag
|
||||
"StandaloneMmPkg",
|
||||
"FatPkg",
|
||||
"CryptoPkg",
|
||||
"PrmPkg",
|
||||
"UnitTestFrameworkPkg",
|
||||
"OvmfPkg",
|
||||
"RedfishPkg",
|
||||
"UefiPayloadPkg"
|
||||
"RedfishPkg"
|
||||
)
|
||||
|
||||
def GetArchitecturesSupported(self):
|
||||
|
@@ -69,7 +69,7 @@ class CharEncodingCheck(ICiBuildPlugin):
|
||||
overall_status = 0
|
||||
files_tested = 0
|
||||
|
||||
abs_pkg_path = Edk2pathObj.GetAbsolutePathOnThisSystemFromEdk2RelativePath(packagename)
|
||||
abs_pkg_path = Edk2pathObj.GetAbsolutePathOnThisSytemFromEdk2RelativePath(packagename)
|
||||
|
||||
if abs_pkg_path is None:
|
||||
tc.SetSkipped()
|
||||
@@ -90,7 +90,7 @@ class CharEncodingCheck(ICiBuildPlugin):
|
||||
tc.LogStdError("CharEncodingCheck.IgnoreInf -> {0} not found in filesystem. Invalid ignore file".format(a))
|
||||
logging.info("CharEncodingCheck.IgnoreInf -> {0} not found in filesystem. Invalid ignore file".format(a))
|
||||
|
||||
files = [Edk2pathObj.GetAbsolutePathOnThisSystemFromEdk2RelativePath(x) for x in files]
|
||||
files = [Edk2pathObj.GetAbsolutePathOnThisSytemFromEdk2RelativePath(x) for x in files]
|
||||
for a in files:
|
||||
files_tested += 1
|
||||
if(self.TestEncodingOk(a, enc)):
|
||||
|
@@ -61,7 +61,7 @@ class CompilerPlugin(ICiBuildPlugin):
|
||||
tc.LogStdError("DscPath not found in config file. Nothing to compile.")
|
||||
return -1
|
||||
|
||||
AP = Edk2pathObj.GetAbsolutePathOnThisSystemFromEdk2RelativePath(packagename)
|
||||
AP = Edk2pathObj.GetAbsolutePathOnThisSytemFromEdk2RelativePath(packagename)
|
||||
|
||||
APDSC = os.path.join(AP, pkgconfig["DscPath"].strip())
|
||||
AP_Path = Edk2pathObj.GetEdk2RelativePathFromAbsolutePath(APDSC)
|
||||
|
@@ -55,7 +55,7 @@ class DependencyCheck(ICiBuildPlugin):
|
||||
overall_status = 0
|
||||
|
||||
# Get current platform
|
||||
abs_pkg_path = Edk2pathObj.GetAbsolutePathOnThisSystemFromEdk2RelativePath(packagename)
|
||||
abs_pkg_path = Edk2pathObj.GetAbsolutePathOnThisSytemFromEdk2RelativePath(packagename)
|
||||
|
||||
# Get INF Files
|
||||
INFFiles = self.WalkDirectoryForExtension([".inf"], abs_pkg_path)
|
||||
|
@@ -58,7 +58,7 @@ class DscCompleteCheck(ICiBuildPlugin):
|
||||
"DscPath not found in config file. Nothing to check.")
|
||||
return -1
|
||||
|
||||
abs_pkg_path = Edk2pathObj.GetAbsolutePathOnThisSystemFromEdk2RelativePath(
|
||||
abs_pkg_path = Edk2pathObj.GetAbsolutePathOnThisSytemFromEdk2RelativePath(
|
||||
packagename)
|
||||
abs_dsc_path = os.path.join(abs_pkg_path, pkgconfig["DscPath"].strip())
|
||||
wsr_dsc_path = Edk2pathObj.GetEdk2RelativePathFromAbsolutePath(
|
||||
|
@@ -30,6 +30,7 @@ class EccCheck(ICiBuildPlugin):
|
||||
},
|
||||
"""
|
||||
|
||||
ReModifyFile = re.compile(r'[B-Q,S-Z]+[\d]*\t(.*)')
|
||||
FindModifyFile = re.compile(r'\+\+\+ b\/(.*)')
|
||||
LineScopePattern = (r'@@ -\d*\,*\d* \+\d*\,*\d* @@.*')
|
||||
LineNumRange = re.compile(r'@@ -\d*\,*\d* \+(\d*)\,*(\d*) @@.*')
|
||||
@@ -68,174 +69,77 @@ class EccCheck(ICiBuildPlugin):
|
||||
env.set_shell_var('WORKSPACE', workspace_path)
|
||||
env.set_shell_var('PACKAGES_PATH', os.pathsep.join(Edk2pathObj.PackagePathList))
|
||||
self.ECC_PASS = True
|
||||
|
||||
# Create temp directory
|
||||
temp_path = os.path.join(workspace_path, 'Build', '.pytool', 'Plugin', 'EccCheck')
|
||||
try:
|
||||
# Delete temp directory
|
||||
if os.path.exists(temp_path):
|
||||
shutil.rmtree(temp_path)
|
||||
# Copy package being scanned to temp_path
|
||||
shutil.copytree (
|
||||
os.path.join(workspace_path, packagename),
|
||||
os.path.join(temp_path, packagename),
|
||||
symlinks=True
|
||||
)
|
||||
# Copy exception.xml to temp_path
|
||||
shutil.copyfile (
|
||||
os.path.join(basetools_path, "Source", "Python", "Ecc", "exception.xml"),
|
||||
os.path.join(temp_path, "exception.xml")
|
||||
)
|
||||
# Output file to use for git diff operations
|
||||
temp_diff_output = os.path.join (temp_path, 'diff.txt')
|
||||
|
||||
self.ApplyConfig(pkgconfig, temp_path, packagename)
|
||||
modify_dir_list = self.GetModifyDir(packagename, temp_diff_output)
|
||||
patch = self.GetDiff(packagename, temp_diff_output)
|
||||
ecc_diff_range = self.GetDiffRange(patch, packagename, temp_path)
|
||||
#
|
||||
# Use temp_path as working directory when running ECC tool
|
||||
#
|
||||
self.GenerateEccReport(modify_dir_list, ecc_diff_range, temp_path, basetools_path)
|
||||
ecc_log = os.path.join(temp_path, "Ecc.log")
|
||||
self.ApplyConfig(pkgconfig, workspace_path, basetools_path, packagename)
|
||||
modify_dir_list = self.GetModifyDir(packagename)
|
||||
patch = self.GetDiff(packagename)
|
||||
ecc_diff_range = self.GetDiffRange(patch, packagename, workspace_path)
|
||||
self.GenerateEccReport(modify_dir_list, ecc_diff_range, workspace_path, basetools_path)
|
||||
ecc_log = os.path.join(workspace_path, "Ecc.log")
|
||||
self.RevertCode()
|
||||
if self.ECC_PASS:
|
||||
# Delete temp directory
|
||||
if os.path.exists(temp_path):
|
||||
shutil.rmtree(temp_path)
|
||||
tc.SetSuccess()
|
||||
self.RemoveFile(ecc_log)
|
||||
return 0
|
||||
else:
|
||||
with open(ecc_log, encoding='utf8') as output:
|
||||
ecc_output = output.readlines()
|
||||
for line in ecc_output:
|
||||
logging.error(line.strip())
|
||||
# Delete temp directory
|
||||
if os.path.exists(temp_path):
|
||||
shutil.rmtree(temp_path)
|
||||
tc.SetFailed("EccCheck failed for {0}".format(packagename), "CHECK FAILED")
|
||||
return 1
|
||||
except KeyboardInterrupt:
|
||||
# If EccCheck is interrupted by keybard interrupt, then return failure
|
||||
# Delete temp directory
|
||||
if os.path.exists(temp_path):
|
||||
shutil.rmtree(temp_path)
|
||||
tc.SetFailed("EccCheck interrupted for {0}".format(packagename), "CHECK FAILED")
|
||||
return 1
|
||||
else:
|
||||
# If EccCheck fails for any other exception type, raise the exception
|
||||
# Delete temp directory
|
||||
if os.path.exists(temp_path):
|
||||
shutil.rmtree(temp_path)
|
||||
tc.SetFailed("EccCheck exception for {0}".format(packagename), "CHECK FAILED")
|
||||
raise
|
||||
self.RemoveFile(ecc_log)
|
||||
tc.SetFailed("EccCheck failed for {0}".format(packagename), "Ecc detected issues")
|
||||
return 1
|
||||
|
||||
def GetDiff(self, pkg: str, temp_diff_output: str) -> List[str]:
|
||||
patch = []
|
||||
#
|
||||
# Generate unified diff between origin/master and HEAD.
|
||||
#
|
||||
params = "diff --output={} --unified=0 origin/master HEAD".format(temp_diff_output)
|
||||
RunCmd("git", params)
|
||||
with open(temp_diff_output) as file:
|
||||
patch = file.read().strip().split('\n')
|
||||
def RevertCode(self) -> None:
|
||||
submoudle_params = "submodule update --init"
|
||||
RunCmd("git", submoudle_params)
|
||||
reset_params = "reset HEAD --hard"
|
||||
RunCmd("git", reset_params)
|
||||
|
||||
def GetDiff(self, pkg: str) -> List[str]:
|
||||
return_buffer = StringIO()
|
||||
params = "diff --unified=0 origin/master HEAD"
|
||||
RunCmd("git", params, outstream=return_buffer)
|
||||
p = return_buffer.getvalue().strip()
|
||||
patch = p.split("\n")
|
||||
return_buffer.close()
|
||||
|
||||
return patch
|
||||
|
||||
def GetModifyDir(self, pkg: str, temp_diff_output: str) -> List[str]:
|
||||
#
|
||||
# Generate diff between origin/master and HEAD using --diff-filter to
|
||||
# exclude deleted and renamed files that do not need to be scanned by
|
||||
# ECC. Also use --name-status to only generate the names of the files
|
||||
# with differences. The output format of this git diff command is a
|
||||
# list of files with the change status and the filename. The filename
|
||||
# is always at the end of the line. Examples:
|
||||
#
|
||||
# M MdeModulePkg/Application/CapsuleApp/CapsuleApp.h
|
||||
# M MdeModulePkg/Application/UiApp/FrontPage.h
|
||||
#
|
||||
params = "diff --output={} --diff-filter=dr --name-status origin/master HEAD".format(temp_diff_output)
|
||||
RunCmd("git", params)
|
||||
dir_list = []
|
||||
with open(temp_diff_output) as file:
|
||||
dir_list = file.read().strip().split('\n')
|
||||
def RemoveFile(self, file: str) -> None:
|
||||
if os.path.exists(file):
|
||||
os.remove(file)
|
||||
return
|
||||
|
||||
def GetModifyDir(self, pkg: str) -> List[str]:
|
||||
return_buffer = StringIO()
|
||||
params = "diff --name-status" + ' HEAD' + ' origin/master'
|
||||
RunCmd("git", params, outstream=return_buffer)
|
||||
p1 = return_buffer.getvalue().strip()
|
||||
dir_list = p1.split("\n")
|
||||
return_buffer.close()
|
||||
modify_dir_list = []
|
||||
for modify_dir in dir_list:
|
||||
#
|
||||
# Parse file name from the end of the line
|
||||
#
|
||||
file_path = modify_dir.strip().split()
|
||||
#
|
||||
# Skip lines that do not have at least 2 elements (status and file name)
|
||||
#
|
||||
if len(file_path) < 2:
|
||||
file_path = self.ReModifyFile.findall(modify_dir)
|
||||
if file_path:
|
||||
file_dir = os.path.dirname(file_path[0])
|
||||
else:
|
||||
continue
|
||||
#
|
||||
# Parse the directory name from the file name
|
||||
#
|
||||
file_dir = os.path.dirname(file_path[-1])
|
||||
#
|
||||
# Skip directory names that do not start with the package being scanned.
|
||||
#
|
||||
if file_dir.split('/')[0] != pkg:
|
||||
if pkg in file_dir and file_dir != pkg:
|
||||
modify_dir_list.append('%s' % file_dir)
|
||||
else:
|
||||
continue
|
||||
#
|
||||
# Skip directory names that are identical to the package being scanned.
|
||||
# The assumption here is that there are no source files at the package
|
||||
# root. Instead, the only expected files in the package root are
|
||||
# EDK II meta data files (DEC, DSC, FDF).
|
||||
#
|
||||
if file_dir == pkg:
|
||||
continue
|
||||
#
|
||||
# Skip directory names that are already in the modified dir list
|
||||
#
|
||||
if file_dir in modify_dir_list:
|
||||
continue
|
||||
#
|
||||
# Add the candidate directory to scan to the modified dir list
|
||||
#
|
||||
modify_dir_list.append(file_dir)
|
||||
|
||||
#
|
||||
# Remove duplicates from modify_dir_list
|
||||
# Given a folder path, ECC performs a recursive scan of that folder.
|
||||
# If a parent and child folder are both present in modify_dir_list,
|
||||
# then ECC will perform redudanct scans of source files. In order
|
||||
# to prevent redundant scans, if a parent and child folder are both
|
||||
# present, then remove all the child folders.
|
||||
#
|
||||
# For example, if modified_dir_list contains the following elements:
|
||||
# MdeModulePkg/Core/Dxe
|
||||
# MdeModulePkg/Core/Dxe/Hand
|
||||
# MdeModulePkg/Core/Dxe/Mem
|
||||
#
|
||||
# Then MdeModulePkg/Core/Dxe/Hand and MdeModulePkg/Core/Dxe/Mem should
|
||||
# be removed because the files in those folders are covered by a scan
|
||||
# of MdeModulePkg/Core/Dxe.
|
||||
#
|
||||
filtered_list = []
|
||||
for dir1 in modify_dir_list:
|
||||
Append = True
|
||||
for dir2 in modify_dir_list:
|
||||
if dir1 == dir2:
|
||||
continue
|
||||
common = os.path.commonpath([dir1, dir2])
|
||||
if os.path.normpath(common) == os.path.normpath(dir2):
|
||||
Append = False
|
||||
break
|
||||
if Append and dir1 not in filtered_list:
|
||||
filtered_list.append(dir1)
|
||||
return filtered_list
|
||||
modify_dir_list = list(set(modify_dir_list))
|
||||
return modify_dir_list
|
||||
|
||||
def GetDiffRange(self, patch_diff: List[str], pkg: str, temp_path: str) -> Dict[str, List[Tuple[int, int]]]:
|
||||
def GetDiffRange(self, patch_diff: List[str], pkg: str, workingdir: str) -> Dict[str, List[Tuple[int, int]]]:
|
||||
IsDelete = True
|
||||
StartCheck = False
|
||||
range_directory: Dict[str, List[Tuple[int, int]]] = {}
|
||||
for line in patch_diff:
|
||||
modify_file = self.FindModifyFile.findall(line)
|
||||
if modify_file and pkg in modify_file[0] and not StartCheck and os.path.isfile(modify_file[0]):
|
||||
modify_file_comment_dic = self.GetCommentRange(modify_file[0], temp_path)
|
||||
modify_file_comment_dic = self.GetCommentRange(modify_file[0], workingdir)
|
||||
IsDelete = False
|
||||
StartCheck = True
|
||||
modify_file_dic = modify_file[0]
|
||||
@@ -254,13 +158,11 @@ class EccCheck(ICiBuildPlugin):
|
||||
range_directory[modify_file_dic].append(i)
|
||||
return range_directory
|
||||
|
||||
def GetCommentRange(self, modify_file: str, temp_path: str) -> List[Tuple[int, int]]:
|
||||
comment_range: List[Tuple[int, int]] = []
|
||||
modify_file_path = os.path.join(temp_path, modify_file)
|
||||
if not os.path.exists (modify_file_path):
|
||||
return comment_range
|
||||
def GetCommentRange(self, modify_file: str, workingdir: str) -> List[Tuple[int, int]]:
|
||||
modify_file_path = os.path.join(workingdir, modify_file)
|
||||
with open(modify_file_path) as f:
|
||||
line_no = 1
|
||||
comment_range: List[Tuple[int, int]] = []
|
||||
Start = False
|
||||
for line in f:
|
||||
if line.startswith('/**'):
|
||||
@@ -277,33 +179,35 @@ class EccCheck(ICiBuildPlugin):
|
||||
return comment_range
|
||||
|
||||
def GenerateEccReport(self, modify_dir_list: List[str], ecc_diff_range: Dict[str, List[Tuple[int, int]]],
|
||||
temp_path: str, basetools_path: str) -> None:
|
||||
workspace_path: str, basetools_path: str) -> None:
|
||||
ecc_need = False
|
||||
ecc_run = True
|
||||
config = os.path.normpath(os.path.join(basetools_path, "Source", "Python", "Ecc", "config.ini"))
|
||||
exception = os.path.normpath(os.path.join(temp_path, "exception.xml"))
|
||||
report = os.path.normpath(os.path.join(temp_path, "Ecc.csv"))
|
||||
config = os.path.join(basetools_path, "Source", "Python", "Ecc", "config.ini")
|
||||
exception = os.path.join(basetools_path, "Source", "Python", "Ecc", "exception.xml")
|
||||
report = os.path.join(workspace_path, "Ecc.csv")
|
||||
for modify_dir in modify_dir_list:
|
||||
target = os.path.normpath(os.path.join(temp_path, modify_dir))
|
||||
target = os.path.join(workspace_path, modify_dir)
|
||||
logging.info('Run ECC tool for the commit in %s' % modify_dir)
|
||||
ecc_need = True
|
||||
ecc_params = "-c {0} -e {1} -t {2} -r {3}".format(config, exception, target, report)
|
||||
return_code = RunCmd("Ecc", ecc_params, workingdir=temp_path)
|
||||
return_code = RunCmd("Ecc", ecc_params, workingdir=workspace_path)
|
||||
if return_code != 0:
|
||||
ecc_run = False
|
||||
break
|
||||
if not ecc_run:
|
||||
logging.error('Fail to run ECC tool')
|
||||
self.ParseEccReport(ecc_diff_range, temp_path)
|
||||
self.ParseEccReport(ecc_diff_range, workspace_path)
|
||||
|
||||
if not ecc_need:
|
||||
logging.info("Doesn't need run ECC check")
|
||||
|
||||
revert_params = "checkout -- {}".format(exception)
|
||||
RunCmd("git", revert_params)
|
||||
return
|
||||
|
||||
def ParseEccReport(self, ecc_diff_range: Dict[str, List[Tuple[int, int]]], temp_path: str) -> None:
|
||||
ecc_log = os.path.join(temp_path, "Ecc.log")
|
||||
ecc_csv = os.path.join(temp_path, "Ecc.csv")
|
||||
def ParseEccReport(self, ecc_diff_range: Dict[str, List[Tuple[int, int]]], workspace_path: str) -> None:
|
||||
ecc_log = os.path.join(workspace_path, "Ecc.log")
|
||||
ecc_csv = os.path.join(workspace_path, "Ecc.csv")
|
||||
row_lines = []
|
||||
ignore_error_code = self.GetIgnoreErrorCode()
|
||||
if os.path.exists(ecc_csv):
|
||||
@@ -332,16 +236,16 @@ class EccCheck(ICiBuildPlugin):
|
||||
log.writelines(all_line)
|
||||
return
|
||||
|
||||
def ApplyConfig(self, pkgconfig: Dict[str, List[str]], temp_path: str, pkg: str) -> None:
|
||||
def ApplyConfig(self, pkgconfig: Dict[str, List[str]], workspace_path: str, basetools_path: str, pkg: str) -> None:
|
||||
if "IgnoreFiles" in pkgconfig:
|
||||
for a in pkgconfig["IgnoreFiles"]:
|
||||
a = os.path.join(temp_path, pkg, a)
|
||||
a = os.path.join(workspace_path, pkg, a)
|
||||
a = a.replace(os.sep, "/")
|
||||
|
||||
logging.info("Ignoring Files {0}".format(a))
|
||||
if os.path.exists(a):
|
||||
if os.path.isfile(a):
|
||||
os.remove(a)
|
||||
self.RemoveFile(a)
|
||||
elif os.path.isdir(a):
|
||||
shutil.rmtree(a)
|
||||
else:
|
||||
@@ -349,7 +253,7 @@ class EccCheck(ICiBuildPlugin):
|
||||
|
||||
if "ExceptionList" in pkgconfig:
|
||||
exception_list = pkgconfig["ExceptionList"]
|
||||
exception_xml = os.path.join(temp_path, "exception.xml")
|
||||
exception_xml = os.path.join(basetools_path, "Source", "Python", "Ecc", "exception.xml")
|
||||
try:
|
||||
logging.info("Appending exceptions")
|
||||
self.AppendException(exception_list, exception_xml)
|
||||
|
@@ -116,7 +116,7 @@ class GuidCheck(ICiBuildPlugin):
|
||||
def RunBuildPlugin(self, packagename, Edk2pathObj, pkgconfig, environment, PLM, PLMHelper, tc, output_stream=None):
|
||||
Errors = []
|
||||
|
||||
abs_pkg_path = Edk2pathObj.GetAbsolutePathOnThisSystemFromEdk2RelativePath(
|
||||
abs_pkg_path = Edk2pathObj.GetAbsolutePathOnThisSytemFromEdk2RelativePath(
|
||||
packagename)
|
||||
|
||||
if abs_pkg_path is None:
|
||||
|
@@ -93,7 +93,7 @@ class HostUnitTestCompilerPlugin(ICiBuildPlugin):
|
||||
tc.LogStdError("DscPath not found in config file. Nothing to compile for HostBasedUnitTests.")
|
||||
return -1
|
||||
|
||||
AP = Edk2pathObj.GetAbsolutePathOnThisSystemFromEdk2RelativePath(packagename)
|
||||
AP = Edk2pathObj.GetAbsolutePathOnThisSytemFromEdk2RelativePath(packagename)
|
||||
|
||||
APDSC = os.path.join(AP, pkgconfig["DscPath"].strip())
|
||||
AP_Path = Edk2pathObj.GetEdk2RelativePathFromAbsolutePath(APDSC)
|
||||
|
@@ -61,7 +61,7 @@ class HostUnitTestDscCompleteCheck(ICiBuildPlugin):
|
||||
"DscPath not found in config file. Nothing to check.")
|
||||
return -1
|
||||
|
||||
abs_pkg_path = Edk2pathObj.GetAbsolutePathOnThisSystemFromEdk2RelativePath(
|
||||
abs_pkg_path = Edk2pathObj.GetAbsolutePathOnThisSytemFromEdk2RelativePath(
|
||||
packagename)
|
||||
abs_dsc_path = os.path.join(abs_pkg_path, pkgconfig["DscPath"].strip())
|
||||
wsr_dsc_path = Edk2pathObj.GetEdk2RelativePathFromAbsolutePath(
|
||||
|
@@ -63,7 +63,7 @@ class LibraryClassCheck(ICiBuildPlugin):
|
||||
overall_status = 0
|
||||
LibraryClassIgnore = []
|
||||
|
||||
abs_pkg_path = Edk2pathObj.GetAbsolutePathOnThisSystemFromEdk2RelativePath(packagename)
|
||||
abs_pkg_path = Edk2pathObj.GetAbsolutePathOnThisSytemFromEdk2RelativePath(packagename)
|
||||
abs_dec_path = self.__GetPkgDec(abs_pkg_path)
|
||||
wsr_dec_path = Edk2pathObj.GetEdk2RelativePathFromAbsolutePath(abs_dec_path)
|
||||
|
||||
|
@@ -5,7 +5,6 @@
|
||||
##
|
||||
|
||||
import os
|
||||
import shutil
|
||||
import logging
|
||||
import re
|
||||
from io import StringIO
|
||||
@@ -62,19 +61,12 @@ class LicenseCheck(ICiBuildPlugin):
|
||||
# - Junit Logger
|
||||
# - output_stream the StringIO output stream from this plugin via logging
|
||||
def RunBuildPlugin(self, packagename, Edk2pathObj, pkgconfig, environment, PLM, PLMHelper, tc, output_stream=None):
|
||||
# Create temp directory
|
||||
temp_path = os.path.join(Edk2pathObj.WorkspacePath, 'Build', '.pytool', 'Plugin', 'LicenseCheck')
|
||||
if not os.path.exists(temp_path):
|
||||
os.makedirs(temp_path)
|
||||
# Output file to use for git diff operations
|
||||
temp_diff_output = os.path.join (temp_path, 'diff.txt')
|
||||
params = "diff --output={} --unified=0 origin/master HEAD".format(temp_diff_output)
|
||||
RunCmd("git", params)
|
||||
with open(temp_diff_output) as file:
|
||||
patch = file.read().strip().split("\n")
|
||||
# Delete temp directory
|
||||
if os.path.exists(temp_path):
|
||||
shutil.rmtree(temp_path)
|
||||
return_buffer = StringIO()
|
||||
params = "diff --unified=0 origin/master HEAD"
|
||||
RunCmd("git", params, outstream=return_buffer)
|
||||
p = return_buffer.getvalue().strip()
|
||||
patch = p.split("\n")
|
||||
return_buffer.close()
|
||||
|
||||
ignore_files = []
|
||||
if "IgnoreFiles" in pkgconfig:
|
||||
|
@@ -73,7 +73,7 @@ class SpellCheck(ICiBuildPlugin):
|
||||
def RunBuildPlugin(self, packagename, Edk2pathObj, pkgconfig, environment, PLM, PLMHelper, tc, output_stream=None):
|
||||
Errors = []
|
||||
|
||||
abs_pkg_path = Edk2pathObj.GetAbsolutePathOnThisSystemFromEdk2RelativePath(
|
||||
abs_pkg_path = Edk2pathObj.GetAbsolutePathOnThisSytemFromEdk2RelativePath(
|
||||
packagename)
|
||||
|
||||
if abs_pkg_path is None:
|
||||
|
@@ -1,127 +0,0 @@
|
||||
# UncrustifyCheck Plugin
|
||||
|
||||
This CiBuildPlugin scans all the files in a given package and checks for coding standard compliance issues.
|
||||
|
||||
This plugin is enabled by default. If a package would like to prevent the plugin from reporting errors, it can do
|
||||
so by enabling [`AuditOnly`](#auditonly) mode.
|
||||
|
||||
This plugin requires the directory containing the Uncrustify executable that should be used for this plugin to
|
||||
be specified in an environment variable named `UNCRUSTIFY_CI_PATH`. This unique variable name is used to avoid confusion
|
||||
with other paths to Uncrustify which might not be the expected build for use by this plugin.
|
||||
|
||||
By default, an Uncrustify configuration file named "uncrustify.cfg" located in the same directory as the plugin is
|
||||
used. The value can be overridden to a package-specific path with the `ConfigFilePath` configuration file option.
|
||||
|
||||
* Uncrustify source code and documentation: https://github.com/uncrustify/uncrustify
|
||||
* Project Mu Uncrustify fork source code and documentation: https://dev.azure.com/projectmu/Uncrustify
|
||||
|
||||
## Files Checked in a Package
|
||||
|
||||
By default, this plugin will discover all files in the package with the following default paths:
|
||||
|
||||
```python
|
||||
[
|
||||
# C source
|
||||
"*.c",
|
||||
"*.h"
|
||||
]
|
||||
```
|
||||
|
||||
From this list of files, any files ignored by Git or residing in a Git submodule will be removed. If Git is not
|
||||
found, submodules are not found, or ignored files are not found no changes are made to the list of discovered files.
|
||||
|
||||
To control the paths checked in a given package, review the configuration options described in this file.
|
||||
|
||||
## Configuration
|
||||
|
||||
The plugin can be configured with a few optional configuration options.
|
||||
|
||||
``` yaml
|
||||
"UncrustifyCheck": {
|
||||
"AdditionalIncludePaths": [], # Additional paths to check formatting (wildcards supported).
|
||||
"AuditOnly": False, # Don't fail the build if there are errors. Just log them.
|
||||
"ConfigFilePath": "", # Custom path to an Uncrustify config file.
|
||||
"IgnoreFiles": [], # A list of file patterns to ignore.
|
||||
"IgnoreStandardPaths": [], # Standard Plugin defined paths that should be ignored.
|
||||
"OutputFileDiffs": True, # Output chunks of formatting diffs in the test case log.
|
||||
# This can significantly slow down the plugin on very large packages.
|
||||
"SkipGitExclusions": False # Don't exclude git ignored files and files in git submodules.
|
||||
}
|
||||
```
|
||||
|
||||
### `AdditionalIncludePaths`
|
||||
|
||||
A package configuration file can specify any additional paths to be included with this option.
|
||||
|
||||
At this time, it is recommended all files run against the plugin be written in the C or C++ language.
|
||||
|
||||
### `AuditOnly`
|
||||
|
||||
`Boolean` - Default is `False`.
|
||||
|
||||
If `True`, run the test in an "audit only mode" which will log all errors but instead of failing the build, it will set
|
||||
the test as skipped. This allows visibility into the failures without breaking the build.
|
||||
|
||||
### `ConfigFilePath`
|
||||
|
||||
`String` - Default is `"uncrustify.cfg"`
|
||||
|
||||
When specified in the config file, this is a package relative path to the Uncrustify configuration file.
|
||||
|
||||
### `IgnoreFiles`
|
||||
|
||||
This option supports .gitignore file and folder matching strings including wildcards.
|
||||
|
||||
The files specified by this configuration option will not be processed by Uncrustify.
|
||||
|
||||
### `IgnoreStandardPaths`
|
||||
|
||||
This plugin by default will check the below standard paths. A package configuration file can specify any of these paths
|
||||
to be ignored.
|
||||
|
||||
```python
|
||||
[
|
||||
# C source
|
||||
"*.c",
|
||||
"*.h"
|
||||
]
|
||||
```
|
||||
|
||||
### `OutputFileDiffs`
|
||||
|
||||
`Boolean` - Default is `True`.
|
||||
|
||||
If `True`, output diffs of formatting changes into the test case log. This is helpful to exactly understand what changes
|
||||
need to be made to the source code in order to fix a coding standard compliance issue.
|
||||
|
||||
Note that calculating the file diffs on a very large set of of results (e.g. >100 files) can significantly slow down
|
||||
plugin execution.
|
||||
|
||||
### `SkipGitExclusions`
|
||||
|
||||
`Boolean` - Default is `False`.
|
||||
|
||||
By default, files in paths matched in a .gitignore file or a recognized git submodule are excluded. If this option
|
||||
is `True`, the plugin will not attempt to recognize these files and exclude them.
|
||||
|
||||
## High-Level Plugin Operation
|
||||
|
||||
This plugin generates two main sets of temporary files:
|
||||
|
||||
1. A working directory in the directory `Build/.pytool/Plugin/Uncrustify`
|
||||
2. For each source file with formatting errors, a sibling file with the `.uncrustify_plugin` extension
|
||||
|
||||
The working directory contains temporary files unique to operation of the plugin. All of these files are removed on
|
||||
exit of the plugin including successful or unsuccessful execution (such as a Python exception occurring). If for any
|
||||
reason, any files in the package exist prior to running the plugin with the `.uncrustify_plugin` extension, the plugin
|
||||
will inform the user to remove these files and exit before running Uncrustify. This is to ensure the accuracy of the
|
||||
results reported from each execution instance of the plugin.
|
||||
|
||||
The plugin determines the list of relevant files to check with Uncrustify and then invokes Uncrustify with that file
|
||||
list. For any files not compliant to the configuration file provided, Uncrustify will generate a corresponding file
|
||||
with the `.uncrustify_plugin` extension. The plugin discovers all of these files. If any such files are present, this
|
||||
indicates a formatting issue was found and the test is marked failed (unless `AuditOnly` mode is enabled).
|
||||
|
||||
The test case log will contain a report of which files failed to format properly, allowing the user to run Uncrustify
|
||||
against the file locally to fix the issue. If the `OutputFileDiffs` configuration option is set to `True`, the plugin
|
||||
will output diff chunks for all code formatting issues in the test case log.
|
@@ -1,660 +0,0 @@
|
||||
# @file UncrustifyCheck.py
|
||||
#
|
||||
# An edk2-pytool based plugin wrapper for Uncrustify
|
||||
#
|
||||
# Copyright (c) Microsoft Corporation.
|
||||
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
##
|
||||
import configparser
|
||||
import difflib
|
||||
import errno
|
||||
import logging
|
||||
import os
|
||||
import pathlib
|
||||
import shutil
|
||||
import timeit
|
||||
from edk2toolext.environment import version_aggregator
|
||||
from edk2toolext.environment.plugin_manager import PluginManager
|
||||
from edk2toolext.environment.plugintypes.ci_build_plugin import ICiBuildPlugin
|
||||
from edk2toolext.environment.plugintypes.uefi_helper_plugin import HelperFunctions
|
||||
from edk2toolext.environment.var_dict import VarDict
|
||||
from edk2toollib.gitignore_parser import parse_gitignore_lines
|
||||
from edk2toollib.log.junit_report_format import JunitReportTestCase
|
||||
from edk2toollib.uefi.edk2.path_utilities import Edk2Path
|
||||
from edk2toollib.utility_functions import RunCmd
|
||||
from io import StringIO
|
||||
from typing import Any, Dict, List, Tuple
|
||||
|
||||
#
|
||||
# Provide more user friendly messages for certain scenarios
|
||||
#
|
||||
class UncrustifyException(Exception):
|
||||
def __init__(self, message, exit_code):
|
||||
super().__init__(message)
|
||||
self.exit_code = exit_code
|
||||
|
||||
|
||||
class UncrustifyAppEnvVarNotFoundException(UncrustifyException):
|
||||
def __init__(self, message):
|
||||
super().__init__(message, -101)
|
||||
|
||||
|
||||
class UncrustifyAppVersionErrorException(UncrustifyException):
|
||||
def __init__(self, message):
|
||||
super().__init__(message, -102)
|
||||
|
||||
|
||||
class UncrustifyAppExecutionException(UncrustifyException):
|
||||
def __init__(self, message):
|
||||
super().__init__(message, -103)
|
||||
|
||||
|
||||
class UncrustifyStalePluginFormattedFilesException(UncrustifyException):
|
||||
def __init__(self, message):
|
||||
super().__init__(message, -120)
|
||||
|
||||
|
||||
class UncrustifyInputFileCreationErrorException(UncrustifyException):
|
||||
def __init__(self, message):
|
||||
super().__init__(message, -121)
|
||||
|
||||
class UncrustifyInvalidIgnoreStandardPathsException(UncrustifyException):
|
||||
def __init__(self, message):
|
||||
super().__init__(message, -122)
|
||||
|
||||
class UncrustifyGitIgnoreFileException(UncrustifyException):
|
||||
def __init__(self, message):
|
||||
super().__init__(message, -140)
|
||||
|
||||
|
||||
class UncrustifyGitSubmoduleException(UncrustifyException):
|
||||
def __init__(self, message):
|
||||
super().__init__(message, -141)
|
||||
|
||||
|
||||
class UncrustifyCheck(ICiBuildPlugin):
|
||||
"""
|
||||
A CiBuildPlugin that uses Uncrustify to check the source files in the
|
||||
package being tested for coding standard issues.
|
||||
|
||||
By default, the plugin runs against standard C source file extensions but
|
||||
its configuration can be modified through its configuration file.
|
||||
|
||||
Configuration options:
|
||||
"UncrustifyCheck": {
|
||||
"AdditionalIncludePaths": [], # Additional paths to check formatting (wildcards supported).
|
||||
"AuditOnly": False, # Don't fail the build if there are errors. Just log them.
|
||||
"ConfigFilePath": "", # Custom path to an Uncrustify config file.
|
||||
"IgnoreStandardPaths": [], # Standard Plugin defined paths that should be ignored.
|
||||
"OutputFileDiffs": False, # Output chunks of formatting diffs in the test case log.
|
||||
# This can significantly slow down the plugin on very large packages.
|
||||
"SkipGitExclusions": False # Don't exclude git ignored files and files in git submodules.
|
||||
}
|
||||
"""
|
||||
|
||||
#
|
||||
# By default, use an "uncrustify.cfg" config file in the plugin directory
|
||||
# A package can override this path via "ConfigFilePath"
|
||||
#
|
||||
# Note: Values specified via "ConfigFilePath" are relative to the package
|
||||
#
|
||||
DEFAULT_CONFIG_FILE_PATH = os.path.join(
|
||||
pathlib.Path(__file__).parent.resolve(), "uncrustify.cfg")
|
||||
|
||||
#
|
||||
# The extension used for formatted files produced by this plugin
|
||||
#
|
||||
FORMATTED_FILE_EXTENSION = ".uncrustify_plugin"
|
||||
|
||||
#
|
||||
# A package can add any additional paths with "AdditionalIncludePaths"
|
||||
# A package can remove any of these paths with "IgnoreStandardPaths"
|
||||
#
|
||||
STANDARD_PLUGIN_DEFINED_PATHS = ("*.c", "*.h")
|
||||
|
||||
#
|
||||
# The Uncrustify application path should set in this environment variable
|
||||
#
|
||||
UNCRUSTIFY_PATH_ENV_KEY = "UNCRUSTIFY_CI_PATH"
|
||||
|
||||
def GetTestName(self, packagename: str, environment: VarDict) -> Tuple:
|
||||
""" Provide the testcase name and classname for use in reporting
|
||||
|
||||
Args:
|
||||
packagename: string containing name of package to build
|
||||
environment: The VarDict for the test to run in
|
||||
Returns:
|
||||
A tuple containing the testcase name and the classname
|
||||
(testcasename, classname)
|
||||
testclassname: a descriptive string for the testcase can include whitespace
|
||||
classname: should be patterned <packagename>.<plugin>.<optionally any unique condition>
|
||||
"""
|
||||
return ("Check file coding standard compliance in " + packagename, packagename + ".UncrustifyCheck")
|
||||
|
||||
def RunBuildPlugin(self, package_rel_path: str, edk2_path: Edk2Path, package_config: Dict[str, List[str]], environment_config: Any, plugin_manager: PluginManager, plugin_manager_helper: HelperFunctions, tc: JunitReportTestCase, output_stream=None) -> int:
|
||||
"""
|
||||
External function of plugin. This function is used to perform the task of the CiBuild Plugin.
|
||||
|
||||
Args:
|
||||
- package_rel_path: edk2 workspace relative path to the package
|
||||
- edk2_path: Edk2Path object with workspace and packages paths
|
||||
- package_config: Dictionary with the package configuration
|
||||
- environment_config: Environment configuration
|
||||
- plugin_manager: Plugin Manager Instance
|
||||
- plugin_manager_helper: Plugin Manager Helper Instance
|
||||
- tc: JUnit test case
|
||||
- output_stream: The StringIO output stream from this plugin (logging)
|
||||
|
||||
Returns
|
||||
>0 : Number of errors found
|
||||
0 : Passed successfully
|
||||
-1 : Skipped for missing prereq
|
||||
"""
|
||||
try:
|
||||
# Initialize plugin and check pre-requisites.
|
||||
self._initialize_environment_info(
|
||||
package_rel_path, edk2_path, package_config, tc)
|
||||
self._initialize_configuration()
|
||||
self._check_for_preexisting_formatted_files()
|
||||
|
||||
# Log important context information.
|
||||
self._log_uncrustify_app_info()
|
||||
|
||||
# Get template file contents if specified
|
||||
self._get_template_file_contents()
|
||||
|
||||
# Create meta input files & directories
|
||||
self._create_temp_working_directory()
|
||||
self._create_uncrustify_file_list_file()
|
||||
|
||||
self._run_uncrustify()
|
||||
|
||||
# Post-execution actions.
|
||||
self._process_uncrustify_results()
|
||||
|
||||
except UncrustifyException as e:
|
||||
self._tc.LogStdError(
|
||||
f"Uncrustify error {e.exit_code}. Details:\n\n{str(e)}")
|
||||
logging.warning(
|
||||
f"Uncrustify error {e.exit_code}. Details:\n\n{str(e)}")
|
||||
return -1
|
||||
else:
|
||||
if self._formatted_file_error_count > 0:
|
||||
if self._audit_only_mode:
|
||||
logging.info(
|
||||
"Setting test as skipped since AuditOnly is enabled")
|
||||
self._tc.SetSkipped()
|
||||
return -1
|
||||
else:
|
||||
self._tc.SetFailed(
|
||||
f"{self._plugin_name} failed due to {self._formatted_file_error_count} incorrectly formatted files.", "CHECK_FAILED")
|
||||
else:
|
||||
self._tc.SetSuccess()
|
||||
return self._formatted_file_error_count
|
||||
finally:
|
||||
self._cleanup_temporary_formatted_files()
|
||||
self._cleanup_temporary_directory()
|
||||
|
||||
def _initialize_configuration(self) -> None:
|
||||
"""
|
||||
Initializes plugin configuration.
|
||||
"""
|
||||
self._initialize_app_info()
|
||||
self._initialize_config_file_info()
|
||||
self._initialize_file_to_format_info()
|
||||
self._initialize_test_case_output_options()
|
||||
|
||||
def _check_for_preexisting_formatted_files(self) -> None:
|
||||
"""
|
||||
Checks if any formatted files from prior execution are present.
|
||||
|
||||
Existence of such files is an unexpected condition. This might result
|
||||
from an error that occurred during a previous run or a premature exit from a debug scenario. In any case, the package should be clean before starting a new run.
|
||||
"""
|
||||
pre_existing_formatted_file_count = len(
|
||||
[str(path.resolve()) for path in pathlib.Path(self._abs_package_path).rglob(f'*{UncrustifyCheck.FORMATTED_FILE_EXTENSION}')])
|
||||
|
||||
if pre_existing_formatted_file_count > 0:
|
||||
raise UncrustifyStalePluginFormattedFilesException(
|
||||
f"{pre_existing_formatted_file_count} formatted files already exist. To prevent overwriting these files, please remove them before running this plugin.")
|
||||
|
||||
def _cleanup_temporary_directory(self) -> None:
|
||||
"""
|
||||
Cleans up the temporary directory used for this execution instance.
|
||||
|
||||
This removes the directory and all files created during this instance.
|
||||
"""
|
||||
if hasattr(self, '_working_dir'):
|
||||
self._remove_tree(self._working_dir)
|
||||
|
||||
def _cleanup_temporary_formatted_files(self) -> None:
|
||||
"""
|
||||
Cleans up the temporary formmatted files produced by Uncrustify.
|
||||
|
||||
This will recursively remove all formatted files generated by Uncrustify
|
||||
during this execution instance.
|
||||
"""
|
||||
if hasattr(self, '_abs_package_path'):
|
||||
formatted_files = [str(path.resolve()) for path in pathlib.Path(
|
||||
self._abs_package_path).rglob(f'*{UncrustifyCheck.FORMATTED_FILE_EXTENSION}')]
|
||||
|
||||
for formatted_file in formatted_files:
|
||||
os.remove(formatted_file)
|
||||
|
||||
def _create_temp_working_directory(self) -> None:
|
||||
"""
|
||||
Creates the temporary directory used for this execution instance.
|
||||
"""
|
||||
self._working_dir = os.path.join(
|
||||
self._abs_workspace_path, "Build", ".pytool", "Plugin", f"{self._plugin_name}")
|
||||
|
||||
try:
|
||||
pathlib.Path(self._working_dir).mkdir(parents=True, exist_ok=True)
|
||||
except OSError as e:
|
||||
raise UncrustifyInputFileCreationErrorException(
|
||||
f"Error creating plugin directory {self._working_dir}.\n\n{repr(e)}.")
|
||||
|
||||
def _create_uncrustify_file_list_file(self) -> None:
|
||||
"""
|
||||
Creates the file with the list of source files for Uncrustify to process.
|
||||
"""
|
||||
self._app_input_file_path = os.path.join(
|
||||
self._working_dir, "uncrustify_file_list.txt")
|
||||
|
||||
with open(self._app_input_file_path, 'w', encoding='utf8') as f:
|
||||
f.writelines(f"\n".join(self._abs_file_paths_to_format))
|
||||
|
||||
def _execute_uncrustify(self) -> None:
|
||||
"""
|
||||
Executes Uncrustify with the initialized configuration.
|
||||
"""
|
||||
output = StringIO()
|
||||
self._app_exit_code = RunCmd(
|
||||
self._app_path,
|
||||
f"-c {self._app_config_file} -F {self._app_input_file_path} --if-changed --suffix {UncrustifyCheck.FORMATTED_FILE_EXTENSION}", outstream=output)
|
||||
self._app_output = output.getvalue().strip().splitlines()
|
||||
|
||||
def _get_files_ignored_in_config(self):
|
||||
""""
|
||||
Returns a function that returns true if a given file string path is ignored in the plugin configuration file and false otherwise.
|
||||
"""
|
||||
ignored_files = []
|
||||
if "IgnoreFiles" in self._package_config:
|
||||
ignored_files = self._package_config["IgnoreFiles"]
|
||||
|
||||
# Pass "Package configuration file" as the source file path since
|
||||
# the actual configuration file name is unknown to this plugin and
|
||||
# this provides a generic description of the file that provided
|
||||
# the ignore file content.
|
||||
#
|
||||
# This information is only used for reporting (not used here) and
|
||||
# the ignore lines are being passed directly as they are given to
|
||||
# this plugin.
|
||||
return parse_gitignore_lines(ignored_files, "Package configuration file", self._abs_workspace_path)
|
||||
|
||||
def _get_git_ignored_paths(self) -> List[str]:
|
||||
""""
|
||||
Returns a list of file absolute path strings to all files ignored in this git repository.
|
||||
|
||||
If git is not found, an empty list will be returned.
|
||||
"""
|
||||
if not shutil.which("git"):
|
||||
logging.warn(
|
||||
"Git is not found on this system. Git submodule paths will not be considered.")
|
||||
return []
|
||||
|
||||
outstream_buffer = StringIO()
|
||||
exit_code = RunCmd("git", "ls-files --other",
|
||||
workingdir=self._abs_workspace_path, outstream=outstream_buffer, logging_level=logging.NOTSET)
|
||||
if (exit_code != 0):
|
||||
raise UncrustifyGitIgnoreFileException(
|
||||
f"An error occurred reading git ignore settings. This will prevent Uncrustify from running against the expected set of files.")
|
||||
|
||||
# Note: This will potentially be a large list, but at least sorted
|
||||
rel_paths = outstream_buffer.getvalue().strip().splitlines()
|
||||
abs_paths = []
|
||||
for path in rel_paths:
|
||||
abs_paths.append(
|
||||
os.path.normpath(os.path.join(self._abs_workspace_path, path)))
|
||||
return abs_paths
|
||||
|
||||
def _get_git_submodule_paths(self) -> List[str]:
|
||||
"""
|
||||
Returns a list of directory absolute path strings to the root of each submodule in the workspace repository.
|
||||
|
||||
If git is not found, an empty list will be returned.
|
||||
"""
|
||||
if not shutil.which("git"):
|
||||
logging.warn(
|
||||
"Git is not found on this system. Git submodule paths will not be considered.")
|
||||
return []
|
||||
|
||||
if os.path.isfile(os.path.join(self._abs_workspace_path, ".gitmodules")):
|
||||
logging.info(
|
||||
f".gitmodules file found. Excluding submodules in {self._package_name}.")
|
||||
|
||||
outstream_buffer = StringIO()
|
||||
exit_code = RunCmd("git", "config --file .gitmodules --get-regexp path", workingdir=self._abs_workspace_path, outstream=outstream_buffer, logging_level=logging.NOTSET)
|
||||
if (exit_code != 0):
|
||||
raise UncrustifyGitSubmoduleException(
|
||||
f".gitmodule file detected but an error occurred reading the file. Cannot proceed with unknown submodule paths.")
|
||||
|
||||
submodule_paths = []
|
||||
for line in outstream_buffer.getvalue().strip().splitlines():
|
||||
submodule_paths.append(
|
||||
os.path.normpath(os.path.join(self._abs_workspace_path, line.split()[1])))
|
||||
|
||||
return submodule_paths
|
||||
else:
|
||||
return []
|
||||
|
||||
def _get_template_file_contents(self) -> None:
|
||||
"""
|
||||
Gets the contents of Uncrustify template files if they are specified
|
||||
in the Uncrustify configuration file.
|
||||
"""
|
||||
|
||||
self._file_template_contents = None
|
||||
self._func_template_contents = None
|
||||
|
||||
# Allow no value to allow "set" statements in the config file which do
|
||||
# not specify value assignment
|
||||
parser = configparser.ConfigParser(allow_no_value=True)
|
||||
with open(self._app_config_file, 'r') as cf:
|
||||
parser.read_string("[dummy_section]\n" + cf.read())
|
||||
|
||||
try:
|
||||
file_template_name = parser["dummy_section"]["cmt_insert_file_header"]
|
||||
|
||||
file_template_path = pathlib.Path(file_template_name)
|
||||
|
||||
if not file_template_path.is_file():
|
||||
file_template_path = pathlib.Path(os.path.join(self._plugin_path, file_template_name))
|
||||
self._file_template_contents = file_template_path.read_text()
|
||||
except KeyError:
|
||||
logging.warn("A file header template is not specified in the config file.")
|
||||
except FileNotFoundError:
|
||||
logging.warn("The specified file header template file was not found.")
|
||||
try:
|
||||
func_template_name = parser["dummy_section"]["cmt_insert_func_header"]
|
||||
|
||||
func_template_path = pathlib.Path(func_template_name)
|
||||
|
||||
if not func_template_path.is_file():
|
||||
func_template_path = pathlib.Path(os.path.join(self._plugin_path, func_template_name))
|
||||
self._func_template_contents = func_template_path.read_text()
|
||||
except KeyError:
|
||||
logging.warn("A function header template is not specified in the config file.")
|
||||
except FileNotFoundError:
|
||||
logging.warn("The specified function header template file was not found.")
|
||||
|
||||
def _initialize_app_info(self) -> None:
|
||||
"""
|
||||
Initialize Uncrustify application information.
|
||||
|
||||
This function will determine the application path and version.
|
||||
"""
|
||||
# Verify Uncrustify is specified in the environment.
|
||||
if UncrustifyCheck.UNCRUSTIFY_PATH_ENV_KEY not in os.environ:
|
||||
raise UncrustifyAppEnvVarNotFoundException(
|
||||
f"Uncrustify environment variable {UncrustifyCheck.UNCRUSTIFY_PATH_ENV_KEY} is not present.")
|
||||
|
||||
self._app_path = shutil.which('uncrustify', path=os.environ[UncrustifyCheck.UNCRUSTIFY_PATH_ENV_KEY])
|
||||
|
||||
if self._app_path is None:
|
||||
raise FileNotFoundError(
|
||||
errno.ENOENT, os.strerror(errno.ENOENT), self._app_path)
|
||||
|
||||
self._app_path = os.path.normcase(os.path.normpath(self._app_path))
|
||||
|
||||
if not os.path.isfile(self._app_path):
|
||||
raise FileNotFoundError(
|
||||
errno.ENOENT, os.strerror(errno.ENOENT), self._app_path)
|
||||
|
||||
# Verify Uncrustify is present at the expected path.
|
||||
return_buffer = StringIO()
|
||||
ret = RunCmd(self._app_path, "--version", outstream=return_buffer)
|
||||
if (ret != 0):
|
||||
raise UncrustifyAppVersionErrorException(
|
||||
f"Error occurred executing --version: {ret}.")
|
||||
|
||||
# Log Uncrustify version information.
|
||||
self._app_version = return_buffer.getvalue().strip()
|
||||
self._tc.LogStdOut(f"Uncrustify version: {self._app_version}")
|
||||
version_aggregator.GetVersionAggregator().ReportVersion(
|
||||
"Uncrustify", self._app_version, version_aggregator.VersionTypes.INFO)
|
||||
|
||||
def _initialize_config_file_info(self) -> None:
|
||||
"""
|
||||
Initialize Uncrustify configuration file info.
|
||||
|
||||
The config file path is relative to the package root.
|
||||
"""
|
||||
self._app_config_file = UncrustifyCheck.DEFAULT_CONFIG_FILE_PATH
|
||||
if "ConfigFilePath" in self._package_config:
|
||||
self._app_config_file = self._package_config["ConfigFilePath"].strip()
|
||||
|
||||
self._app_config_file = os.path.normpath(
|
||||
os.path.join(self._abs_package_path, self._app_config_file))
|
||||
|
||||
if not os.path.isfile(self._app_config_file):
|
||||
raise FileNotFoundError(
|
||||
errno.ENOENT, os.strerror(errno.ENOENT), self._app_config_file)
|
||||
|
||||
def _initialize_environment_info(self, package_rel_path: str, edk2_path: Edk2Path, package_config: Dict[str, List[str]], tc: JunitReportTestCase) -> None:
|
||||
"""
|
||||
Initializes plugin environment information.
|
||||
"""
|
||||
self._abs_package_path = edk2_path.GetAbsolutePathOnThisSystemFromEdk2RelativePath(
|
||||
package_rel_path)
|
||||
self._abs_workspace_path = edk2_path.WorkspacePath
|
||||
self._package_config = package_config
|
||||
self._package_name = os.path.basename(
|
||||
os.path.normpath(package_rel_path))
|
||||
self._plugin_name = self.__class__.__name__
|
||||
self._plugin_path = os.path.dirname(os.path.realpath(__file__))
|
||||
self._rel_package_path = package_rel_path
|
||||
self._tc = tc
|
||||
|
||||
def _initialize_file_to_format_info(self) -> None:
|
||||
"""
|
||||
Forms the list of source files for Uncrustify to process.
|
||||
"""
|
||||
# Create a list of all the package relative file paths in the package to run against Uncrustify.
|
||||
rel_file_paths_to_format = list(
|
||||
UncrustifyCheck.STANDARD_PLUGIN_DEFINED_PATHS)
|
||||
|
||||
# Allow the ci.yaml to remove any of the pre-defined standard paths
|
||||
if "IgnoreStandardPaths" in self._package_config:
|
||||
for a in self._package_config["IgnoreStandardPaths"]:
|
||||
if a.strip() in rel_file_paths_to_format:
|
||||
self._tc.LogStdOut(
|
||||
f"Ignoring standard path due to ci.yaml ignore: {a}")
|
||||
rel_file_paths_to_format.remove(a.strip())
|
||||
else:
|
||||
raise UncrustifyInvalidIgnoreStandardPathsException(f"Invalid IgnoreStandardPaths value: {a}")
|
||||
|
||||
# Allow the ci.yaml to specify additional include paths for this package
|
||||
if "AdditionalIncludePaths" in self._package_config:
|
||||
rel_file_paths_to_format.extend(
|
||||
self._package_config["AdditionalIncludePaths"])
|
||||
|
||||
self._abs_file_paths_to_format = []
|
||||
for path in rel_file_paths_to_format:
|
||||
self._abs_file_paths_to_format.extend(
|
||||
[str(path.resolve()) for path in pathlib.Path(self._abs_package_path).rglob(path)])
|
||||
|
||||
# Remove files ignore in the plugin configuration file
|
||||
plugin_ignored_files = list(filter(self._get_files_ignored_in_config(), self._abs_file_paths_to_format))
|
||||
|
||||
if plugin_ignored_files:
|
||||
logging.info(
|
||||
f"{self._package_name} file count before plugin ignore file exclusion: {len(self._abs_file_paths_to_format)}")
|
||||
for path in plugin_ignored_files:
|
||||
if path in self._abs_file_paths_to_format:
|
||||
logging.info(f" File ignored in plugin config file: {path}")
|
||||
self._abs_file_paths_to_format.remove(path)
|
||||
logging.info(
|
||||
f"{self._package_name} file count after plugin ignore file exclusion: {len(self._abs_file_paths_to_format)}")
|
||||
|
||||
if not "SkipGitExclusions" in self._package_config or not self._package_config["SkipGitExclusions"]:
|
||||
# Remove files ignored by git
|
||||
logging.info(
|
||||
f"{self._package_name} file count before git ignore file exclusion: {len(self._abs_file_paths_to_format)}")
|
||||
|
||||
ignored_paths = self._get_git_ignored_paths()
|
||||
self._abs_file_paths_to_format = list(
|
||||
set(self._abs_file_paths_to_format).difference(ignored_paths))
|
||||
|
||||
logging.info(
|
||||
f"{self._package_name} file count after git ignore file exclusion: {len(self._abs_file_paths_to_format)}")
|
||||
|
||||
# Remove files in submodules
|
||||
logging.info(
|
||||
f"{self._package_name} file count before submodule exclusion: {len(self._abs_file_paths_to_format)}")
|
||||
|
||||
submodule_paths = tuple(self._get_git_submodule_paths())
|
||||
for path in submodule_paths:
|
||||
logging.info(f" submodule path: {path}")
|
||||
|
||||
self._abs_file_paths_to_format = [
|
||||
f for f in self._abs_file_paths_to_format if not f.startswith(submodule_paths)]
|
||||
|
||||
logging.info(
|
||||
f"{self._package_name} file count after submodule exclusion: {len(self._abs_file_paths_to_format)}")
|
||||
|
||||
# Sort the files for more consistent results
|
||||
self._abs_file_paths_to_format.sort()
|
||||
|
||||
def _initialize_test_case_output_options(self) -> None:
|
||||
"""
|
||||
Initializes options that influence test case output.
|
||||
"""
|
||||
self._audit_only_mode = False
|
||||
self._output_file_diffs = True
|
||||
|
||||
if "AuditOnly" in self._package_config and self._package_config["AuditOnly"]:
|
||||
self._audit_only_mode = True
|
||||
|
||||
if "OutputFileDiffs" in self._package_config and not self._package_config["OutputFileDiffs"]:
|
||||
self._output_file_diffs = False
|
||||
|
||||
def _log_uncrustify_app_info(self) -> None:
|
||||
"""
|
||||
Logs Uncrustify application information.
|
||||
"""
|
||||
self._tc.LogStdOut(f"Found Uncrustify at {self._app_path}")
|
||||
self._tc.LogStdOut(f"Uncrustify version: {self._app_version}")
|
||||
self._tc.LogStdOut('\n')
|
||||
logging.info(f"Found Uncrustify at {self._app_path}")
|
||||
logging.info(f"Uncrustify version: {self._app_version}")
|
||||
logging.info('\n')
|
||||
|
||||
def _process_uncrustify_results(self) -> None:
|
||||
"""
|
||||
Process the results from Uncrustify.
|
||||
|
||||
Determines whether formatting errors are present and logs failures.
|
||||
"""
|
||||
formatted_files = [str(path.resolve()) for path in pathlib.Path(
|
||||
self._abs_package_path).rglob(f'*{UncrustifyCheck.FORMATTED_FILE_EXTENSION}')]
|
||||
|
||||
self._formatted_file_error_count = len(formatted_files)
|
||||
|
||||
if self._formatted_file_error_count > 0:
|
||||
logging.error(
|
||||
"Visit the following instructions to learn "
|
||||
"how to find the detailed formatting errors in Azure "
|
||||
"DevOps CI: "
|
||||
"https://github.com/tianocore/tianocore.github.io/wiki/EDK-II-Code-Formatting#how-to-find-uncrustify-formatting-errors-in-continuous-integration-ci")
|
||||
self._tc.LogStdError("Files with formatting errors:\n")
|
||||
|
||||
if self._output_file_diffs:
|
||||
logging.info("Calculating file diffs. This might take a while...")
|
||||
|
||||
for formatted_file in formatted_files:
|
||||
pre_formatted_file = formatted_file[:-
|
||||
len(UncrustifyCheck.FORMATTED_FILE_EXTENSION)]
|
||||
logging.error(pre_formatted_file)
|
||||
|
||||
if (self._output_file_diffs or
|
||||
self._file_template_contents is not None or
|
||||
self._func_template_contents is not None):
|
||||
self._tc.LogStdError(
|
||||
f"Formatting errors in {os.path.relpath(pre_formatted_file, self._abs_package_path)}\n")
|
||||
|
||||
with open(formatted_file) as ff:
|
||||
formatted_file_text = ff.read()
|
||||
|
||||
if (self._file_template_contents is not None and
|
||||
self._file_template_contents in formatted_file_text):
|
||||
self._tc.LogStdError(f"File header is missing in {os.path.relpath(pre_formatted_file, self._abs_package_path)}\n")
|
||||
|
||||
if (self._func_template_contents is not None and
|
||||
self._func_template_contents in formatted_file_text):
|
||||
self._tc.LogStdError(f"A function header is missing in {os.path.relpath(pre_formatted_file, self._abs_package_path)}\n")
|
||||
|
||||
if self._output_file_diffs:
|
||||
with open(pre_formatted_file) as pf:
|
||||
pre_formatted_file_text = pf.read()
|
||||
|
||||
for line in difflib.unified_diff(pre_formatted_file_text.split('\n'), formatted_file_text.split('\n'), fromfile=pre_formatted_file, tofile=formatted_file, n=3):
|
||||
self._tc.LogStdError(line)
|
||||
|
||||
self._tc.LogStdError('\n')
|
||||
else:
|
||||
self._tc.LogStdError(pre_formatted_file)
|
||||
|
||||
def _remove_tree(self, dir_path: str, ignore_errors: bool = False) -> None:
|
||||
"""
|
||||
Helper for removing a directory. Over time there have been
|
||||
many private implementations of this due to reliability issues in the
|
||||
shutil implementations. To consolidate on a single function this helper is added.
|
||||
|
||||
On error try to change file attributes. Also add retry logic.
|
||||
|
||||
This function is temporarily borrowed from edk2toollib.utility_functions
|
||||
since the version used in edk2 is not recent enough to include the
|
||||
function.
|
||||
|
||||
This function should be replaced by "RemoveTree" when it is available.
|
||||
|
||||
Args:
|
||||
- dir_path: Path to directory to remove.
|
||||
- ignore_errors: Whether to ignore errors during removal
|
||||
"""
|
||||
|
||||
def _remove_readonly(func, path, _):
|
||||
"""
|
||||
Private function to attempt to change permissions on file/folder being deleted.
|
||||
"""
|
||||
os.chmod(path, os.stat.S_IWRITE)
|
||||
func(path)
|
||||
|
||||
for _ in range(3): # retry up to 3 times
|
||||
try:
|
||||
shutil.rmtree(dir_path, ignore_errors=ignore_errors, onerror=_remove_readonly)
|
||||
except OSError as err:
|
||||
logging.warning(f"Failed to fully remove {dir_path}: {err}")
|
||||
else:
|
||||
break
|
||||
else:
|
||||
raise RuntimeError(f"Failed to remove {dir_path}")
|
||||
|
||||
def _run_uncrustify(self) -> None:
|
||||
"""
|
||||
Runs Uncrustify for this instance of plugin execution.
|
||||
"""
|
||||
logging.info("Executing Uncrustify. This might take a while...")
|
||||
start_time = timeit.default_timer()
|
||||
self._execute_uncrustify()
|
||||
end_time = timeit.default_timer() - start_time
|
||||
|
||||
execution_summary = f"Uncrustify executed against {len(self._abs_file_paths_to_format)} files in {self._package_name} in {end_time:.2f} seconds.\n"
|
||||
|
||||
self._tc.LogStdOut(execution_summary)
|
||||
logging.info(execution_summary)
|
||||
|
||||
if self._app_exit_code != 0 and self._app_exit_code != 1:
|
||||
raise UncrustifyAppExecutionException(
|
||||
f"Error {str(self._app_exit_code)} returned from Uncrustify:\n\n{str(self._app_output)}")
|
@@ -1,9 +0,0 @@
|
||||
/** @file
|
||||
Brief description of the file's purpose.
|
||||
|
||||
Detailed description of the file's contents and other useful
|
||||
information for a person viewing the file for the first time.
|
||||
|
||||
<<Copyright>>
|
||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
**/
|
@@ -1,15 +0,0 @@
|
||||
/**
|
||||
Brief description of this function's purpose.
|
||||
|
||||
Follow it immediately with the detailed description.
|
||||
|
||||
@param[in] Arg1 Description of Arg1.
|
||||
@param[in] Arg2 Description of Arg2 This is complicated and requires
|
||||
multiple lines to describe.
|
||||
@param[out] Arg3 Description of Arg3.
|
||||
@param[in, out] Arg4 Description of Arg4.
|
||||
|
||||
@retval VAL_ONE Description of what VAL_ONE signifies.
|
||||
@retval OTHER This is the only other return value. If there were other
|
||||
return values, they would be listed.
|
||||
**/
|
@@ -1,462 +0,0 @@
|
||||
## @file
|
||||
# Uncrustify Configuration File for EDK II C Code
|
||||
#
|
||||
# Coding Standard: https://edk2-docs.gitbook.io/edk-ii-c-coding-standards-specification/
|
||||
#
|
||||
# This configuration file is meant to be a "best attempt" to align with the
|
||||
# definitions in the EDK II C Coding Standards Specification.
|
||||
#
|
||||
# Copyright (c) Microsoft Corporation.
|
||||
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
##
|
||||
|
||||
# Force UTF-8 encoding (no UTF-16)
|
||||
enable_digraphs = false
|
||||
utf8_byte = false
|
||||
utf8_force = true
|
||||
|
||||
# Code width / line splitting
|
||||
#code_width =120 # TODO: This causes non-deterministic behaviour in some cases when code wraps
|
||||
ls_code_width =false
|
||||
ls_for_split_full =true
|
||||
ls_func_split_full =true
|
||||
pos_comma =trail
|
||||
|
||||
# 5.1.7 All files must end with CRLF
|
||||
newlines = crlf
|
||||
|
||||
# 5.1.2 Do not use tab characters
|
||||
|
||||
cmt_convert_tab_to_spaces = true # Whether to convert all tabs to spaces in comments. If false, tabs in
|
||||
# comments are left alone, unless used for indenting.
|
||||
indent_columns = 2 # Number of spaces for indentation
|
||||
indent_with_tabs = 0 # Do not use TAB characters
|
||||
string_replace_tab_chars = true # Replace TAB with SPACE
|
||||
# Note: This will break .robot files but is needed for edk2 style
|
||||
|
||||
# 5.2.1.1 There shall be only one statement on a line (statement ends with ;)
|
||||
nl_multi_line_cond = true # Add a newline between ')' and '{' if the ')' is on a different line than
|
||||
# the if/for/etc.
|
||||
nl_after_semicolon = true # Whether to add a newline after semicolons, except in 'for' statements.
|
||||
|
||||
# 5.2.1.3 An open brace '{' goes on the same line as the closing parenthesis ')' of simple predicate expressions
|
||||
mod_full_brace_do = add # Add or remove braces on a single-line 'do' statement.
|
||||
mod_full_brace_for = add
|
||||
mod_full_brace_function = add # Add or remove braces on a single-line function definition.
|
||||
mod_full_brace_if = add # Add or remove braces on a single-line 'if' statement. Braces will not be
|
||||
# removed if the braced statement contains an 'else'.
|
||||
mod_full_brace_if_chain = false
|
||||
mod_full_brace_while = add
|
||||
|
||||
# 5.2.1.4 A close brace '}' always goes at the beginning of the last line of the body
|
||||
eat_blanks_after_open_brace = true
|
||||
eat_blanks_before_close_brace = true # Whether to remove blank lines before '}'.
|
||||
|
||||
# 5.2.2.2 Always put space before and after binary operators.
|
||||
sp_assign = add # Add or remove space around assignment operator '=', '+=', etc.
|
||||
sp_assign_default = add
|
||||
sp_bool = add # Add or remove space around boolean operators '&&' and '||'.
|
||||
sp_compare = add # Add or remove space around compare operator '<', '>', '==', etc.
|
||||
|
||||
# 5.2.2.3 Do not put space between unary operators and their object
|
||||
sp_addr = remove # A or remove space after the '&' (address-of) unary operator.
|
||||
sp_incdec = remove # Add or remove space between '++' and '--' the word to which it is being
|
||||
# applied, as in '(--x)' or 'y++;'.
|
||||
sp_inv = remove # Add or remove space after the '~' (invert) unary operator.
|
||||
sp_not = remove # Add or remove space after the '!' (not) unary operator.
|
||||
sp_sign = remove # Add or remove space after '+' or '-', as in 'x = -5' or 'y = +7'.
|
||||
|
||||
# 5.2.2.4 Subsequent lines of multi-line function calls should line up two spaces from the beginning of the function
|
||||
# name
|
||||
nl_func_call_args_multi_line = true # Whether to add a newline after each ',' in a function call if '(' and ')'
|
||||
# are in different lines.
|
||||
nl_func_call_args_multi_line_ignore_closures = false
|
||||
|
||||
# - Indent each argument 2 spaces from the start of the function name. If a
|
||||
# function is called through a structure or union member, of type
|
||||
# pointer-to-function, then indent each argument 2 spaces from the start of the
|
||||
# member name.
|
||||
indent_func_call_edk2_style = true # Use EDK2 indentation style for function calls (**CUSTOM SETTING**)
|
||||
indent_paren_after_func_call = true # Whether to indent the open parenthesis of a function call, if the
|
||||
# parenthesis is on its own line.
|
||||
|
||||
# - Align the close parenthesis with the start of the last argument
|
||||
indent_paren_close = 0 # How to indent a close parenthesis after a newline.
|
||||
# (0: Body, 1: Openparenthesis, 2: Brace level)
|
||||
|
||||
|
||||
# 5.2.2.5 Always put space after commas or semicolons that separate items
|
||||
sp_after_comma = force # Add or remove space after ',', i.e. 'a,b' vs. 'a, b'.
|
||||
sp_before_comma = remove # Add or remove space before ','.
|
||||
|
||||
# 5.2.2.6 Always put space before an open parenthesis
|
||||
sp_after_sparen = add # Add or remove space after ')' of control statements.
|
||||
sp_attribute_paren = add # Add or remove space between '__attribute__' and '('.
|
||||
sp_before_sparen = force # Add or remove space before '(' of control statements
|
||||
# ('if', 'for', 'switch', 'while', etc.).
|
||||
sp_defined_paren = force # Add or remove space between 'defined' and '(' in '#if defined (FOO)'.
|
||||
sp_func_call_paren = force # Add or remove space between function name and '(' on function calls.
|
||||
sp_func_call_paren_empty = force # Add or remove space between function name and '()' on function calls
|
||||
# without parameters. If set to ignore (the default), sp_func_call_paren is
|
||||
# used.
|
||||
sp_func_def_paren = add # Add or remove space between alias name and '(' of a non-pointer function
|
||||
# type typedef.
|
||||
sp_func_proto_paren = add # Add or remove space between function name and '()' on function declaration
|
||||
sp_sizeof_paren = force # Add or remove space between 'sizeof' and '('.
|
||||
sp_type_func = add # Add or remove space between return type and function name. A minimum of 1
|
||||
# is forced except for pointer return types.
|
||||
|
||||
# Not specified, but also good style to remove spaces inside parentheses (Optional)
|
||||
sp_cparen_oparen = remove # Add or remove space between back-to-back parentheses, i.e. ')(' vs. ') ('.
|
||||
sp_inside_fparen = remove # Add or remove space inside function '(' and ')'.
|
||||
sp_inside_fparens = remove # Add or remove space inside empty function '()'.
|
||||
sp_inside_paren = remove # Add or remove space inside '(' and ')'.
|
||||
sp_inside_paren_cast = remove # Add or remove spaces inside cast parentheses. '(int)x'
|
||||
sp_inside_square = remove # Add or remove space inside a non-empty '[' and ']'.
|
||||
sp_paren_paren = remove # Add or remove space between nested parentheses, i.e. '((' vs. ') )'.
|
||||
sp_square_fparen = remove # Add or remove space between ']' and '(' when part of a function call.
|
||||
|
||||
# 5.2.2.7 Put a space before an open brace if it is not on its own line
|
||||
sp_do_brace_open = force # Add or remove space between 'do' and '{'.
|
||||
sp_paren_brace = force # Add or remove space between ')' and '{'.
|
||||
sp_sparen_brace = force # Add or remove space between ')' and '{' of of control statements.
|
||||
|
||||
# 5.2.2.8 Do not put spaces around structure member and pointer operators
|
||||
sp_after_byref = remove # Add or remove space after reference sign '&', if followed by a word.
|
||||
sp_before_byref = add # Add or remove space before a reference sign '&'.
|
||||
sp_deref = remove # Add or remove space after the '*' (dereference) unary operator. This does
|
||||
# not affect the spacing after a '*' that is part of a type.
|
||||
sp_member = remove # Add or remove space around the '.' or '->' operators.
|
||||
|
||||
# 5.2.2.9 Do not put spaces before open brackets of array subscripts
|
||||
sp_before_square = remove # Add or remove space before '[' (except '[]').
|
||||
sp_before_squares = remove # Add or remove space before '[]'.
|
||||
sp_before_vardef_square = remove # Add or remove space before '[' for a variable definition.
|
||||
|
||||
# 5.2.2.10 Use extra parentheses rather than depending on in-depth knowledge of the order of precedence of C
|
||||
mod_full_paren_if_bool = true # Whether to fully parenthesize Boolean expressions in 'while' and 'if'
|
||||
# statement, as in 'if (a && b > c)' => 'if (a && (b > c))'.
|
||||
|
||||
# 5.2.2.11 Align a continuation line with the part of the line that it continues.
|
||||
use_indent_continue_only_once = true
|
||||
|
||||
# Additional '{}' bracing rules (Optional)
|
||||
# NOTE - The style guide specifies two different styles for braces,
|
||||
# so these are ignored for now to allow developers some flexibility.
|
||||
nl_after_brace_close = true # Whether to add a newline after '}'. Does not apply if followed by a
|
||||
# necessary ';'.
|
||||
nl_brace_else = remove # Add or remove newline between '}' and 'else'.
|
||||
nl_brace_while = remove # Add or remove newline between '}' and 'while' of 'do' statement.
|
||||
nl_do_brace = remove # Add or remove newline between 'do' and '{'.
|
||||
nl_else_brace = remove # Add or remove newline between 'else' and '{'.
|
||||
nl_else_if = remove # Add or remove newline between 'else' and 'if'.
|
||||
nl_elseif_brace = remove # Add or remove newline between 'else if' and '{'.
|
||||
nl_enum_brace = remove # Add or remove newline between 'enum' and '{'.
|
||||
nl_fcall_brace = remove # Add or remove newline between a function call's ')' and '{',
|
||||
# as in 'list_for_each(item, &list) { }'.
|
||||
nl_for_brace = remove # Add or remove newline between 'for' and '{'.
|
||||
nl_if_brace = remove # Add or remove newline between 'if' and '{'.
|
||||
nl_struct_brace = remove # Add or remove newline between 'struct and '{'.
|
||||
nl_switch_brace = remove # Add or remove newline between 'switch' and '{'.
|
||||
nl_union_brace = remove # Add or remove newline between 'union' and '{'.
|
||||
nl_while_brace = remove # Add or remove newline between 'while' and '{'.
|
||||
|
||||
# Additional whitespace rules (Optional)
|
||||
sp_after_ptr_star = remove # Add or remove space after pointer star '*', if followed by a word.
|
||||
# Useful when paired with align_var_def_star_style==2
|
||||
sp_after_ptr_star_func = remove # Add or remove space after a pointer star '*', if followed by a function
|
||||
# prototype or function definition.
|
||||
sp_after_semi = remove # Add or remove space after ';', except when followed by a comment.
|
||||
sp_before_case_colon = remove # Add or remove space before case ':'.
|
||||
sp_before_ptr_star = add # Add or remove space before pointer star '*'.
|
||||
sp_before_ptr_star_func = add # Add or remove space before a pointer star '*', if followed by a function
|
||||
# prototype or function definition.
|
||||
sp_before_semi = remove # Add or remove space before ';'
|
||||
sp_before_semi_for = remove # Add or remove space before ';' in non-empty 'for' statements.
|
||||
sp_before_semi_for_empty = add # Add or remove space before a semicolon of an empty part of a for statement
|
||||
sp_between_ptr_star = remove # Add or remove space between pointer stars '*'. (ie, 'VOID **')
|
||||
sp_brace_close_while = force # Add or remove space between '}' and 'while'.
|
||||
|
||||
sp_after_cast = remove
|
||||
sp_after_type = add
|
||||
sp_balance_nested_parens = false
|
||||
sp_before_nl_cont = add
|
||||
sp_before_square_asm_block = ignore
|
||||
sp_before_unnamed_byref = add
|
||||
sp_brace_brace = ignore
|
||||
sp_brace_else = force
|
||||
sp_brace_typedef = add
|
||||
sp_case_label = force
|
||||
sp_cmt_cpp_doxygen = true
|
||||
sp_cond_colon = add
|
||||
sp_cond_question = add
|
||||
sp_cpp_cast_paren = force
|
||||
sp_else_brace = force
|
||||
sp_endif_cmt = force
|
||||
sp_enum_assign = add
|
||||
sp_inside_braces = force
|
||||
sp_inside_braces_empty = force
|
||||
sp_inside_braces_enum = force
|
||||
sp_inside_braces_struct = force
|
||||
sp_pp_concat = add
|
||||
sp_pp_stringify = add
|
||||
sp_return_paren = add
|
||||
sp_special_semi = force
|
||||
sp_while_paren_open = force
|
||||
|
||||
# Additional Indentation Rules
|
||||
indent_access_spec = 1
|
||||
indent_access_spec_body = false
|
||||
indent_align_assign = true
|
||||
indent_align_string = true
|
||||
indent_bool_paren = true
|
||||
indent_brace_parent = false
|
||||
indent_braces = false
|
||||
indent_braces_no_class = false
|
||||
indent_braces_no_func = true
|
||||
indent_braces_no_struct = false
|
||||
indent_class = false
|
||||
indent_class_colon = false
|
||||
indent_cmt_with_tabs = false # Whether to indent comments that are not at a brace level with tabs on
|
||||
# a tabstop. Requires indent_with_tabs=2. If false, will use spaces.
|
||||
indent_col1_comment = true
|
||||
indent_col1_multi_string_literal= true
|
||||
indent_comma_paren = true
|
||||
indent_else_if = true
|
||||
indent_extern = false
|
||||
indent_first_bool_expr = true
|
||||
|
||||
indent_func_def_param_paren_pos_threshold = 0
|
||||
indent_func_param_double = false
|
||||
indent_func_proto_param = true
|
||||
indent_ignore_asm_block = true
|
||||
indent_label = 1
|
||||
indent_member = 2
|
||||
indent_namespace = false
|
||||
indent_param = 2
|
||||
indent_paren_nl = false
|
||||
indent_paren_open_brace = false
|
||||
indent_preserve_sql = false
|
||||
indent_relative_single_line_comments = false
|
||||
indent_sing_line_comments = 0
|
||||
indent_single_newlines = false
|
||||
indent_square_nl = false
|
||||
indent_switch_case = 2
|
||||
indent_template_param = true
|
||||
indent_var_def_blk = 0
|
||||
indent_var_def_cont = false
|
||||
|
||||
# Tidy-up rules (Optional)
|
||||
mod_move_case_break = true # Whether to move a 'break' that appears after a fully braced 'case'
|
||||
# before the close brace, as in 'case X: { ... } break;' =>
|
||||
# 'case X: { ... break; }'.
|
||||
mod_pawn_semicolon = false
|
||||
mod_remove_empty_return = false # Whether to remove a void 'return;' that appears as the last statement
|
||||
# in a function.
|
||||
mod_remove_extra_semicolon = true
|
||||
mod_sort_import = false
|
||||
mod_sort_include = false
|
||||
mod_sort_using = false
|
||||
nl_after_case = false # Whether to add a newline after a 'case' statement.
|
||||
nl_end_of_file = force # Add or remove newline at the end of the file.
|
||||
nl_end_of_file_min = 1 # The minimum number of newlines at the end of the file
|
||||
nl_max = 2 # The maximum number of consecutive newlines (3 = 2 blank lines).
|
||||
nl_start_of_file = remove # Add or remove newlines at the start of the file.
|
||||
|
||||
# Code alignment rules (Optional)
|
||||
align_asm_colon = false
|
||||
align_assign_span = 1 # The span for aligning on '=' in assignments.
|
||||
align_assign_thresh = 0
|
||||
align_edk2_style = true # Whether to apply edk2-specific alignment formatting
|
||||
align_enum_equ_span = 1 # The span for aligning on '=' in enums.
|
||||
align_func_params = true # Whether to align variable definitions in prototypes and functions.
|
||||
align_func_params_gap = 2
|
||||
align_func_params_span = 2 # The span for aligning parameter definitions in function on parameter name.
|
||||
align_func_params_thresh = 0
|
||||
align_func_proto_span = 0
|
||||
align_keep_tabs = false
|
||||
align_left_shift = false
|
||||
align_mix_var_proto = false
|
||||
align_nl_cont = false
|
||||
align_oc_decl_colon = false
|
||||
align_on_operator = false
|
||||
align_on_tabstop = false
|
||||
align_pp_define_gap = 2
|
||||
align_pp_define_span = 1
|
||||
align_right_cmt_at_col = 0 # Align trailing comment at or beyond column N; 'pulls in' comments as
|
||||
# a bonus side effect (0=ignore)
|
||||
align_right_cmt_gap = 0 # If a trailing comment is more than this number of columns away from the
|
||||
# text it follows,
|
||||
# it will qualify for being aligned. This has to be > 0 to do anything.
|
||||
align_right_cmt_mix = false # If aligning comments, mix with comments after '}' and #endif with less
|
||||
# than 3 spaces before the comment
|
||||
align_right_cmt_same_level = true # Whether to only align trailing comments that are at the same brace level.
|
||||
align_right_cmt_span = 2 # The span for aligning comments that end lines.
|
||||
align_same_func_call_params = false
|
||||
align_single_line_brace = true
|
||||
align_single_line_func = true
|
||||
align_struct_init_span = 1 # The span for aligning struct initializer values.
|
||||
align_typedef_amp_style = 1
|
||||
align_typedef_func = 1 # How to align typedef'd functions with other typedefs.
|
||||
# (0: No align, 1: Align open paranthesis, 2: Align function type name)
|
||||
align_typedef_gap = 2
|
||||
align_typedef_span = 1 # The span for aligning single-line typedefs.
|
||||
align_typedef_star_style = 1
|
||||
align_var_def_amp_style = 1
|
||||
align_var_def_attribute = true
|
||||
align_var_def_colon = true # Whether to align the colon in struct bit fields.
|
||||
align_var_def_gap = 2 # The gap (minimum spacing for aligned items) for variable definitions.
|
||||
align_var_def_inline = false
|
||||
align_var_def_span = 1 # The span (lines needed to align) for aligning variable definitions.
|
||||
align_var_def_star_style = 1 # How to consider (or treat) the '*' in the alignment of variable
|
||||
# definitions.
|
||||
# 0: Part of the type 'void * foo;' (default)
|
||||
# 1: Part of the variable 'void *foo;'
|
||||
# 2: Dangling 'void *foo;'
|
||||
# (Note - should also set sp_after_ptr_star=remove)
|
||||
align_var_struct_gap = 4
|
||||
align_var_struct_span = 8 # The span for aligning struct/union member definitions.
|
||||
align_var_struct_thresh = 0
|
||||
align_with_tabs = false
|
||||
|
||||
# Comment formatting
|
||||
cmt_align_doxygen_javadoc_tags = true # Whether to align doxygen javadoc-style tags ('@param', '@return', etc.)
|
||||
# TODO: Eats '[' in '[in]'
|
||||
cmt_c_group = false
|
||||
cmt_c_nl_end = true # Whether to add a newline before the closing '*/' of the combined c-comment.
|
||||
cmt_c_nl_start = true
|
||||
cmt_cpp_group = false
|
||||
cmt_cpp_nl_end = true
|
||||
cmt_cpp_nl_start = true
|
||||
cmt_cpp_to_c = false
|
||||
cmt_indent_multi = false # Whether to apply changes to multi-line comments, including cmt_width,
|
||||
# keyword substitution and leading chars.
|
||||
cmt_insert_before_preproc = false
|
||||
#cmt_insert_file_header = default_file_header.txt
|
||||
#cmt_insert_func_header = default_function_header.txt
|
||||
cmt_multi_check_last = false
|
||||
cmt_multi_first_len_minimum = 2
|
||||
cmt_reflow_mode = 1 # How to reflow comments.
|
||||
# (0:No reflow, 1:No touching at all, 2: Full reflow)
|
||||
cmt_sp_after_star_cont = 0 # The number of spaces to insert after the star on subsequent comment lines.
|
||||
cmt_sp_before_star_cont = 0 # The number of spaces to insert at the start of subsequent comment lines.
|
||||
cmt_star_cont = false # Whether to put a star on subsequent comment lines.
|
||||
cmt_width = 120 # Try to wrap comments at N columns.
|
||||
sp_cmt_cpp_start = add # Add or remove space after the opening of a C++ comment, as in
|
||||
# '// <here> A'. NOTE: Breaks indentation within comments.
|
||||
|
||||
# Function definitions / declarations
|
||||
indent_func_call_param = false # Whether to indent continued function call parameters one indent level,
|
||||
# rather than aligning parameters under the open parenthesis.
|
||||
indent_func_class_param = false # Whether to indent continued function call declaration one indent level,
|
||||
# rather than aligning parameters under the open parenthesis.
|
||||
indent_func_ctor_var_param = false # Whether to indent continued class variable constructors one indent level,
|
||||
# rather than aligning parameters under the open parenthesis.
|
||||
indent_func_def_param = true # Whether to indent continued function definition parameters one indent
|
||||
# level, rather than aligning parameters under the open parenthesis.
|
||||
nl_fdef_brace = add # Add or remove newline between function signature and '{'.
|
||||
nl_func_call_end_multi_line = true # Whether to add a newline before ')' in a function call if '(' and ')' are
|
||||
# in different lines.
|
||||
nl_func_call_paren = remove # Add or remove newline between a function name and the opening '(' in the
|
||||
# call.
|
||||
nl_func_call_start_multi_line = true # Whether to add a newline after '(' in a function call if '(' and ')' are
|
||||
# in different lines.
|
||||
nl_func_decl_args = force # Add or remove newline after each ',' in a function declaration.
|
||||
nl_func_decl_empty = add # Add or remove newline between '()' in a function declaration.
|
||||
nl_func_def_args = force # Add or remove newline after each ',' in a function definition.
|
||||
nl_func_def_empty = add # Add or remove newline between '()' in a function definition.
|
||||
nl_func_def_paren = remove # Add or remove newline between a function name and the opening '('
|
||||
# in the definition.
|
||||
nl_func_paren = remove # Add or remove newline between a function name and the opening '(' in
|
||||
# the declaration.
|
||||
nl_func_type_name = add # Add or remove newline between return type and function name in a function
|
||||
# definition.
|
||||
sp_fparen_brace = force # Add or remove space between ')' and '{' of function.
|
||||
use_indent_func_call_param = true # indent_func_call_param will be used
|
||||
|
||||
# Additional Newline Rules
|
||||
nl_after_brace_open = true # Whether to add a newline after '{'. This also adds a newline
|
||||
# before the matching '}'.
|
||||
nl_after_brace_open_cmt = true # Whether to add a newline between the open brace and a
|
||||
# trailing single-line comment.
|
||||
# Requires nl_after_brace_open = true.
|
||||
nl_after_do = add # Add or remove blank line after 'do/while' statement.
|
||||
nl_after_for = add # Add or remove blank line after 'for' statement.
|
||||
nl_after_func_body = 2 # The number of newlines after '}' of a multi-line function body
|
||||
nl_after_func_body_one_liner = 2
|
||||
nl_after_func_proto = 2
|
||||
nl_after_func_proto_group = 2
|
||||
nl_after_if = add
|
||||
nl_after_multiline_comment = false
|
||||
nl_after_return = false
|
||||
nl_after_struct = 2
|
||||
nl_after_switch = add
|
||||
nl_after_vbrace_close = true
|
||||
nl_after_vbrace_open = true
|
||||
nl_after_vbrace_open_empty = true
|
||||
nl_after_while = add
|
||||
nl_assign_leave_one_liners = true
|
||||
nl_before_block_comment = 2
|
||||
nl_before_case = false
|
||||
nl_before_do = ignore
|
||||
nl_before_for = ignore
|
||||
nl_before_if = ignore
|
||||
nl_before_switch = ignore
|
||||
nl_before_while = ignore
|
||||
nl_before_whole_file_ifdef = 2
|
||||
nl_brace_brace = force
|
||||
nl_brace_struct_var = remove
|
||||
nl_case_colon_brace = add
|
||||
nl_class_leave_one_liners = false
|
||||
nl_collapse_empty_body = false
|
||||
nl_comment_func_def = 1
|
||||
nl_create_for_one_liner = false
|
||||
nl_create_if_one_liner = false
|
||||
nl_create_while_one_liner = false
|
||||
nl_define_macro = false
|
||||
nl_ds_struct_enum_close_brace = true
|
||||
nl_ds_struct_enum_cmt = false
|
||||
nl_enum_leave_one_liners = false
|
||||
nl_func_decl_end = add
|
||||
nl_func_decl_start = add
|
||||
nl_func_def_end = add
|
||||
nl_func_def_start = add
|
||||
nl_func_leave_one_liners = false
|
||||
nl_func_proto_type_name = add
|
||||
nl_func_var_def_blk = 1
|
||||
nl_getset_leave_one_liners = false
|
||||
nl_if_leave_one_liners = false
|
||||
nl_multi_line_define = false
|
||||
nl_squeeze_ifdef = false
|
||||
nl_var_def_blk_end = 0
|
||||
nl_var_def_blk_start = 0
|
||||
|
||||
# Preprocessor Rules
|
||||
pp_define_at_level = true
|
||||
pp_if_indent_code = false
|
||||
pp_indent_func_def = false
|
||||
pp_indent_extern = false
|
||||
pp_ignore_define_body = true # Workaround: Turn off processing for #define body
|
||||
# (current rules do not work for some defines)
|
||||
pp_indent = add
|
||||
pp_indent_at_level = true
|
||||
pp_indent_count = 2
|
||||
pp_indent_if = 2
|
||||
pp_indent_region = 2
|
||||
pp_region_indent_code = false
|
||||
pp_space = remove
|
||||
|
||||
#
|
||||
# The tokens below are assigned specific types so they are always recognized properly.
|
||||
#
|
||||
|
||||
# Explicitly define EDK II qualifiers
|
||||
set QUALIFIER CONST
|
||||
set QUALIFIER EFIAPI
|
||||
set QUALIFIER IN
|
||||
set QUALIFIER OPTIONAL
|
||||
set QUALIFIER OUT
|
||||
|
||||
# Explicitly define EDK II types
|
||||
set TYPE EFI_STATUS
|
||||
set TYPE VOID
|
@@ -1,16 +0,0 @@
|
||||
## @file
|
||||
# Downloads the Uncrustify application from a Project Mu NuGet package.
|
||||
#
|
||||
# Copyright (c) Microsoft Corporation.
|
||||
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
##
|
||||
{
|
||||
"id": "uncrustify-ci-1",
|
||||
"scope": "cibuild",
|
||||
"type": "nuget",
|
||||
"name": "mu-uncrustify-release",
|
||||
"source": "https://pkgs.dev.azure.com/projectmu/Uncrustify/_packaging/mu_uncrustify/nuget/v3/index.json",
|
||||
"version": "73.0.3",
|
||||
"flags": ["set_shell_var", "host_specific"],
|
||||
"var_name": "UNCRUSTIFY_CI_PATH"
|
||||
}
|
@@ -1,11 +0,0 @@
|
||||
## @file
|
||||
# CiBuildPlugin used to check coding standard compliance of EDK II style C source code
|
||||
#
|
||||
# Copyright (c) Microsoft Corporation.
|
||||
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
##
|
||||
{
|
||||
"scope": "cibuild",
|
||||
"name": "Uncrustify Coding Standard Test",
|
||||
"module": "UncrustifyCheck"
|
||||
}
|
@@ -82,7 +82,7 @@ easily and consistently running locally and in a cloud ci environment. To do
|
||||
that a few steps should be followed. Details of EDKII Tools can be found in the
|
||||
[docs folder here](https://github.com/tianocore/edk2-pytool-extensions/tree/master/docs)
|
||||
|
||||
### Prerequisites
|
||||
### Prerequisets
|
||||
|
||||
1. A supported toolchain (others might work but this is what is tested and validated)
|
||||
* Windows 10:
|
||||
@@ -95,7 +95,7 @@ that a few steps should be followed. Details of EDKII Tools can be found in the
|
||||
2. Python 3.7.x or newer on path
|
||||
3. git on path
|
||||
4. Recommended to setup and activate a python virtual environment
|
||||
5. Install the requirements `pip install --upgrade -r pip-requirements.txt`
|
||||
5. Install the requirements `pip install --upgrade pip-requirements.txt`
|
||||
|
||||
### Running CI
|
||||
|
||||
@@ -264,10 +264,6 @@ BSD-2-Clause-Patent.
|
||||
Run the Ecc tool on the package. The Ecc tool is available in the BaseTools
|
||||
package. It checks that the code complies to the EDKII coding standard.
|
||||
|
||||
### Coding Standard Compliance - UncrustifyCheck
|
||||
|
||||
Runs the Uncrustify application to check for coding standard compliance issues.
|
||||
|
||||
## PyTool Scopes
|
||||
|
||||
Scopes are how the PyTool ext_dep, path_env, and plugins are activated. Meaning
|
||||
|
@@ -19,10 +19,7 @@
|
||||
],
|
||||
## Both file path and directory path are accepted.
|
||||
"IgnoreFiles": [
|
||||
"Library/ArmSoftFloatLib/berkeley-softfloat-3",
|
||||
"Library/ArmSoftFloatLib/ArmSoftFloatLib.c",
|
||||
"Library/CompilerIntrinsicsLib",
|
||||
"Universal/Smbios/SmbiosMiscDxe"
|
||||
"Library/ArmSoftFloatLib/berkeley-softfloat-3"
|
||||
]
|
||||
},
|
||||
|
||||
|
@@ -3,7 +3,6 @@
|
||||
#
|
||||
# Copyright (c) 2009 - 2010, Apple Inc. All rights reserved.<BR>
|
||||
# Copyright (c) 2011 - 2021, ARM Limited. All rights reserved.
|
||||
# Copyright (c) 2021, Ampere Computing LLC. All rights reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
#
|
||||
@@ -338,9 +337,9 @@
|
||||
# UINT64 Mmio32CpuBase; // mapping target in 64-bit cpu-physical space
|
||||
# UINT64 Mmio64CpuBase; // mapping target in 64-bit cpu-physical space
|
||||
#
|
||||
# gEfiMdePkgTokenSpaceGuid.PcdPciIoTranslation = IoCpuBase - PcdPciIoBase;
|
||||
# gEfiMdePkgTokenSpaceGuid.PcdPciMmio32Translation = Mmio32CpuBase - (UINT64)PcdPciMmio32Base;
|
||||
# gEfiMdePkgTokenSpaceGuid.PcdPciMmio64Translation = Mmio64CpuBase - PcdPciMmio64Base;
|
||||
# PcdPciIoTranslation = IoCpuBase - PcdPciIoBase;
|
||||
# PcdPciMmio32Translation = Mmio32CpuBase - (UINT64)PcdPciMmio32Base;
|
||||
# PcdPciMmio64Translation = Mmio64CpuBase - PcdPciMmio64Base;
|
||||
#
|
||||
# because (a) the target address space (ie. the cpu-physical space) is
|
||||
# 64-bit, and (b) the translation values are meant as offsets for *modular*
|
||||
@@ -357,11 +356,11 @@
|
||||
# UINT64 TranslatedMmio64Address; // output parameter
|
||||
#
|
||||
# TranslatedIoAddress = UntranslatedIoAddress +
|
||||
# gEfiMdePkgTokenSpaceGuid.PcdPciIoTranslation;
|
||||
# PcdPciIoTranslation;
|
||||
# TranslatedMmio32Address = (UINT64)UntranslatedMmio32Address +
|
||||
# gEfiMdePkgTokenSpaceGuid.PcdPciMmio32Translation;
|
||||
# PcdPciMmio32Translation;
|
||||
# TranslatedMmio64Address = UntranslatedMmio64Address +
|
||||
# gEfiMdePkgTokenSpaceGuid.PcdPciMmio64Translation;
|
||||
# PcdPciMmio64Translation;
|
||||
#
|
||||
# The modular arithmetic performed in UINT64 ensures that the translation
|
||||
# works correctly regardless of the relation between IoCpuBase and
|
||||
@@ -370,20 +369,16 @@
|
||||
#
|
||||
gArmTokenSpaceGuid.PcdPciIoBase|0x0|UINT64|0x00000050
|
||||
gArmTokenSpaceGuid.PcdPciIoSize|0x0|UINT64|0x00000051
|
||||
gArmTokenSpaceGuid.PcdPciIoTranslation|0x0|UINT64|0x00000052
|
||||
gArmTokenSpaceGuid.PcdPciMmio32Base|0x0|UINT32|0x00000053
|
||||
gArmTokenSpaceGuid.PcdPciMmio32Size|0x0|UINT32|0x00000054
|
||||
gArmTokenSpaceGuid.PcdPciMmio32Translation|0x0|UINT64|0x00000055
|
||||
gArmTokenSpaceGuid.PcdPciMmio64Base|0x0|UINT64|0x00000056
|
||||
gArmTokenSpaceGuid.PcdPciMmio64Size|0x0|UINT64|0x00000057
|
||||
gArmTokenSpaceGuid.PcdPciMmio64Translation|0x0|UINT64|0x00000058
|
||||
|
||||
#
|
||||
# Inclusive range of allowed PCI buses.
|
||||
#
|
||||
gArmTokenSpaceGuid.PcdPciBusMin|0x0|UINT32|0x00000059
|
||||
gArmTokenSpaceGuid.PcdPciBusMax|0x0|UINT32|0x0000005A
|
||||
|
||||
[PcdsDynamicEx]
|
||||
#
|
||||
# This dynamic PCD hold the GUID of a firmware FFS which contains
|
||||
# the LinuxBoot payload.
|
||||
#
|
||||
gArmTokenSpaceGuid.PcdLinuxBootFileGuid|{0x0}|VOID*|0x0000005C
|
||||
|
@@ -5,7 +5,6 @@
|
||||
# Copyright (c) 2011 - 2021, Arm Limited. All rights reserved.<BR>
|
||||
# Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
|
||||
# Copyright (c) Microsoft Corporation.<BR>
|
||||
# Copyright (c) 2021, Ampere Computing LLC. All rights reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
#
|
||||
@@ -151,7 +150,6 @@
|
||||
ArmPkg/Library/ArmSmcPsciResetSystemLib/ArmSmcPsciResetSystemLib.inf
|
||||
ArmPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf
|
||||
ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
|
||||
ArmPkg/Library/LinuxBootBootManagerLib/LinuxBootBootManagerLib.inf
|
||||
|
||||
ArmPkg/Drivers/ArmCrashDumpDxe/ArmCrashDumpDxe.inf
|
||||
ArmPkg/Drivers/ArmScmiDxe/ArmScmiDxe.inf
|
||||
|
@@ -26,9 +26,7 @@ ArmCrashDumpDxeInitialize (
|
||||
Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **)&mCpu);
|
||||
ASSERT_EFI_ERROR(Status);
|
||||
|
||||
return mCpu->RegisterInterruptHandler (
|
||||
mCpu,
|
||||
return mCpu->RegisterInterruptHandler (mCpu,
|
||||
EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS,
|
||||
&DefaultExceptionHandler
|
||||
);
|
||||
&DefaultExceptionHandler);
|
||||
}
|
||||
|
@@ -33,6 +33,7 @@ UINTN mGicNumInterrupts = 0;
|
||||
|
||||
HARDWARE_INTERRUPT_HANDLER *gRegisteredInterruptHandlers = NULL;
|
||||
|
||||
|
||||
/**
|
||||
Calculate GICD_ICFGRn base address and corresponding bit
|
||||
field Int_config[1] of the GIC distributor register.
|
||||
@@ -70,6 +71,8 @@ GicGetDistributorIcfgBaseAndBit (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Register Handler for the specified interrupt source.
|
||||
|
||||
@@ -134,28 +137,17 @@ CpuArchEventProtocolNotify (
|
||||
// Unregister the default exception handler.
|
||||
Status = Cpu->RegisterInterruptHandler (Cpu, ARM_ARCH_EXCEPTION_IRQ, NULL);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((
|
||||
DEBUG_ERROR,
|
||||
"%a: Cpu->RegisterInterruptHandler() - %r\n",
|
||||
__FUNCTION__,
|
||||
Status
|
||||
));
|
||||
DEBUG ((DEBUG_ERROR, "%a: Cpu->RegisterInterruptHandler() - %r\n",
|
||||
__FUNCTION__, Status));
|
||||
return;
|
||||
}
|
||||
|
||||
// Register to receive interrupts
|
||||
Status = Cpu->RegisterInterruptHandler (
|
||||
Cpu,
|
||||
ARM_ARCH_EXCEPTION_IRQ,
|
||||
Context
|
||||
);
|
||||
Status = Cpu->RegisterInterruptHandler (Cpu, ARM_ARCH_EXCEPTION_IRQ,
|
||||
Context);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((
|
||||
DEBUG_ERROR,
|
||||
"%a: Cpu->RegisterInterruptHandler() - %r\n",
|
||||
__FUNCTION__,
|
||||
Status
|
||||
));
|
||||
DEBUG ((DEBUG_ERROR, "%a: Cpu->RegisterInterruptHandler() - %r\n",
|
||||
__FUNCTION__, Status));
|
||||
}
|
||||
|
||||
gBS->CloseEvent (Event);
|
||||
@@ -199,8 +191,7 @@ InstallAndRegisterInterruptService (
|
||||
TPL_CALLBACK,
|
||||
CpuArchEventProtocolNotify,
|
||||
InterruptHandler,
|
||||
&mCpuArchProtocolNotifyEventRegistration
|
||||
);
|
||||
&mCpuArchProtocolNotifyEventRegistration);
|
||||
|
||||
// Register for an ExitBootServicesEvent
|
||||
Status = gBS->CreateEvent (
|
||||
|
@@ -55,6 +55,7 @@ GicV3DxeInitialize (
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
);
|
||||
|
||||
|
||||
// Shared code
|
||||
|
||||
/**
|
||||
|
@@ -230,8 +230,7 @@ ArmGicSetInterruptPriority (
|
||||
Revision = ArmGicGetSupportedArchRevision ();
|
||||
if ((Revision == ARM_GIC_ARCH_REVISION_2) ||
|
||||
FeaturePcdGet (PcdArmGicV3WithV2Legacy) ||
|
||||
SourceIsSpi (Source))
|
||||
{
|
||||
SourceIsSpi (Source)) {
|
||||
MmioAndThenOr32 (
|
||||
GicDistributorBase + ARM_GIC_ICDIPR + (4 * RegOffset),
|
||||
~(0xff << RegShift),
|
||||
@@ -274,8 +273,7 @@ ArmGicEnableInterrupt (
|
||||
Revision = ArmGicGetSupportedArchRevision ();
|
||||
if ((Revision == ARM_GIC_ARCH_REVISION_2) ||
|
||||
FeaturePcdGet (PcdArmGicV3WithV2Legacy) ||
|
||||
SourceIsSpi (Source))
|
||||
{
|
||||
SourceIsSpi (Source)) {
|
||||
// Write set-enable register
|
||||
MmioWrite32 (
|
||||
GicDistributorBase + ARM_GIC_ICDISER + (4 * RegOffset),
|
||||
@@ -319,8 +317,7 @@ ArmGicDisableInterrupt (
|
||||
Revision = ArmGicGetSupportedArchRevision ();
|
||||
if ((Revision == ARM_GIC_ARCH_REVISION_2) ||
|
||||
FeaturePcdGet (PcdArmGicV3WithV2Legacy) ||
|
||||
SourceIsSpi (Source))
|
||||
{
|
||||
SourceIsSpi (Source)) {
|
||||
// Write clear-enable register
|
||||
MmioWrite32 (
|
||||
GicDistributorBase + ARM_GIC_ICDICER + (4 * RegOffset),
|
||||
@@ -364,8 +361,7 @@ ArmGicIsInterruptEnabled (
|
||||
Revision = ArmGicGetSupportedArchRevision ();
|
||||
if ((Revision == ARM_GIC_ARCH_REVISION_2) ||
|
||||
FeaturePcdGet (PcdArmGicV3WithV2Legacy) ||
|
||||
SourceIsSpi (Source))
|
||||
{
|
||||
SourceIsSpi (Source)) {
|
||||
Interrupts = ((MmioRead32 (
|
||||
GicDistributorBase + ARM_GIC_ICDISER + (4 * RegOffset)
|
||||
)
|
||||
|
@@ -22,6 +22,7 @@
|
||||
|
||||
[Sources.ARM]
|
||||
GicV3/Arm/ArmGicV3.S | GCC
|
||||
GicV3/Arm/ArmGicV3.asm | RVCT
|
||||
|
||||
[Sources.AARCH64]
|
||||
GicV3/AArch64/ArmGicV3.S
|
||||
|
@@ -261,13 +261,9 @@ GicV2SetTriggerType (
|
||||
BOOLEAN SourceEnabled;
|
||||
|
||||
if ( (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING)
|
||||
&& (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_LEVEL_HIGH))
|
||||
{
|
||||
DEBUG ((
|
||||
DEBUG_ERROR,
|
||||
"Invalid interrupt trigger type: %d\n", \
|
||||
TriggerType
|
||||
));
|
||||
&& (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_LEVEL_HIGH)) {
|
||||
DEBUG ((DEBUG_ERROR, "Invalid interrupt trigger type: %d\n", \
|
||||
TriggerType));
|
||||
ASSERT (FALSE);
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
@@ -10,6 +10,7 @@
|
||||
#include <Library/IoLib.h>
|
||||
#include <Library/ArmGicLib.h>
|
||||
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
ArmGicV2EnableInterruptInterface (
|
||||
|
82
ArmPkg/Drivers/ArmGic/GicV3/Arm/ArmGicV3.asm
Normal file
82
ArmPkg/Drivers/ArmGic/GicV3/Arm/ArmGicV3.asm
Normal file
@@ -0,0 +1,82 @@
|
||||
//
|
||||
// Copyright (c) 2014, ARM Limited. All rights reserved.
|
||||
//
|
||||
// SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
//
|
||||
//
|
||||
|
||||
// For the moment we assume this will run in SVC mode on ARMv7
|
||||
|
||||
|
||||
INCLUDE AsmMacroExport.inc
|
||||
|
||||
//UINT32
|
||||
//EFIAPI
|
||||
//ArmGicGetControlSystemRegisterEnable (
|
||||
// VOID
|
||||
// );
|
||||
RVCT_ASM_EXPORT ArmGicV3GetControlSystemRegisterEnable
|
||||
mrc p15, 0, r0, c12, c12, 5 // ICC_SRE
|
||||
bx lr
|
||||
|
||||
//VOID
|
||||
//EFIAPI
|
||||
//ArmGicSetControlSystemRegisterEnable (
|
||||
// IN UINT32 ControlSystemRegisterEnable
|
||||
// );
|
||||
RVCT_ASM_EXPORT ArmGicV3SetControlSystemRegisterEnable
|
||||
mcr p15, 0, r0, c12, c12, 5 // ICC_SRE
|
||||
isb
|
||||
bx lr
|
||||
|
||||
//VOID
|
||||
//ArmGicV3EnableInterruptInterface (
|
||||
// VOID
|
||||
// );
|
||||
RVCT_ASM_EXPORT ArmGicV3EnableInterruptInterface
|
||||
mov r0, #1
|
||||
mcr p15, 0, r0, c12, c12, 7 // ICC_IGRPEN1
|
||||
bx lr
|
||||
|
||||
//VOID
|
||||
//ArmGicV3DisableInterruptInterface (
|
||||
// VOID
|
||||
// );
|
||||
RVCT_ASM_EXPORT ArmGicV3DisableInterruptInterface
|
||||
mov r0, #0
|
||||
mcr p15, 0, r0, c12, c12, 7 // ICC_IGRPEN1
|
||||
bx lr
|
||||
|
||||
//VOID
|
||||
//ArmGicV3EndOfInterrupt (
|
||||
// IN UINTN InterruptId
|
||||
// );
|
||||
RVCT_ASM_EXPORT ArmGicV3EndOfInterrupt
|
||||
mcr p15, 0, r0, c12, c12, 1 //ICC_EOIR1
|
||||
bx lr
|
||||
|
||||
//UINTN
|
||||
//ArmGicV3AcknowledgeInterrupt (
|
||||
// VOID
|
||||
// );
|
||||
RVCT_ASM_EXPORT ArmGicV3AcknowledgeInterrupt
|
||||
mrc p15, 0, r0, c12, c12, 0 //ICC_IAR1
|
||||
bx lr
|
||||
|
||||
//VOID
|
||||
//ArmGicV3SetPriorityMask (
|
||||
// IN UINTN Priority
|
||||
// );
|
||||
RVCT_ASM_EXPORT ArmGicV3SetPriorityMask
|
||||
mcr p15, 0, r0, c4, c6, 0 //ICC_PMR
|
||||
bx lr
|
||||
|
||||
//VOID
|
||||
//ArmGicV3SetBinaryPointer (
|
||||
// IN UINTN BinaryPoint
|
||||
// );
|
||||
RVCT_ASM_EXPORT ArmGicV3SetBinaryPointer
|
||||
mcr p15, 0, r0, c12, c12, 3 //ICC_BPR1
|
||||
bx lr
|
||||
|
||||
END
|
@@ -255,13 +255,9 @@ GicV3SetTriggerType (
|
||||
BOOLEAN SourceEnabled;
|
||||
|
||||
if ( (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING)
|
||||
&& (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_LEVEL_HIGH))
|
||||
{
|
||||
DEBUG ((
|
||||
DEBUG_ERROR,
|
||||
"Invalid interrupt trigger type: %d\n", \
|
||||
TriggerType
|
||||
));
|
||||
&& (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_LEVEL_HIGH)) {
|
||||
DEBUG ((DEBUG_ERROR, "Invalid interrupt trigger type: %d\n", \
|
||||
TriggerType));
|
||||
ASSERT (FALSE);
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
@@ -348,6 +344,10 @@ GicV3ExitBootServicesEvent (
|
||||
GicV3DisableInterruptSource (&gHardwareInterruptV3Protocol, Index);
|
||||
}
|
||||
|
||||
for (Index = 0; Index < mGicNumInterrupts; Index++) {
|
||||
GicV3EndOfInterrupt (&gHardwareInterruptV3Protocol, Index);
|
||||
}
|
||||
|
||||
// Disable Gic Interface
|
||||
ArmGicV3DisableInterruptInterface ();
|
||||
|
||||
@@ -434,8 +434,8 @@ GicV3DxeInitialize (
|
||||
|
||||
if ((MmioRead32 (
|
||||
mGicDistributorBase + ARM_GIC_ICDDCR
|
||||
) & ARM_GIC_ICDDCR_DS) != 0)
|
||||
{
|
||||
) & ARM_GIC_ICDDCR_DS) != 0) {
|
||||
|
||||
// If the Disable Security (DS) control bit is set, we are dealing with a
|
||||
// GIC that has only one security state. In this case, let's assume we are
|
||||
// executing in non-secure state (which is appropriate for DXE modules)
|
||||
|
@@ -117,7 +117,7 @@ CpuIoCheckParameter (
|
||||
// For FIFO type, the target address won't increase during the access,
|
||||
// so treat Count as 1
|
||||
//
|
||||
if ((Width >= EfiCpuIoWidthFifoUint8) && (Width <= EfiCpuIoWidthFifoUint64)) {
|
||||
if (Width >= EfiCpuIoWidthFifoUint8 && Width <= EfiCpuIoWidthFifoUint64) {
|
||||
Count = 1;
|
||||
}
|
||||
|
||||
@@ -161,7 +161,6 @@ CpuIoCheckParameter (
|
||||
if (MaxCount < (Count - 1)) {
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
if (Address > LShiftU64 (MaxCount - Count + 1, Width)) {
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
@@ -255,7 +254,6 @@ CpuMemoryServiceRead (
|
||||
*((UINT64 *)Uint8Buffer) = MmioRead64 ((UINTN)Address);
|
||||
}
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -337,7 +335,6 @@ CpuMemoryServiceWrite (
|
||||
MmioWrite64 ((UINTN)Address, *((UINT64 *)Uint8Buffer));
|
||||
}
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -524,6 +521,7 @@ STATIC EFI_CPU_IO2_PROTOCOL mCpuIo2 = {
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
The user Entry Point for module CpuIo2Dxe. The user code starts with this function.
|
||||
|
||||
@@ -546,8 +544,7 @@ ArmPciCpuIo2Initialize (
|
||||
ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiCpuIo2ProtocolGuid);
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||
&mHandle,
|
||||
&gEfiCpuIo2ProtocolGuid,
|
||||
&mCpuIo2,
|
||||
&gEfiCpuIo2ProtocolGuid, &mCpuIo2,
|
||||
NULL
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
@@ -38,7 +38,7 @@
|
||||
UefiBootServicesTableLib
|
||||
|
||||
[Pcd]
|
||||
gEfiMdePkgTokenSpaceGuid.PcdPciIoTranslation
|
||||
gArmTokenSpaceGuid.PcdPciIoTranslation
|
||||
|
||||
[Protocols]
|
||||
gEfiCpuIo2ProtocolGuid ## PRODUCES
|
||||
|
@@ -53,6 +53,7 @@ typedef struct {
|
||||
CLOCK_RATE_DWORD Rate;
|
||||
} CLOCK_RATE_SET_ATTRIBUTES;
|
||||
|
||||
|
||||
// Message parameters for CLOCK_CONFIG_SET command.
|
||||
typedef struct {
|
||||
UINT32 ClockId;
|
||||
|
@@ -124,9 +124,7 @@ ScmiCommandExecute (
|
||||
Response = (SCMI_MESSAGE_RESPONSE*)MtlGetChannelPayload (Channel);
|
||||
|
||||
if (Response->Status != ScmiSuccess) {
|
||||
DEBUG ((
|
||||
DEBUG_ERROR,
|
||||
"SCMI error: ProtocolId = 0x%x, MessageId = 0x%x, error = %d\n",
|
||||
DEBUG ((DEBUG_ERROR, "SCMI error: ProtocolId = 0x%x, MessageId = 0x%x, error = %d\n",
|
||||
Command->ProtocolId,
|
||||
Command->MessageId,
|
||||
Response->Status
|
||||
|
@@ -256,6 +256,7 @@ BaseDiscoverListProtocols (
|
||||
Skip = 0;
|
||||
|
||||
while (Skip < TotalProtocols) {
|
||||
|
||||
*MessageParams = Skip;
|
||||
|
||||
// Note PayloadLength is a IN/OUT parameter.
|
||||
|
@@ -135,7 +135,6 @@ ClockGetClockAttributes (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
// TRUE if bit 0 of ClockAttributes->Attributes is set.
|
||||
*Enabled = CLOCK_ENABLED (ClockAttributes->Attributes);
|
||||
|
||||
@@ -210,6 +209,7 @@ ClockDescribeRates (
|
||||
*MessageParams++ = ClockId;
|
||||
|
||||
do {
|
||||
|
||||
*MessageParams = RateIndex;
|
||||
|
||||
// Set Payload length, note PayloadLength is a IN/OUT parameter.
|
||||
|
@@ -88,8 +88,7 @@ ArmScmiDxeEntryPoint (
|
||||
|
||||
// Accept any version between SCMI v1.0 and SCMI v2.0
|
||||
if ((Version < BASE_PROTOCOL_VERSION_V1) ||
|
||||
(Version > BASE_PROTOCOL_VERSION_V2))
|
||||
{
|
||||
(Version > BASE_PROTOCOL_VERSION_V2)) {
|
||||
ASSERT (FALSE);
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
@@ -131,8 +130,7 @@ ArmScmiDxeEntryPoint (
|
||||
|
||||
// Install supported protocol on ImageHandle.
|
||||
for (ProtocolIndex = 1; ProtocolIndex < ARRAY_SIZE (Protocols);
|
||||
ProtocolIndex++)
|
||||
{
|
||||
ProtocolIndex++) {
|
||||
for (Index = 0; Index < NumProtocols; Index++) {
|
||||
if (Protocols[ProtocolIndex].Id == SupportedList[Index]) {
|
||||
Status = Protocols[ProtocolIndex].InitFn (&ImageHandle);
|
||||
@@ -140,7 +138,6 @@ ArmScmiDxeEntryPoint (
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@@ -8,7 +8,6 @@
|
||||
http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
|
||||
DEN0056A_System_Control_and_Management_Interface.pdf
|
||||
**/
|
||||
|
||||
#ifndef SCMI_DXE_H_
|
||||
#define SCMI_DXE_H_
|
||||
|
||||
|
@@ -183,6 +183,7 @@ PerformanceDescribeLevels (
|
||||
Cmd.MessageId = ScmiMessageIdPerformanceDescribeLevels;
|
||||
|
||||
do {
|
||||
|
||||
*MessageParams = LevelIndex;
|
||||
|
||||
// Note, PayloadLength is an IN/OUT parameter.
|
||||
@@ -218,6 +219,7 @@ PerformanceDescribeLevels (
|
||||
sizeof (SCMI_PERFORMANCE_LEVEL)
|
||||
);
|
||||
}
|
||||
|
||||
} while (ReturnRemainNumLevels != 0);
|
||||
|
||||
*LevelArraySize = RequiredSize;
|
||||
|
@@ -8,7 +8,6 @@
|
||||
http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
|
||||
DEN0056A_System_Control_and_Management_Interface.pdf
|
||||
**/
|
||||
|
||||
#ifndef SCMI_PRIVATE_H_
|
||||
#define SCMI_PRIVATE_H_
|
||||
|
||||
|
@@ -52,11 +52,9 @@ PageAttributeToGcdAttribute (
|
||||
GcdAttributes = EFI_MEMORY_WB;
|
||||
break;
|
||||
default:
|
||||
DEBUG ((
|
||||
DEBUG_ERROR,
|
||||
DEBUG ((DEBUG_ERROR,
|
||||
"PageAttributeToGcdAttribute: PageAttributes:0x%lX not supported.\n",
|
||||
PageAttributes
|
||||
));
|
||||
PageAttributes));
|
||||
ASSERT (0);
|
||||
// The Global Coherency Domain (GCD) value is defined as a bit set.
|
||||
// Returning 0 means no attribute has been set.
|
||||
@@ -65,8 +63,7 @@ PageAttributeToGcdAttribute (
|
||||
|
||||
// Determine protection attributes
|
||||
if (((PageAttributes & TT_AP_MASK) == TT_AP_NO_RO) ||
|
||||
((PageAttributes & TT_AP_MASK) == TT_AP_RO_RO))
|
||||
{
|
||||
((PageAttributes & TT_AP_MASK) == TT_AP_RO_RO)) {
|
||||
// Read only cases map to write-protect
|
||||
GcdAttributes |= EFI_MEMORY_RO;
|
||||
}
|
||||
@@ -91,7 +88,7 @@ GetFirstPageAttribute (
|
||||
// Get the first entry of the table
|
||||
FirstEntry = *FirstLevelTableAddress;
|
||||
|
||||
if ((TableLevel != 3) && ((FirstEntry & TT_TYPE_MASK) == TT_TYPE_TABLE_ENTRY)) {
|
||||
if ((TableLevel != 3) && (FirstEntry & TT_TYPE_MASK) == TT_TYPE_TABLE_ENTRY) {
|
||||
// Only valid for Levels 0, 1 and 2
|
||||
|
||||
// Get the attribute of the subsequent table
|
||||
@@ -141,18 +138,14 @@ GetNextEntryAttribute (
|
||||
|
||||
// If Entry is a Table Descriptor type entry then go through the sub-level table
|
||||
if ((EntryType == TT_TYPE_BLOCK_ENTRY) ||
|
||||
((TableLevel == 3) && (EntryType == TT_TYPE_BLOCK_ENTRY_LEVEL3)))
|
||||
{
|
||||
((TableLevel == 3) && (EntryType == TT_TYPE_BLOCK_ENTRY_LEVEL3))) {
|
||||
if ((*PrevEntryAttribute == INVALID_ENTRY) || (EntryAttribute != *PrevEntryAttribute)) {
|
||||
if (*PrevEntryAttribute != INVALID_ENTRY) {
|
||||
// Update GCD with the last region
|
||||
SetGcdMemorySpaceAttributes (
|
||||
MemorySpaceMap,
|
||||
NumberOfDescriptors,
|
||||
SetGcdMemorySpaceAttributes (MemorySpaceMap, NumberOfDescriptors,
|
||||
*StartGcdRegion,
|
||||
(BaseAddress + (Index * TT_ADDRESS_AT_LEVEL(TableLevel))) - *StartGcdRegion,
|
||||
PageAttributeToGcdAttribute (*PrevEntryAttribute)
|
||||
);
|
||||
PageAttributeToGcdAttribute (*PrevEntryAttribute));
|
||||
}
|
||||
|
||||
// Start of the new region
|
||||
@@ -166,24 +159,17 @@ GetNextEntryAttribute (
|
||||
ASSERT (TableLevel < 3);
|
||||
|
||||
// Increase the level number and scan the sub-level table
|
||||
GetNextEntryAttribute (
|
||||
(UINT64 *)(Entry & TT_ADDRESS_MASK_DESCRIPTION_TABLE),
|
||||
TT_ENTRY_COUNT,
|
||||
TableLevel + 1,
|
||||
GetNextEntryAttribute ((UINT64*)(Entry & TT_ADDRESS_MASK_DESCRIPTION_TABLE),
|
||||
TT_ENTRY_COUNT, TableLevel + 1,
|
||||
(BaseAddress + (Index * TT_ADDRESS_AT_LEVEL(TableLevel))),
|
||||
PrevEntryAttribute,
|
||||
StartGcdRegion
|
||||
);
|
||||
PrevEntryAttribute, StartGcdRegion);
|
||||
} else {
|
||||
if (*PrevEntryAttribute != INVALID_ENTRY) {
|
||||
// Update GCD with the last region
|
||||
SetGcdMemorySpaceAttributes (
|
||||
MemorySpaceMap,
|
||||
NumberOfDescriptors,
|
||||
SetGcdMemorySpaceAttributes (MemorySpaceMap, NumberOfDescriptors,
|
||||
*StartGcdRegion,
|
||||
(BaseAddress + (Index * TT_ADDRESS_AT_LEVEL(TableLevel))) - *StartGcdRegion,
|
||||
PageAttributeToGcdAttribute (*PrevEntryAttribute)
|
||||
);
|
||||
PageAttributeToGcdAttribute (*PrevEntryAttribute));
|
||||
|
||||
// Start of the new region
|
||||
*StartGcdRegion = BaseAddress + (Index * TT_ADDRESS_AT_LEVEL(TableLevel));
|
||||
@@ -246,24 +232,17 @@ SyncCacheConfig (
|
||||
|
||||
// We scan from the start of the memory map (ie: at the address 0x0)
|
||||
BaseAddressGcdRegion = 0x0;
|
||||
EndAddressGcdRegion = GetNextEntryAttribute (
|
||||
FirstLevelTableAddress,
|
||||
TableCount,
|
||||
TableLevel,
|
||||
EndAddressGcdRegion = GetNextEntryAttribute (FirstLevelTableAddress,
|
||||
TableCount, TableLevel,
|
||||
BaseAddressGcdRegion,
|
||||
&PageAttribute,
|
||||
&BaseAddressGcdRegion
|
||||
);
|
||||
&PageAttribute, &BaseAddressGcdRegion);
|
||||
|
||||
// Update GCD with the last region if valid
|
||||
if (PageAttribute != INVALID_ENTRY) {
|
||||
SetGcdMemorySpaceAttributes (
|
||||
MemorySpaceMap,
|
||||
NumberOfDescriptors,
|
||||
SetGcdMemorySpaceAttributes (MemorySpaceMap, NumberOfDescriptors,
|
||||
BaseAddressGcdRegion,
|
||||
EndAddressGcdRegion - BaseAddressGcdRegion,
|
||||
PageAttributeToGcdAttribute (PageAttribute)
|
||||
);
|
||||
PageAttributeToGcdAttribute (PageAttribute));
|
||||
}
|
||||
|
||||
FreePool (MemorySpaceMap);
|
||||
@@ -285,7 +264,6 @@ EfiAttributeToArmAttribute (
|
||||
} else {
|
||||
ArmAttributes = TT_ATTR_INDX_DEVICE_MEMORY | TT_UXN_MASK | TT_PXN_MASK;
|
||||
}
|
||||
|
||||
break;
|
||||
case EFI_MEMORY_WC:
|
||||
ArmAttributes = TT_ATTR_INDX_MEMORY_NON_CACHEABLE;
|
||||
@@ -305,7 +283,7 @@ EfiAttributeToArmAttribute (
|
||||
|
||||
// Determine protection attributes
|
||||
if ((EfiAttributes & EFI_MEMORY_RO) != 0) {
|
||||
ArmAttributes |= TT_AP_NO_RO;
|
||||
ArmAttributes |= TT_AP_RO_RO;
|
||||
}
|
||||
|
||||
// Process eXecute Never attribute
|
||||
@@ -352,10 +330,7 @@ GetMemoryRegionRec (
|
||||
NextTranslationTable, // Address of the next level page table
|
||||
TableLevel + 1, // Next Page Table level
|
||||
(UINTN*)TT_LAST_BLOCK_ADDRESS(NextTranslationTable, TT_ENTRY_COUNT),
|
||||
BaseAddress,
|
||||
RegionLength,
|
||||
RegionAttributes
|
||||
);
|
||||
BaseAddress, RegionLength, RegionAttributes);
|
||||
|
||||
// In case of 'Success', it means the end of the block region has been found into the upper
|
||||
// level translation table
|
||||
@@ -383,7 +358,6 @@ GetMemoryRegionRec (
|
||||
// In case we have found the end of the region we return success
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
BlockEntry++;
|
||||
}
|
||||
|
||||
@@ -414,14 +388,9 @@ GetMemoryRegion (
|
||||
// Get the Table info from T0SZ
|
||||
GetRootTranslationTableInfo (T0SZ, &TableLevel, &EntryCount);
|
||||
|
||||
Status = GetMemoryRegionRec (
|
||||
TranslationTable,
|
||||
TableLevel,
|
||||
Status = GetMemoryRegionRec (TranslationTable, TableLevel,
|
||||
(UINTN*)TT_LAST_BLOCK_ADDRESS(TranslationTable, EntryCount),
|
||||
BaseAddress,
|
||||
RegionLength,
|
||||
RegionAttributes
|
||||
);
|
||||
BaseAddress, RegionLength, RegionAttributes);
|
||||
|
||||
// If the region continues up to the end of the root table then GetMemoryRegionRec()
|
||||
// will return EFI_NOT_FOUND
|
||||
|
@@ -206,7 +206,6 @@ SyncCacheConfigPage (
|
||||
*NextRegionBase = BaseAddress | (i << TT_DESCRIPTOR_PAGE_BASE_SHIFT);
|
||||
NextPageAttributes = 0;
|
||||
}
|
||||
|
||||
*NextRegionLength += TT_DESCRIPTOR_PAGE_SIZE;
|
||||
}
|
||||
|
||||
@@ -234,6 +233,7 @@ SyncCacheConfig (
|
||||
UINTN NumberOfDescriptors;
|
||||
EFI_GCD_MEMORY_SPACE_DESCRIPTOR *MemorySpaceMap;
|
||||
|
||||
|
||||
DEBUG ((DEBUG_PAGE, "SyncCacheConfig()\n"));
|
||||
|
||||
// This code assumes MMU is enabled and filed with section translations
|
||||
@@ -246,6 +246,7 @@ SyncCacheConfig (
|
||||
Status = gDS->GetMemorySpaceMap (&NumberOfDescriptors, &MemorySpaceMap);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
|
||||
// The GCD implementation maintains its own copy of the state of memory space attributes. GCD needs
|
||||
// to know what the initial memory space attributes are. The CPU Arch. Protocol does not provide a
|
||||
// GetMemoryAttributes function for GCD to get this so we must resort to calling GCD (as if we were
|
||||
@@ -283,7 +284,6 @@ SyncCacheConfig (
|
||||
NextRegionBase = TT_DESCRIPTOR_SECTION_BASE_ADDRESS(i << TT_DESCRIPTOR_SECTION_BASE_SHIFT);
|
||||
NextSectionAttributes = SectionAttributes;
|
||||
}
|
||||
|
||||
NextRegionLength += TT_DESCRIPTOR_SECTION_SIZE;
|
||||
} else if (TT_DESCRIPTOR_SECTION_TYPE_IS_PAGE_TABLE(FirstLevelTable[i])) {
|
||||
// In this case any bits set in the 'NextSectionAttributes' are garbage and were set from
|
||||
@@ -292,14 +292,9 @@ SyncCacheConfig (
|
||||
// section attributes into page attributes
|
||||
NextSectionAttributes = 0;
|
||||
Status = SyncCacheConfigPage (
|
||||
i,
|
||||
FirstLevelTable[i],
|
||||
NumberOfDescriptors,
|
||||
MemorySpaceMap,
|
||||
&NextRegionBase,
|
||||
&NextRegionLength,
|
||||
&NextSectionAttributes
|
||||
);
|
||||
i,FirstLevelTable[i],
|
||||
NumberOfDescriptors, MemorySpaceMap,
|
||||
&NextRegionBase,&NextRegionLength,&NextSectionAttributes);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
} else {
|
||||
// We do not support yet 16MB sections
|
||||
@@ -318,7 +313,6 @@ SyncCacheConfig (
|
||||
NextRegionBase = TT_DESCRIPTOR_SECTION_BASE_ADDRESS(i << TT_DESCRIPTOR_SECTION_BASE_SHIFT);
|
||||
NextSectionAttributes = 0;
|
||||
}
|
||||
|
||||
NextRegionLength += TT_DESCRIPTOR_SECTION_SIZE;
|
||||
}
|
||||
} // section entry loop
|
||||
@@ -500,8 +494,7 @@ GetMemoryRegion (
|
||||
break;
|
||||
}
|
||||
} else if (((SectionDescriptor & TT_DESCRIPTOR_SECTION_TYPE_MASK) == TT_DESCRIPTOR_SECTION_TYPE_SECTION) ||
|
||||
((SectionDescriptor & TT_DESCRIPTOR_SECTION_TYPE_MASK) == TT_DESCRIPTOR_SECTION_TYPE_SUPERSECTION))
|
||||
{
|
||||
((SectionDescriptor & TT_DESCRIPTOR_SECTION_TYPE_MASK) == TT_DESCRIPTOR_SECTION_TYPE_SUPERSECTION)) {
|
||||
if ((SectionDescriptor & TT_DESCRIPTOR_SECTION_ATTRIBUTE_MASK) != *RegionAttributes) {
|
||||
// If the attributes of the section differ from the one targeted then we exit the loop
|
||||
break;
|
||||
|
@@ -49,6 +49,7 @@ CpuFlushCpuDataCache (
|
||||
IN EFI_CPU_FLUSH_TYPE FlushType
|
||||
)
|
||||
{
|
||||
|
||||
switch (FlushType) {
|
||||
case EfiCpuFlushTypeWriteBack:
|
||||
WriteBackDataCacheRange ((VOID *)(UINTN)Start, (UINTN)Length);
|
||||
@@ -66,6 +67,7 @@ CpuFlushCpuDataCache (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
This function enables interrupt processing by the processor.
|
||||
|
||||
@@ -86,6 +88,7 @@ CpuEnableInterrupt (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
This function disables interrupt processing by the processor.
|
||||
|
||||
@@ -106,6 +109,7 @@ CpuDisableInterrupt (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
This function retrieves the processor's current interrupt state a returns it in
|
||||
State. If interrupts are currently enabled, then TRUE is returned. If interrupts
|
||||
@@ -134,6 +138,7 @@ CpuGetInterruptState (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
This function generates an INIT on the processor. If this function succeeds, then the
|
||||
processor will be reset, and control will not be returned to the caller. If InitType is
|
||||
@@ -242,8 +247,7 @@ CpuDxeInitialize (
|
||||
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||
&mCpuHandle,
|
||||
&gEfiCpuArchProtocolGuid,
|
||||
&mCpu,
|
||||
&gEfiCpuArchProtocolGuid, &mCpu,
|
||||
NULL
|
||||
);
|
||||
|
||||
|
@@ -59,6 +59,7 @@ RegisterInterruptHandler (
|
||||
IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
This function registers and enables the handler specified by InterruptHandler for a processor
|
||||
interrupt or exception type specified by InterruptType. If InterruptHandler is NULL, then the
|
||||
@@ -85,6 +86,7 @@ RegisterDebuggerInterruptHandler (
|
||||
IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler
|
||||
);
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
CpuSetMemoryAttributes (
|
||||
|
@@ -43,22 +43,19 @@ SearchGcdMemorySpaces (
|
||||
*EndIndex = 0;
|
||||
for (Index = 0; Index < NumberOfDescriptors; Index++) {
|
||||
if ((BaseAddress >= MemorySpaceMap[Index].BaseAddress) &&
|
||||
(BaseAddress < (MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length)))
|
||||
{
|
||||
(BaseAddress < (MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length))) {
|
||||
*StartIndex = Index;
|
||||
}
|
||||
|
||||
if (((BaseAddress + Length - 1) >= MemorySpaceMap[Index].BaseAddress) &&
|
||||
((BaseAddress + Length - 1) < (MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length)))
|
||||
{
|
||||
((BaseAddress + Length - 1) < (MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length))) {
|
||||
*EndIndex = Index;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Sets the attributes for a specified range in Gcd Memory Space Map.
|
||||
|
||||
@@ -91,21 +88,14 @@ SetGcdMemorySpaceAttributes (
|
||||
EFI_PHYSICAL_ADDRESS RegionStart;
|
||||
UINT64 RegionLength;
|
||||
|
||||
DEBUG ((
|
||||
DEBUG_GCD,
|
||||
"SetGcdMemorySpaceAttributes[0x%lX; 0x%lX] = 0x%lX\n",
|
||||
BaseAddress,
|
||||
BaseAddress + Length,
|
||||
Attributes
|
||||
));
|
||||
DEBUG ((DEBUG_GCD, "SetGcdMemorySpaceAttributes[0x%lX; 0x%lX] = 0x%lX\n",
|
||||
BaseAddress, BaseAddress + Length, Attributes));
|
||||
|
||||
// We do not support a smaller granularity than 4KB on ARM Architecture
|
||||
if ((Length & EFI_PAGE_MASK) != 0) {
|
||||
DEBUG ((
|
||||
DEBUG_WARN,
|
||||
DEBUG ((DEBUG_WARN,
|
||||
"Warning: We do not support smaller granularity than 4KB on ARM Architecture (passed length: 0x%lX).\n",
|
||||
Length
|
||||
));
|
||||
Length));
|
||||
}
|
||||
|
||||
//
|
||||
@@ -130,7 +120,6 @@ SetGcdMemorySpaceAttributes (
|
||||
if (MemorySpaceMap[Index].GcdMemoryType == EfiGcdMemoryTypeNonExistent) {
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
// Calculate the start and end address of the overlapping range
|
||||
//
|
||||
@@ -139,13 +128,11 @@ SetGcdMemorySpaceAttributes (
|
||||
} else {
|
||||
RegionStart = MemorySpaceMap[Index].BaseAddress;
|
||||
}
|
||||
|
||||
if ((BaseAddress + Length - 1) < (MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length)) {
|
||||
RegionLength = BaseAddress + Length - RegionStart;
|
||||
} else {
|
||||
RegionLength = MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length - RegionStart;
|
||||
}
|
||||
|
||||
//
|
||||
// Set memory attributes according to MTRR attribute and the original attribute of descriptor
|
||||
//
|
||||
|
@@ -79,8 +79,7 @@ PublishArmProcessorTable (
|
||||
|
||||
// Allocate runtime memory for ARM processor Table entries
|
||||
ArmProcessorTable->ArmCpus = (ARM_CORE_INFO*)AllocateRuntimePool (
|
||||
ArmProcessorTable->NumberOfEntries * sizeof (ARM_CORE_INFO)
|
||||
);
|
||||
ArmProcessorTable->NumberOfEntries * sizeof(ARM_CORE_INFO));
|
||||
|
||||
// Check if the memory allocation is successful or not
|
||||
ASSERT(NULL != ArmProcessorTable->ArmCpus);
|
||||
|
@@ -24,7 +24,7 @@ InitializeExceptions (
|
||||
|
||||
VectorInfo = (EFI_VECTOR_HANDOFF_INFO *)NULL;
|
||||
Status = EfiGetSystemConfigurationTable(&gEfiVectorHandoffTableGuid, (VOID **)&VectorInfoList);
|
||||
if ((Status == EFI_SUCCESS) && (VectorInfoList != NULL)) {
|
||||
if (Status == EFI_SUCCESS && VectorInfoList != NULL) {
|
||||
VectorInfo = VectorInfoList;
|
||||
}
|
||||
|
||||
|
@@ -16,6 +16,8 @@ Abstract:
|
||||
|
||||
**/
|
||||
|
||||
|
||||
|
||||
//
|
||||
// The package level header files this module uses
|
||||
//
|
||||
|
@@ -5,7 +5,6 @@
|
||||
* SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
*
|
||||
**/
|
||||
|
||||
#ifndef GENERIC_WATCHDOG_H_
|
||||
#define GENERIC_WATCHDOG_H_
|
||||
|
||||
|
@@ -119,12 +119,8 @@ WatchdogInterruptHandler (
|
||||
mWatchdogNotify (TimerPeriod + 1);
|
||||
}
|
||||
|
||||
gRT->ResetSystem (
|
||||
EfiResetCold,
|
||||
EFI_TIMEOUT,
|
||||
StrSize (ResetString),
|
||||
(CHAR16 *)ResetString
|
||||
);
|
||||
gRT->ResetSystem (EfiResetCold, EFI_TIMEOUT, StrSize (ResetString),
|
||||
(CHAR16 *)ResetString);
|
||||
|
||||
// If we got here then the reset didn't work
|
||||
ASSERT (FALSE);
|
||||
@@ -162,11 +158,11 @@ WatchdogRegisterHandler (
|
||||
IN EFI_WATCHDOG_TIMER_NOTIFY NotifyFunction
|
||||
)
|
||||
{
|
||||
if ((mWatchdogNotify == NULL) && (NotifyFunction == NULL)) {
|
||||
if (mWatchdogNotify == NULL && NotifyFunction == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if ((mWatchdogNotify != NULL) && (NotifyFunction != NULL)) {
|
||||
if (mWatchdogNotify != NULL && NotifyFunction != NULL) {
|
||||
return EFI_ALREADY_STARTED;
|
||||
}
|
||||
|
||||
@@ -311,11 +307,8 @@ GenericWatchdogEntry (
|
||||
EFI_STATUS Status;
|
||||
EFI_HANDLE Handle;
|
||||
|
||||
Status = gBS->LocateProtocol (
|
||||
&gHardwareInterrupt2ProtocolGuid,
|
||||
NULL,
|
||||
(VOID **)&mInterruptProtocol
|
||||
);
|
||||
Status = gBS->LocateProtocol (&gHardwareInterrupt2ProtocolGuid, NULL,
|
||||
(VOID **)&mInterruptProtocol);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
/* Make sure the Watchdog Timer Architectural Protocol has not been installed
|
||||
@@ -327,44 +320,33 @@ GenericWatchdogEntry (
|
||||
ASSERT (mTimerFrequencyHz != 0);
|
||||
|
||||
// Install interrupt handler
|
||||
Status = mInterruptProtocol->RegisterInterruptSource (
|
||||
mInterruptProtocol,
|
||||
Status = mInterruptProtocol->RegisterInterruptSource (mInterruptProtocol,
|
||||
FixedPcdGet32 (PcdGenericWatchdogEl2IntrNum),
|
||||
WatchdogInterruptHandler
|
||||
);
|
||||
WatchdogInterruptHandler);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
Status = mInterruptProtocol->SetTriggerType (
|
||||
mInterruptProtocol,
|
||||
Status = mInterruptProtocol->SetTriggerType (mInterruptProtocol,
|
||||
FixedPcdGet32 (PcdGenericWatchdogEl2IntrNum),
|
||||
EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING
|
||||
);
|
||||
EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto UnregisterHandler;
|
||||
}
|
||||
|
||||
// Install the Timer Architectural Protocol onto a new handle
|
||||
Handle = NULL;
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||
&Handle,
|
||||
&gEfiWatchdogTimerArchProtocolGuid,
|
||||
&mWatchdogTimer,
|
||||
NULL
|
||||
);
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (&Handle,
|
||||
&gEfiWatchdogTimerArchProtocolGuid, &mWatchdogTimer,
|
||||
NULL);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto UnregisterHandler;
|
||||
}
|
||||
|
||||
// Register for an ExitBootServicesEvent
|
||||
Status = gBS->CreateEvent (
|
||||
EVT_SIGNAL_EXIT_BOOT_SERVICES,
|
||||
TPL_NOTIFY,
|
||||
WatchdogExitBootServicesEvent,
|
||||
NULL,
|
||||
&mEfiExitBootServicesEvent
|
||||
);
|
||||
Status = gBS->CreateEvent (EVT_SIGNAL_EXIT_BOOT_SERVICES, TPL_NOTIFY,
|
||||
WatchdogExitBootServicesEvent, NULL,
|
||||
&mEfiExitBootServicesEvent);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
mNumTimerTicks = 0;
|
||||
@@ -374,10 +356,8 @@ GenericWatchdogEntry (
|
||||
|
||||
UnregisterHandler:
|
||||
// Unregister the handler
|
||||
mInterruptProtocol->RegisterInterruptSource (
|
||||
mInterruptProtocol,
|
||||
mInterruptProtocol->RegisterInterruptSource (mInterruptProtocol,
|
||||
FixedPcdGet32 (PcdGenericWatchdogEl2IntrNum),
|
||||
NULL
|
||||
);
|
||||
NULL);
|
||||
return Status;
|
||||
}
|
||||
|
@@ -42,20 +42,14 @@ STATIC EFI_HANDLE mMmCommunicateHandle;
|
||||
This function provides a service to send and receive messages from a registered UEFI service.
|
||||
|
||||
@param[in] This The EFI_MM_COMMUNICATION_PROTOCOL instance.
|
||||
@param[in, out] CommBufferPhysical Physical address of the MM communication buffer
|
||||
@param[in, out] CommBufferVirtual Virtual address of the MM communication buffer
|
||||
@param[in, out] CommSize The size of the data buffer being passed in. On input,
|
||||
when not omitted, the buffer should cover EFI_MM_COMMUNICATE_HEADER
|
||||
and the value of MessageLength field. On exit, the size
|
||||
of data being returned. Zero if the handler does not
|
||||
wish to reply with any data. This parameter is optional
|
||||
and may be NULL.
|
||||
@param[in] CommBufferPhysical Physical address of the MM communication buffer
|
||||
@param[in] CommBufferVirtual Virtual address of the MM communication buffer
|
||||
@param[in] CommSize The size of the data buffer being passed in. On exit, the size of data
|
||||
being returned. Zero if the handler does not wish to reply with any data.
|
||||
This parameter is optional and may be NULL.
|
||||
|
||||
@retval EFI_SUCCESS The message was successfully posted.
|
||||
@retval EFI_INVALID_PARAMETER CommBufferPhysical or CommBufferVirtual was NULL, or
|
||||
integer value pointed by CommSize does not cover
|
||||
EFI_MM_COMMUNICATE_HEADER and the value of MessageLength
|
||||
field.
|
||||
@retval EFI_INVALID_PARAMETER CommBufferPhysical was NULL or CommBufferVirtual was NULL.
|
||||
@retval EFI_BAD_BUFFER_SIZE The buffer is too large for the MM implementation.
|
||||
If this error is returned, the MessageLength field
|
||||
in the CommBuffer header or the integer pointed by
|
||||
@@ -88,11 +82,10 @@ MmCommunication2Communicate (
|
||||
//
|
||||
// Check parameters
|
||||
//
|
||||
if ((CommBufferVirtual == NULL) || (CommBufferPhysical == NULL)) {
|
||||
if (CommBufferVirtual == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
CommunicateHeader = CommBufferVirtual;
|
||||
// CommBuffer is a mandatory parameter. Hence, Rely on
|
||||
// MessageLength + Header to ascertain the
|
||||
@@ -102,41 +95,33 @@ MmCommunication2Communicate (
|
||||
sizeof (CommunicateHeader->HeaderGuid) +
|
||||
sizeof (CommunicateHeader->MessageLength);
|
||||
|
||||
// If CommSize is not omitted, perform size inspection before proceeding.
|
||||
if (CommSize != NULL) {
|
||||
// If the length of the CommBuffer is 0 then return the expected length.
|
||||
if (CommSize != 0) {
|
||||
// This case can be used by the consumer of this driver to find out the
|
||||
// max size that can be used for allocating CommBuffer.
|
||||
if ((*CommSize == 0) ||
|
||||
(*CommSize > mNsCommBuffMemRegion.Length))
|
||||
{
|
||||
(*CommSize > mNsCommBuffMemRegion.Length)) {
|
||||
*CommSize = mNsCommBuffMemRegion.Length;
|
||||
Status = EFI_BAD_BUFFER_SIZE;
|
||||
return EFI_BAD_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
//
|
||||
// CommSize should cover at least MessageLength + sizeof (EFI_MM_COMMUNICATE_HEADER);
|
||||
// CommSize must match MessageLength + sizeof (EFI_MM_COMMUNICATE_HEADER);
|
||||
//
|
||||
if (*CommSize < BufferSize) {
|
||||
Status = EFI_INVALID_PARAMETER;
|
||||
if (*CommSize != BufferSize) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// If the message length is 0 or greater than what can be tolerated by the MM
|
||||
// If the buffer size is 0 or greater than what can be tolerated by the MM
|
||||
// environment then return the expected size.
|
||||
//
|
||||
if ((CommunicateHeader->MessageLength == 0) ||
|
||||
(BufferSize > mNsCommBuffMemRegion.Length))
|
||||
{
|
||||
if ((BufferSize == 0) ||
|
||||
(BufferSize > mNsCommBuffMemRegion.Length)) {
|
||||
CommunicateHeader->MessageLength = mNsCommBuffMemRegion.Length -
|
||||
sizeof (CommunicateHeader->HeaderGuid) -
|
||||
sizeof (CommunicateHeader->MessageLength);
|
||||
Status = EFI_BAD_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
// MessageLength or CommSize check has failed, return here.
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
return EFI_BAD_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
// SMC Function ID
|
||||
@@ -234,19 +219,15 @@ NotifySetVirtualAddressMap (
|
||||
(VOID **)&mNsCommBuffMemRegion.VirtualBase
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((
|
||||
DEBUG_ERROR,
|
||||
"NotifySetVirtualAddressMap():"
|
||||
" Unable to convert MM runtime pointer. Status:0x%r\n",
|
||||
Status
|
||||
));
|
||||
DEBUG ((DEBUG_ERROR, "NotifySetVirtualAddressMap():"
|
||||
" Unable to convert MM runtime pointer. Status:0x%r\n", Status));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
STATIC
|
||||
EFI_STATUS
|
||||
GetMmCompatibility (
|
||||
)
|
||||
GetMmCompatibility ()
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT32 MmVersion;
|
||||
@@ -260,24 +241,13 @@ GetMmCompatibility (
|
||||
MmVersion = MmVersionArgs.Arg0;
|
||||
|
||||
if ((MM_MAJOR_VER(MmVersion) == MM_CALLER_MAJOR_VER) &&
|
||||
(MM_MINOR_VER (MmVersion) >= MM_CALLER_MINOR_VER))
|
||||
{
|
||||
DEBUG ((
|
||||
DEBUG_INFO,
|
||||
"MM Version: Major=0x%x, Minor=0x%x\n",
|
||||
MM_MAJOR_VER (MmVersion),
|
||||
MM_MINOR_VER (MmVersion)
|
||||
));
|
||||
(MM_MINOR_VER(MmVersion) >= MM_CALLER_MINOR_VER)) {
|
||||
DEBUG ((DEBUG_INFO, "MM Version: Major=0x%x, Minor=0x%x\n",
|
||||
MM_MAJOR_VER(MmVersion), MM_MINOR_VER(MmVersion)));
|
||||
Status = EFI_SUCCESS;
|
||||
} else {
|
||||
DEBUG ((
|
||||
DEBUG_ERROR,
|
||||
"Incompatible MM Versions.\n Current Version: Major=0x%x, Minor=0x%x.\n Expected: Major=0x%x, Minor>=0x%x.\n",
|
||||
MM_MAJOR_VER (MmVersion),
|
||||
MM_MINOR_VER (MmVersion),
|
||||
MM_CALLER_MAJOR_VER,
|
||||
MM_CALLER_MINOR_VER
|
||||
));
|
||||
DEBUG ((DEBUG_ERROR, "Incompatible MM Versions.\n Current Version: Major=0x%x, Minor=0x%x.\n Expected: Major=0x%x, Minor>=0x%x.\n",
|
||||
MM_MAJOR_VER(MmVersion), MM_MINOR_VER(MmVersion), MM_CALLER_MAJOR_VER, MM_CALLER_MINOR_VER));
|
||||
Status = EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
@@ -369,11 +339,8 @@ MmCommunication2Initialize (
|
||||
EFI_MEMORY_RUNTIME
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((
|
||||
DEBUG_ERROR,
|
||||
"MmCommunicateInitialize: "
|
||||
"Failed to add MM-NS Buffer Memory Space\n"
|
||||
));
|
||||
DEBUG ((DEBUG_ERROR, "MmCommunicateInitialize: "
|
||||
"Failed to add MM-NS Buffer Memory Space\n"));
|
||||
goto ReturnErrorStatus;
|
||||
}
|
||||
|
||||
@@ -383,11 +350,8 @@ MmCommunication2Initialize (
|
||||
EFI_MEMORY_WB | EFI_MEMORY_XP | EFI_MEMORY_RUNTIME
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((
|
||||
DEBUG_ERROR,
|
||||
"MmCommunicateInitialize: "
|
||||
"Failed to set MM-NS Buffer Memory attributes\n"
|
||||
));
|
||||
DEBUG ((DEBUG_ERROR, "MmCommunicateInitialize: "
|
||||
"Failed to set MM-NS Buffer Memory attributes\n"));
|
||||
goto CleanAddedMemorySpace;
|
||||
}
|
||||
|
||||
@@ -399,11 +363,8 @@ MmCommunication2Initialize (
|
||||
&mMmCommunication2
|
||||
);
|
||||
if (EFI_ERROR(Status)) {
|
||||
DEBUG ((
|
||||
DEBUG_ERROR,
|
||||
"MmCommunicationInitialize: "
|
||||
"Failed to install MM communication protocol\n"
|
||||
));
|
||||
DEBUG ((DEBUG_ERROR, "MmCommunicationInitialize: "
|
||||
"Failed to install MM communication protocol\n"));
|
||||
goto CleanAddedMemorySpace;
|
||||
}
|
||||
|
||||
@@ -420,24 +381,17 @@ MmCommunication2Initialize (
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
for (Index = 0; Index < ARRAY_SIZE (mGuidedEventGuid); Index++) {
|
||||
Status = gBS->CreateEventEx (
|
||||
EVT_NOTIFY_SIGNAL,
|
||||
TPL_CALLBACK,
|
||||
MmGuidedEventNotify,
|
||||
mGuidedEventGuid[Index],
|
||||
mGuidedEventGuid[Index],
|
||||
&mGuidedEvent[Index]
|
||||
);
|
||||
Status = gBS->CreateEventEx (EVT_NOTIFY_SIGNAL, TPL_CALLBACK,
|
||||
MmGuidedEventNotify, mGuidedEventGuid[Index],
|
||||
mGuidedEventGuid[Index], &mGuidedEvent[Index]);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
if (EFI_ERROR (Status)) {
|
||||
while (Index-- > 0) {
|
||||
gBS->CloseEvent (mGuidedEvent[Index]);
|
||||
}
|
||||
|
||||
goto UninstallProtocol;
|
||||
}
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
|
||||
UninstallProtocol:
|
||||
|
@@ -7,6 +7,7 @@
|
||||
|
||||
**/
|
||||
|
||||
|
||||
#include <PiDxe.h>
|
||||
|
||||
#include <Library/ArmLib.h>
|
||||
@@ -305,6 +306,7 @@ TimerInterruptHandler (
|
||||
|
||||
// Check if the timer interrupt is active
|
||||
if ((ArmGenericTimerGetTimerCtrlReg () ) & ARM_ARCH_TIMER_ISTATUS) {
|
||||
|
||||
if (mTimerNotifyFunction != 0) {
|
||||
mTimerNotifyFunction (mTimerPeriod * mElapsedPeriod);
|
||||
}
|
||||
@@ -336,6 +338,7 @@ TimerInterruptHandler (
|
||||
gBS->RestoreTPL (OriginalTPL);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Initialize the state information for the Timer Architectural Protocol and
|
||||
the Timer Debug support protocol that allows the debugger to break into a
|
||||
@@ -409,8 +412,7 @@ TimerInitialize (
|
||||
// Install the Timer Architectural Protocol onto a new handle
|
||||
Status = gBS->InstallMultipleProtocolInterfaces(
|
||||
&Handle,
|
||||
&gEfiTimerArchProtocolGuid,
|
||||
&gTimer,
|
||||
&gEfiTimerArchProtocolGuid, &gTimer,
|
||||
NULL
|
||||
);
|
||||
ASSERT_EFI_ERROR(Status);
|
||||
|
@@ -60,12 +60,10 @@ typedef struct {
|
||||
|
||||
SEMIHOST_DEVICE_PATH gDevicePath = {
|
||||
{
|
||||
{ HARDWARE_DEVICE_PATH, HW_VENDOR_DP, { sizeof (VENDOR_DEVICE_PATH), 0 }
|
||||
},
|
||||
{ HARDWARE_DEVICE_PATH, HW_VENDOR_DP, { sizeof (VENDOR_DEVICE_PATH), 0 } },
|
||||
EFI_CALLER_ID_GUID
|
||||
},
|
||||
{ END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, { sizeof (EFI_DEVICE_PATH_PROTOCOL), 0 }
|
||||
}
|
||||
{ END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, { sizeof (EFI_DEVICE_PATH_PROTOCOL), 0 } }
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
@@ -117,6 +115,8 @@ FreeFCB (
|
||||
FreePool (Fcb);
|
||||
}
|
||||
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
VolumeOpen (
|
||||
IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,
|
||||
@@ -193,14 +193,12 @@ FileOpen (
|
||||
|
||||
if ( (OpenMode != EFI_FILE_MODE_READ) &&
|
||||
(OpenMode != (EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE)) &&
|
||||
(OpenMode != (EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE)))
|
||||
{
|
||||
(OpenMode != (EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE)) ) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if (((OpenMode & EFI_FILE_MODE_CREATE) != 0) &&
|
||||
((Attributes & EFI_FILE_DIRECTORY) != 0))
|
||||
{
|
||||
((Attributes & EFI_FILE_DIRECTORY) != 0)) {
|
||||
return EFI_WRITE_PROTECTED;
|
||||
}
|
||||
|
||||
@@ -209,15 +207,13 @@ FileOpen (
|
||||
if (AsciiFileName == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
UnicodeStrToAsciiStrS (FileName, AsciiFileName, Length);
|
||||
|
||||
// Opening '/', '\', '.', or the NULL pathname is trying to open the root directory
|
||||
if ((AsciiStrCmp (AsciiFileName, "\\") == 0) ||
|
||||
(AsciiStrCmp (AsciiFileName, "/") == 0) ||
|
||||
(AsciiStrCmp (AsciiFileName, "") == 0) ||
|
||||
(AsciiStrCmp (AsciiFileName, ".") == 0))
|
||||
{
|
||||
(AsciiStrCmp (AsciiFileName, ".") == 0) ) {
|
||||
FreePool (AsciiFileName);
|
||||
return (VolumeOpen (&gSemihostFs, NewHandle));
|
||||
}
|
||||
@@ -236,7 +232,6 @@ FileOpen (
|
||||
} else {
|
||||
SemihostMode = SEMIHOST_FILE_MODE_READ | SEMIHOST_FILE_MODE_BINARY | SEMIHOST_FILE_MODE_UPDATE;
|
||||
}
|
||||
|
||||
Return = SemihostFileOpen (AsciiFileName, SemihostMode, &SemihostHandle);
|
||||
|
||||
if (RETURN_ERROR (Return)) {
|
||||
@@ -351,7 +346,6 @@ TruncateFile (
|
||||
if (RETURN_ERROR (Return)) {
|
||||
goto Error;
|
||||
}
|
||||
|
||||
Remaining -= ToRead;
|
||||
Read += ToRead;
|
||||
}
|
||||
@@ -385,12 +379,12 @@ Error:
|
||||
if (FileHandle != 0) {
|
||||
SemihostFileClose (FileHandle);
|
||||
}
|
||||
|
||||
if (Buffer != NULL) {
|
||||
FreePool (Buffer);
|
||||
}
|
||||
|
||||
return (Status);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -426,7 +420,6 @@ FileClose (
|
||||
if (Fcb->Info.FileSize < Fcb->Info.PhysicalSize) {
|
||||
TruncateFile (Fcb->FileName, Fcb->Info.FileSize);
|
||||
}
|
||||
|
||||
FreePool (Fcb->FileName);
|
||||
}
|
||||
|
||||
@@ -478,7 +471,6 @@ FileDelete (
|
||||
if (RETURN_ERROR (Return)) {
|
||||
return EFI_WARN_DELETE_FAILURE;
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
} else {
|
||||
return EFI_WARN_DELETE_FAILURE;
|
||||
@@ -582,7 +574,6 @@ ExtendFile (
|
||||
if (RETURN_ERROR (Return)) {
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
Remaining -= WriteNb;
|
||||
}
|
||||
|
||||
@@ -627,8 +618,7 @@ FileWrite (
|
||||
|
||||
// We cannot write a read-only file
|
||||
if ((Fcb->Info.Attribute & EFI_FILE_READ_ONLY)
|
||||
|| !(Fcb->OpenMode & EFI_FILE_MODE_WRITE))
|
||||
{
|
||||
|| !(Fcb->OpenMode & EFI_FILE_MODE_WRITE)) {
|
||||
return EFI_ACCESS_DENIED;
|
||||
}
|
||||
|
||||
@@ -642,7 +632,6 @@ FileWrite (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
Fcb->Info.FileSize = Fcb->Position;
|
||||
}
|
||||
|
||||
@@ -661,7 +650,6 @@ FileWrite (
|
||||
if (RETURN_ERROR (Return)) {
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
Fcb->Info.PhysicalSize = Length;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
@@ -730,7 +718,8 @@ FileSetPosition (
|
||||
if (Position != 0) {
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
//
|
||||
// UEFI Spec section 12.5:
|
||||
// "Seeking to position 0xFFFFFFFFFFFFFFFF causes the current position to
|
||||
@@ -739,7 +728,6 @@ FileSetPosition (
|
||||
if (Position == 0xFFFFFFFFFFFFFFFF) {
|
||||
Position = Fcb->Info.FileSize;
|
||||
}
|
||||
|
||||
Return = SemihostFileSeek (Fcb->SemihostHandle, MIN (Position, Fcb->Info.FileSize));
|
||||
if (RETURN_ERROR (Return)) {
|
||||
return EFI_DEVICE_ERROR;
|
||||
@@ -901,8 +889,7 @@ FileGetInfo (
|
||||
if ((This == NULL) ||
|
||||
(InformationType == NULL) ||
|
||||
(BufferSize == NULL) ||
|
||||
((Buffer == NULL) && (*BufferSize > 0)))
|
||||
{
|
||||
((Buffer == NULL) && (*BufferSize > 0)) ) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@@ -981,7 +968,6 @@ SetFileInfo (
|
||||
if (AsciiFileName == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
UnicodeStrToAsciiStrS (Info->FileName, AsciiFileName, Length);
|
||||
|
||||
FileSizeIsDifferent = (Info->FileSize != Fcb->Info.FileSize);
|
||||
@@ -999,8 +985,7 @@ SetFileInfo (
|
||||
// description.
|
||||
//
|
||||
if ((Fcb->OpenMode == EFI_FILE_MODE_READ) ||
|
||||
(Fcb->Info.Attribute & EFI_FILE_READ_ONLY))
|
||||
{
|
||||
(Fcb->Info.Attribute & EFI_FILE_READ_ONLY) ) {
|
||||
if (FileSizeIsDifferent || FileNameIsDifferent || ReadOnlyIsDifferent) {
|
||||
Status = EFI_ACCESS_DENIED;
|
||||
goto Error;
|
||||
@@ -1021,7 +1006,6 @@ SetFileInfo (
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Error;
|
||||
}
|
||||
|
||||
//
|
||||
// The read/write position from the host file system point of view
|
||||
// is at the end of the file. If the position from this module
|
||||
@@ -1032,14 +1016,12 @@ SetFileInfo (
|
||||
FileSetPosition (&Fcb->File, Fcb->Position);
|
||||
}
|
||||
}
|
||||
|
||||
Fcb->Info.FileSize = FileSize;
|
||||
|
||||
Return = SemihostFileLength (Fcb->SemihostHandle, &Length);
|
||||
if (RETURN_ERROR (Return)) {
|
||||
goto Error;
|
||||
}
|
||||
|
||||
Fcb->Info.PhysicalSize = Length;
|
||||
}
|
||||
|
||||
@@ -1066,7 +1048,6 @@ SetFileInfo (
|
||||
if (RETURN_ERROR (Return)) {
|
||||
goto Error;
|
||||
}
|
||||
|
||||
FreePool (Fcb->FileName);
|
||||
Fcb->FileName = AsciiFileName;
|
||||
AsciiFileName = NULL;
|
||||
@@ -1138,24 +1119,19 @@ FileSetInfo (
|
||||
if (Info->Size < (SIZE_OF_EFI_FILE_INFO + StrSize (Info->FileName))) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if (BufferSize < Info->Size) {
|
||||
return EFI_BAD_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
return SetFileInfo (Fcb, Info);
|
||||
} else if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {
|
||||
SystemInfo = Buffer;
|
||||
if (SystemInfo->Size <
|
||||
(SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (SystemInfo->VolumeLabel)))
|
||||
{
|
||||
(SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (SystemInfo->VolumeLabel))) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if (BufferSize < SystemInfo->Size) {
|
||||
return EFI_BAD_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
Buffer = SystemInfo->VolumeLabel;
|
||||
|
||||
if (StrSize (Buffer) > 0) {
|
||||
@@ -1190,8 +1166,7 @@ FileFlush (
|
||||
return EFI_SUCCESS;
|
||||
} else {
|
||||
if ((Fcb->Info.Attribute & EFI_FILE_READ_ONLY)
|
||||
|| !(Fcb->OpenMode & EFI_FILE_MODE_WRITE))
|
||||
{
|
||||
|| !(Fcb->OpenMode & EFI_FILE_MODE_WRITE)) {
|
||||
return EFI_ACCESS_DENIED;
|
||||
} else {
|
||||
return EFI_SUCCESS;
|
||||
@@ -1217,10 +1192,8 @@ SemihostFsEntryPoint (
|
||||
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||
&gInstallHandle,
|
||||
&gEfiSimpleFileSystemProtocolGuid,
|
||||
&gSemihostFs,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
&gDevicePath,
|
||||
&gEfiSimpleFileSystemProtocolGuid, &gSemihostFs,
|
||||
&gEfiDevicePathProtocolGuid, &gDevicePath,
|
||||
NULL
|
||||
);
|
||||
|
||||
|
@@ -243,3 +243,4 @@ FileFlush (
|
||||
);
|
||||
|
||||
#endif // SEMIHOST_FS_H_
|
||||
|
||||
|
23
ArmPkg/Include/AsmMacroExport.inc
Normal file
23
ArmPkg/Include/AsmMacroExport.inc
Normal file
@@ -0,0 +1,23 @@
|
||||
;%HEADER%
|
||||
;/** @file
|
||||
; Macros to centralize the EXPORT, AREA, and definition of an assembly
|
||||
; function. The AREA prefix is required to put the function in its own
|
||||
; section so that removal of unused functions in the final link is performed.
|
||||
; This provides equivalent functionality to the compiler's --split-sections
|
||||
; option.
|
||||
;
|
||||
; Copyright (c) 2015 HP Development Company, L.P.
|
||||
;
|
||||
; SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
;
|
||||
;**/
|
||||
|
||||
|
||||
MACRO
|
||||
RVCT_ASM_EXPORT $func
|
||||
EXPORT $func
|
||||
AREA s_$func, CODE, READONLY
|
||||
$func
|
||||
MEND
|
||||
|
||||
END
|
@@ -9,6 +9,7 @@
|
||||
|
||||
**/
|
||||
|
||||
|
||||
#ifndef ASM_MACRO_IO_LIB_H_
|
||||
#define ASM_MACRO_IO_LIB_H_
|
||||
|
||||
|
@@ -9,6 +9,7 @@
|
||||
|
||||
**/
|
||||
|
||||
|
||||
#ifndef ASM_MACRO_IO_LIBV8_H_
|
||||
#define ASM_MACRO_IO_LIBV8_H_
|
||||
|
||||
@@ -23,6 +24,7 @@
|
||||
cbnz SAFE_XREG, 1f ;\
|
||||
b . ;// We should never get here
|
||||
|
||||
|
||||
// CurrentEL : 0xC = EL3; 8 = EL2; 4 = EL1
|
||||
// This only selects between EL1 and EL2 and EL3, else we die.
|
||||
// Provide the Macro with a safe temp xreg to use.
|
||||
|
@@ -152,6 +152,7 @@
|
||||
#define TCR_EL1_TBI0_MASK (0x01UL << TCR_EL1_TBI0_FIELD)
|
||||
#define TCR_EL1_TBI1_MASK (0x01UL << TCR_EL1_TBI1_FIELD)
|
||||
|
||||
|
||||
#define TCR_EL23_T0SZ_FIELD (0)
|
||||
#define TCR_EL23_IRGN0_FIELD (8)
|
||||
#define TCR_EL23_ORGN0_FIELD (10)
|
||||
@@ -165,6 +166,7 @@
|
||||
#define TCR_EL23_TG0_MASK (0x01UL << TCR_EL23_TG0_FIELD)
|
||||
#define TCR_EL23_PS_MASK (0x07UL << TCR_EL23_PS_FIELD)
|
||||
|
||||
|
||||
#define TCR_RGN_OUTER_NON_CACHEABLE (0x0UL << 10)
|
||||
#define TCR_RGN_OUTER_WRITE_BACK_ALLOC (0x1UL << 10)
|
||||
#define TCR_RGN_OUTER_WRITE_THROUGH (0x2UL << 10)
|
||||
@@ -193,3 +195,4 @@
|
||||
// Uses LPAE Page Table format
|
||||
|
||||
#endif // AARCH64_MMU_H_
|
||||
|
||||
|
@@ -48,6 +48,7 @@
|
||||
#define A9_SCU_SACR_OFFSET 0x50
|
||||
#define A9_SCU_SSACR_OFFSET 0x54
|
||||
|
||||
|
||||
UINTN
|
||||
EFIAPI
|
||||
ArmGetScuBaseAddress (
|
||||
@@ -55,3 +56,4 @@ ArmGetScuBaseAddress (
|
||||
);
|
||||
|
||||
#endif // ARM_CORTEX_A9_H_
|
||||
|
||||
|
@@ -41,6 +41,7 @@
|
||||
#define CPSR_IRQ (1 << 7)
|
||||
#define CPSR_FIQ (1 << 6)
|
||||
|
||||
|
||||
// CPACR - Coprocessor Access Control Register definitions
|
||||
#define CPACR_CP_DENIED(cp) 0x00
|
||||
#define CPACR_CP_PRIV(cp) ((0x1 << ((cp) << 1)) & 0x0FFFFFFF)
|
||||
|
@@ -33,6 +33,7 @@
|
||||
#define TTBR_MP_NON_CACHEABLE ( TTBR_RGN_OUTER_NON_CACHEABLE | TTBR_RGN_INNER_NON_CACHEABLE )
|
||||
#define TTBR_MP_WRITE_BACK_ALLOC ( TTBR_RGN_OUTER_WRITE_BACK_ALLOC | TTBR_RGN_INNER_WRITE_BACK_ALLOC | TTBR_SHAREABLE)
|
||||
|
||||
|
||||
#define TRANSLATION_TABLE_SECTION_COUNT 4096
|
||||
#define TRANSLATION_TABLE_SECTION_SIZE (sizeof(UINT32) * TRANSLATION_TABLE_SECTION_COUNT)
|
||||
#define TRANSLATION_TABLE_SECTION_ALIGNMENT (sizeof(UINT32) * TRANSLATION_TABLE_SECTION_COUNT)
|
||||
|
@@ -14,7 +14,8 @@
|
||||
#define MPIDR_U_BIT_MASK 0x40000000
|
||||
|
||||
typedef struct {
|
||||
UINT64 Mpidr;
|
||||
UINT32 ClusterId;
|
||||
UINT32 CoreId;
|
||||
|
||||
// MP Core Mailbox
|
||||
EFI_PHYSICAL_ADDRESS MailboxSetAddress;
|
||||
@@ -42,6 +43,7 @@ typedef struct {
|
||||
ARM_CORE_INFO *ArmCpus;
|
||||
} ARM_PROCESSOR_TABLE;
|
||||
|
||||
|
||||
#define ARM_MP_CORE_INFO_GUID \
|
||||
{ 0xa4ee0728, 0xe5d7, 0x4ac5, {0xb2, 0x1e, 0x65, 0x8e, 0xd8, 0x57, 0xe8, 0x34} }
|
||||
|
||||
|
@@ -27,7 +27,8 @@ typedef union {
|
||||
} CSSELR_DATA;
|
||||
|
||||
/// The cache type values for the InD field of the CSSELR register
|
||||
typedef enum {
|
||||
typedef enum
|
||||
{
|
||||
/// Select the data or unified cache
|
||||
CsselrCacheTypeDataOrUnified = 0,
|
||||
/// Select the instruction cache
|
||||
|
@@ -17,6 +17,7 @@ typedef enum {
|
||||
ARM_GIC_ARCH_REVISION_3
|
||||
} ARM_GIC_ARCH_REVISION;
|
||||
|
||||
|
||||
ARM_GIC_ARCH_REVISION
|
||||
EFIAPI
|
||||
ArmGicGetSupportedArchRevision (
|
||||
|
@@ -52,6 +52,7 @@
|
||||
#define ARM_GIC_ICDICFR_LEVEL_TRIGGERED 0x0 // Level triggered interrupt
|
||||
#define ARM_GIC_ICDICFR_EDGE_TRIGGERED 0x1 // Edge triggered interrupt
|
||||
|
||||
|
||||
// GIC Redistributor
|
||||
#define ARM_GICR_CTLR_FRAME_SIZE SIZE_64KB
|
||||
#define ARM_GICR_SGI_PPI_FRAME_SIZE SIZE_64KB
|
||||
|
@@ -59,12 +59,8 @@ typedef struct {
|
||||
ARM_MEMORY_REGION_ATTRIBUTES Attributes;
|
||||
} ARM_MEMORY_REGION_DESCRIPTOR;
|
||||
|
||||
typedef VOID (*CACHE_OPERATION)(
|
||||
VOID
|
||||
);
|
||||
typedef VOID (*LINE_OPERATION)(
|
||||
UINTN
|
||||
);
|
||||
typedef VOID (*CACHE_OPERATION)(VOID);
|
||||
typedef VOID (*LINE_OPERATION)(UINTN);
|
||||
|
||||
//
|
||||
// ARM Processor Mode
|
||||
@@ -111,10 +107,6 @@ typedef enum {
|
||||
#define GET_CORE_ID(MpId) ((MpId) & ARM_CORE_MASK)
|
||||
#define GET_CLUSTER_ID(MpId) (((MpId) & ARM_CLUSTER_MASK) >> 8)
|
||||
#define GET_MPID(ClusterId, CoreId) (((ClusterId) << 8) | (CoreId))
|
||||
#define GET_MPIDR_AFF0(MpId) ((MpId) & ARM_CORE_AFF0)
|
||||
#define GET_MPIDR_AFF1(MpId) (((MpId) & ARM_CORE_AFF1) >> 8)
|
||||
#define GET_MPIDR_AFF2(MpId) (((MpId) & ARM_CORE_AFF2) >> 16)
|
||||
#define GET_MPIDR_AFF3(MpId) (((MpId) & ARM_CORE_AFF3) >> 32)
|
||||
#define PRIMARY_CORE_ID (PcdGet32(PcdArmPrimaryCore) & ARM_CORE_MASK)
|
||||
|
||||
/** Reads the CCSIDR register for the specified cache.
|
||||
@@ -191,6 +183,7 @@ ArmInvalidateDataCache (
|
||||
VOID
|
||||
);
|
||||
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
ArmCleanInvalidateDataCache (
|
||||
@@ -580,6 +573,7 @@ ArmWriteHVBar (
|
||||
IN UINTN HypModeVectorBase
|
||||
);
|
||||
|
||||
|
||||
//
|
||||
// Helper functions for accessing CPU ACTLR
|
||||
//
|
||||
@@ -742,6 +736,7 @@ ArmGetPhysicalAddressBits (
|
||||
VOID
|
||||
);
|
||||
|
||||
|
||||
///
|
||||
/// ID Register Helper functions
|
||||
///
|
||||
@@ -773,7 +768,6 @@ ArmHasCcidx (
|
||||
///
|
||||
/// AArch32-only ID Register Helper functions
|
||||
///
|
||||
|
||||
/**
|
||||
Check whether the CPU supports the Security extensions
|
||||
|
||||
@@ -785,7 +779,6 @@ EFIAPI
|
||||
ArmHasSecurityExtensions (
|
||||
VOID
|
||||
);
|
||||
|
||||
#endif // MDE_CPU_ARM
|
||||
|
||||
#endif // ARM_LIB_H_
|
||||
|
@@ -128,3 +128,4 @@ MtlReceiveMessage (
|
||||
);
|
||||
|
||||
#endif /* ARM_MTL_LIB_H_ */
|
||||
|
||||
|
@@ -1,6 +1,5 @@
|
||||
/** @file
|
||||
*
|
||||
* Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
|
||||
* Copyright (c) 2012-2014, ARM Limited. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
@@ -38,76 +37,4 @@ ArmCallSmc (
|
||||
IN OUT ARM_SMC_ARGS *Args
|
||||
);
|
||||
|
||||
/** Trigger an SMC call with 3 arguments.
|
||||
|
||||
@param Function The SMC function.
|
||||
@param Arg1 Argument/result.
|
||||
@param Arg2 Argument/result.
|
||||
@param Arg3 Argument/result.
|
||||
|
||||
@return The SMC error code.
|
||||
|
||||
**/
|
||||
UINTN
|
||||
ArmCallSmc3 (
|
||||
IN UINTN Function,
|
||||
IN OUT UINTN *Arg1 OPTIONAL,
|
||||
IN OUT UINTN *Arg2 OPTIONAL,
|
||||
IN OUT UINTN *Arg3 OPTIONAL
|
||||
);
|
||||
|
||||
/** Trigger an SMC call with 2 arguments.
|
||||
|
||||
@param Function The SMC function.
|
||||
@param Arg1 Argument/result.
|
||||
@param Arg2 Argument/result.
|
||||
@param Arg3 Result.
|
||||
|
||||
@return The SMC error code.
|
||||
|
||||
**/
|
||||
UINTN
|
||||
ArmCallSmc2 (
|
||||
IN UINTN Function,
|
||||
IN OUT UINTN *Arg1 OPTIONAL,
|
||||
IN OUT UINTN *Arg2 OPTIONAL,
|
||||
OUT UINTN *Arg3 OPTIONAL
|
||||
);
|
||||
|
||||
/** Trigger an SMC call with 1 argument.
|
||||
|
||||
@param Function The SMC function.
|
||||
@param Arg1 Argument/result.
|
||||
@param Arg2 Result.
|
||||
@param Arg3 Result.
|
||||
|
||||
@return The SMC error code.
|
||||
|
||||
**/
|
||||
UINTN
|
||||
ArmCallSmc1 (
|
||||
IN UINTN Function,
|
||||
IN OUT UINTN *Arg1 OPTIONAL,
|
||||
OUT UINTN *Arg2 OPTIONAL,
|
||||
OUT UINTN *Arg3 OPTIONAL
|
||||
);
|
||||
|
||||
/** Trigger an SMC call with 0 arguments.
|
||||
|
||||
@param Function The SMC function.
|
||||
@param Arg1 Result.
|
||||
@param Arg2 Result.
|
||||
@param Arg3 Result.
|
||||
|
||||
@return The SMC error code.
|
||||
|
||||
**/
|
||||
UINTN
|
||||
ArmCallSmc0 (
|
||||
IN UINTN Function,
|
||||
OUT UINTN *Arg1 OPTIONAL,
|
||||
OUT UINTN *Arg2 OPTIONAL,
|
||||
OUT UINTN *Arg3 OPTIONAL
|
||||
);
|
||||
|
||||
#endif // ARM_SMC_LIB_H_
|
||||
|
@@ -8,13 +8,15 @@
|
||||
*
|
||||
**/
|
||||
|
||||
|
||||
#ifndef OEM_MISC_LIB_H_
|
||||
#define OEM_MISC_LIB_H_
|
||||
|
||||
#include <Uefi.h>
|
||||
#include <IndustryStandard/SmBios.h>
|
||||
|
||||
typedef enum {
|
||||
typedef enum
|
||||
{
|
||||
CpuCacheL1 = 1,
|
||||
CpuCacheL2,
|
||||
CpuCacheL3,
|
||||
@@ -25,7 +27,8 @@ typedef enum {
|
||||
CpuCacheLevelMax
|
||||
} OEM_MISC_CPU_CACHE_LEVEL;
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
UINT8 Voltage; ///< Processor voltage
|
||||
UINT16 CurrentSpeed; ///< Current clock speed in MHz
|
||||
UINT16 MaxSpeed; ///< Maximum clock speed in MHz
|
||||
@@ -35,19 +38,17 @@ typedef struct {
|
||||
UINT16 ThreadCount; ///< Number of threads per processor
|
||||
} OEM_MISC_PROCESSOR_DATA;
|
||||
|
||||
typedef enum {
|
||||
typedef enum
|
||||
{
|
||||
ProductNameType01,
|
||||
SerialNumType01,
|
||||
UuidType01,
|
||||
SystemManufacturerType01,
|
||||
VersionType01,
|
||||
SkuNumberType01,
|
||||
FamilyType01,
|
||||
AssertTagType02,
|
||||
SerialNumberType02,
|
||||
BoardManufacturerType02,
|
||||
ProductNameType02,
|
||||
VersionType02,
|
||||
SkuNumberType02,
|
||||
ChassisLocationType02,
|
||||
AssetTagType03,
|
||||
@@ -56,8 +57,6 @@ typedef enum {
|
||||
ChassisTypeType03,
|
||||
ManufacturerType03,
|
||||
SkuNumberType03,
|
||||
ProcessorPartNumType04,
|
||||
ProcessorSerialNumType04,
|
||||
SmbiosHiiStringFieldMax
|
||||
} OEM_MISC_SMBIOS_HII_STRING_FIELD;
|
||||
|
||||
|
@@ -18,3 +18,4 @@
|
||||
#define SCMI_MAX_STR_LEN 16
|
||||
|
||||
#endif /* ARM_SCMI_H_ */
|
||||
|
||||
|
@@ -215,3 +215,4 @@ typedef struct _SCMI_CLOCK_PROTOCOL {
|
||||
} SCMI_CLOCK_PROTOCOL;
|
||||
|
||||
#endif /* ARM_SCMI_CLOCK_PROTOCOL_H_ */
|
||||
|
||||
|
@@ -256,3 +256,4 @@ typedef enum {
|
||||
} SCMI_MESSAGE_ID_PERFORMANCE;
|
||||
|
||||
#endif /* ARM_SCMI_PERFORMANCE_PROTOCOL_H_ */
|
||||
|
||||
|
@@ -7,6 +7,7 @@
|
||||
|
||||
**/
|
||||
|
||||
|
||||
#include <Base.h>
|
||||
#include <Library/ArmLib.h>
|
||||
#include <Library/BaseLib.h>
|
||||
@@ -24,6 +25,7 @@
|
||||
#define MULT_U64_X_N MultU64x64
|
||||
#endif
|
||||
|
||||
|
||||
RETURN_STATUS
|
||||
EFIAPI
|
||||
TimerConstructor (
|
||||
@@ -34,6 +36,7 @@ TimerConstructor (
|
||||
// Check if the ARM Generic Timer Extension is implemented.
|
||||
//
|
||||
if (ArmIsArchTimerImplemented ()) {
|
||||
|
||||
//
|
||||
// Check if Architectural Timer frequency is pre-determined by the platform
|
||||
// (ie. nonzero).
|
||||
@@ -56,7 +59,6 @@ TimerConstructor (
|
||||
if (ArmHasSecurityExtensions ()) {
|
||||
ArmGenericTimerSetTimerFreq (PcdGet32 (PcdArmArchTimerFreqInHz));
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -66,8 +68,9 @@ TimerConstructor (
|
||||
// If the reset value (0) is returned, just ASSERT.
|
||||
//
|
||||
ASSERT (ArmGenericTimerGetTimerFreq () != 0);
|
||||
|
||||
} else {
|
||||
DEBUG ((DEBUG_ERROR, "ARM Architectural Timer is not available in the CPU, hence this library cannot be used.\n"));
|
||||
DEBUG ((EFI_D_ERROR, "ARM Architectural Timer is not available in the CPU, hence this library cannot be used.\n"));
|
||||
ASSERT (0);
|
||||
}
|
||||
|
||||
@@ -93,10 +96,10 @@ GetPlatformTimerFreq (
|
||||
if (TimerFreq == 0) {
|
||||
TimerFreq = ArmGenericTimerGetTimerFreq ();
|
||||
}
|
||||
|
||||
return TimerFreq;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Stalls the CPU for the number of microseconds specified by MicroSeconds.
|
||||
|
||||
@@ -138,6 +141,7 @@ MicroSecondDelay (
|
||||
return MicroSeconds;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Stalls the CPU for at least the given number of nanoseconds.
|
||||
|
||||
@@ -215,7 +219,7 @@ GetPerformanceCounter (
|
||||
UINT64
|
||||
EFIAPI
|
||||
GetPerformanceCounterProperties (
|
||||
OUT UINT64 *StartValue OPTIONAL,
|
||||
OUT UINT64 *StartValue, OPTIONAL
|
||||
OUT UINT64 *EndValue OPTIONAL
|
||||
)
|
||||
{
|
||||
@@ -263,8 +267,7 @@ GetTimeInNanoSecond (
|
||||
DivU64x32Remainder (
|
||||
Ticks,
|
||||
TimerFreq,
|
||||
&Remainder
|
||||
),
|
||||
&Remainder),
|
||||
1000000000U
|
||||
);
|
||||
|
||||
@@ -275,8 +278,7 @@ GetTimeInNanoSecond (
|
||||
NanoSeconds += DivU64x32 (
|
||||
MULT_U64_X_N (
|
||||
(UINT64) Remainder,
|
||||
1000000000U
|
||||
),
|
||||
1000000000U),
|
||||
TimerFreq
|
||||
);
|
||||
|
||||
|
@@ -34,7 +34,6 @@ CacheRangeOperation (
|
||||
LineOperation(AlignedAddress);
|
||||
AlignedAddress += LineLength;
|
||||
}
|
||||
|
||||
ArmDataSynchronizationBarrier ();
|
||||
}
|
||||
|
||||
@@ -63,18 +62,11 @@ InvalidateInstructionCacheRange (
|
||||
IN UINTN Length
|
||||
)
|
||||
{
|
||||
CacheRangeOperation (
|
||||
Address,
|
||||
Length,
|
||||
ArmCleanDataCacheEntryToPoUByMVA,
|
||||
ArmDataCacheLineLength ()
|
||||
);
|
||||
CacheRangeOperation (
|
||||
Address,
|
||||
Length,
|
||||
CacheRangeOperation (Address, Length, ArmCleanDataCacheEntryToPoUByMVA,
|
||||
ArmDataCacheLineLength ());
|
||||
CacheRangeOperation (Address, Length,
|
||||
ArmInvalidateInstructionCacheEntryToPoUByMVA,
|
||||
ArmInstructionCacheLineLength ()
|
||||
);
|
||||
ArmInstructionCacheLineLength ());
|
||||
|
||||
ArmInstructionSynchronizationBarrier ();
|
||||
|
||||
@@ -97,12 +89,8 @@ WriteBackInvalidateDataCacheRange (
|
||||
IN UINTN Length
|
||||
)
|
||||
{
|
||||
CacheRangeOperation (
|
||||
Address,
|
||||
Length,
|
||||
ArmCleanInvalidateDataCacheEntryByMVA,
|
||||
ArmDataCacheLineLength ()
|
||||
);
|
||||
CacheRangeOperation(Address, Length, ArmCleanInvalidateDataCacheEntryByMVA,
|
||||
ArmDataCacheLineLength ());
|
||||
return Address;
|
||||
}
|
||||
|
||||
@@ -122,12 +110,8 @@ WriteBackDataCacheRange (
|
||||
IN UINTN Length
|
||||
)
|
||||
{
|
||||
CacheRangeOperation (
|
||||
Address,
|
||||
Length,
|
||||
ArmCleanDataCacheEntryByMVA,
|
||||
ArmDataCacheLineLength ()
|
||||
);
|
||||
CacheRangeOperation(Address, Length, ArmCleanDataCacheEntryByMVA,
|
||||
ArmDataCacheLineLength ());
|
||||
return Address;
|
||||
}
|
||||
|
||||
@@ -138,11 +122,7 @@ InvalidateDataCacheRange (
|
||||
IN UINTN Length
|
||||
)
|
||||
{
|
||||
CacheRangeOperation (
|
||||
Address,
|
||||
Length,
|
||||
ArmInvalidateDataCacheEntryByMVA,
|
||||
ArmDataCacheLineLength ()
|
||||
);
|
||||
CacheRangeOperation(Address, Length, ArmInvalidateDataCacheEntryByMVA,
|
||||
ArmDataCacheLineLength ());
|
||||
return Address;
|
||||
}
|
||||
|
@@ -69,6 +69,7 @@ CHAR8 *gLdmStack[] = {
|
||||
|
||||
#define LDM_EXT(_reg, _off) ((_reg == 13) ? gLdmStack[(_off)] : gLdmAdr[(_off)])
|
||||
|
||||
|
||||
#define SIGN(_U) ((_U) ? "" : "-")
|
||||
#define WRITE(_Write) ((_Write) ? "!" : "")
|
||||
#define BYTE(_B) ((_B) ? "B":"")
|
||||
@@ -109,11 +110,9 @@ MRegList (
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (First) {
|
||||
AsciiStrCatS (mMregListStr, sizeof mMregListStr, "ERROR");
|
||||
}
|
||||
|
||||
AsciiStrCatS (mMregListStr, sizeof mMregListStr, "}");
|
||||
|
||||
// BugBug: Make caller pass in buffer it is cleaner
|
||||
@@ -137,6 +136,7 @@ RotateRight (
|
||||
return (Op >> Shift) | (Op << (32 - Shift));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Place a disassembly of **OpCodePtr into buffer, and update OpCodePtr to
|
||||
point to next instruction.
|
||||
@@ -181,6 +181,7 @@ DisassembleArmInstruction (
|
||||
Rd = (OpCode >> 12) & 0xf;
|
||||
Rm = (OpCode & 0xf);
|
||||
|
||||
|
||||
if (Extended) {
|
||||
Index = AsciiSPrint (Buf, Size, "0x%08x ", OpCode);
|
||||
Buf += Index;
|
||||
@@ -196,7 +197,6 @@ DisassembleArmInstruction (
|
||||
// A4.1.103 STREX{<cond>} <Rd>, <Rm>, [<Rn>]
|
||||
AsciiSPrint (Buf, Size, "STREX%a %a, %a, [%a]", COND (OpCode), gReg[Rd], gReg[Rn], gReg[Rn]);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -212,7 +212,6 @@ DisassembleArmInstruction (
|
||||
// A4.1.98 STM{<cond>}<addressing_mode> <Rn>, <registers>^
|
||||
AsciiSPrint (Buf, Size, "STM%a%a, %a%a, %a", COND (OpCode), LDM_EXT (Rn ,(OpCode >> 23) & 3), gReg[Rn], WRITE (Write), MRegList (OpCode), USER (WriteBack));
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -224,7 +223,6 @@ DisassembleArmInstruction (
|
||||
} else {
|
||||
Index = AsciiSPrint (Buf, Size, "%a%a%a%a %a, ", Load ? "LDR" : "STR", COND (OpCode), BYTE (WriteBack), (!(Pre) && Write) ? "T":"", gReg[Rd]);
|
||||
}
|
||||
|
||||
if (Pre) {
|
||||
if (!Imm) {
|
||||
// A5.2.2 [<Rn>, #+/-<offset_12>]
|
||||
@@ -257,8 +255,7 @@ DisassembleArmInstruction (
|
||||
|
||||
AsciiSPrint (&Buf[Index], Size - Index, "[%a, #%a%a, %a, #%d]%a", gReg[Rn], SIGN (Up), gReg[Rm], Type, ShiftImm, WRITE (Write));
|
||||
}
|
||||
} else {
|
||||
// !Pre
|
||||
} else { // !Pre
|
||||
if (!Imm) {
|
||||
// A5.2.8 [<Rn>], #+/-<offset_12>
|
||||
AsciiSPrint (&Buf[Index], Size - Index, "[%a], #%a0x%x", gReg[Rn], SIGN (Up), Offset12);
|
||||
@@ -290,7 +287,6 @@ DisassembleArmInstruction (
|
||||
AsciiSPrint (&Buf[Index], Size - Index, "[%a], #%a%a, %a, #%d", gReg[Rn], SIGN (Up), gReg[Rm], Type, ShiftImm);
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -341,7 +337,6 @@ DisassembleArmInstruction (
|
||||
AsciiSPrint (&Buf[Index], Size - Index, "[%a], #%a%a", gReg[Rn], SIGN (Up), gReg[Rm]);
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -376,20 +371,15 @@ DisassembleArmInstruction (
|
||||
AsciiSPrint (Buf, Size, "CPS #0x%x", (OpCode & 0x2f));
|
||||
} else {
|
||||
IMod = (OpCode >> 18) & 0x3;
|
||||
Index = AsciiSPrint (
|
||||
Buf,
|
||||
Size,
|
||||
"CPS%a %a%a%a",
|
||||
Index = AsciiSPrint (Buf, Size, "CPS%a %a%a%a",
|
||||
(IMod == 3) ? "ID":"IE",
|
||||
((OpCode & BIT8) != 0) ? "A":"",
|
||||
((OpCode & BIT7) != 0) ? "I":"",
|
||||
((OpCode & BIT6) != 0) ? "F" : ""
|
||||
);
|
||||
((OpCode & BIT6) != 0) ? "F":"");
|
||||
if ((OpCode & BIT17) != 0) {
|
||||
AsciiSPrint (&Buf[Index], Size - Index, ", #0x%x", OpCode & 0x1f);
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -405,6 +395,7 @@ DisassembleArmInstruction (
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if ((OpCode & 0x0db00000) == 0x01200000) {
|
||||
// A4.1.38 MSR{<cond>} CPSR_<fields>, #<immediate> MSR{<cond>} CPSR_<fields>, <Rm>
|
||||
if (Imm) {
|
||||
@@ -414,7 +405,6 @@ DisassembleArmInstruction (
|
||||
// MSR{<cond>} CPSR_<fields>, <Rm>
|
||||
AsciiSPrint (Buf, Size, "MRS%a %a_%a, %a", COND (OpCode), WriteBack ? "SPSR" : "CPSR", gReg[Rd]);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -444,6 +434,7 @@ DisassembleArmInstruction (
|
||||
// A5.5.5.2 [<Rn>, #+/-<offset_8>*4 ]!
|
||||
AsciiSPrint (&Buf[Index], Size - Index, "[%a, #%a0x%x*4]%a", gReg[Rn], SIGN (Up), OpCode & 0xff, WRITE (Write));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if ((OpCode & 0x0f000010) == 0x0e000010) {
|
||||
@@ -463,3 +454,4 @@ DisassembleArmInstruction (
|
||||
*OpCodePtr += 1;
|
||||
return;
|
||||
}
|
||||
|
||||
|
@@ -93,6 +93,9 @@ extern CHAR8 *gReg[];
|
||||
#define THUMB2_MRS 235
|
||||
#define THUMB2_MSR 236
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
CHAR8 *Start;
|
||||
UINT32 OpCode;
|
||||
@@ -199,6 +202,7 @@ THUMB_INSTRUCTIONS gOpThumb[] = {
|
||||
{ "UXTH", 0xb280, 0xffc0, DATA_FORMAT5 },
|
||||
|
||||
{ "IT", 0xbf00, 0xff00, IT_BLOCK }
|
||||
|
||||
};
|
||||
|
||||
THUMB_INSTRUCTIONS gOpThumb2[] = {
|
||||
@@ -277,6 +281,7 @@ THUMB_INSTRUCTIONS gOpThumb2[] = {
|
||||
{ "MLA", 0xfb000000, 0xfff000f0, THUMB2_4REGS }, // MLA <Rd>, <Rn>, <Rm>, <Ra>
|
||||
{ "MLS", 0xfb000010, 0xfff000f0, THUMB2_4REGS }, // MLA <Rd>, <Rn>, <Rm>, <Ra>
|
||||
|
||||
|
||||
{ "SMLABB", 0xfb100000, 0xfff000f0, THUMB2_4REGS }, // SMLABB <Rd>, <Rn>, <Rm>, <Ra>
|
||||
{ "SMLABT", 0xfb100010, 0xfff000f0, THUMB2_4REGS }, // SMLABT <Rd>, <Rn>, <Rm>, <Ra>
|
||||
{ "SMLABB", 0xfb100020, 0xfff000f0, THUMB2_4REGS }, // SMLATB <Rd>, <Rn>, <Rm>, <Ra>
|
||||
@@ -293,6 +298,7 @@ THUMB_INSTRUCTIONS gOpThumb2[] = {
|
||||
{ "SMLAD", 0xfb200000, 0xfff000f0, THUMB2_4REGS }, // SMLAD <Rd>, <Rn>, <Rm>, <Ra>
|
||||
{ "SMLADX", 0xfb200010, 0xfff000f0, THUMB2_4REGS }, // SMLADX <Rd>, <Rn>, <Rm>, <Ra>
|
||||
|
||||
|
||||
{ "B", 0xf0008000, 0xf800d000, B_T3 }, // B<c> <label>
|
||||
{ "B", 0xf0009000, 0xf800d000, B_T4 }, // B<c> <label>
|
||||
{ "BL", 0xf000d000, 0xf800d000, B_T4 }, // BL<c> <label>
|
||||
@@ -413,11 +419,9 @@ ThumbMRegList (
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (First) {
|
||||
AsciiStrCatS (mThumbMregListStr, sizeof mThumbMregListStr, "ERROR");
|
||||
}
|
||||
|
||||
AsciiStrCatS (mThumbMregListStr, sizeof mThumbMregListStr, "}");
|
||||
|
||||
// BugBug: Make caller pass in buffer it is cleaner
|
||||
@@ -517,7 +521,6 @@ DisassembleThumbInstruction (
|
||||
*OpCodePtrPtr += 1;
|
||||
|
||||
// Manage IT Block ItFlag TRUE means we are in an IT block
|
||||
|
||||
/*if (*ItBlock != 0) {
|
||||
ItFlag = TRUE;
|
||||
*ItBlock -= 1;
|
||||
@@ -532,7 +535,6 @@ DisassembleThumbInstruction (
|
||||
} else {
|
||||
Offset = AsciiSPrint (Buf, Size, "%-6a", gOpThumb[Index].Start);
|
||||
}
|
||||
|
||||
switch (gOpThumb[Index].AddressMode) {
|
||||
case LOAD_STORE_FORMAT1:
|
||||
// A6.5.1 <Rd>, [<Rn>, #<5_bit_offset>]
|
||||
@@ -577,6 +579,7 @@ DisassembleThumbInstruction (
|
||||
AsciiSPrint (&Buf[Offset], Size - Offset, " %a", ThumbMRegList ((OpCode & 0xff) | ((OpCode & BIT8) == BIT8 ? BIT14 : 0)));
|
||||
return;
|
||||
|
||||
|
||||
case IMMED_8:
|
||||
// A6.7 <immed_8>
|
||||
AsciiSPrint (&Buf[Offset], Size - Offset, " 0x%x", OpCode & 0xff);
|
||||
@@ -681,13 +684,13 @@ DisassembleThumbInstruction (
|
||||
} else if ((OpCode & 0xf) == 0x8) {
|
||||
*ItBlock = 1;
|
||||
}
|
||||
|
||||
AsciiSPrint (&Buf[Offset], Size - Offset, " %a", gCondition[(OpCode >> 4) & 0xf]);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Thumb2 are 32-bit instructions
|
||||
*OpCodePtrPtr += 1;
|
||||
Rt = (OpCode32 >> 12) & 0xf;
|
||||
@@ -702,7 +705,6 @@ DisassembleThumbInstruction (
|
||||
} else {
|
||||
Offset = AsciiSPrint (Buf, Size, " %-6a", gOpThumb2[Index].Start);
|
||||
}
|
||||
|
||||
switch (gOpThumb2[Index].AddressMode) {
|
||||
case B_T3:
|
||||
Cond = gCondition[(OpCode32 >> 22) & 0xf];
|
||||
@@ -765,7 +767,6 @@ DisassembleThumbInstruction (
|
||||
// U == 0 means subtrack, U == 1 means add
|
||||
Target = -Target;
|
||||
}
|
||||
|
||||
AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a", gReg[(OpCode32 >> 12) & 0xf], PcAlign4 (Pc) + Target);
|
||||
return;
|
||||
|
||||
@@ -777,7 +778,6 @@ DisassembleThumbInstruction (
|
||||
} else {
|
||||
AsciiSPrint (&Buf[Offset], Size - Offset, ", LSL #%d]", (OpCode32 >> 4) & 3);
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
case LDM_REG_IMM12:
|
||||
@@ -788,7 +788,6 @@ DisassembleThumbInstruction (
|
||||
} else {
|
||||
AsciiSPrint (&Buf[Offset], Size - Offset, ", #0x%x]", OpCode32 & 0xfff);
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
case LDM_REG_IMM8:
|
||||
@@ -806,7 +805,6 @@ DisassembleThumbInstruction (
|
||||
} else {
|
||||
AsciiSPrint (&Buf[Offset], Size - Offset, "], #%a0x%x", UAdd?"":"-", OpCode32 & 0xff);
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
case LDRD_REG_IMM8_SIGNED:
|
||||
@@ -826,7 +824,6 @@ DisassembleThumbInstruction (
|
||||
AsciiSPrint (&Buf[Offset], Size - Offset, ", #%a0x%x", UAdd?"":"-", (OpCode32 & 0xff) << 2);
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
case LDRD_REG_IMM8:
|
||||
@@ -836,7 +833,6 @@ DisassembleThumbInstruction (
|
||||
// U == 0 means subtrack, U == 1 means add
|
||||
Target = -Target;
|
||||
}
|
||||
|
||||
AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a, %a", gReg[Rt], gReg[Rt2], Pc + 4 + Target);
|
||||
return;
|
||||
|
||||
@@ -867,7 +863,6 @@ DisassembleThumbInstruction (
|
||||
if ((OpCode32 & BIT20) == BIT20) {
|
||||
Buf[Offset - 3] = 'S'; // assume %-6a
|
||||
}
|
||||
|
||||
Target = (OpCode32 & 0xff) | ((OpCode32 >> 4) & 0x700) | ((OpCode & BIT26) == BIT26 ? BIT11 : 0);
|
||||
AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a, #0x%x", gReg[Rd], gReg[Rn], Target);
|
||||
return;
|
||||
@@ -877,7 +872,6 @@ DisassembleThumbInstruction (
|
||||
if ((OpCode32 & BIT20) == BIT20) {
|
||||
Buf[Offset - 3] = 'S'; // assume %-6a
|
||||
}
|
||||
|
||||
Target = (OpCode32 & 0xff) | ((OpCode32 >> 4) & 0x700) | ((OpCode & BIT26) == BIT26 ? BIT11 : 0);
|
||||
AsciiSPrint (&Buf[Offset], Size - Offset, " %a, #0x%x", gReg[Rd], Target);
|
||||
return;
|
||||
@@ -894,13 +888,11 @@ DisassembleThumbInstruction (
|
||||
if ((OpCode32 & BIT20) == BIT20) {
|
||||
Buf[Offset - 3] = 'S'; // assume %-6a
|
||||
}
|
||||
|
||||
Target = ((OpCode32 >> 6) & 3) | ((OpCode32 >> 10) & 0x1c0);
|
||||
Offset += AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a, %a", gReg[Rd], gReg[Rn], gReg[Rm]);
|
||||
if (Target != 0) {
|
||||
AsciiSPrint (&Buf[Offset], Size - Offset, ", LSL %d", gShiftType[(OpCode >> 5) & 3], Target);
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
case ADD_IMM5_2REG:
|
||||
@@ -911,12 +903,12 @@ DisassembleThumbInstruction (
|
||||
AsciiSPrint (&Buf[Offset], Size - Offset, ", LSL %d", gShiftType[(OpCode >> 5) & 3], Target);
|
||||
}
|
||||
|
||||
|
||||
case ASR_IMM5:
|
||||
// ARS <Rd>, <Rm> #<const>} imm3:imm2
|
||||
if ((OpCode32 & BIT20) == BIT20) {
|
||||
Buf[Offset - 3] = 'S'; // assume %-6a
|
||||
}
|
||||
|
||||
Target = ((OpCode32 >> 6) & 3) | ((OpCode32 >> 10) & 0x1c0);
|
||||
AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a #%d", gReg[Rd], gReg[Rm], Target);
|
||||
return;
|
||||
@@ -926,7 +918,6 @@ DisassembleThumbInstruction (
|
||||
if ((OpCode32 & BIT20) == BIT20) {
|
||||
Buf[Offset - 3] = 'S'; // assume %-6a
|
||||
}
|
||||
|
||||
AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a %a", gReg[Rd], gReg[Rn], gReg[Rm]);
|
||||
return;
|
||||
|
||||
@@ -938,7 +929,6 @@ DisassembleThumbInstruction (
|
||||
} else {
|
||||
Target = PcAlign4 (Pc) + Target;
|
||||
}
|
||||
|
||||
AsciiSPrint (&Buf[Offset], Size - Offset, " %a, 0x%08x", gReg[Rd], Target);
|
||||
return;
|
||||
|
||||
@@ -960,7 +950,6 @@ DisassembleThumbInstruction (
|
||||
} else {
|
||||
AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a, #%d, #%d", gReg[Rd], gReg[Rn], LsBit, MsBit + 1);
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
case CPD_THUMB2:
|
||||
@@ -975,7 +964,6 @@ DisassembleThumbInstruction (
|
||||
if (Opc2 != 0) {
|
||||
AsciiSPrint (&Buf[Offset], Size - Offset, ",#%d,", Opc2);
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
case MRC_THUMB2:
|
||||
@@ -989,7 +977,6 @@ DisassembleThumbInstruction (
|
||||
if (Opc2 != 0) {
|
||||
AsciiSPrint (&Buf[Offset], Size - Offset, ",#%d,", Opc2);
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
case MRRC_THUMB2:
|
||||
@@ -1032,6 +1019,8 @@ DisassembleThumbInstruction (
|
||||
AsciiSPrint (Buf, Size, "0x%08x", OpCode32);
|
||||
}
|
||||
|
||||
|
||||
|
||||
VOID
|
||||
DisassembleArmInstruction (
|
||||
IN UINT32 **OpCodePtr,
|
||||
@@ -1040,6 +1029,7 @@ DisassembleArmInstruction (
|
||||
IN BOOLEAN Extended
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Place a disassembly of **OpCodePtr into buffer, and update OpCodePtr to
|
||||
point to next instruction.
|
||||
@@ -1071,3 +1061,4 @@ DisassembleInstruction (
|
||||
DisassembleArmInstruction ((UINT32 **)OpCodePtr, Buf, Size, Extended);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -35,7 +35,8 @@ ArchVectorConfig (
|
||||
if (VectorBaseAddress == 0xFFFF0000) {
|
||||
// set SCTLR.V to enable high vectors
|
||||
ArmSetHighVectors();
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
// Set SCTLR.V to 0 to enable VBAR to be used
|
||||
ArmSetLowVectors();
|
||||
}
|
||||
|
296
ArmPkg/Library/ArmExceptionLib/Arm/ExceptionSupport.asm
Normal file
296
ArmPkg/Library/ArmExceptionLib/Arm/ExceptionSupport.asm
Normal file
@@ -0,0 +1,296 @@
|
||||
//------------------------------------------------------------------------------
|
||||
//
|
||||
// Use ARMv6 instruction to operate on a single stack
|
||||
//
|
||||
// Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
|
||||
// Copyright (c) 2014, ARM Limited. All rights reserved.<BR>
|
||||
// Copyright (c) 2016 HP Development Company, L.P.<BR>
|
||||
//
|
||||
// SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#include <Library/PcdLib.h>
|
||||
|
||||
/*
|
||||
|
||||
This is the stack constructed by the exception handler (low address to high address)
|
||||
# R0 - IFAR is EFI_SYSTEM_CONTEXT for ARM
|
||||
Reg Offset
|
||||
=== ======
|
||||
R0 0x00 # stmfd SP!,{R0-R12}
|
||||
R1 0x04
|
||||
R2 0x08
|
||||
R3 0x0c
|
||||
R4 0x10
|
||||
R5 0x14
|
||||
R6 0x18
|
||||
R7 0x1c
|
||||
R8 0x20
|
||||
R9 0x24
|
||||
R10 0x28
|
||||
R11 0x2c
|
||||
R12 0x30
|
||||
SP 0x34 # reserved via subtraction 0x20 (32) from SP
|
||||
LR 0x38
|
||||
PC 0x3c
|
||||
CPSR 0x40
|
||||
DFSR 0x44
|
||||
DFAR 0x48
|
||||
IFSR 0x4c
|
||||
IFAR 0x50
|
||||
|
||||
LR 0x54 # SVC Link register (we need to restore it)
|
||||
|
||||
LR 0x58 # pushed by srsfd
|
||||
CPSR 0x5c
|
||||
|
||||
*/
|
||||
|
||||
|
||||
EXPORT ExceptionHandlersStart
|
||||
EXPORT ExceptionHandlersEnd
|
||||
EXPORT CommonExceptionEntry
|
||||
EXPORT AsmCommonExceptionEntry
|
||||
IMPORT CommonCExceptionHandler
|
||||
|
||||
PRESERVE8
|
||||
AREA DxeExceptionHandlers, CODE, READONLY, CODEALIGN, ALIGN=5
|
||||
|
||||
//
|
||||
// This code gets copied to the ARM vector table
|
||||
// ExceptionHandlersStart - ExceptionHandlersEnd gets copied
|
||||
//
|
||||
ExceptionHandlersStart
|
||||
|
||||
Reset
|
||||
b ResetEntry
|
||||
|
||||
UndefinedInstruction
|
||||
b UndefinedInstructionEntry
|
||||
|
||||
SoftwareInterrupt
|
||||
b SoftwareInterruptEntry
|
||||
|
||||
PrefetchAbort
|
||||
b PrefetchAbortEntry
|
||||
|
||||
DataAbort
|
||||
b DataAbortEntry
|
||||
|
||||
ReservedException
|
||||
b ReservedExceptionEntry
|
||||
|
||||
Irq
|
||||
b IrqEntry
|
||||
|
||||
Fiq
|
||||
b FiqEntry
|
||||
|
||||
ResetEntry
|
||||
srsfd #0x13! ; Store return state on SVC stack
|
||||
; We are already in SVC mode
|
||||
stmfd SP!,{LR} ; Store the link register for the current mode
|
||||
sub SP,SP,#0x20 ; Save space for SP, LR, PC, IFAR - CPSR
|
||||
stmfd SP!,{R0-R12} ; Store the register state
|
||||
|
||||
mov R0,#0 ; ExceptionType
|
||||
ldr R1,CommonExceptionEntry
|
||||
bx R1
|
||||
|
||||
UndefinedInstructionEntry
|
||||
sub LR, LR, #4 ; Only -2 for Thumb, adjust in CommonExceptionEntry
|
||||
srsfd #0x13! ; Store return state on SVC stack
|
||||
cps #0x13 ; Switch to SVC for common stack
|
||||
stmfd SP!,{LR} ; Store the link register for the current mode
|
||||
sub SP,SP,#0x20 ; Save space for SP, LR, PC, IFAR - CPSR
|
||||
stmfd SP!,{R0-R12} ; Store the register state
|
||||
|
||||
mov R0,#1 ; ExceptionType
|
||||
ldr R1,CommonExceptionEntry;
|
||||
bx R1
|
||||
|
||||
SoftwareInterruptEntry
|
||||
srsfd #0x13! ; Store return state on SVC stack
|
||||
; We are already in SVC mode
|
||||
stmfd SP!,{LR} ; Store the link register for the current mode
|
||||
sub SP,SP,#0x20 ; Save space for SP, LR, PC, IFAR - CPSR
|
||||
stmfd SP!,{R0-R12} ; Store the register state
|
||||
|
||||
mov R0,#2 ; ExceptionType
|
||||
ldr R1,CommonExceptionEntry
|
||||
bx R1
|
||||
|
||||
PrefetchAbortEntry
|
||||
sub LR,LR,#4
|
||||
srsfd #0x13! ; Store return state on SVC stack
|
||||
cps #0x13 ; Switch to SVC for common stack
|
||||
stmfd SP!,{LR} ; Store the link register for the current mode
|
||||
sub SP,SP,#0x20 ; Save space for SP, LR, PC, IFAR - CPSR
|
||||
stmfd SP!,{R0-R12} ; Store the register state
|
||||
|
||||
mov R0,#3 ; ExceptionType
|
||||
ldr R1,CommonExceptionEntry
|
||||
bx R1
|
||||
|
||||
DataAbortEntry
|
||||
sub LR,LR,#8
|
||||
srsfd #0x13! ; Store return state on SVC stack
|
||||
cps #0x13 ; Switch to SVC for common stack
|
||||
stmfd SP!,{LR} ; Store the link register for the current mode
|
||||
sub SP,SP,#0x20 ; Save space for SP, LR, PC, IFAR - CPSR
|
||||
stmfd SP!,{R0-R12} ; Store the register state
|
||||
|
||||
mov R0,#4 ; ExceptionType
|
||||
ldr R1,CommonExceptionEntry
|
||||
bx R1
|
||||
|
||||
ReservedExceptionEntry
|
||||
srsfd #0x13! ; Store return state on SVC stack
|
||||
cps #0x13 ; Switch to SVC for common stack
|
||||
stmfd SP!,{LR} ; Store the link register for the current mode
|
||||
sub SP,SP,#0x20 ; Save space for SP, LR, PC, IFAR - CPSR
|
||||
stmfd SP!,{R0-R12} ; Store the register state
|
||||
|
||||
mov R0,#5 ; ExceptionType
|
||||
ldr R1,CommonExceptionEntry
|
||||
bx R1
|
||||
|
||||
IrqEntry
|
||||
sub LR,LR,#4
|
||||
srsfd #0x13! ; Store return state on SVC stack
|
||||
cps #0x13 ; Switch to SVC for common stack
|
||||
stmfd SP!,{LR} ; Store the link register for the current mode
|
||||
sub SP,SP,#0x20 ; Save space for SP, LR, PC, IFAR - CPSR
|
||||
stmfd SP!,{R0-R12} ; Store the register state
|
||||
|
||||
mov R0,#6 ; ExceptionType
|
||||
ldr R1,CommonExceptionEntry
|
||||
bx R1
|
||||
|
||||
FiqEntry
|
||||
sub LR,LR,#4
|
||||
srsfd #0x13! ; Store return state on SVC stack
|
||||
cps #0x13 ; Switch to SVC for common stack
|
||||
stmfd SP!,{LR} ; Store the link register for the current mode
|
||||
sub SP,SP,#0x20 ; Save space for SP, LR, PC, IFAR - CPSR
|
||||
stmfd SP!,{R0-R12} ; Store the register state
|
||||
; Since we have already switch to SVC R8_fiq - R12_fiq
|
||||
; never get used or saved
|
||||
mov R0,#7 ; ExceptionType
|
||||
ldr R1,CommonExceptionEntry
|
||||
bx R1
|
||||
|
||||
//
|
||||
// This gets patched by the C code that patches in the vector table
|
||||
//
|
||||
CommonExceptionEntry
|
||||
dcd AsmCommonExceptionEntry
|
||||
|
||||
ExceptionHandlersEnd
|
||||
|
||||
//
|
||||
// This code runs from CpuDxe driver loaded address. It is patched into
|
||||
// CommonExceptionEntry.
|
||||
//
|
||||
AsmCommonExceptionEntry
|
||||
mrc p15, 0, R1, c6, c0, 2 ; Read IFAR
|
||||
str R1, [SP, #0x50] ; Store it in EFI_SYSTEM_CONTEXT_ARM.IFAR
|
||||
|
||||
mrc p15, 0, R1, c5, c0, 1 ; Read IFSR
|
||||
str R1, [SP, #0x4c] ; Store it in EFI_SYSTEM_CONTEXT_ARM.IFSR
|
||||
|
||||
mrc p15, 0, R1, c6, c0, 0 ; Read DFAR
|
||||
str R1, [SP, #0x48] ; Store it in EFI_SYSTEM_CONTEXT_ARM.DFAR
|
||||
|
||||
mrc p15, 0, R1, c5, c0, 0 ; Read DFSR
|
||||
str R1, [SP, #0x44] ; Store it in EFI_SYSTEM_CONTEXT_ARM.DFSR
|
||||
|
||||
ldr R1, [SP, #0x5c] ; srsfd saved pre-exception CPSR on the stack
|
||||
str R1, [SP, #0x40] ; Store it in EFI_SYSTEM_CONTEXT_ARM.CPSR
|
||||
|
||||
add R2, SP, #0x38 ; Make R2 point to EFI_SYSTEM_CONTEXT_ARM.LR
|
||||
and R3, R1, #0x1f ; Check CPSR to see if User or System Mode
|
||||
cmp R3, #0x1f ; if ((CPSR == 0x10) || (CPSR == 0x1f))
|
||||
cmpne R3, #0x10 ;
|
||||
stmeqed R2, {lr}^ ; save unbanked lr
|
||||
; else
|
||||
stmneed R2, {lr} ; save SVC lr
|
||||
|
||||
|
||||
ldr R5, [SP, #0x58] ; PC is the LR pushed by srsfd
|
||||
; Check to see if we have to adjust for Thumb entry
|
||||
sub r4, r0, #1 ; if (ExceptionType == 1 || ExceptionType == 2)) {
|
||||
cmp r4, #1 ; // UND & SVC have different LR adjust for Thumb
|
||||
bhi NoAdjustNeeded
|
||||
|
||||
tst r1, #0x20 ; if ((CPSR & T)) == T) { // Thumb Mode on entry
|
||||
addne R5, R5, #2 ; PC += 2;
|
||||
strne R5,[SP,#0x58] ; Update LR value pushed by srsfd
|
||||
|
||||
NoAdjustNeeded
|
||||
|
||||
str R5, [SP, #0x3c] ; Store it in EFI_SYSTEM_CONTEXT_ARM.PC
|
||||
|
||||
add R1, SP, #0x60 ; We pushed 0x60 bytes on the stack
|
||||
str R1, [SP, #0x34] ; Store it in EFI_SYSTEM_CONTEXT_ARM.SP
|
||||
|
||||
; R0 is ExceptionType
|
||||
mov R1,SP ; R1 is SystemContext
|
||||
|
||||
#if (FixedPcdGet32(PcdVFPEnabled))
|
||||
vpush {d0-d15} ; save vstm registers in case they are used in optimizations
|
||||
#endif
|
||||
|
||||
mov R4, SP ; Save current SP
|
||||
tst R4, #4
|
||||
subne SP, SP, #4 ; Adjust SP if not 8-byte aligned
|
||||
|
||||
/*
|
||||
VOID
|
||||
EFIAPI
|
||||
CommonCExceptionHandler (
|
||||
IN EFI_EXCEPTION_TYPE ExceptionType, R0
|
||||
IN OUT EFI_SYSTEM_CONTEXT SystemContext R1
|
||||
)
|
||||
|
||||
*/
|
||||
blx CommonCExceptionHandler ; Call exception handler
|
||||
|
||||
mov SP, R4 ; Restore SP
|
||||
|
||||
#if (FixedPcdGet32(PcdVFPEnabled))
|
||||
vpop {d0-d15}
|
||||
#endif
|
||||
|
||||
ldr R1, [SP, #0x4c] ; Restore EFI_SYSTEM_CONTEXT_ARM.IFSR
|
||||
mcr p15, 0, R1, c5, c0, 1 ; Write IFSR
|
||||
|
||||
ldr R1, [SP, #0x44] ; Restore EFI_SYSTEM_CONTEXT_ARM.DFSR
|
||||
mcr p15, 0, R1, c5, c0, 0 ; Write DFSR
|
||||
|
||||
ldr R1,[SP,#0x3c] ; EFI_SYSTEM_CONTEXT_ARM.PC
|
||||
str R1,[SP,#0x58] ; Store it back to srsfd stack slot so it can be restored
|
||||
|
||||
ldr R1,[SP,#0x40] ; EFI_SYSTEM_CONTEXT_ARM.CPSR
|
||||
str R1,[SP,#0x5c] ; Store it back to srsfd stack slot so it can be restored
|
||||
|
||||
add R3, SP, #0x54 ; Make R3 point to SVC LR saved on entry
|
||||
add R2, SP, #0x38 ; Make R2 point to EFI_SYSTEM_CONTEXT_ARM.LR
|
||||
and R1, R1, #0x1f ; Check to see if User or System Mode
|
||||
cmp R1, #0x1f ; if ((CPSR == 0x10) || (CPSR == 0x1f))
|
||||
cmpne R1, #0x10 ;
|
||||
ldmeqed R2, {lr}^ ; restore unbanked lr
|
||||
; else
|
||||
ldmneed R3, {lr} ; restore SVC lr, via ldmfd SP!, {LR}
|
||||
|
||||
ldmfd SP!,{R0-R12} ; Restore general purpose registers
|
||||
; Exception handler can not change SP
|
||||
|
||||
add SP,SP,#0x20 ; Clear out the remaining stack space
|
||||
ldmfd SP!,{LR} ; restore the link register for this context
|
||||
rfefd SP! ; return from exception via srsfd stack slot
|
||||
|
||||
END
|
||||
|
||||
|
@@ -43,8 +43,7 @@ ExceptionHandlersEnd (
|
||||
VOID
|
||||
);
|
||||
|
||||
RETURN_STATUS
|
||||
ArchVectorConfig (
|
||||
RETURN_STATUS ArchVectorConfig(
|
||||
IN UINTN VectorBaseAddress
|
||||
);
|
||||
|
||||
@@ -67,6 +66,7 @@ STATIC CONST BOOLEAN gArmRelocateVectorTable = TRUE;
|
||||
STATIC CONST BOOLEAN gArmRelocateVectorTable = FALSE;
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
Initializes all CPU exceptions entries and provides the default exception handlers.
|
||||
|
||||
@@ -96,10 +96,12 @@ InitializeCpuExceptionHandlers (
|
||||
|
||||
// if we are requested to copy exception handlers to another location
|
||||
if (gArmRelocateVectorTable) {
|
||||
|
||||
VectorBase = PcdGet64(PcdCpuVectorBaseAddress);
|
||||
Status = CopyExceptionHandlers(VectorBase);
|
||||
} else {
|
||||
// use VBAR to point to where our exception handlers are
|
||||
|
||||
}
|
||||
else { // use VBAR to point to where our exception handlers are
|
||||
|
||||
// The vector table must be aligned for the architecture. If this
|
||||
// assertion fails ensure the appropriate FFS alignment is in effect,
|
||||
@@ -178,11 +180,12 @@ CopyExceptionHandlers (
|
||||
//
|
||||
for (Index = 0; Index <= gMaxExceptionNumber; Index++) {
|
||||
if (!FeaturePcdGet(PcdDebuggerExceptionSupport) ||
|
||||
(gDebuggerExceptionHandlers[Index] == 0) || (gDebuggerExceptionHandlers[Index] == (VOID *)gDebuggerNoHandlerValue))
|
||||
{
|
||||
(gDebuggerExceptionHandlers[Index] == 0) || (gDebuggerExceptionHandlers[Index] == (VOID *)gDebuggerNoHandlerValue)) {
|
||||
|
||||
Status = RegisterExceptionHandler(Index, NULL);
|
||||
ASSERT_EFI_ERROR(Status);
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
// If the debugger has already hooked put its vector back
|
||||
VectorBase[Index] = (UINT32)(UINTN)gDebuggerExceptionHandlers[Index];
|
||||
}
|
||||
@@ -194,6 +197,7 @@ CopyExceptionHandlers (
|
||||
return RETURN_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Initializes all CPU interrupt/exceptions entries and provides the default interrupt/exception handlers.
|
||||
|
||||
@@ -303,8 +307,9 @@ CommonCExceptionHandler (
|
||||
gExceptionHandlers[ExceptionType](ExceptionType, SystemContext);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
DEBUG ((DEBUG_ERROR, "Unknown exception type %d\n", ExceptionType));
|
||||
}
|
||||
else {
|
||||
DEBUG((EFI_D_ERROR, "Unknown exception type %d\n", ExceptionType));
|
||||
ASSERT(FALSE);
|
||||
}
|
||||
|
||||
@@ -342,3 +347,4 @@ InitializeCpuExceptionHandlersEx (
|
||||
{
|
||||
return InitializeCpuExceptionHandlers (VectorInfo);
|
||||
}
|
||||
|
||||
|
@@ -33,6 +33,7 @@
|
||||
|
||||
[Sources.Arm]
|
||||
Arm/ArmException.c
|
||||
Arm/ExceptionSupport.asm | RVCT
|
||||
Arm/ExceptionSupport.S | GCC
|
||||
|
||||
[Sources.AARCH64]
|
||||
|
@@ -28,6 +28,7 @@
|
||||
|
||||
[Sources.Arm]
|
||||
Arm/ArmException.c
|
||||
Arm/ExceptionSupport.asm | RVCT
|
||||
Arm/ExceptionSupport.S | GCC
|
||||
|
||||
[Sources.AARCH64]
|
||||
|
@@ -71,6 +71,7 @@ ArmGenericTimerGetTimerVal (
|
||||
return ArmReadCntpTval ();
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
ArmGenericTimerSetTimerVal (
|
||||
|
@@ -71,6 +71,7 @@ ArmGenericTimerGetTimerVal (
|
||||
return ArmReadCntvTval ();
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
ArmGenericTimerSetTimerVal (
|
||||
|
@@ -38,7 +38,6 @@ ArmGicArchLibInitialize (
|
||||
ArmGicV3SetControlSystemRegisterEnable (IccSre | ICC_SRE_EL2_SRE);
|
||||
IccSre = ArmGicV3GetControlSystemRegisterEnable ();
|
||||
}
|
||||
|
||||
if (IccSre & ICC_SRE_EL2_SRE) {
|
||||
mGicArchRevision = ARM_GIC_ARCH_REVISION_3;
|
||||
goto Done;
|
||||
|
@@ -36,7 +36,6 @@ ArmGicGetSupportedArchRevision (
|
||||
ArmGicV3SetControlSystemRegisterEnable (IccSre | ICC_SRE_EL2_SRE);
|
||||
IccSre = ArmGicV3GetControlSystemRegisterEnable ();
|
||||
}
|
||||
|
||||
if (IccSre & ICC_SRE_EL2_SRE) {
|
||||
return ARM_GIC_ARCH_REVISION_3;
|
||||
}
|
||||
|
46
ArmPkg/Library/ArmHvcLib/Arm/ArmHvc.asm
Normal file
46
ArmPkg/Library/ArmHvcLib/Arm/ArmHvc.asm
Normal file
@@ -0,0 +1,46 @@
|
||||
//
|
||||
// Copyright (c) 2012-2014, ARM Limited. All rights reserved.
|
||||
// Copyright (c) 2014, Linaro Limited. All rights reserved.
|
||||
//
|
||||
// SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
//
|
||||
//
|
||||
|
||||
|
||||
INCLUDE AsmMacroExport.inc
|
||||
|
||||
RVCT_ASM_EXPORT ArmCallHvc
|
||||
push {r4-r8}
|
||||
// r0 will be popped just after the HVC call
|
||||
push {r0}
|
||||
|
||||
// Load the HVC arguments values into the appropriate registers
|
||||
ldr r7, [r0, #28]
|
||||
ldr r6, [r0, #24]
|
||||
ldr r5, [r0, #20]
|
||||
ldr r4, [r0, #16]
|
||||
ldr r3, [r0, #12]
|
||||
ldr r2, [r0, #8]
|
||||
ldr r1, [r0, #4]
|
||||
ldr r0, [r0, #0]
|
||||
|
||||
hvc #0
|
||||
|
||||
// Pop the ARM_HVC_ARGS structure address from the stack into r8
|
||||
pop {r8}
|
||||
|
||||
// Load the HVC returned values into the appropriate registers
|
||||
// A HVC call can return up to 4 values - we do not need to store back r4-r7.
|
||||
str r3, [r8, #12]
|
||||
str r2, [r8, #8]
|
||||
str r1, [r8, #4]
|
||||
str r0, [r8, #0]
|
||||
|
||||
mov r0, r8
|
||||
|
||||
// Restore the registers r4-r8
|
||||
pop {r4-r8}
|
||||
|
||||
bx lr
|
||||
|
||||
END
|
@@ -15,6 +15,7 @@
|
||||
LIBRARY_CLASS = ArmHvcLib
|
||||
|
||||
[Sources.ARM]
|
||||
Arm/ArmHvc.asm | RVCT
|
||||
Arm/ArmHvc.S | GCC
|
||||
|
||||
[Sources.AARCH64]
|
||||
@@ -23,3 +24,6 @@
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
ArmPkg/ArmPkg.dec
|
||||
|
||||
[BuildOptions]
|
||||
RVCT:*_*_ARM_PLATFORM_FLAGS == --cpu Cortex-A15
|
||||
|
@@ -11,9 +11,7 @@
|
||||
#ifndef AARCH64_LIB_H_
|
||||
#define AARCH64_LIB_H_
|
||||
|
||||
typedef VOID (*AARCH64_CACHE_OPERATION)(
|
||||
UINTN
|
||||
);
|
||||
typedef VOID (*AARCH64_CACHE_OPERATION)(UINTN);
|
||||
|
||||
VOID
|
||||
AArch64AllDataCachesOperation (
|
||||
@@ -55,3 +53,4 @@ ArmReadIdAA64Mmfr2 (
|
||||
);
|
||||
|
||||
#endif // AARCH64_LIB_H_
|
||||
|
||||
|
174
ArmPkg/Library/ArmLib/Arm/ArmLibSupport.asm
Normal file
174
ArmPkg/Library/ArmLib/Arm/ArmLibSupport.asm
Normal file
@@ -0,0 +1,174 @@
|
||||
//------------------------------------------------------------------------------
|
||||
//
|
||||
// Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
|
||||
// Copyright (c) 2011 - 2016, ARM Limited. All rights reserved.
|
||||
//
|
||||
// SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
INCLUDE AsmMacroIoLib.inc
|
||||
|
||||
|
||||
INCLUDE AsmMacroExport.inc
|
||||
|
||||
RVCT_ASM_EXPORT ArmReadMidr
|
||||
mrc p15,0,R0,c0,c0,0
|
||||
bx LR
|
||||
|
||||
RVCT_ASM_EXPORT ArmCacheInfo
|
||||
mrc p15,0,R0,c0,c0,1
|
||||
bx LR
|
||||
|
||||
RVCT_ASM_EXPORT ArmGetInterruptState
|
||||
mrs R0,CPSR
|
||||
tst R0,#0x80 // Check if IRQ is enabled.
|
||||
moveq R0,#1
|
||||
movne R0,#0
|
||||
bx LR
|
||||
|
||||
RVCT_ASM_EXPORT ArmGetFiqState
|
||||
mrs R0,CPSR
|
||||
tst R0,#0x40 // Check if FIQ is enabled.
|
||||
moveq R0,#1
|
||||
movne R0,#0
|
||||
bx LR
|
||||
|
||||
RVCT_ASM_EXPORT ArmSetDomainAccessControl
|
||||
mcr p15,0,r0,c3,c0,0
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT CPSRMaskInsert
|
||||
stmfd sp!, {r4-r12, lr} // save all the banked registers
|
||||
mov r3, sp // copy the stack pointer into a non-banked register
|
||||
mrs r2, cpsr // read the cpsr
|
||||
bic r2, r2, r0 // clear mask in the cpsr
|
||||
and r1, r1, r0 // clear bits outside the mask in the input
|
||||
orr r2, r2, r1 // set field
|
||||
msr cpsr_cxsf, r2 // write back cpsr (may have caused a mode switch)
|
||||
isb
|
||||
mov sp, r3 // restore stack pointer
|
||||
ldmfd sp!, {r4-r12, lr} // restore registers
|
||||
bx lr // return (hopefully thumb-safe!) // return (hopefully thumb-safe!)
|
||||
|
||||
RVCT_ASM_EXPORT CPSRRead
|
||||
mrs r0, cpsr
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmReadCpacr
|
||||
mrc p15, 0, r0, c1, c0, 2
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmWriteCpacr
|
||||
mcr p15, 0, r0, c1, c0, 2
|
||||
isb
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmWriteAuxCr
|
||||
mcr p15, 0, r0, c1, c0, 1
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmReadAuxCr
|
||||
mrc p15, 0, r0, c1, c0, 1
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmSetTTBR0
|
||||
mcr p15,0,r0,c2,c0,0
|
||||
isb
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmSetTTBCR
|
||||
mcr p15, 0, r0, c2, c0, 2
|
||||
isb
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmGetTTBR0BaseAddress
|
||||
mrc p15,0,r0,c2,c0,0
|
||||
MOV32 r1, 0xFFFFC000
|
||||
and r0, r0, r1
|
||||
isb
|
||||
bx lr
|
||||
|
||||
//
|
||||
//VOID
|
||||
//ArmUpdateTranslationTableEntry (
|
||||
// IN VOID *TranslationTableEntry // R0
|
||||
// IN VOID *MVA // R1
|
||||
// );
|
||||
RVCT_ASM_EXPORT ArmUpdateTranslationTableEntry
|
||||
mcr p15,0,R0,c7,c14,1 // DCCIMVAC Clean data cache by MVA
|
||||
dsb
|
||||
mcr p15,0,R1,c8,c7,1 // TLBIMVA TLB Invalidate MVA
|
||||
mcr p15,0,R9,c7,c5,6 // BPIALL Invalidate Branch predictor array. R9 == NoOp
|
||||
dsb
|
||||
isb
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmInvalidateTlb
|
||||
mov r0,#0
|
||||
mcr p15,0,r0,c8,c7,0
|
||||
mcr p15,0,R9,c7,c5,6 // BPIALL Invalidate Branch predictor array. R9 == NoOp
|
||||
dsb
|
||||
isb
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmReadScr
|
||||
mrc p15, 0, r0, c1, c1, 0
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmWriteScr
|
||||
mcr p15, 0, r0, c1, c1, 0
|
||||
isb
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmReadHVBar
|
||||
mrc p15, 4, r0, c12, c0, 0
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmWriteHVBar
|
||||
mcr p15, 4, r0, c12, c0, 0
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmReadMVBar
|
||||
mrc p15, 0, r0, c12, c0, 1
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmWriteMVBar
|
||||
mcr p15, 0, r0, c12, c0, 1
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmCallWFE
|
||||
wfe
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmCallSEV
|
||||
sev
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmReadSctlr
|
||||
mrc p15, 0, r0, c1, c0, 0 // Read SCTLR into R0 (Read control register configuration data)
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmWriteSctlr
|
||||
mcr p15, 0, r0, c1, c0, 0
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmReadCpuActlr
|
||||
mrc p15, 0, r0, c1, c0, 1
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmWriteCpuActlr
|
||||
mcr p15, 0, r0, c1, c0, 1
|
||||
dsb
|
||||
isb
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmGetPhysicalAddressBits
|
||||
mrc p15, 0, r0, c0, c1, 4 ; MMFR0
|
||||
and r0, r0, #0xf ; VMSA [3:0]
|
||||
cmp r0, #5 ; >= 5 implies LPAE support
|
||||
movlt r0, #32 ; 32 bits if no LPAE
|
||||
movge r0, #40 ; 40 bits if LPAE
|
||||
bx lr
|
||||
|
||||
END
|
107
ArmPkg/Library/ArmLib/Arm/ArmLibSupportV7.asm
Normal file
107
ArmPkg/Library/ArmLib/Arm/ArmLibSupportV7.asm
Normal file
@@ -0,0 +1,107 @@
|
||||
//------------------------------------------------------------------------------
|
||||
//
|
||||
// Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
|
||||
// Copyright (c) 2011-2013, ARM Limited. All rights reserved.
|
||||
//
|
||||
// SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
INCLUDE AsmMacroExport.inc
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
RVCT_ASM_EXPORT ArmIsMpCore
|
||||
mrc p15,0,R0,c0,c0,5
|
||||
// Get Multiprocessing extension (bit31) & U bit (bit30)
|
||||
and R0, R0, #0xC0000000
|
||||
// if (bit31 == 1) && (bit30 == 0) then the processor is part of a multiprocessor system
|
||||
cmp R0, #0x80000000
|
||||
moveq R0, #1
|
||||
movne R0, #0
|
||||
bx LR
|
||||
|
||||
RVCT_ASM_EXPORT ArmEnableAsynchronousAbort
|
||||
cpsie a
|
||||
isb
|
||||
bx LR
|
||||
|
||||
RVCT_ASM_EXPORT ArmDisableAsynchronousAbort
|
||||
cpsid a
|
||||
isb
|
||||
bx LR
|
||||
|
||||
RVCT_ASM_EXPORT ArmEnableIrq
|
||||
cpsie i
|
||||
isb
|
||||
bx LR
|
||||
|
||||
RVCT_ASM_EXPORT ArmDisableIrq
|
||||
cpsid i
|
||||
isb
|
||||
bx LR
|
||||
|
||||
RVCT_ASM_EXPORT ArmEnableFiq
|
||||
cpsie f
|
||||
isb
|
||||
bx LR
|
||||
|
||||
RVCT_ASM_EXPORT ArmDisableFiq
|
||||
cpsid f
|
||||
isb
|
||||
bx LR
|
||||
|
||||
RVCT_ASM_EXPORT ArmEnableInterrupts
|
||||
cpsie if
|
||||
isb
|
||||
bx LR
|
||||
|
||||
RVCT_ASM_EXPORT ArmDisableInterrupts
|
||||
cpsid if
|
||||
isb
|
||||
bx LR
|
||||
|
||||
RVCT_ASM_EXPORT ArmReadIdMmfr4
|
||||
mrc p15,0,r0,c0,c2,6 ; Read ID_MMFR4 Register
|
||||
bx LR
|
||||
|
||||
// UINTN
|
||||
// ReadCCSIDR (
|
||||
// IN UINT32 CSSELR
|
||||
// )
|
||||
RVCT_ASM_EXPORT ReadCCSIDR
|
||||
mcr p15,2,r0,c0,c0,0 ; Write Cache Size Selection Register (CSSELR)
|
||||
isb
|
||||
mrc p15,1,r0,c0,c0,0 ; Read current CP15 Cache Size ID Register (CCSIDR)
|
||||
bx lr
|
||||
|
||||
// UINT32
|
||||
// ReadCCSIDR2 (
|
||||
// IN UINT32 CSSELR
|
||||
// )
|
||||
RVCT_ASM_EXPORT ReadCCSIDR2
|
||||
mcr p15,2,r0,c0,c0,0 ; Write Cache Size Selection Register (CSSELR)
|
||||
isb
|
||||
mrc p15,1,r0,c0,c0,2 ; Read current CP15 Cache Size ID Register (CCSIDR2)
|
||||
bx lr
|
||||
|
||||
// UINT32
|
||||
// ReadCLIDR (
|
||||
// IN UINT32 CSSELR
|
||||
// )
|
||||
RVCT_ASM_EXPORT ReadCLIDR
|
||||
mrc p15,1,r0,c0,c0,1 ; Read CP15 Cache Level ID Register
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmReadNsacr
|
||||
mrc p15, 0, r0, c1, c1, 2
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmWriteNsacr
|
||||
mcr p15, 0, r0, c1, c1, 2
|
||||
bx lr
|
||||
|
||||
END
|
93
ArmPkg/Library/ArmLib/Arm/ArmV7ArchTimerSupport.asm
Normal file
93
ArmPkg/Library/ArmLib/Arm/ArmV7ArchTimerSupport.asm
Normal file
@@ -0,0 +1,93 @@
|
||||
//------------------------------------------------------------------------------
|
||||
//
|
||||
// Copyright (c) 2011, ARM Limited. All rights reserved.
|
||||
//
|
||||
// SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
INCLUDE AsmMacroExport.inc
|
||||
PRESERVE8
|
||||
|
||||
RVCT_ASM_EXPORT ArmReadCntFrq
|
||||
mrc p15, 0, r0, c14, c0, 0 ; Read CNTFRQ
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmWriteCntFrq
|
||||
mcr p15, 0, r0, c14, c0, 0 ; Write to CNTFRQ
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmReadCntPct
|
||||
mrrc p15, 0, r0, r1, c14 ; Read CNTPT (Physical counter register)
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmReadCntkCtl
|
||||
mrc p15, 0, r0, c14, c1, 0 ; Read CNTK_CTL (Timer PL1 Control Register)
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmWriteCntkCtl
|
||||
mcr p15, 0, r0, c14, c1, 0 ; Write to CNTK_CTL (Timer PL1 Control Register)
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmReadCntpTval
|
||||
mrc p15, 0, r0, c14, c2, 0 ; Read CNTP_TVAL (PL1 physical timer value register)
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmWriteCntpTval
|
||||
mcr p15, 0, r0, c14, c2, 0 ; Write to CNTP_TVAL (PL1 physical timer value register)
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmReadCntpCtl
|
||||
mrc p15, 0, r0, c14, c2, 1 ; Read CNTP_CTL (PL1 Physical Timer Control Register)
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmWriteCntpCtl
|
||||
mcr p15, 0, r0, c14, c2, 1 ; Write to CNTP_CTL (PL1 Physical Timer Control Register)
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmReadCntvTval
|
||||
mrc p15, 0, r0, c14, c3, 0 ; Read CNTV_TVAL (Virtual Timer Value register)
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmWriteCntvTval
|
||||
mcr p15, 0, r0, c14, c3, 0 ; Write to CNTV_TVAL (Virtual Timer Value register)
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmReadCntvCtl
|
||||
mrc p15, 0, r0, c14, c3, 1 ; Read CNTV_CTL (Virtual Timer Control Register)
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmWriteCntvCtl
|
||||
mcr p15, 0, r0, c14, c3, 1 ; Write to CNTV_CTL (Virtual Timer Control Register)
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmReadCntvCt
|
||||
mrrc p15, 1, r0, r1, c14 ; Read CNTVCT (Virtual Count Register)
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmReadCntpCval
|
||||
mrrc p15, 2, r0, r1, c14 ; Read CNTP_CTVAL (Physical Timer Compare Value Register)
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmWriteCntpCval
|
||||
mcrr p15, 2, r0, r1, c14 ; Write to CNTP_CTVAL (Physical Timer Compare Value Register)
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmReadCntvCval
|
||||
mrrc p15, 3, r0, r1, c14 ; Read CNTV_CTVAL (Virtual Timer Compare Value Register)
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmWriteCntvCval
|
||||
mcrr p15, 3, r0, r1, c14 ; write to CNTV_CTVAL (Virtual Timer Compare Value Register)
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmReadCntvOff
|
||||
mrrc p15, 4, r0, r1, c14 ; Read CNTVOFF (virtual Offset register)
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmWriteCntvOff
|
||||
mcrr p15, 4, r0, r1, c14 ; Write to CNTVOFF (Virtual Offset register)
|
||||
bx lr
|
||||
|
||||
END
|
@@ -23,9 +23,7 @@
|
||||
#define ID_MMFR0_SHR_IMP_HW_COHERENT 1
|
||||
#define ID_MMFR0_SHR_IGNORED 0xf
|
||||
|
||||
typedef VOID (*ARM_V7_CACHE_OPERATION)(
|
||||
UINT32
|
||||
);
|
||||
typedef VOID (*ARM_V7_CACHE_OPERATION)(UINT32);
|
||||
|
||||
VOID
|
||||
ArmV7AllDataCachesOperation (
|
||||
@@ -67,3 +65,4 @@ ArmReadIdPfr1 (
|
||||
);
|
||||
|
||||
#endif // ARM_V7_LIB_H_
|
||||
|
||||
|
292
ArmPkg/Library/ArmLib/Arm/ArmV7Support.asm
Normal file
292
ArmPkg/Library/ArmLib/Arm/ArmV7Support.asm
Normal file
@@ -0,0 +1,292 @@
|
||||
//------------------------------------------------------------------------------
|
||||
//
|
||||
// Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
|
||||
// Copyright (c) 2011 - 2014, ARM Limited. All rights reserved.
|
||||
//
|
||||
// SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
INCLUDE AsmMacroExport.inc
|
||||
PRESERVE8
|
||||
|
||||
DC_ON EQU ( 0x1:SHL:2 )
|
||||
IC_ON EQU ( 0x1:SHL:12 )
|
||||
CTRL_M_BIT EQU (1 << 0)
|
||||
CTRL_C_BIT EQU (1 << 2)
|
||||
CTRL_B_BIT EQU (1 << 7)
|
||||
CTRL_I_BIT EQU (1 << 12)
|
||||
|
||||
|
||||
RVCT_ASM_EXPORT ArmInvalidateDataCacheEntryByMVA
|
||||
mcr p15, 0, r0, c7, c6, 1 ; invalidate single data cache line
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmCleanDataCacheEntryByMVA
|
||||
mcr p15, 0, r0, c7, c10, 1 ; clean single data cache line
|
||||
bx lr
|
||||
|
||||
|
||||
RVCT_ASM_EXPORT ArmInvalidateInstructionCacheEntryToPoUByMVA
|
||||
mcr p15, 0, r0, c7, c5, 1 ; invalidate single instruction cache line to PoU
|
||||
mcr p15, 0, r0, c7, c5, 7 ; invalidate branch predictor
|
||||
bx lr
|
||||
|
||||
|
||||
RVCT_ASM_EXPORT ArmCleanDataCacheEntryToPoUByMVA
|
||||
mcr p15, 0, r0, c7, c11, 1 ; clean single data cache line to PoU
|
||||
bx lr
|
||||
|
||||
|
||||
RVCT_ASM_EXPORT ArmCleanInvalidateDataCacheEntryByMVA
|
||||
mcr p15, 0, r0, c7, c14, 1 ; clean and invalidate single data cache line
|
||||
bx lr
|
||||
|
||||
|
||||
RVCT_ASM_EXPORT ArmInvalidateDataCacheEntryBySetWay
|
||||
mcr p15, 0, r0, c7, c6, 2 ; Invalidate this line
|
||||
bx lr
|
||||
|
||||
|
||||
RVCT_ASM_EXPORT ArmCleanInvalidateDataCacheEntryBySetWay
|
||||
mcr p15, 0, r0, c7, c14, 2 ; Clean and Invalidate this line
|
||||
bx lr
|
||||
|
||||
|
||||
RVCT_ASM_EXPORT ArmCleanDataCacheEntryBySetWay
|
||||
mcr p15, 0, r0, c7, c10, 2 ; Clean this line
|
||||
bx lr
|
||||
|
||||
|
||||
RVCT_ASM_EXPORT ArmInvalidateInstructionCache
|
||||
mcr p15,0,R0,c7,c5,0 ;Invalidate entire instruction cache
|
||||
isb
|
||||
bx LR
|
||||
|
||||
RVCT_ASM_EXPORT ArmEnableMmu
|
||||
mrc p15,0,R0,c1,c0,0 ; Read SCTLR into R0 (Read control register configuration data)
|
||||
orr R0,R0,#1 ; Set SCTLR.M bit : Enable MMU
|
||||
mcr p15,0,R0,c1,c0,0 ; Write R0 into SCTLR (Write control register configuration data)
|
||||
dsb
|
||||
isb
|
||||
bx LR
|
||||
|
||||
RVCT_ASM_EXPORT ArmDisableMmu
|
||||
mrc p15,0,R0,c1,c0,0 ; Read SCTLR into R0 (Read control register configuration data)
|
||||
bic R0,R0,#1 ; Clear SCTLR.M bit : Disable MMU
|
||||
mcr p15,0,R0,c1,c0,0 ; Write R0 into SCTLR (Write control register configuration data)
|
||||
|
||||
mcr p15,0,R0,c8,c7,0 ; TLBIALL : Invalidate unified TLB
|
||||
mcr p15,0,R0,c7,c5,6 ; BPIALL : Invalidate entire branch predictor array
|
||||
dsb
|
||||
isb
|
||||
bx LR
|
||||
|
||||
RVCT_ASM_EXPORT ArmDisableCachesAndMmu
|
||||
mrc p15, 0, r0, c1, c0, 0 ; Get control register
|
||||
bic r0, r0, #CTRL_M_BIT ; Disable MMU
|
||||
bic r0, r0, #CTRL_C_BIT ; Disable D Cache
|
||||
bic r0, r0, #CTRL_I_BIT ; Disable I Cache
|
||||
mcr p15, 0, r0, c1, c0, 0 ; Write control register
|
||||
dsb
|
||||
isb
|
||||
bx LR
|
||||
|
||||
RVCT_ASM_EXPORT ArmMmuEnabled
|
||||
mrc p15,0,R0,c1,c0,0 ; Read SCTLR into R0 (Read control register configuration data)
|
||||
and R0,R0,#1
|
||||
bx LR
|
||||
|
||||
RVCT_ASM_EXPORT ArmEnableDataCache
|
||||
ldr R1,=DC_ON ; Specify SCTLR.C bit : (Data) Cache enable bit
|
||||
mrc p15,0,R0,c1,c0,0 ; Read SCTLR into R0 (Read control register configuration data)
|
||||
orr R0,R0,R1 ; Set SCTLR.C bit : Data and unified caches enabled
|
||||
mcr p15,0,R0,c1,c0,0 ; Write R0 into SCTLR (Write control register configuration data)
|
||||
dsb
|
||||
isb
|
||||
bx LR
|
||||
|
||||
RVCT_ASM_EXPORT ArmDisableDataCache
|
||||
ldr R1,=DC_ON ; Specify SCTLR.C bit : (Data) Cache enable bit
|
||||
mrc p15,0,R0,c1,c0,0 ; Read SCTLR into R0 (Read control register configuration data)
|
||||
bic R0,R0,R1 ; Clear SCTLR.C bit : Data and unified caches disabled
|
||||
mcr p15,0,R0,c1,c0,0 ; Write R0 into SCTLR (Write control register configuration data)
|
||||
dsb
|
||||
isb
|
||||
bx LR
|
||||
|
||||
RVCT_ASM_EXPORT ArmEnableInstructionCache
|
||||
ldr R1,=IC_ON ; Specify SCTLR.I bit : Instruction cache enable bit
|
||||
mrc p15,0,R0,c1,c0,0 ; Read SCTLR into R0 (Read control register configuration data)
|
||||
orr R0,R0,R1 ; Set SCTLR.I bit : Instruction caches enabled
|
||||
mcr p15,0,R0,c1,c0,0 ; Write R0 into SCTLR (Write control register configuration data)
|
||||
dsb
|
||||
isb
|
||||
bx LR
|
||||
|
||||
RVCT_ASM_EXPORT ArmDisableInstructionCache
|
||||
ldr R1,=IC_ON ; Specify SCTLR.I bit : Instruction cache enable bit
|
||||
mrc p15,0,R0,c1,c0,0 ; Read SCTLR into R0 (Read control register configuration data)
|
||||
BIC R0,R0,R1 ; Clear SCTLR.I bit : Instruction caches disabled
|
||||
mcr p15,0,R0,c1,c0,0 ; Write R0 into SCTLR (Write control register configuration data)
|
||||
isb
|
||||
bx LR
|
||||
|
||||
RVCT_ASM_EXPORT ArmEnableSWPInstruction
|
||||
mrc p15, 0, r0, c1, c0, 0
|
||||
orr r0, r0, #0x00000400
|
||||
mcr p15, 0, r0, c1, c0, 0
|
||||
isb
|
||||
bx LR
|
||||
|
||||
RVCT_ASM_EXPORT ArmEnableBranchPrediction
|
||||
mrc p15, 0, r0, c1, c0, 0 ; Read SCTLR into R0 (Read control register configuration data)
|
||||
orr r0, r0, #0x00000800 ;
|
||||
mcr p15, 0, r0, c1, c0, 0 ; Write R0 into SCTLR (Write control register configuration data)
|
||||
dsb
|
||||
isb
|
||||
bx LR
|
||||
|
||||
RVCT_ASM_EXPORT ArmDisableBranchPrediction
|
||||
mrc p15, 0, r0, c1, c0, 0 ; Read SCTLR into R0 (Read control register configuration data)
|
||||
bic r0, r0, #0x00000800 ;
|
||||
mcr p15, 0, r0, c1, c0, 0 ; Write R0 into SCTLR (Write control register configuration data)
|
||||
dsb
|
||||
isb
|
||||
bx LR
|
||||
|
||||
RVCT_ASM_EXPORT ArmSetLowVectors
|
||||
mrc p15, 0, r0, c1, c0, 0 ; Read SCTLR into R0 (Read control register configuration data)
|
||||
bic r0, r0, #0x00002000 ; clear V bit
|
||||
mcr p15, 0, r0, c1, c0, 0 ; Write R0 into SCTLR (Write control register configuration data)
|
||||
isb
|
||||
bx LR
|
||||
|
||||
RVCT_ASM_EXPORT ArmSetHighVectors
|
||||
mrc p15, 0, r0, c1, c0, 0 ; Read SCTLR into R0 (Read control register configuration data)
|
||||
orr r0, r0, #0x00002000 ; Set V bit
|
||||
mcr p15, 0, r0, c1, c0, 0 ; Write R0 into SCTLR (Write control register configuration data)
|
||||
isb
|
||||
bx LR
|
||||
|
||||
RVCT_ASM_EXPORT ArmV7AllDataCachesOperation
|
||||
stmfd SP!,{r4-r12, LR}
|
||||
mov R1, R0 ; Save Function call in R1
|
||||
mrc p15, 1, R6, c0, c0, 1 ; Read CLIDR
|
||||
ands R3, R6, #&7000000 ; Mask out all but Level of Coherency (LoC)
|
||||
mov R3, R3, LSR #23 ; Cache level value (naturally aligned)
|
||||
beq Finished
|
||||
mov R10, #0
|
||||
|
||||
Loop1
|
||||
add R2, R10, R10, LSR #1 ; Work out 3xcachelevel
|
||||
mov R12, R6, LSR R2 ; bottom 3 bits are the Cache type for this level
|
||||
and R12, R12, #7 ; get those 3 bits alone
|
||||
cmp R12, #2
|
||||
blt Skip ; no cache or only instruction cache at this level
|
||||
mcr p15, 2, R10, c0, c0, 0 ; write the Cache Size selection register (CSSELR) // OR in 1 for Instruction
|
||||
isb ; isb to sync the change to the CacheSizeID reg
|
||||
mrc p15, 1, R12, c0, c0, 0 ; reads current Cache Size ID register (CCSIDR)
|
||||
and R2, R12, #&7 ; extract the line length field
|
||||
add R2, R2, #4 ; add 4 for the line length offset (log2 16 bytes)
|
||||
ldr R4, =0x3FF
|
||||
ands R4, R4, R12, LSR #3 ; R4 is the max number on the way size (right aligned)
|
||||
clz R5, R4 ; R5 is the bit position of the way size increment
|
||||
ldr R7, =0x00007FFF
|
||||
ands R7, R7, R12, LSR #13 ; R7 is the max number of the index size (right aligned)
|
||||
|
||||
Loop2
|
||||
mov R9, R4 ; R9 working copy of the max way size (right aligned)
|
||||
|
||||
Loop3
|
||||
orr R0, R10, R9, LSL R5 ; factor in the way number and cache number into R11
|
||||
orr R0, R0, R7, LSL R2 ; factor in the index number
|
||||
|
||||
blx R1
|
||||
|
||||
subs R9, R9, #1 ; decrement the way number
|
||||
bge Loop3
|
||||
subs R7, R7, #1 ; decrement the index
|
||||
bge Loop2
|
||||
Skip
|
||||
add R10, R10, #2 ; increment the cache number
|
||||
cmp R3, R10
|
||||
bgt Loop1
|
||||
|
||||
Finished
|
||||
dsb
|
||||
ldmfd SP!, {r4-r12, lr}
|
||||
bx LR
|
||||
|
||||
RVCT_ASM_EXPORT ArmDataMemoryBarrier
|
||||
dmb
|
||||
bx LR
|
||||
|
||||
RVCT_ASM_EXPORT ArmDataSynchronizationBarrier
|
||||
dsb
|
||||
bx LR
|
||||
|
||||
RVCT_ASM_EXPORT ArmInstructionSynchronizationBarrier
|
||||
isb
|
||||
bx LR
|
||||
|
||||
RVCT_ASM_EXPORT ArmReadVBar
|
||||
// Set the Address of the Vector Table in the VBAR register
|
||||
mrc p15, 0, r0, c12, c0, 0
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmWriteVBar
|
||||
// Set the Address of the Vector Table in the VBAR register
|
||||
mcr p15, 0, r0, c12, c0, 0
|
||||
// Ensure the SCTLR.V bit is clear
|
||||
mrc p15, 0, r0, c1, c0, 0 ; Read SCTLR into R0 (Read control register configuration data)
|
||||
bic r0, r0, #0x00002000 ; clear V bit
|
||||
mcr p15, 0, r0, c1, c0, 0 ; Write R0 into SCTLR (Write control register configuration data)
|
||||
isb
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmEnableVFP
|
||||
// Read CPACR (Coprocessor Access Control Register)
|
||||
mrc p15, 0, r0, c1, c0, 2
|
||||
// Enable VPF access (Full Access to CP10, CP11) (V* instructions)
|
||||
orr r0, r0, #0x00f00000
|
||||
// Write back CPACR (Coprocessor Access Control Register)
|
||||
mcr p15, 0, r0, c1, c0, 2
|
||||
isb
|
||||
// Set EN bit in FPEXC. The Advanced SIMD and VFP extensions are enabled and operate normally.
|
||||
mov r0, #0x40000000
|
||||
mcr p10,#0x7,r0,c8,c0,#0
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmCallWFI
|
||||
wfi
|
||||
bx lr
|
||||
|
||||
//Note: Return 0 in Uniprocessor implementation
|
||||
RVCT_ASM_EXPORT ArmReadCbar
|
||||
mrc p15, 4, r0, c15, c0, 0 //Read Configuration Base Address Register
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmReadMpidr
|
||||
mrc p15, 0, r0, c0, c0, 5 ; read MPIDR
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmReadTpidrurw
|
||||
mrc p15, 0, r0, c13, c0, 2 ; read TPIDRURW
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmWriteTpidrurw
|
||||
mcr p15, 0, r0, c13, c0, 2 ; write TPIDRURW
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmIsArchTimerImplemented
|
||||
mrc p15, 0, r0, c0, c1, 1 ; Read ID_PFR1
|
||||
and r0, r0, #0x000F0000
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmReadIdPfr1
|
||||
mrc p15, 0, r0, c0, c1, 1 ; Read ID_PFR1 Register
|
||||
bx lr
|
||||
|
||||
END
|
@@ -30,6 +30,11 @@
|
||||
Arm/ArmV7Support.S | GCC
|
||||
Arm/ArmV7ArchTimerSupport.S | GCC
|
||||
|
||||
Arm/ArmLibSupport.asm | RVCT
|
||||
Arm/ArmLibSupportV7.asm | RVCT
|
||||
Arm/ArmV7Support.asm | RVCT
|
||||
Arm/ArmV7ArchTimerSupport.asm | RVCT
|
||||
|
||||
[Sources.AARCH64]
|
||||
AArch64/AArch64Lib.h
|
||||
AArch64/AArch64Lib.c
|
||||
|
@@ -47,13 +47,12 @@ ArmMemoryAttributeToPageAttribute (
|
||||
ASSERT (0);
|
||||
case ARM_MEMORY_REGION_ATTRIBUTE_DEVICE:
|
||||
case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_DEVICE:
|
||||
if (ArmReadCurrentEL () == AARCH64_EL2) {
|
||||
if (ArmReadCurrentEL () == AARCH64_EL2)
|
||||
return TT_ATTR_INDX_DEVICE_MEMORY | TT_XN_MASK;
|
||||
} else {
|
||||
else
|
||||
return TT_ATTR_INDX_DEVICE_MEMORY | TT_UXN_MASK | TT_PXN_MASK;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#define MIN_T0SZ 16
|
||||
#define BITS_PER_LEVEL 9
|
||||
@@ -108,15 +107,12 @@ FreePageTablesRecursive (
|
||||
if (Level < 3) {
|
||||
for (Index = 0; Index < TT_ENTRY_COUNT; Index++) {
|
||||
if ((TranslationTable[Index] & TT_TYPE_MASK) == TT_TYPE_TABLE_ENTRY) {
|
||||
FreePageTablesRecursive (
|
||||
(VOID *)(UINTN)(TranslationTable[Index] &
|
||||
FreePageTablesRecursive ((VOID *)(UINTN)(TranslationTable[Index] &
|
||||
TT_ADDRESS_MASK_BLOCK_ENTRY),
|
||||
Level + 1
|
||||
);
|
||||
Level + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
FreePages (TranslationTable, 1);
|
||||
}
|
||||
|
||||
@@ -130,7 +126,6 @@ IsBlockEntry (
|
||||
if (Level == 3) {
|
||||
return (Entry & TT_TYPE_MASK) == TT_TYPE_BLOCK_ENTRY_LEVEL3;
|
||||
}
|
||||
|
||||
return (Entry & TT_TYPE_MASK) == TT_TYPE_BLOCK_ENTRY;
|
||||
}
|
||||
|
||||
@@ -148,7 +143,6 @@ IsTableEntry (
|
||||
//
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return (Entry & TT_TYPE_MASK) == TT_TYPE_TABLE_ENTRY;
|
||||
}
|
||||
|
||||
@@ -176,16 +170,8 @@ UpdateRegionMappingRecursive (
|
||||
BlockShift = (Level + 1) * BITS_PER_LEVEL + MIN_T0SZ;
|
||||
BlockMask = MAX_UINT64 >> BlockShift;
|
||||
|
||||
DEBUG ((
|
||||
DEBUG_VERBOSE,
|
||||
"%a(%d): %llx - %llx set %lx clr %lx\n",
|
||||
__FUNCTION__,
|
||||
Level,
|
||||
RegionStart,
|
||||
RegionEnd,
|
||||
AttributeSetMask,
|
||||
AttributeClearMask
|
||||
));
|
||||
DEBUG ((DEBUG_VERBOSE, "%a(%d): %llx - %llx set %lx clr %lx\n", __FUNCTION__,
|
||||
Level, RegionStart, RegionEnd, AttributeSetMask, AttributeClearMask));
|
||||
|
||||
for (; RegionStart < RegionEnd; RegionStart = BlockEnd) {
|
||||
BlockEnd = MIN (RegionEnd, (RegionStart | BlockMask) + 1);
|
||||
@@ -201,9 +187,8 @@ UpdateRegionMappingRecursive (
|
||||
// we cannot replace it with a block entry without potentially losing
|
||||
// attribute information, so keep the table entry in that case.
|
||||
//
|
||||
if ((Level == 0) || (((RegionStart | BlockEnd) & BlockMask) != 0) ||
|
||||
(IsTableEntry (*Entry, Level) && (AttributeClearMask != 0)))
|
||||
{
|
||||
if (Level == 0 || ((RegionStart | BlockEnd) & BlockMask) != 0 ||
|
||||
(IsTableEntry (*Entry, Level) && AttributeClearMask != 0)) {
|
||||
ASSERT (Level < 3);
|
||||
|
||||
if (!IsTableEntry (*Entry, Level)) {
|
||||
@@ -231,14 +216,9 @@ UpdateRegionMappingRecursive (
|
||||
// We are splitting an existing block entry, so we have to populate
|
||||
// the new table with the attributes of the block entry it replaces.
|
||||
//
|
||||
Status = UpdateRegionMappingRecursive (
|
||||
RegionStart & ~BlockMask,
|
||||
(RegionStart | BlockMask) + 1,
|
||||
*Entry & TT_ATTRIBUTES_MASK,
|
||||
0,
|
||||
TranslationTable,
|
||||
Level + 1
|
||||
);
|
||||
Status = UpdateRegionMappingRecursive (RegionStart & ~BlockMask,
|
||||
(RegionStart | BlockMask) + 1, *Entry & TT_ATTRIBUTES_MASK,
|
||||
0, TranslationTable, Level + 1);
|
||||
if (EFI_ERROR (Status)) {
|
||||
//
|
||||
// The range we passed to UpdateRegionMappingRecursive () is block
|
||||
@@ -256,14 +236,9 @@ UpdateRegionMappingRecursive (
|
||||
//
|
||||
// Recurse to the next level
|
||||
//
|
||||
Status = UpdateRegionMappingRecursive (
|
||||
RegionStart,
|
||||
BlockEnd,
|
||||
AttributeSetMask,
|
||||
AttributeClearMask,
|
||||
TranslationTable,
|
||||
Level + 1
|
||||
);
|
||||
Status = UpdateRegionMappingRecursive (RegionStart, BlockEnd,
|
||||
AttributeSetMask, AttributeClearMask, TranslationTable,
|
||||
Level + 1);
|
||||
if (EFI_ERROR (Status)) {
|
||||
if (!IsTableEntry (*Entry, Level)) {
|
||||
//
|
||||
@@ -275,18 +250,13 @@ UpdateRegionMappingRecursive (
|
||||
//
|
||||
FreePageTablesRecursive (TranslationTable, Level + 1);
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
if (!IsTableEntry (*Entry, Level)) {
|
||||
EntryValue = (UINTN)TranslationTable | TT_TYPE_TABLE_ENTRY;
|
||||
ReplaceTableEntry (
|
||||
Entry,
|
||||
EntryValue,
|
||||
RegionStart,
|
||||
IsBlockEntry (*Entry, Level)
|
||||
);
|
||||
ReplaceTableEntry (Entry, EntryValue, RegionStart,
|
||||
IsBlockEntry (*Entry, Level));
|
||||
}
|
||||
} else {
|
||||
EntryValue = (*Entry & AttributeClearMask) | AttributeSetMask;
|
||||
@@ -310,7 +280,6 @@ UpdateRegionMappingRecursive (
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -331,14 +300,9 @@ UpdateRegionMapping (
|
||||
|
||||
T0SZ = ArmGetTCR () & TCR_T0SZ_MASK;
|
||||
|
||||
return UpdateRegionMappingRecursive (
|
||||
RegionStart,
|
||||
RegionStart + RegionLength,
|
||||
AttributeSetMask,
|
||||
AttributeClearMask,
|
||||
ArmGetTTBR0BaseAddress (),
|
||||
GetRootTableLevel (T0SZ)
|
||||
);
|
||||
return UpdateRegionMappingRecursive (RegionStart, RegionStart + RegionLength,
|
||||
AttributeSetMask, AttributeClearMask, ArmGetTTBR0BaseAddress (),
|
||||
GetRootTableLevel (T0SZ));
|
||||
}
|
||||
|
||||
STATIC
|
||||
@@ -382,9 +346,8 @@ GcdAttributeToPageAttribute (
|
||||
break;
|
||||
}
|
||||
|
||||
if (((GcdAttributes & EFI_MEMORY_XP) != 0) ||
|
||||
((GcdAttributes & EFI_MEMORY_CACHETYPE_MASK) == EFI_MEMORY_UC))
|
||||
{
|
||||
if ((GcdAttributes & EFI_MEMORY_XP) != 0 ||
|
||||
(GcdAttributes & EFI_MEMORY_CACHETYPE_MASK) == EFI_MEMORY_UC) {
|
||||
if (ArmReadCurrentEL () == AARCH64_EL2) {
|
||||
PageAttributes |= TT_XN_MASK;
|
||||
} else {
|
||||
@@ -393,7 +356,7 @@ GcdAttributeToPageAttribute (
|
||||
}
|
||||
|
||||
if ((GcdAttributes & EFI_MEMORY_RO) != 0) {
|
||||
PageAttributes |= TT_AP_NO_RO;
|
||||
PageAttributes |= TT_AP_RO_RO;
|
||||
}
|
||||
|
||||
return PageAttributes | TT_AF;
|
||||
@@ -422,12 +385,8 @@ ArmSetMemoryAttributes (
|
||||
TT_PXN_MASK | TT_XN_MASK);
|
||||
}
|
||||
|
||||
return UpdateRegionMapping (
|
||||
BaseAddress,
|
||||
Length,
|
||||
PageAttributes,
|
||||
PageAttributeMask
|
||||
);
|
||||
return UpdateRegionMapping (BaseAddress, Length, PageAttributes,
|
||||
PageAttributeMask);
|
||||
}
|
||||
|
||||
STATIC
|
||||
@@ -460,8 +419,7 @@ ArmSetMemoryRegionNoExec (
|
||||
BaseAddress,
|
||||
Length,
|
||||
Val,
|
||||
~TT_ADDRESS_MASK_BLOCK_ENTRY
|
||||
);
|
||||
~TT_ADDRESS_MASK_BLOCK_ENTRY);
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
@@ -479,8 +437,7 @@ ArmClearMemoryRegionNoExec (
|
||||
BaseAddress,
|
||||
Length,
|
||||
0,
|
||||
Mask
|
||||
);
|
||||
Mask);
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
@@ -492,9 +449,8 @@ ArmSetMemoryRegionReadOnly (
|
||||
return SetMemoryRegionAttribute (
|
||||
BaseAddress,
|
||||
Length,
|
||||
TT_AP_NO_RO,
|
||||
~TT_ADDRESS_MASK_BLOCK_ENTRY
|
||||
);
|
||||
TT_AP_RO_RO,
|
||||
~TT_ADDRESS_MASK_BLOCK_ENTRY);
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
@@ -506,9 +462,8 @@ ArmClearMemoryRegionReadOnly (
|
||||
return SetMemoryRegionAttribute (
|
||||
BaseAddress,
|
||||
Length,
|
||||
TT_AP_NO_RW,
|
||||
~(TT_ADDRESS_MASK_BLOCK_ENTRY | TT_AP_MASK)
|
||||
);
|
||||
TT_AP_RW_RW,
|
||||
~(TT_ADDRESS_MASK_BLOCK_ENTRY | TT_AP_MASK));
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
@@ -568,11 +523,9 @@ ArmConfigureMmu (
|
||||
} else if (MaxAddress < SIZE_256TB) {
|
||||
TCR |= TCR_PS_256TB;
|
||||
} else {
|
||||
DEBUG ((
|
||||
DEBUG_ERROR,
|
||||
DEBUG ((DEBUG_ERROR,
|
||||
"ArmConfigureMmu: The MaxAddress 0x%lX is not supported by this MMU configuration.\n",
|
||||
MaxAddress
|
||||
));
|
||||
MaxAddress));
|
||||
ASSERT (0); // Bigger than 48-bit memory space are not supported
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
@@ -594,11 +547,9 @@ ArmConfigureMmu (
|
||||
} else if (MaxAddress < SIZE_256TB) {
|
||||
TCR |= TCR_IPS_256TB;
|
||||
} else {
|
||||
DEBUG ((
|
||||
DEBUG_ERROR,
|
||||
DEBUG ((DEBUG_ERROR,
|
||||
"ArmConfigureMmu: The MaxAddress 0x%lX is not supported by this MMU configuration.\n",
|
||||
MaxAddress
|
||||
));
|
||||
MaxAddress));
|
||||
ASSERT (0); // Bigger than 48-bit memory space are not supported
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
@@ -628,7 +579,6 @@ ArmConfigureMmu (
|
||||
if (TranslationTable == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
//
|
||||
// We set TTBR0 just after allocating the table to retrieve its location from
|
||||
// the subsequent functions without needing to pass this value across the
|
||||
@@ -649,10 +599,8 @@ ArmConfigureMmu (
|
||||
// Make sure we are not inadvertently hitting in the caches
|
||||
// when populating the page tables.
|
||||
//
|
||||
InvalidateDataCacheRange (
|
||||
TranslationTable,
|
||||
RootTableEntryCount * sizeof (UINT64)
|
||||
);
|
||||
InvalidateDataCacheRange (TranslationTable,
|
||||
RootTableEntryCount * sizeof (UINT64));
|
||||
ZeroMem (TranslationTable, RootTableEntryCount * sizeof (UINT64));
|
||||
|
||||
while (MemoryTable->Length != 0) {
|
||||
@@ -660,7 +608,6 @@ ArmConfigureMmu (
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto FreeTranslationTable;
|
||||
}
|
||||
|
||||
MemoryTable++;
|
||||
}
|
||||
|
||||
@@ -702,10 +649,8 @@ ArmMmuBaseLibConstructor (
|
||||
// The ArmReplaceLiveTranslationEntry () helper function may be invoked
|
||||
// with the MMU off so we have to ensure that it gets cleaned to the PoC
|
||||
//
|
||||
WriteBackDataCacheRange (
|
||||
(VOID *)(UINTN)ArmReplaceLiveTranslationEntry,
|
||||
ArmReplaceLiveTranslationEntrySize
|
||||
);
|
||||
WriteBackDataCacheRange ((VOID *)(UINTN)ArmReplaceLiveTranslationEntry,
|
||||
ArmReplaceLiveTranslationEntrySize);
|
||||
|
||||
return RETURN_SUCCESS;
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user