Compare commits
	
		
			99 Commits
		
	
	
		
			edk2-stabl
			...
			dev/ec-fmp
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 153b1e1afb | ||
|  | 102042deda | ||
|  | 045b938884 | ||
|  | 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 | 
| @@ -17,7 +17,7 @@ parameters: | ||||
| jobs: | ||||
|  | ||||
| - job: Build_${{ parameters.tool_chain_tag }} | ||||
|   timeoutInMinutes: 120 | ||||
|  | ||||
|   #Use matrix to speed up the build process | ||||
|   strategy: | ||||
|     matrix: | ||||
| @@ -48,9 +48,6 @@ jobs: | ||||
|       TARGET_SECURITY: | ||||
|         Build.Pkgs: 'SecurityPkg' | ||||
|         Build.Targets: 'DEBUG,RELEASE,NO-TARGET' | ||||
|       TARGET_UEFIPAYLOAD: | ||||
|         Build.Pkgs: 'UefiPayloadPkg' | ||||
|         Build.Targets: 'DEBUG,RELEASE,NO-TARGET' | ||||
|       TARGET_PLATFORMS: | ||||
|         # For Platforms only check code. Leave it to Platform CI | ||||
|         # to build them. | ||||
|   | ||||
| @@ -67,8 +67,7 @@ class Settings(CiBuildSettingsManager, UpdateSettingsManager, SetupSettingsManag | ||||
|                 "CryptoPkg", | ||||
|                 "UnitTestFrameworkPkg", | ||||
|                 "OvmfPkg", | ||||
|                 "RedfishPkg", | ||||
|                 "UefiPayloadPkg" | ||||
|                 "RedfishPkg" | ||||
|                 ) | ||||
|  | ||||
|     def GetArchitecturesSupported(self): | ||||
|   | ||||
| @@ -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) | ||||
|   | ||||
| @@ -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: | ||||
|   | ||||
| @@ -1,120 +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. | ||||
|       "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. | ||||
|   } | ||||
| ``` | ||||
|  | ||||
| ### `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. | ||||
|  | ||||
| ### `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 `False`. | ||||
|  | ||||
| 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,618 +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.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_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 | ||||
|         return outstream_buffer.getvalue().strip().splitlines() | ||||
|  | ||||
|     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.GetAbsolutePathOnThisSytemFromEdk2RelativePath( | ||||
|             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)]) | ||||
|  | ||||
|         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 = False | ||||
|  | ||||
|         if "AuditOnly" in self._package_config and self._package_config["AuditOnly"]: | ||||
|             self._audit_only_mode = True | ||||
|  | ||||
|         if "OutputFileDiffs" in self._package_config and self._package_config["OutputFileDiffs"]: | ||||
|             self._output_file_diffs = True | ||||
|  | ||||
|     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: | ||||
|             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" | ||||
| } | ||||
| @@ -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) | ||||
|                      ) | ||||
|   | ||||
| @@ -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 ( | ||||
|   | ||||
| @@ -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_ | ||||
|  | ||||
|   | ||||
| @@ -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(); | ||||
|   } | ||||
|   | ||||
| @@ -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); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -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; | ||||
|     } | ||||
|   | ||||
| @@ -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_ | ||||
|  | ||||
|   | ||||
| @@ -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_ | ||||
|  | ||||
|   | ||||
| @@ -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; | ||||
| } | ||||
|   | ||||
| @@ -37,21 +37,18 @@ ArmMmuPeiLibConstructor ( | ||||
|   // is executing from DRAM, we only need to perform the cache maintenance | ||||
|   // when not executing in place. | ||||
|   // | ||||
|   if (((UINTN)FileInfo.Buffer <= (UINTN)ArmReplaceLiveTranslationEntry) && | ||||
|   if ((UINTN)FileInfo.Buffer <= (UINTN)ArmReplaceLiveTranslationEntry && | ||||
|       ((UINTN)FileInfo.Buffer + FileInfo.BufferSize >= | ||||
|        (UINTN)ArmReplaceLiveTranslationEntry + ArmReplaceLiveTranslationEntrySize)) | ||||
|   { | ||||
|     DEBUG ((DEBUG_INFO, "ArmMmuLib: skipping cache maintenance on XIP PEIM\n")); | ||||
|        (UINTN)ArmReplaceLiveTranslationEntry + ArmReplaceLiveTranslationEntrySize)) { | ||||
|     DEBUG ((EFI_D_INFO, "ArmMmuLib: skipping cache maintenance on XIP PEIM\n")); | ||||
|   } else { | ||||
|     DEBUG ((DEBUG_INFO, "ArmMmuLib: performing cache maintenance on shadowed PEIM\n")); | ||||
|     DEBUG ((EFI_D_INFO, "ArmMmuLib: performing cache maintenance on shadowed PEIM\n")); | ||||
|     // | ||||
|     // 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; | ||||
|   | ||||
| @@ -76,7 +76,6 @@ PreferNonshareableMemory ( | ||||
|     ASSERT (FALSE); | ||||
|     return FALSE; | ||||
|   } | ||||
|  | ||||
|   return Val != ID_MMFR0_SHR_IMP_HW_COHERENT; | ||||
| } | ||||
|  | ||||
| @@ -141,8 +140,7 @@ PopulateLevel2PageTable ( | ||||
|       // Allocate a Level2 Page Table for this Section | ||||
|       TranslationTable = (UINTN)AllocateAlignedPages ( | ||||
|                                   EFI_SIZE_TO_PAGES (TRANSLATION_TABLE_PAGE_SIZE), | ||||
|                                   TRANSLATION_TABLE_PAGE_ALIGNMENT | ||||
|                                   ); | ||||
|                                   TRANSLATION_TABLE_PAGE_ALIGNMENT); | ||||
|  | ||||
|       // Translate the Section Descriptor into Page Descriptor | ||||
|       SectionDescriptor = TT_DESCRIPTOR_PAGE_TYPE_PAGE | ConvertSectionAttributesToPageAttributes (*SectionEntry, FALSE); | ||||
| @@ -153,10 +151,8 @@ PopulateLevel2PageTable ( | ||||
|       // Make sure we are not inadvertently hitting in the caches | ||||
|       // when populating the page tables | ||||
|       // | ||||
|       InvalidateDataCacheRange ( | ||||
|         (VOID *)TranslationTable, | ||||
|         TRANSLATION_TABLE_PAGE_SIZE | ||||
|         ); | ||||
|       InvalidateDataCacheRange ((VOID *)TranslationTable, | ||||
|         TRANSLATION_TABLE_PAGE_SIZE); | ||||
|  | ||||
|       // Populate the new Level2 Page Table for the section | ||||
|       PageEntry = (UINT32*)TranslationTable; | ||||
| @@ -176,16 +172,13 @@ PopulateLevel2PageTable ( | ||||
|   } else { | ||||
|     TranslationTable = (UINTN)AllocateAlignedPages ( | ||||
|                                 EFI_SIZE_TO_PAGES (TRANSLATION_TABLE_PAGE_SIZE), | ||||
|                                 TRANSLATION_TABLE_PAGE_ALIGNMENT | ||||
|                                 ); | ||||
|                                 TRANSLATION_TABLE_PAGE_ALIGNMENT); | ||||
|     // | ||||
|     // Make sure we are not inadvertently hitting in the caches | ||||
|     // when populating the page tables | ||||
|     // | ||||
|     InvalidateDataCacheRange ( | ||||
|       (VOID *)TranslationTable, | ||||
|       TRANSLATION_TABLE_PAGE_SIZE | ||||
|       ); | ||||
|     InvalidateDataCacheRange ((VOID *)TranslationTable, | ||||
|       TRANSLATION_TABLE_PAGE_SIZE); | ||||
|     ZeroMem ((VOID *)TranslationTable, TRANSLATION_TABLE_PAGE_SIZE); | ||||
|  | ||||
|     *SectionEntry = (TranslationTable & TT_DESCRIPTOR_SECTION_PAGETABLE_ADDRESS_MASK) | | ||||
| @@ -209,10 +202,8 @@ PopulateLevel2PageTable ( | ||||
|   // [speculatively] since the previous invalidate are evicted again. | ||||
|   // | ||||
|   ArmDataMemoryBarrier (); | ||||
|   InvalidateDataCacheRange ( | ||||
|     (UINT32 *)TranslationTable + FirstPageOffset, | ||||
|     RemainLength / TT_DESCRIPTOR_PAGE_SIZE * sizeof (*PageEntry) | ||||
|     ); | ||||
|   InvalidateDataCacheRange ((UINT32 *)TranslationTable + FirstPageOffset, | ||||
|     RemainLength / TT_DESCRIPTOR_PAGE_SIZE * sizeof (*PageEntry)); | ||||
| } | ||||
|  | ||||
| STATIC | ||||
| @@ -283,9 +274,8 @@ FillTranslationTable ( | ||||
|   SectionEntry    = TRANSLATION_TABLE_ENTRY_FOR_VIRTUAL_ADDRESS(TranslationTable, MemoryRegion->VirtualBase); | ||||
|  | ||||
|   while (RemainLength != 0) { | ||||
|     if ((PhysicalBase % TT_DESCRIPTOR_SECTION_SIZE == 0) && | ||||
|         (RemainLength >= TT_DESCRIPTOR_SECTION_SIZE)) | ||||
|     { | ||||
|     if (PhysicalBase % TT_DESCRIPTOR_SECTION_SIZE == 0 && | ||||
|         RemainLength >= TT_DESCRIPTOR_SECTION_SIZE) { | ||||
|       // Case: Physical address aligned on the Section Size (1MB) && the length | ||||
|       // is greater than the Section Size | ||||
|       *SectionEntry = TT_DESCRIPTOR_SECTION_BASE_ADDRESS(PhysicalBase) | Attributes; | ||||
| @@ -301,21 +291,14 @@ FillTranslationTable ( | ||||
|       PhysicalBase += TT_DESCRIPTOR_SECTION_SIZE; | ||||
|       RemainLength -= TT_DESCRIPTOR_SECTION_SIZE; | ||||
|     } else { | ||||
|       PageMapLength = MIN ( | ||||
|                         (UINT32)RemainLength, | ||||
|                         TT_DESCRIPTOR_SECTION_SIZE - | ||||
|                         (PhysicalBase % TT_DESCRIPTOR_SECTION_SIZE) | ||||
|                         ); | ||||
|       PageMapLength = MIN ((UINT32)RemainLength, TT_DESCRIPTOR_SECTION_SIZE - | ||||
|                                          (PhysicalBase % TT_DESCRIPTOR_SECTION_SIZE)); | ||||
|  | ||||
|       // Case: Physical address aligned on the Section Size (1MB) && the length | ||||
|       //       does not fill a section | ||||
|       // Case: Physical address NOT aligned on the Section Size (1MB) | ||||
|       PopulateLevel2PageTable ( | ||||
|         SectionEntry, | ||||
|         PhysicalBase, | ||||
|         PageMapLength, | ||||
|         MemoryRegion->Attributes | ||||
|         ); | ||||
|       PopulateLevel2PageTable (SectionEntry, PhysicalBase, PageMapLength, | ||||
|         MemoryRegion->Attributes); | ||||
|  | ||||
|       // | ||||
|       // Issue a DMB to ensure that the page table entry update made it to | ||||
| @@ -349,8 +332,7 @@ ArmConfigureMmu ( | ||||
|  | ||||
|   TranslationTable = AllocateAlignedPages ( | ||||
|                        EFI_SIZE_TO_PAGES (TRANSLATION_TABLE_SECTION_SIZE), | ||||
|                        TRANSLATION_TABLE_SECTION_ALIGNMENT | ||||
|                        ); | ||||
|                        TRANSLATION_TABLE_SECTION_ALIGNMENT); | ||||
|   if (TranslationTable == NULL) { | ||||
|     return RETURN_OUT_OF_RESOURCES; | ||||
|   } | ||||
| @@ -407,8 +389,7 @@ ArmConfigureMmu ( | ||||
|   // | ||||
|   ArmSetTTBCR (0); | ||||
|  | ||||
|   ArmSetDomainAccessControl ( | ||||
|     DOMAIN_ACCESS_CONTROL_NONE (15) | | ||||
|   ArmSetDomainAccessControl (DOMAIN_ACCESS_CONTROL_NONE(15) | | ||||
|                              DOMAIN_ACCESS_CONTROL_NONE(14) | | ||||
|                              DOMAIN_ACCESS_CONTROL_NONE(13) | | ||||
|                              DOMAIN_ACCESS_CONTROL_NONE(12) | | ||||
| @@ -423,8 +404,7 @@ ArmConfigureMmu ( | ||||
|                              DOMAIN_ACCESS_CONTROL_NONE( 3) | | ||||
|                              DOMAIN_ACCESS_CONTROL_NONE( 2) | | ||||
|                              DOMAIN_ACCESS_CONTROL_NONE( 1) | | ||||
|     DOMAIN_ACCESS_CONTROL_CLIENT (0) | ||||
|     ); | ||||
|                              DOMAIN_ACCESS_CONTROL_CLIENT(0)); | ||||
|  | ||||
|   ArmEnableInstructionCache(); | ||||
|   ArmEnableDataCache(); | ||||
|   | ||||
| @@ -206,6 +206,7 @@ UpdatePageEntries ( | ||||
|  | ||||
|     Status = EFI_SUCCESS; | ||||
|     Offset += TT_DESCRIPTOR_PAGE_SIZE; | ||||
|  | ||||
|   } // End first level translation table loop | ||||
|  | ||||
|   return Status; | ||||
| @@ -302,8 +303,7 @@ UpdateSectionEntries ( | ||||
|                  (FirstLevelIdx + i) << TT_DESCRIPTOR_SECTION_BASE_SHIFT, | ||||
|                  TT_DESCRIPTOR_SECTION_SIZE, | ||||
|                  Attributes, | ||||
|                  NULL | ||||
|                  ); | ||||
|                  NULL); | ||||
|     } else { | ||||
|       // still a section entry | ||||
|  | ||||
| @@ -355,22 +355,19 @@ ArmSetMemoryAttributes ( | ||||
|   FlushTlbs = FALSE; | ||||
|   while (Length > 0) { | ||||
|     if ((BaseAddress % TT_DESCRIPTOR_SECTION_SIZE == 0) && | ||||
|         (Length >= TT_DESCRIPTOR_SECTION_SIZE)) | ||||
|     { | ||||
|         Length >= TT_DESCRIPTOR_SECTION_SIZE) { | ||||
|  | ||||
|       ChunkLength = Length - Length % TT_DESCRIPTOR_SECTION_SIZE; | ||||
|  | ||||
|       DEBUG (( | ||||
|         DEBUG_PAGE, | ||||
|       DEBUG ((DEBUG_PAGE, | ||||
|         "SetMemoryAttributes(): MMU section 0x%lx length 0x%lx to %lx\n", | ||||
|         BaseAddress, | ||||
|         ChunkLength, | ||||
|         Attributes | ||||
|         )); | ||||
|         BaseAddress, ChunkLength, Attributes)); | ||||
|  | ||||
|       Status = UpdateSectionEntries (BaseAddress, ChunkLength, Attributes); | ||||
|  | ||||
|       FlushTlbs = TRUE; | ||||
|     } else { | ||||
|  | ||||
|       // | ||||
|       // Process page by page until the next section boundary, but only if | ||||
|       // we have more than a section's worth of area to deal with after that. | ||||
| @@ -381,20 +378,12 @@ ArmSetMemoryAttributes ( | ||||
|         ChunkLength = Length; | ||||
|       } | ||||
|  | ||||
|       DEBUG (( | ||||
|         DEBUG_PAGE, | ||||
|       DEBUG ((DEBUG_PAGE, | ||||
|         "SetMemoryAttributes(): MMU page 0x%lx length 0x%lx to %lx\n", | ||||
|         BaseAddress, | ||||
|         ChunkLength, | ||||
|         Attributes | ||||
|         )); | ||||
|         BaseAddress, ChunkLength, Attributes)); | ||||
|  | ||||
|       Status = UpdatePageEntries ( | ||||
|                  BaseAddress, | ||||
|                  ChunkLength, | ||||
|                  Attributes, | ||||
|                  &FlushTlbs | ||||
|                  ); | ||||
|       Status = UpdatePageEntries (BaseAddress, ChunkLength, Attributes, | ||||
|                  &FlushTlbs); | ||||
|     } | ||||
|  | ||||
|     if (EFI_ERROR (Status)) { | ||||
| @@ -408,7 +397,6 @@ ArmSetMemoryAttributes ( | ||||
|   if (FlushTlbs) { | ||||
|     ArmInvalidateTlb (); | ||||
|   } | ||||
|  | ||||
|   return Status; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -65,7 +65,7 @@ LibResetSystem ( | ||||
|   ArmCallSmc (&ArmSmcArgs); | ||||
|  | ||||
|   // We should never be here | ||||
|   DEBUG ((DEBUG_ERROR, "%a: PSCI Reset failed\n", __FUNCTION__)); | ||||
|   DEBUG ((EFI_D_ERROR, "%a: PSCI Reset failed\n", __FUNCTION__)); | ||||
|   CpuDeadLoop (); | ||||
|   return EFI_UNSUPPORTED; | ||||
| } | ||||
|   | ||||
| @@ -1,129 +0,0 @@ | ||||
| /** @file | ||||
|   SMC helper functions. | ||||
|  | ||||
|   Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR> | ||||
|  | ||||
|   SPDX-License-Identifier: BSD-2-Clause-Patent | ||||
|  | ||||
| **/ | ||||
|  | ||||
| #include <Library/ArmSmcLib.h> | ||||
| #include <Library/BaseMemoryLib.h> | ||||
|  | ||||
| /** Triggers 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 | ||||
|   ) | ||||
| { | ||||
|   ARM_SMC_ARGS  Args; | ||||
|   UINTN         ErrorCode; | ||||
|  | ||||
|   ZeroMem (&Args, sizeof (ARM_SMC_ARGS)); | ||||
|  | ||||
|   Args.Arg0 = Function; | ||||
|  | ||||
|   if (Arg1 != NULL) { | ||||
|     Args.Arg1 = *Arg1; | ||||
|   } | ||||
|  | ||||
|   if (Arg2 != NULL) { | ||||
|     Args.Arg2 = *Arg2; | ||||
|   } | ||||
|  | ||||
|   if (Arg3 != NULL) { | ||||
|     Args.Arg3 = *Arg3; | ||||
|   } | ||||
|  | ||||
|   ArmCallSmc (&Args); | ||||
|  | ||||
|   ErrorCode = Args.Arg0; | ||||
|  | ||||
|   if (Arg1 != NULL) { | ||||
|     *Arg1 = Args.Arg1; | ||||
|   } | ||||
|  | ||||
|   if (Arg2 != NULL) { | ||||
|     *Arg2 = Args.Arg2; | ||||
|   } | ||||
|  | ||||
|   if (Arg3 != NULL) { | ||||
|     *Arg3 = Args.Arg3; | ||||
|   } | ||||
|  | ||||
|   return ErrorCode; | ||||
| } | ||||
|  | ||||
| /** 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 | ||||
|   ) | ||||
| { | ||||
|   return ArmCallSmc3 (Function, Arg1, Arg2, Arg3); | ||||
| } | ||||
|  | ||||
| /** 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 | ||||
|   ) | ||||
| { | ||||
|   return ArmCallSmc3 (Function, Arg1, Arg2, Arg3); | ||||
| } | ||||
|  | ||||
| /** 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 | ||||
|   ) | ||||
| { | ||||
|   return ArmCallSmc3 (Function, Arg1, Arg2, Arg3); | ||||
| } | ||||
| @@ -20,9 +20,6 @@ | ||||
| [Sources.AARCH64] | ||||
|   AArch64/ArmSmc.S | ||||
|  | ||||
| [Sources] | ||||
|   ArmSmc.c | ||||
|  | ||||
| [Packages] | ||||
|   MdePkg/MdePkg.dec | ||||
|   ArmPkg/ArmPkg.dec | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| // | ||||
| //  Copyright (c) 2021, NUVIA Inc. All rights reserved. | ||||
| //  Copyright (c) 2016, Linaro Limited. All rights reserved. | ||||
| // | ||||
| //  SPDX-License-Identifier: BSD-2-Clause-Patent | ||||
| @@ -8,7 +7,6 @@ | ||||
|  | ||||
| #include <Base.h> | ||||
| #include <Library/ArmSmcLib.h> | ||||
| #include <IndustryStandard/ArmStdSmc.h> | ||||
|  | ||||
| VOID | ||||
| ArmCallSmc ( | ||||
| @@ -16,86 +14,3 @@ ArmCallSmc ( | ||||
|   ) | ||||
| { | ||||
| } | ||||
|  | ||||
| /** Triggers 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 | ||||
|   ) | ||||
| { | ||||
|   return SMC_ARCH_CALL_NOT_SUPPORTED; | ||||
| } | ||||
|  | ||||
| /** 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 | ||||
|   ) | ||||
| { | ||||
|   return SMC_ARCH_CALL_NOT_SUPPORTED; | ||||
| } | ||||
|  | ||||
| /** 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 | ||||
|   ) | ||||
| { | ||||
|   return SMC_ARCH_CALL_NOT_SUPPORTED; | ||||
| } | ||||
|  | ||||
| /** 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 | ||||
|   ) | ||||
| { | ||||
|   return SMC_ARCH_CALL_NOT_SUPPORTED; | ||||
| } | ||||
|   | ||||
| @@ -31,8 +31,11 @@ ResetCold ( | ||||
|   VOID | ||||
|   ) | ||||
| { | ||||
|   ARM_SMC_ARGS ArmSmcArgs; | ||||
|  | ||||
|   // Send a PSCI 0.2 SYSTEM_RESET command | ||||
|   ArmCallSmc0 (ARM_SMC_ID_PSCI_SYSTEM_RESET, NULL, NULL, NULL); | ||||
|   ArmSmcArgs.Arg0 = ARM_SMC_ID_PSCI_SYSTEM_RESET; | ||||
|   ArmCallSmc (&ArmSmcArgs); | ||||
| } | ||||
|  | ||||
| /** | ||||
| @@ -63,8 +66,11 @@ ResetShutdown ( | ||||
|   VOID | ||||
|   ) | ||||
| { | ||||
|   ARM_SMC_ARGS ArmSmcArgs; | ||||
|  | ||||
|   // Send a PSCI 0.2 SYSTEM_OFF command | ||||
|   ArmCallSmc0 (ARM_SMC_ID_PSCI_SYSTEM_OFF, NULL, NULL, NULL); | ||||
|   ArmSmcArgs.Arg0 = ARM_SMC_ID_PSCI_SYSTEM_OFF; | ||||
|   ArmCallSmc (&ArmSmcArgs); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   | ||||
| @@ -25,18 +25,12 @@ typedef uint64_t  aeabi_double_t; | ||||
|  * Helpers to convert between float32 and aeabi_float_t, and float64 and | ||||
|  * aeabi_double_t used by the AEABI functions below. | ||||
|  */ | ||||
| static aeabi_float_t | ||||
| f32_to_f ( | ||||
|   float32_t  val | ||||
|   ) | ||||
| static aeabi_float_t f32_to_f(float32_t val) | ||||
| { | ||||
|   return val.v; | ||||
| } | ||||
|  | ||||
| static float32_t | ||||
| f32_from_f ( | ||||
|   aeabi_float_t  val | ||||
|   ) | ||||
| static float32_t f32_from_f(aeabi_float_t val) | ||||
| { | ||||
|   float32_t res; | ||||
|  | ||||
| @@ -45,18 +39,12 @@ f32_from_f ( | ||||
|   return res; | ||||
| } | ||||
|  | ||||
| static aeabi_double_t | ||||
| f64_to_d ( | ||||
|   float64_t  val | ||||
|   ) | ||||
| static aeabi_double_t f64_to_d(float64_t val) | ||||
| { | ||||
|   return val.v; | ||||
| } | ||||
|  | ||||
| static float64_t | ||||
| f64_from_d ( | ||||
|   aeabi_double_t  val | ||||
|   ) | ||||
| static float64_t f64_from_d(aeabi_double_t val) | ||||
| { | ||||
|   float64_t res; | ||||
|  | ||||
| @@ -76,47 +64,29 @@ f64_from_d ( | ||||
|  * Table 2, Standard aeabi_double_t precision floating-point arithmetic helper | ||||
|  * functions | ||||
|  */ | ||||
| aeabi_double_t | ||||
| __aeabi_dadd ( | ||||
|   aeabi_double_t  a, | ||||
|   aeabi_double_t  b | ||||
|   ) | ||||
|  | ||||
| aeabi_double_t __aeabi_dadd(aeabi_double_t a, aeabi_double_t b) | ||||
| { | ||||
|   return f64_to_d(f64_add(f64_from_d(a), f64_from_d(b))); | ||||
| } | ||||
|  | ||||
| aeabi_double_t | ||||
| __aeabi_ddiv ( | ||||
|   aeabi_double_t  a, | ||||
|   aeabi_double_t  b | ||||
|   ) | ||||
| aeabi_double_t __aeabi_ddiv(aeabi_double_t a, aeabi_double_t b) | ||||
| { | ||||
|   return f64_to_d(f64_div(f64_from_d(a), f64_from_d(b))); | ||||
| } | ||||
|  | ||||
| aeabi_double_t | ||||
| __aeabi_dmul ( | ||||
|   aeabi_double_t  a, | ||||
|   aeabi_double_t  b | ||||
|   ) | ||||
| aeabi_double_t __aeabi_dmul(aeabi_double_t a, aeabi_double_t b) | ||||
| { | ||||
|   return f64_to_d(f64_mul(f64_from_d(a), f64_from_d(b))); | ||||
| } | ||||
|  | ||||
| aeabi_double_t | ||||
| __aeabi_drsub ( | ||||
|   aeabi_double_t  a, | ||||
|   aeabi_double_t  b | ||||
|   ) | ||||
|  | ||||
| aeabi_double_t __aeabi_drsub(aeabi_double_t a, aeabi_double_t b) | ||||
| { | ||||
|   return f64_to_d(f64_sub(f64_from_d(b), f64_from_d(a))); | ||||
| } | ||||
|  | ||||
| aeabi_double_t | ||||
| __aeabi_dsub ( | ||||
|   aeabi_double_t  a, | ||||
|   aeabi_double_t  b | ||||
|   ) | ||||
| aeabi_double_t __aeabi_dsub(aeabi_double_t a, aeabi_double_t b) | ||||
| { | ||||
|   return f64_to_d(f64_sub(f64_from_d(a), f64_from_d(b))); | ||||
| } | ||||
| @@ -124,47 +94,28 @@ __aeabi_dsub ( | ||||
| /* | ||||
|  * Table 3, double precision floating-point comparison helper functions | ||||
|  */ | ||||
| int | ||||
| __aeabi_dcmpeq ( | ||||
|   aeabi_double_t  a, | ||||
|   aeabi_double_t  b | ||||
|   ) | ||||
|  | ||||
| int __aeabi_dcmpeq(aeabi_double_t a, aeabi_double_t b) | ||||
| { | ||||
|   return f64_eq(f64_from_d(a), f64_from_d(b)); | ||||
| } | ||||
|  | ||||
| int | ||||
| __aeabi_dcmplt ( | ||||
|   aeabi_double_t  a, | ||||
|   aeabi_double_t  b | ||||
|   ) | ||||
| int __aeabi_dcmplt(aeabi_double_t a, aeabi_double_t b) | ||||
| { | ||||
|   return f64_lt(f64_from_d(a), f64_from_d(b)); | ||||
| } | ||||
|  | ||||
| int | ||||
| __aeabi_dcmple ( | ||||
|   aeabi_double_t  a, | ||||
|   aeabi_double_t  b | ||||
|   ) | ||||
| int __aeabi_dcmple(aeabi_double_t a, aeabi_double_t b) | ||||
| { | ||||
|   return f64_le(f64_from_d(a), f64_from_d(b)); | ||||
| } | ||||
|  | ||||
| int | ||||
| __aeabi_dcmpge ( | ||||
|   aeabi_double_t  a, | ||||
|   aeabi_double_t  b | ||||
|   ) | ||||
| int __aeabi_dcmpge(aeabi_double_t a, aeabi_double_t b) | ||||
| { | ||||
|   return f64_le(f64_from_d(b), f64_from_d(a)); | ||||
| } | ||||
|  | ||||
| int | ||||
| __aeabi_dcmpgt ( | ||||
|   aeabi_double_t  a, | ||||
|   aeabi_double_t  b | ||||
|   ) | ||||
| int __aeabi_dcmpgt(aeabi_double_t a, aeabi_double_t b) | ||||
| { | ||||
|   return f64_lt(f64_from_d(b), f64_from_d(a)); | ||||
| } | ||||
| @@ -173,47 +124,28 @@ __aeabi_dcmpgt ( | ||||
|  * Table 4, Standard single precision floating-point arithmetic helper | ||||
|  * functions | ||||
|  */ | ||||
| aeabi_float_t | ||||
| __aeabi_fadd ( | ||||
|   aeabi_float_t  a, | ||||
|   aeabi_float_t  b | ||||
|   ) | ||||
|  | ||||
| aeabi_float_t __aeabi_fadd(aeabi_float_t a, aeabi_float_t b) | ||||
| { | ||||
|   return f32_to_f(f32_add(f32_from_f(a), f32_from_f(b))); | ||||
| } | ||||
|  | ||||
| aeabi_float_t | ||||
| __aeabi_fdiv ( | ||||
|   aeabi_float_t  a, | ||||
|   aeabi_float_t  b | ||||
|   ) | ||||
| aeabi_float_t __aeabi_fdiv(aeabi_float_t a, aeabi_float_t b) | ||||
| { | ||||
|   return f32_to_f(f32_div(f32_from_f(a), f32_from_f(b))); | ||||
| } | ||||
|  | ||||
| aeabi_float_t | ||||
| __aeabi_fmul ( | ||||
|   aeabi_float_t  a, | ||||
|   aeabi_float_t  b | ||||
|   ) | ||||
| aeabi_float_t __aeabi_fmul(aeabi_float_t a, aeabi_float_t b) | ||||
| { | ||||
|   return f32_to_f(f32_mul(f32_from_f(a), f32_from_f(b))); | ||||
| } | ||||
|  | ||||
| aeabi_float_t | ||||
| __aeabi_frsub ( | ||||
|   aeabi_float_t  a, | ||||
|   aeabi_float_t  b | ||||
|   ) | ||||
| aeabi_float_t __aeabi_frsub(aeabi_float_t a, aeabi_float_t b) | ||||
| { | ||||
|   return f32_to_f(f32_sub(f32_from_f(b), f32_from_f(a))); | ||||
| } | ||||
|  | ||||
| aeabi_float_t | ||||
| __aeabi_fsub ( | ||||
|   aeabi_float_t  a, | ||||
|   aeabi_float_t  b | ||||
|   ) | ||||
| aeabi_float_t __aeabi_fsub(aeabi_float_t a, aeabi_float_t b) | ||||
| { | ||||
|   return f32_to_f(f32_sub(f32_from_f(a), f32_from_f(b))); | ||||
| } | ||||
| @@ -222,47 +154,28 @@ __aeabi_fsub ( | ||||
|  * Table 5, Standard single precision floating-point comparison helper | ||||
|  * functions | ||||
|  */ | ||||
| int | ||||
| __aeabi_fcmpeq ( | ||||
|   aeabi_float_t  a, | ||||
|   aeabi_float_t  b | ||||
|   ) | ||||
|  | ||||
| int __aeabi_fcmpeq(aeabi_float_t a, aeabi_float_t b) | ||||
| { | ||||
|   return f32_eq(f32_from_f(a), f32_from_f(b)); | ||||
| } | ||||
|  | ||||
| int | ||||
| __aeabi_fcmplt ( | ||||
|   aeabi_float_t  a, | ||||
|   aeabi_float_t  b | ||||
|   ) | ||||
| int __aeabi_fcmplt(aeabi_float_t a, aeabi_float_t b) | ||||
| { | ||||
|   return f32_lt(f32_from_f(a), f32_from_f(b)); | ||||
| } | ||||
|  | ||||
| int | ||||
| __aeabi_fcmple ( | ||||
|   aeabi_float_t  a, | ||||
|   aeabi_float_t  b | ||||
|   ) | ||||
| int __aeabi_fcmple(aeabi_float_t a, aeabi_float_t b) | ||||
| { | ||||
|   return f32_le(f32_from_f(a), f32_from_f(b)); | ||||
| } | ||||
|  | ||||
| int | ||||
| __aeabi_fcmpge ( | ||||
|   aeabi_float_t  a, | ||||
|   aeabi_float_t  b | ||||
|   ) | ||||
| int __aeabi_fcmpge(aeabi_float_t a, aeabi_float_t b) | ||||
| { | ||||
|   return f32_le(f32_from_f(b), f32_from_f(a)); | ||||
| } | ||||
|  | ||||
| int | ||||
| __aeabi_fcmpgt ( | ||||
|   aeabi_float_t  a, | ||||
|   aeabi_float_t  b | ||||
|   ) | ||||
| int __aeabi_fcmpgt(aeabi_float_t a, aeabi_float_t b) | ||||
| { | ||||
|   return f32_lt(f32_from_f(b), f32_from_f(a)); | ||||
| } | ||||
| @@ -270,66 +183,43 @@ __aeabi_fcmpgt ( | ||||
| /* | ||||
|  * Table 6, Standard floating-point to integer conversions | ||||
|  */ | ||||
| int | ||||
| __aeabi_d2iz ( | ||||
|   aeabi_double_t  a | ||||
|   ) | ||||
|  | ||||
| int __aeabi_d2iz(aeabi_double_t a) | ||||
| { | ||||
|   return f64_to_i32_r_minMag(f64_from_d(a), false); | ||||
| } | ||||
|  | ||||
| unsigned | ||||
| __aeabi_d2uiz ( | ||||
|   aeabi_double_t  a | ||||
|   ) | ||||
| unsigned __aeabi_d2uiz(aeabi_double_t a) | ||||
| { | ||||
|   return f64_to_ui32_r_minMag(f64_from_d(a), false); | ||||
| } | ||||
|  | ||||
| long long | ||||
| __aeabi_d2lz ( | ||||
|   aeabi_double_t  a | ||||
|   ) | ||||
| long long __aeabi_d2lz(aeabi_double_t a) | ||||
| { | ||||
|   return f64_to_i64_r_minMag(f64_from_d(a), false); | ||||
| } | ||||
|  | ||||
| unsigned long long | ||||
| __aeabi_d2ulz ( | ||||
|   aeabi_double_t  a | ||||
|   ) | ||||
| unsigned long long __aeabi_d2ulz(aeabi_double_t a) | ||||
| { | ||||
|   return f64_to_ui64_r_minMag(f64_from_d(a), false); | ||||
| } | ||||
|  | ||||
| int | ||||
| __aeabi_f2iz ( | ||||
|   aeabi_float_t  a | ||||
|   ) | ||||
| int __aeabi_f2iz(aeabi_float_t a) | ||||
| { | ||||
|   return f32_to_i32_r_minMag(f32_from_f(a), false); | ||||
| } | ||||
|  | ||||
| unsigned | ||||
| __aeabi_f2uiz ( | ||||
|   aeabi_float_t  a | ||||
|   ) | ||||
| unsigned __aeabi_f2uiz(aeabi_float_t a) | ||||
| { | ||||
|   return f32_to_ui32_r_minMag(f32_from_f(a), false); | ||||
| } | ||||
|  | ||||
| long long | ||||
| __aeabi_f2lz ( | ||||
|   aeabi_float_t  a | ||||
|   ) | ||||
| long long __aeabi_f2lz(aeabi_float_t a) | ||||
| { | ||||
|   return f32_to_i64_r_minMag(f32_from_f(a), false); | ||||
| } | ||||
|  | ||||
| unsigned long long | ||||
| __aeabi_f2ulz ( | ||||
|   aeabi_float_t  a | ||||
|   ) | ||||
| unsigned long long __aeabi_f2ulz(aeabi_float_t a) | ||||
| { | ||||
|   return f32_to_ui64_r_minMag(f32_from_f(a), false); | ||||
| } | ||||
| @@ -337,18 +227,13 @@ __aeabi_f2ulz ( | ||||
| /* | ||||
|  * Table 7, Standard conversions between floating types | ||||
|  */ | ||||
| aeabi_float_t | ||||
| __aeabi_d2f ( | ||||
|   aeabi_double_t  a | ||||
|   ) | ||||
|  | ||||
| aeabi_float_t __aeabi_d2f(aeabi_double_t a) | ||||
| { | ||||
|   return f32_to_f(f64_to_f32(f64_from_d(a))); | ||||
| } | ||||
|  | ||||
| aeabi_double_t | ||||
| __aeabi_f2d ( | ||||
|   aeabi_float_t  a | ||||
|   ) | ||||
| aeabi_double_t __aeabi_f2d(aeabi_float_t a) | ||||
| { | ||||
|   return f64_to_d(f32_to_f64(f32_from_f(a))); | ||||
| } | ||||
| @@ -356,66 +241,43 @@ __aeabi_f2d ( | ||||
| /* | ||||
|  * Table 8, Standard integer to floating-point conversions | ||||
|  */ | ||||
| aeabi_double_t | ||||
| __aeabi_i2d ( | ||||
|   int  a | ||||
|   ) | ||||
|  | ||||
| aeabi_double_t __aeabi_i2d(int a) | ||||
| { | ||||
|   return f64_to_d(i32_to_f64(a)); | ||||
| } | ||||
|  | ||||
| aeabi_double_t | ||||
| __aeabi_ui2d ( | ||||
|   unsigned  a | ||||
|   ) | ||||
| aeabi_double_t __aeabi_ui2d(unsigned a) | ||||
| { | ||||
|   return f64_to_d(ui32_to_f64(a)); | ||||
| } | ||||
|  | ||||
| aeabi_double_t | ||||
| __aeabi_l2d ( | ||||
|   long long  a | ||||
|   ) | ||||
| aeabi_double_t __aeabi_l2d(long long a) | ||||
| { | ||||
|   return f64_to_d(i64_to_f64(a)); | ||||
| } | ||||
|  | ||||
| aeabi_double_t | ||||
| __aeabi_ul2d ( | ||||
|   unsigned long long  a | ||||
|   ) | ||||
| aeabi_double_t __aeabi_ul2d(unsigned long long a) | ||||
| { | ||||
|   return f64_to_d(ui64_to_f64(a)); | ||||
| } | ||||
|  | ||||
| aeabi_float_t | ||||
| __aeabi_i2f ( | ||||
|   int  a | ||||
|   ) | ||||
| aeabi_float_t __aeabi_i2f(int a) | ||||
| { | ||||
|   return f32_to_f(i32_to_f32(a)); | ||||
| } | ||||
|  | ||||
| aeabi_float_t | ||||
| __aeabi_ui2f ( | ||||
|   unsigned  a | ||||
|   ) | ||||
| aeabi_float_t __aeabi_ui2f(unsigned a) | ||||
| { | ||||
|   return f32_to_f(ui32_to_f32(a)); | ||||
| } | ||||
|  | ||||
| aeabi_float_t | ||||
| __aeabi_l2f ( | ||||
|   long long  a | ||||
|   ) | ||||
| aeabi_float_t __aeabi_l2f(long long a) | ||||
| { | ||||
|   return f32_to_f(i64_to_f32(a)); | ||||
| } | ||||
|  | ||||
| aeabi_float_t | ||||
| __aeabi_ul2f ( | ||||
|   unsigned long long  a | ||||
|   ) | ||||
| aeabi_float_t __aeabi_ul2f(unsigned long long a) | ||||
| { | ||||
|   return f32_to_f(ui64_to_f32(a)); | ||||
| } | ||||
|   | ||||
| @@ -13,21 +13,10 @@ typedef unsigned __int64 size_t; | ||||
| typedef unsigned __int32  size_t; | ||||
| #endif | ||||
|  | ||||
| int | ||||
| memcmp ( | ||||
|   void *, | ||||
|   void *, | ||||
|   size_t | ||||
|   ); | ||||
|  | ||||
| int memcmp(void *, void *, size_t); | ||||
| #pragma intrinsic(memcmp) | ||||
| #pragma function(memcmp) | ||||
| int | ||||
| memcmp ( | ||||
|   const void  *s1, | ||||
|   const void  *s2, | ||||
|   size_t      n | ||||
|   ) | ||||
| int memcmp(const void *s1, const void *s2, size_t n) | ||||
| { | ||||
|   unsigned char const *t1; | ||||
|   unsigned char const *t2; | ||||
| @@ -36,10 +25,8 @@ memcmp ( | ||||
|   t2 = s2; | ||||
|  | ||||
|   while (n-- != 0) { | ||||
|     if (*t1 != *t2) { | ||||
|     if (*t1 != *t2) | ||||
|       return (int)*t1 - (int)*t2; | ||||
|     } | ||||
|  | ||||
|     t1++; | ||||
|     t2++; | ||||
|   } | ||||
|   | ||||
| @@ -9,12 +9,7 @@ | ||||
|  | ||||
| typedef __SIZE_TYPE__ size_t; | ||||
|  | ||||
| static void | ||||
| __memcpy ( | ||||
|   void        *dest, | ||||
|   const void  *src, | ||||
|   size_t      n | ||||
|   ) | ||||
| static void __memcpy(void *dest, const void *src, size_t n) | ||||
| { | ||||
|   unsigned char *d; | ||||
|   unsigned char const *s; | ||||
| @@ -27,12 +22,7 @@ __memcpy ( | ||||
|   } | ||||
| } | ||||
|  | ||||
| void * | ||||
| memcpy ( | ||||
|   void        *dest, | ||||
|   const void  *src, | ||||
|   size_t      n | ||||
|   ) | ||||
| void *memcpy(void *dest, const void *src, size_t n) | ||||
| { | ||||
|   __memcpy(dest, src, n); | ||||
|   return dest; | ||||
| @@ -41,27 +31,12 @@ memcpy ( | ||||
| #ifdef __arm__ | ||||
|  | ||||
| __attribute__((__alias__("__memcpy"))) | ||||
| void | ||||
| __aeabi_memcpy ( | ||||
|   void        *dest, | ||||
|   const void  *src, | ||||
|   size_t      n | ||||
|   ); | ||||
| void __aeabi_memcpy(void *dest, const void *src, size_t n); | ||||
|  | ||||
| __attribute__((__alias__("__memcpy"))) | ||||
| void | ||||
| __aeabi_memcpy4 ( | ||||
|   void        *dest, | ||||
|   const void  *src, | ||||
|   size_t      n | ||||
|   ); | ||||
| void __aeabi_memcpy4(void *dest, const void *src, size_t n); | ||||
|  | ||||
| __attribute__((__alias__("__memcpy"))) | ||||
| void | ||||
| __aeabi_memcpy8 ( | ||||
|   void        *dest, | ||||
|   const void  *src, | ||||
|   size_t      n | ||||
|   ); | ||||
| void __aeabi_memcpy8(void *dest, const void *src, size_t n); | ||||
|  | ||||
| #endif | ||||
|   | ||||
| @@ -13,21 +13,10 @@ typedef unsigned __int64 size_t; | ||||
| typedef unsigned __int32  size_t; | ||||
| #endif | ||||
|  | ||||
| void * | ||||
| memcpy ( | ||||
|   void *, | ||||
|   const void *, | ||||
|   size_t | ||||
|   ); | ||||
|  | ||||
| void* memcpy(void *, const void *, size_t); | ||||
| #pragma intrinsic(memcpy) | ||||
| #pragma function(memcpy) | ||||
| void * | ||||
| memcpy ( | ||||
|   void        *dest, | ||||
|   const void  *src, | ||||
|   size_t      n | ||||
|   ) | ||||
| void* memcpy(void *dest, const void *src, size_t n) | ||||
| { | ||||
|   unsigned char *d; | ||||
|   unsigned char const *s; | ||||
|   | ||||
| @@ -13,21 +13,10 @@ typedef unsigned __int64 size_t; | ||||
| typedef unsigned __int32  size_t; | ||||
| #endif | ||||
|  | ||||
| void * | ||||
| memmove ( | ||||
|   void *, | ||||
|   const void *, | ||||
|   size_t | ||||
|   ); | ||||
|  | ||||
| void* memmove(void *, const void *, size_t); | ||||
| #pragma intrinsic(memmove) | ||||
| #pragma function(memmove) | ||||
| void * | ||||
| memmove ( | ||||
|   void        *dest, | ||||
|   const void  *src, | ||||
|   size_t      n | ||||
|   ) | ||||
| void* memmove(void *dest, const void *src, size_t n) | ||||
| { | ||||
|   unsigned char *d; | ||||
|   unsigned char const *s; | ||||
|   | ||||
| @@ -10,12 +10,7 @@ | ||||
| typedef __SIZE_TYPE__ size_t; | ||||
|  | ||||
| static __attribute__((__used__)) | ||||
| void * | ||||
| __memset ( | ||||
|   void    *s, | ||||
|   int     c, | ||||
|   size_t  n | ||||
|   ) | ||||
| void *__memset(void *s, int c, size_t n) | ||||
| { | ||||
|   unsigned char *d; | ||||
|  | ||||
| @@ -35,62 +30,30 @@ __memset ( | ||||
| // our memset() 'weak' to let the other implementation take precedence. | ||||
| // | ||||
| __attribute__((__weak__, __alias__("__memset"))) | ||||
| void * | ||||
| memset ( | ||||
|   void    *dest, | ||||
|   int     c, | ||||
|   size_t  n | ||||
|   ); | ||||
| void *memset(void *dest, int c, size_t n); | ||||
|  | ||||
| #ifdef __arm__ | ||||
|  | ||||
| void | ||||
| __aeabi_memset ( | ||||
|   void    *dest, | ||||
|   size_t  n, | ||||
|   int     c | ||||
|   ) | ||||
| void __aeabi_memset(void *dest, size_t n, int c) | ||||
| { | ||||
|   __memset(dest, c, n); | ||||
| } | ||||
|  | ||||
| __attribute__((__alias__("__aeabi_memset"))) | ||||
| void | ||||
| __aeabi_memset4 ( | ||||
|   void    *dest, | ||||
|   size_t  n, | ||||
|   int     c | ||||
|   ); | ||||
| void __aeabi_memset4(void *dest, size_t n, int c); | ||||
|  | ||||
| __attribute__((__alias__("__aeabi_memset"))) | ||||
| void | ||||
| __aeabi_memset8 ( | ||||
|   void    *dest, | ||||
|   size_t  n, | ||||
|   int     c | ||||
|   ); | ||||
| void __aeabi_memset8(void *dest, size_t n, int c); | ||||
|  | ||||
| void | ||||
| __aeabi_memclr ( | ||||
|   void    *dest, | ||||
|   size_t  n | ||||
|   ) | ||||
| void __aeabi_memclr(void *dest, size_t n) | ||||
| { | ||||
|   __memset(dest, 0, n); | ||||
| } | ||||
|  | ||||
| __attribute__((__alias__("__aeabi_memclr"))) | ||||
| void | ||||
| __aeabi_memclr4 ( | ||||
|   void    *dest, | ||||
|   size_t  n | ||||
|   ); | ||||
| void __aeabi_memclr4(void *dest, size_t n); | ||||
|  | ||||
| __attribute__((__alias__("__aeabi_memclr"))) | ||||
| void | ||||
| __aeabi_memclr8 ( | ||||
|   void    *dest, | ||||
|   size_t  n | ||||
|   ); | ||||
| void __aeabi_memclr8(void *dest, size_t n); | ||||
|  | ||||
| #endif | ||||
|   | ||||
| @@ -13,21 +13,10 @@ typedef unsigned __int64 size_t; | ||||
| typedef unsigned __int32  size_t; | ||||
| #endif | ||||
|  | ||||
| void * | ||||
| memset ( | ||||
|   void *, | ||||
|   int, | ||||
|   size_t | ||||
|   ); | ||||
|  | ||||
| void* memset(void *, int, size_t); | ||||
| #pragma intrinsic(memset) | ||||
| #pragma function(memset) | ||||
| void * | ||||
| memset ( | ||||
|   void    *s, | ||||
|   int     c, | ||||
|   size_t  n | ||||
|   ) | ||||
| void *memset(void *s, int c, size_t n) | ||||
| { | ||||
|   unsigned char *d; | ||||
|  | ||||
|   | ||||
| @@ -22,6 +22,7 @@ | ||||
| #define GET_OCCUPIED_SIZE(ActualSize, Alignment) \ | ||||
|   (ActualSize) + (((Alignment) - ((ActualSize) & ((Alignment) - 1))) & ((Alignment) - 1)) | ||||
|  | ||||
|  | ||||
| // Vector Table for Sec Phase | ||||
| VOID | ||||
| DebugAgentVectorTable ( | ||||
| @@ -124,6 +125,7 @@ GetFfsFile ( | ||||
|     FileState = GetFileState (ErasePolarity, FfsFileHeader); | ||||
|  | ||||
|     switch (FileState) { | ||||
|  | ||||
|     case EFI_FILE_HEADER_INVALID: | ||||
|       FileOffset += sizeof(EFI_FFS_FILE_HEADER); | ||||
|       FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + sizeof(EFI_FFS_FILE_HEADER)); | ||||
| @@ -159,7 +161,6 @@ GetFfsFile ( | ||||
|       return EFI_NOT_FOUND; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   return EFI_NOT_FOUND; | ||||
| } | ||||
|  | ||||
| @@ -267,7 +268,7 @@ VOID | ||||
| EFIAPI | ||||
| InitializeDebugAgent ( | ||||
|   IN UINT32                InitFlag, | ||||
|   IN VOID                  *Context  OPTIONAL, | ||||
|   IN VOID                  *Context, OPTIONAL | ||||
|   IN DEBUG_AGENT_CONTINUE  Function  OPTIONAL | ||||
|   ) | ||||
| { | ||||
| @@ -334,3 +335,4 @@ SaveAndSetDebugTimerInterrupt ( | ||||
| { | ||||
|   return FALSE; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -17,6 +17,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent | ||||
| #include <Library/PeCoffExtraActionLib.h> | ||||
| #include <Library/PrintLib.h> | ||||
|  | ||||
|  | ||||
| /** | ||||
|   If the build is done on cygwin the paths are cygpaths. | ||||
|   /cygdrive/c/tmp.txt vs c:\tmp.txt so we need to convert | ||||
| @@ -56,6 +57,7 @@ DeCygwinPathIfNeeded ( | ||||
|   return Temp; | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   Performs additional actions after a PE/COFF image has been loaded and relocated. | ||||
|  | ||||
| @@ -79,22 +81,24 @@ PeCoffLoaderRelocateImageExtraAction ( | ||||
| #ifdef __CC_ARM | ||||
| #if (__ARMCC_VERSION < 500000) | ||||
|     // Print out the command for the RVD debugger to load symbols for this image | ||||
|     DEBUG ((DEBUG_LOAD | DEBUG_INFO, "load /a /ni /np %a &0x%p\n", DeCygwinPathIfNeeded (ImageContext->PdbPointer, Temp, sizeof (Temp)), (UINTN)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders))); | ||||
|     DEBUG ((EFI_D_LOAD | EFI_D_INFO, "load /a /ni /np %a &0x%p\n", DeCygwinPathIfNeeded (ImageContext->PdbPointer, Temp, sizeof (Temp)), (UINTN)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders))); | ||||
| #else | ||||
|     // Print out the command for the DS-5 to load symbols for this image | ||||
|     DEBUG ((DEBUG_LOAD | DEBUG_INFO, "add-symbol-file %a 0x%p\n", DeCygwinPathIfNeeded (ImageContext->PdbPointer, Temp, sizeof (Temp)), (UINTN)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders))); | ||||
|     DEBUG ((EFI_D_LOAD | EFI_D_INFO, "add-symbol-file %a 0x%p\n", DeCygwinPathIfNeeded (ImageContext->PdbPointer, Temp, sizeof (Temp)), (UINTN)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders))); | ||||
| #endif | ||||
| #elif __GNUC__ | ||||
|     // This may not work correctly if you generate PE/COFF directly as then the Offset would not be required | ||||
|     DEBUG ((DEBUG_LOAD | DEBUG_INFO, "add-symbol-file %a 0x%p\n", DeCygwinPathIfNeeded (ImageContext->PdbPointer, Temp, sizeof (Temp)), (UINTN)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders))); | ||||
|     DEBUG ((EFI_D_LOAD | EFI_D_INFO, "add-symbol-file %a 0x%p\n", DeCygwinPathIfNeeded (ImageContext->PdbPointer, Temp, sizeof (Temp)), (UINTN)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders))); | ||||
| #else | ||||
|     DEBUG ((DEBUG_LOAD | DEBUG_INFO, "Loading driver at 0x%11p EntryPoint=0x%11p\n", (VOID *)(UINTN)ImageContext->ImageAddress, FUNCTION_ENTRY_POINT (ImageContext->EntryPoint))); | ||||
|     DEBUG ((EFI_D_LOAD | EFI_D_INFO, "Loading driver at 0x%11p EntryPoint=0x%11p\n", (VOID *)(UINTN) ImageContext->ImageAddress, FUNCTION_ENTRY_POINT (ImageContext->EntryPoint))); | ||||
| #endif | ||||
|   } else { | ||||
|     DEBUG ((DEBUG_LOAD | DEBUG_INFO, "Loading driver at 0x%11p EntryPoint=0x%11p\n", (VOID *)(UINTN)ImageContext->ImageAddress, FUNCTION_ENTRY_POINT (ImageContext->EntryPoint))); | ||||
|     DEBUG ((EFI_D_LOAD | EFI_D_INFO, "Loading driver at 0x%11p EntryPoint=0x%11p\n", (VOID *)(UINTN) ImageContext->ImageAddress, FUNCTION_ENTRY_POINT (ImageContext->EntryPoint))); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| /** | ||||
|   Performs additional actions just before a PE/COFF image is unloaded.  Any resources | ||||
|   that were allocated by PeCoffLoaderRelocateImageExtraAction() must be freed. | ||||
|   | ||||
| @@ -48,75 +48,43 @@ DescribeInstructionOrDataAbort ( | ||||
|   CHAR8 *AbortCause; | ||||
|  | ||||
|   switch (Iss & 0x3f) { | ||||
|     case 0x0: AbortCause = "Address size fault, zeroth level of translation or translation table base register"; | ||||
|       break; | ||||
|     case 0x1: AbortCause = "Address size fault, first level"; | ||||
|       break; | ||||
|     case 0x2: AbortCause = "Address size fault, second level"; | ||||
|       break; | ||||
|     case 0x3: AbortCause = "Address size fault, third level"; | ||||
|       break; | ||||
|     case 0x4: AbortCause = "Translation fault, zeroth level"; | ||||
|       break; | ||||
|     case 0x5: AbortCause = "Translation fault, first level"; | ||||
|       break; | ||||
|     case 0x6: AbortCause = "Translation fault, second level"; | ||||
|       break; | ||||
|     case 0x7: AbortCause = "Translation fault, third level"; | ||||
|       break; | ||||
|     case 0x9: AbortCause = "Access flag fault, first level"; | ||||
|       break; | ||||
|     case 0xa: AbortCause = "Access flag fault, second level"; | ||||
|       break; | ||||
|     case 0xb: AbortCause = "Access flag fault, third level"; | ||||
|       break; | ||||
|     case 0xd: AbortCause = "Permission fault, first level"; | ||||
|       break; | ||||
|     case 0xe: AbortCause = "Permission fault, second level"; | ||||
|       break; | ||||
|     case 0xf: AbortCause = "Permission fault, third level"; | ||||
|       break; | ||||
|     case 0x10: AbortCause = "Synchronous external abort"; | ||||
|       break; | ||||
|     case 0x18: AbortCause = "Synchronous parity error on memory access"; | ||||
|       break; | ||||
|     case 0x11: AbortCause = "Asynchronous external abort"; | ||||
|       break; | ||||
|     case 0x19: AbortCause = "Asynchronous parity error on memory access"; | ||||
|       break; | ||||
|     case 0x14: AbortCause = "Synchronous external abort on translation table walk, zeroth level"; | ||||
|       break; | ||||
|     case 0x15: AbortCause = "Synchronous external abort on translation table walk, first level"; | ||||
|       break; | ||||
|     case 0x16: AbortCause = "Synchronous external abort on translation table walk, second level"; | ||||
|       break; | ||||
|     case 0x17: AbortCause = "Synchronous external abort on translation table walk, third level"; | ||||
|       break; | ||||
|     case 0x1c: AbortCause = "Synchronous parity error on memory access on translation table walk, zeroth level"; | ||||
|       break; | ||||
|     case 0x1d: AbortCause = "Synchronous parity error on memory access on translation table walk, first level"; | ||||
|       break; | ||||
|     case 0x1e: AbortCause = "Synchronous parity error on memory access on translation table walk, second level"; | ||||
|       break; | ||||
|     case 0x1f: AbortCause = "Synchronous parity error on memory access on translation table walk, third level"; | ||||
|       break; | ||||
|     case 0x21: AbortCause = "Alignment fault"; | ||||
|       break; | ||||
|     case 0x22: AbortCause = "Debug event"; | ||||
|       break; | ||||
|     case 0x30: AbortCause = "TLB conflict abort"; | ||||
|       break; | ||||
|     case 0x0: AbortCause = "Address size fault, zeroth level of translation or translation table base register";  break; | ||||
|     case 0x1: AbortCause = "Address size fault, first level";  break; | ||||
|     case 0x2: AbortCause = "Address size fault, second level";  break; | ||||
|     case 0x3: AbortCause = "Address size fault, third level";  break; | ||||
|     case 0x4: AbortCause = "Translation fault, zeroth level";  break; | ||||
|     case 0x5: AbortCause = "Translation fault, first level";  break; | ||||
|     case 0x6: AbortCause = "Translation fault, second level";  break; | ||||
|     case 0x7: AbortCause = "Translation fault, third level";  break; | ||||
|     case 0x9: AbortCause = "Access flag fault, first level";  break; | ||||
|     case 0xa: AbortCause = "Access flag fault, second level";  break; | ||||
|     case 0xb: AbortCause = "Access flag fault, third level";  break; | ||||
|     case 0xd: AbortCause = "Permission fault, first level";  break; | ||||
|     case 0xe: AbortCause = "Permission fault, second level";  break; | ||||
|     case 0xf: AbortCause = "Permission fault, third level";  break; | ||||
|     case 0x10: AbortCause = "Synchronous external abort";  break; | ||||
|     case 0x18: AbortCause = "Synchronous parity error on memory access";  break; | ||||
|     case 0x11: AbortCause = "Asynchronous external abort";  break; | ||||
|     case 0x19: AbortCause = "Asynchronous parity error on memory access";  break; | ||||
|     case 0x14: AbortCause = "Synchronous external abort on translation table walk, zeroth level";  break; | ||||
|     case 0x15: AbortCause = "Synchronous external abort on translation table walk, first level";  break; | ||||
|     case 0x16: AbortCause = "Synchronous external abort on translation table walk, second level";  break; | ||||
|     case 0x17: AbortCause = "Synchronous external abort on translation table walk, third level";  break; | ||||
|     case 0x1c: AbortCause = "Synchronous parity error on memory access on translation table walk, zeroth level";  break; | ||||
|     case 0x1d: AbortCause = "Synchronous parity error on memory access on translation table walk, first level";  break; | ||||
|     case 0x1e: AbortCause = "Synchronous parity error on memory access on translation table walk, second level";  break; | ||||
|     case 0x1f: AbortCause = "Synchronous parity error on memory access on translation table walk, third level";  break; | ||||
|     case 0x21: AbortCause = "Alignment fault";  break; | ||||
|     case 0x22: AbortCause = "Debug event";  break; | ||||
|     case 0x30: AbortCause = "TLB conflict abort";  break; | ||||
|     case 0x33: | ||||
|     case 0x34: AbortCause = "IMPLEMENTATION DEFINED"; | ||||
|       break; | ||||
|     case 0x34: AbortCause = "IMPLEMENTATION DEFINED";  break; | ||||
|     case 0x35: | ||||
|     case 0x36: AbortCause = "Domain fault"; | ||||
|       break; | ||||
|     default: AbortCause = ""; | ||||
|       break; | ||||
|     case 0x36: AbortCause = "Domain fault"; break; | ||||
|     default: AbortCause = ""; break; | ||||
|   } | ||||
|  | ||||
|   DEBUG ((DEBUG_ERROR, "\n%a: %a\n", AbortType, AbortCause)); | ||||
|   DEBUG ((EFI_D_ERROR, "\n%a: %a\n", AbortType, AbortCause)); | ||||
| } | ||||
|  | ||||
| STATIC | ||||
| @@ -133,22 +101,17 @@ DescribeExceptionSyndrome ( | ||||
|   Iss = Esr & 0x00ffffff; | ||||
|  | ||||
|   switch (Ec) { | ||||
|     case 0x15: Message = "SVC executed in AArch64"; | ||||
|       break; | ||||
|     case 0x15: Message = "SVC executed in AArch64"; break; | ||||
|     case 0x20: | ||||
|     case 0x21: DescribeInstructionOrDataAbort ("Instruction abort", Iss); | ||||
|       return; | ||||
|     case 0x22: Message = "PC alignment fault"; | ||||
|       break; | ||||
|     case 0x23: Message = "SP alignment fault"; | ||||
|       break; | ||||
|     case 0x21: DescribeInstructionOrDataAbort ("Instruction abort", Iss); return; | ||||
|     case 0x22: Message = "PC alignment fault"; break; | ||||
|     case 0x23: Message = "SP alignment fault"; break; | ||||
|     case 0x24: | ||||
|     case 0x25: DescribeInstructionOrDataAbort ("Data abort", Iss); | ||||
|       return; | ||||
|     case 0x25: DescribeInstructionOrDataAbort ("Data abort", Iss); return; | ||||
|     default: return; | ||||
|   } | ||||
|  | ||||
|   DEBUG ((DEBUG_ERROR, "\n %a \n", Message)); | ||||
|   DEBUG ((EFI_D_ERROR, "\n %a \n", Message)); | ||||
| } | ||||
|  | ||||
| #ifndef MDEPKG_NDEBUG | ||||
| @@ -163,14 +126,12 @@ BaseName ( | ||||
|   Str = FullName + AsciiStrLen (FullName); | ||||
|  | ||||
|   while (--Str > FullName) { | ||||
|     if ((*Str == '/') || (*Str == '\\')) { | ||||
|     if (*Str == '/' || *Str == '\\') { | ||||
|       return Str + 1; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   return Str; | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
| /** | ||||
| @@ -199,10 +160,8 @@ DefaultExceptionHandler ( | ||||
|     if (gST->ConOut != NULL) { | ||||
|       AsciiPrint (Message); | ||||
|     } | ||||
|  | ||||
|     CpuDeadLoop (); | ||||
|   } | ||||
|  | ||||
|   mRecursiveException = TRUE; | ||||
|  | ||||
|   CharCount = AsciiSPrint (Buffer,sizeof (Buffer),"\n\n%a Exception at 0x%016lx\n", gExceptionTypeString[ExceptionType], SystemContext.SystemContextAArch64->ELR); | ||||
| @@ -221,16 +180,11 @@ DefaultExceptionHandler ( | ||||
|  | ||||
|     PrevPdb = Pdb = GetImageName (SystemContext.SystemContextAArch64->ELR, &ImageBase, &PeCoffSizeOfHeader); | ||||
|     if (Pdb != NULL) { | ||||
|     DEBUG (( | ||||
|       DEBUG_ERROR, | ||||
|       "PC 0x%012lx (0x%012lx+0x%08x) [ 0] %a\n", | ||||
|       SystemContext.SystemContextAArch64->ELR, | ||||
|       ImageBase, | ||||
|       SystemContext.SystemContextAArch64->ELR - ImageBase, | ||||
|       BaseName (Pdb) | ||||
|       )); | ||||
|       DEBUG ((EFI_D_ERROR, "PC 0x%012lx (0x%012lx+0x%08x) [ 0] %a\n", | ||||
|         SystemContext.SystemContextAArch64->ELR, ImageBase, | ||||
|         SystemContext.SystemContextAArch64->ELR - ImageBase, BaseName (Pdb))); | ||||
|     } else { | ||||
|     DEBUG ((DEBUG_ERROR, "PC 0x%012lx\n", SystemContext.SystemContextAArch64->ELR)); | ||||
|       DEBUG ((EFI_D_ERROR, "PC 0x%012lx\n", SystemContext.SystemContextAArch64->ELR)); | ||||
|     } | ||||
|  | ||||
|     if ((UINT64 *)SystemContext.SystemContextAArch64->FP != 0) { | ||||
| @@ -242,7 +196,6 @@ DefaultExceptionHandler ( | ||||
|         RootFp[0] = SystemContext.SystemContextAArch64->FP; | ||||
|         RootFp[1] = SystemContext.SystemContextAArch64->LR; | ||||
|       } | ||||
|  | ||||
|       for (Fp = RootFp; Fp[0] != 0; Fp = (UINT64 *)Fp[0]) { | ||||
|         Pdb = GetImageName (Fp[1], &ImageBase, &PeCoffSizeOfHeader); | ||||
|         if (Pdb != NULL) { | ||||
| @@ -250,84 +203,71 @@ DefaultExceptionHandler ( | ||||
|             Idx++; | ||||
|             PrevPdb = Pdb; | ||||
|           } | ||||
|  | ||||
|         DEBUG (( | ||||
|           DEBUG_ERROR, | ||||
|           "PC 0x%012lx (0x%012lx+0x%08x) [% 2d] %a\n", | ||||
|           Fp[1], | ||||
|           ImageBase, | ||||
|           Fp[1] - ImageBase, | ||||
|           Idx, | ||||
|           BaseName (Pdb) | ||||
|           )); | ||||
|           DEBUG ((EFI_D_ERROR, "PC 0x%012lx (0x%012lx+0x%08x) [% 2d] %a\n", | ||||
|             Fp[1], ImageBase, Fp[1] - ImageBase, Idx, BaseName (Pdb))); | ||||
|         } else { | ||||
|         DEBUG ((DEBUG_ERROR, "PC 0x%012lx\n", Fp[1])); | ||||
|           DEBUG ((EFI_D_ERROR, "PC 0x%012lx\n", Fp[1])); | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       PrevPdb = Pdb = GetImageName (SystemContext.SystemContextAArch64->ELR, &ImageBase, &PeCoffSizeOfHeader); | ||||
|       if (Pdb != NULL) { | ||||
|       DEBUG ((DEBUG_ERROR, "\n[ 0] %a\n", Pdb)); | ||||
|         DEBUG ((EFI_D_ERROR, "\n[ 0] %a\n", Pdb)); | ||||
|       } | ||||
|  | ||||
|       Idx = 0; | ||||
|       for (Fp = RootFp; Fp[0] != 0; Fp = (UINT64 *)Fp[0]) { | ||||
|         Pdb = GetImageName (Fp[1], &ImageBase, &PeCoffSizeOfHeader); | ||||
|       if ((Pdb != NULL) && (Pdb != PrevPdb)) { | ||||
|         DEBUG ((DEBUG_ERROR, "[% 2d] %a\n", ++Idx, Pdb)); | ||||
|         if (Pdb != NULL && Pdb != PrevPdb) { | ||||
|           DEBUG ((EFI_D_ERROR, "[% 2d] %a\n", ++Idx, Pdb)); | ||||
|           PrevPdb = Pdb; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|   DEBUG_CODE_END (); | ||||
|  | ||||
|   DEBUG ((DEBUG_ERROR, "\n  X0 0x%016lx   X1 0x%016lx   X2 0x%016lx   X3 0x%016lx\n", SystemContext.SystemContextAArch64->X0, SystemContext.SystemContextAArch64->X1, SystemContext.SystemContextAArch64->X2, SystemContext.SystemContextAArch64->X3)); | ||||
|   DEBUG ((DEBUG_ERROR, "  X4 0x%016lx   X5 0x%016lx   X6 0x%016lx   X7 0x%016lx\n", SystemContext.SystemContextAArch64->X4, SystemContext.SystemContextAArch64->X5, SystemContext.SystemContextAArch64->X6, SystemContext.SystemContextAArch64->X7)); | ||||
|   DEBUG ((DEBUG_ERROR, "  X8 0x%016lx   X9 0x%016lx  X10 0x%016lx  X11 0x%016lx\n", SystemContext.SystemContextAArch64->X8, SystemContext.SystemContextAArch64->X9, SystemContext.SystemContextAArch64->X10, SystemContext.SystemContextAArch64->X11)); | ||||
|   DEBUG ((DEBUG_ERROR, " X12 0x%016lx  X13 0x%016lx  X14 0x%016lx  X15 0x%016lx\n", SystemContext.SystemContextAArch64->X12, SystemContext.SystemContextAArch64->X13, SystemContext.SystemContextAArch64->X14, SystemContext.SystemContextAArch64->X15)); | ||||
|   DEBUG ((DEBUG_ERROR, " X16 0x%016lx  X17 0x%016lx  X18 0x%016lx  X19 0x%016lx\n", SystemContext.SystemContextAArch64->X16, SystemContext.SystemContextAArch64->X17, SystemContext.SystemContextAArch64->X18, SystemContext.SystemContextAArch64->X19)); | ||||
|   DEBUG ((DEBUG_ERROR, " X20 0x%016lx  X21 0x%016lx  X22 0x%016lx  X23 0x%016lx\n", SystemContext.SystemContextAArch64->X20, SystemContext.SystemContextAArch64->X21, SystemContext.SystemContextAArch64->X22, SystemContext.SystemContextAArch64->X23)); | ||||
|   DEBUG ((DEBUG_ERROR, " X24 0x%016lx  X25 0x%016lx  X26 0x%016lx  X27 0x%016lx\n", SystemContext.SystemContextAArch64->X24, SystemContext.SystemContextAArch64->X25, SystemContext.SystemContextAArch64->X26, SystemContext.SystemContextAArch64->X27)); | ||||
|   DEBUG ((DEBUG_ERROR, " X28 0x%016lx   FP 0x%016lx   LR 0x%016lx  \n", SystemContext.SystemContextAArch64->X28, SystemContext.SystemContextAArch64->FP, SystemContext.SystemContextAArch64->LR)); | ||||
|   DEBUG ((EFI_D_ERROR, "\n  X0 0x%016lx   X1 0x%016lx   X2 0x%016lx   X3 0x%016lx\n", SystemContext.SystemContextAArch64->X0, SystemContext.SystemContextAArch64->X1, SystemContext.SystemContextAArch64->X2, SystemContext.SystemContextAArch64->X3)); | ||||
|   DEBUG ((EFI_D_ERROR, "  X4 0x%016lx   X5 0x%016lx   X6 0x%016lx   X7 0x%016lx\n", SystemContext.SystemContextAArch64->X4, SystemContext.SystemContextAArch64->X5, SystemContext.SystemContextAArch64->X6, SystemContext.SystemContextAArch64->X7)); | ||||
|   DEBUG ((EFI_D_ERROR, "  X8 0x%016lx   X9 0x%016lx  X10 0x%016lx  X11 0x%016lx\n", SystemContext.SystemContextAArch64->X8, SystemContext.SystemContextAArch64->X9, SystemContext.SystemContextAArch64->X10, SystemContext.SystemContextAArch64->X11)); | ||||
|   DEBUG ((EFI_D_ERROR, " X12 0x%016lx  X13 0x%016lx  X14 0x%016lx  X15 0x%016lx\n", SystemContext.SystemContextAArch64->X12, SystemContext.SystemContextAArch64->X13, SystemContext.SystemContextAArch64->X14, SystemContext.SystemContextAArch64->X15)); | ||||
|   DEBUG ((EFI_D_ERROR, " X16 0x%016lx  X17 0x%016lx  X18 0x%016lx  X19 0x%016lx\n", SystemContext.SystemContextAArch64->X16, SystemContext.SystemContextAArch64->X17, SystemContext.SystemContextAArch64->X18, SystemContext.SystemContextAArch64->X19)); | ||||
|   DEBUG ((EFI_D_ERROR, " X20 0x%016lx  X21 0x%016lx  X22 0x%016lx  X23 0x%016lx\n", SystemContext.SystemContextAArch64->X20, SystemContext.SystemContextAArch64->X21, SystemContext.SystemContextAArch64->X22, SystemContext.SystemContextAArch64->X23)); | ||||
|   DEBUG ((EFI_D_ERROR, " X24 0x%016lx  X25 0x%016lx  X26 0x%016lx  X27 0x%016lx\n", SystemContext.SystemContextAArch64->X24, SystemContext.SystemContextAArch64->X25, SystemContext.SystemContextAArch64->X26, SystemContext.SystemContextAArch64->X27)); | ||||
|   DEBUG ((EFI_D_ERROR, " X28 0x%016lx   FP 0x%016lx   LR 0x%016lx  \n", SystemContext.SystemContextAArch64->X28, SystemContext.SystemContextAArch64->FP, SystemContext.SystemContextAArch64->LR)); | ||||
|  | ||||
|   /* We save these as 128bit numbers, but have to print them as two 64bit numbers, | ||||
|      so swap the 64bit words to correctly represent a 128bit number.  */ | ||||
|   DEBUG ((DEBUG_ERROR, "\n  V0 0x%016lx %016lx   V1 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V0[1], SystemContext.SystemContextAArch64->V0[0], SystemContext.SystemContextAArch64->V1[1], SystemContext.SystemContextAArch64->V1[0])); | ||||
|   DEBUG ((DEBUG_ERROR, "  V2 0x%016lx %016lx   V3 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V2[1], SystemContext.SystemContextAArch64->V2[0], SystemContext.SystemContextAArch64->V3[1], SystemContext.SystemContextAArch64->V3[0])); | ||||
|   DEBUG ((DEBUG_ERROR, "  V4 0x%016lx %016lx   V5 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V4[1], SystemContext.SystemContextAArch64->V4[0], SystemContext.SystemContextAArch64->V5[1], SystemContext.SystemContextAArch64->V5[0])); | ||||
|   DEBUG ((DEBUG_ERROR, "  V6 0x%016lx %016lx   V7 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V6[1], SystemContext.SystemContextAArch64->V6[0], SystemContext.SystemContextAArch64->V7[1], SystemContext.SystemContextAArch64->V7[0])); | ||||
|   DEBUG ((DEBUG_ERROR, "  V8 0x%016lx %016lx   V9 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V8[1], SystemContext.SystemContextAArch64->V8[0], SystemContext.SystemContextAArch64->V9[1], SystemContext.SystemContextAArch64->V9[0])); | ||||
|   DEBUG ((DEBUG_ERROR, " V10 0x%016lx %016lx  V11 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V10[1], SystemContext.SystemContextAArch64->V10[0], SystemContext.SystemContextAArch64->V11[1], SystemContext.SystemContextAArch64->V11[0])); | ||||
|   DEBUG ((DEBUG_ERROR, " V12 0x%016lx %016lx  V13 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V12[1], SystemContext.SystemContextAArch64->V12[0], SystemContext.SystemContextAArch64->V13[1], SystemContext.SystemContextAArch64->V13[0])); | ||||
|   DEBUG ((DEBUG_ERROR, " V14 0x%016lx %016lx  V15 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V14[1], SystemContext.SystemContextAArch64->V14[0], SystemContext.SystemContextAArch64->V15[1], SystemContext.SystemContextAArch64->V15[0])); | ||||
|   DEBUG ((DEBUG_ERROR, " V16 0x%016lx %016lx  V17 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V16[1], SystemContext.SystemContextAArch64->V16[0], SystemContext.SystemContextAArch64->V17[1], SystemContext.SystemContextAArch64->V17[0])); | ||||
|   DEBUG ((DEBUG_ERROR, " V18 0x%016lx %016lx  V19 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V18[1], SystemContext.SystemContextAArch64->V18[0], SystemContext.SystemContextAArch64->V19[1], SystemContext.SystemContextAArch64->V19[0])); | ||||
|   DEBUG ((DEBUG_ERROR, " V20 0x%016lx %016lx  V21 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V20[1], SystemContext.SystemContextAArch64->V20[0], SystemContext.SystemContextAArch64->V21[1], SystemContext.SystemContextAArch64->V21[0])); | ||||
|   DEBUG ((DEBUG_ERROR, " V22 0x%016lx %016lx  V23 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V22[1], SystemContext.SystemContextAArch64->V22[0], SystemContext.SystemContextAArch64->V23[1], SystemContext.SystemContextAArch64->V23[0])); | ||||
|   DEBUG ((DEBUG_ERROR, " V24 0x%016lx %016lx  V25 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V24[1], SystemContext.SystemContextAArch64->V24[0], SystemContext.SystemContextAArch64->V25[1], SystemContext.SystemContextAArch64->V25[0])); | ||||
|   DEBUG ((DEBUG_ERROR, " V26 0x%016lx %016lx  V27 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V26[1], SystemContext.SystemContextAArch64->V26[0], SystemContext.SystemContextAArch64->V27[1], SystemContext.SystemContextAArch64->V27[0])); | ||||
|   DEBUG ((DEBUG_ERROR, " V28 0x%016lx %016lx  V29 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V28[1], SystemContext.SystemContextAArch64->V28[0], SystemContext.SystemContextAArch64->V29[1], SystemContext.SystemContextAArch64->V29[0])); | ||||
|   DEBUG ((DEBUG_ERROR, " V30 0x%016lx %016lx  V31 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V30[1], SystemContext.SystemContextAArch64->V30[0], SystemContext.SystemContextAArch64->V31[1], SystemContext.SystemContextAArch64->V31[0])); | ||||
|   DEBUG ((EFI_D_ERROR, "\n  V0 0x%016lx %016lx   V1 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V0[1], SystemContext.SystemContextAArch64->V0[0], SystemContext.SystemContextAArch64->V1[1], SystemContext.SystemContextAArch64->V1[0])); | ||||
|   DEBUG ((EFI_D_ERROR, "  V2 0x%016lx %016lx   V3 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V2[1], SystemContext.SystemContextAArch64->V2[0], SystemContext.SystemContextAArch64->V3[1], SystemContext.SystemContextAArch64->V3[0])); | ||||
|   DEBUG ((EFI_D_ERROR, "  V4 0x%016lx %016lx   V5 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V4[1], SystemContext.SystemContextAArch64->V4[0], SystemContext.SystemContextAArch64->V5[1], SystemContext.SystemContextAArch64->V5[0])); | ||||
|   DEBUG ((EFI_D_ERROR, "  V6 0x%016lx %016lx   V7 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V6[1], SystemContext.SystemContextAArch64->V6[0], SystemContext.SystemContextAArch64->V7[1], SystemContext.SystemContextAArch64->V7[0])); | ||||
|   DEBUG ((EFI_D_ERROR, "  V8 0x%016lx %016lx   V9 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V8[1], SystemContext.SystemContextAArch64->V8[0], SystemContext.SystemContextAArch64->V9[1], SystemContext.SystemContextAArch64->V9[0])); | ||||
|   DEBUG ((EFI_D_ERROR, " V10 0x%016lx %016lx  V11 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V10[1], SystemContext.SystemContextAArch64->V10[0], SystemContext.SystemContextAArch64->V11[1], SystemContext.SystemContextAArch64->V11[0])); | ||||
|   DEBUG ((EFI_D_ERROR, " V12 0x%016lx %016lx  V13 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V12[1], SystemContext.SystemContextAArch64->V12[0], SystemContext.SystemContextAArch64->V13[1], SystemContext.SystemContextAArch64->V13[0])); | ||||
|   DEBUG ((EFI_D_ERROR, " V14 0x%016lx %016lx  V15 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V14[1], SystemContext.SystemContextAArch64->V14[0], SystemContext.SystemContextAArch64->V15[1], SystemContext.SystemContextAArch64->V15[0])); | ||||
|   DEBUG ((EFI_D_ERROR, " V16 0x%016lx %016lx  V17 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V16[1], SystemContext.SystemContextAArch64->V16[0], SystemContext.SystemContextAArch64->V17[1], SystemContext.SystemContextAArch64->V17[0])); | ||||
|   DEBUG ((EFI_D_ERROR, " V18 0x%016lx %016lx  V19 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V18[1], SystemContext.SystemContextAArch64->V18[0], SystemContext.SystemContextAArch64->V19[1], SystemContext.SystemContextAArch64->V19[0])); | ||||
|   DEBUG ((EFI_D_ERROR, " V20 0x%016lx %016lx  V21 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V20[1], SystemContext.SystemContextAArch64->V20[0], SystemContext.SystemContextAArch64->V21[1], SystemContext.SystemContextAArch64->V21[0])); | ||||
|   DEBUG ((EFI_D_ERROR, " V22 0x%016lx %016lx  V23 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V22[1], SystemContext.SystemContextAArch64->V22[0], SystemContext.SystemContextAArch64->V23[1], SystemContext.SystemContextAArch64->V23[0])); | ||||
|   DEBUG ((EFI_D_ERROR, " V24 0x%016lx %016lx  V25 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V24[1], SystemContext.SystemContextAArch64->V24[0], SystemContext.SystemContextAArch64->V25[1], SystemContext.SystemContextAArch64->V25[0])); | ||||
|   DEBUG ((EFI_D_ERROR, " V26 0x%016lx %016lx  V27 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V26[1], SystemContext.SystemContextAArch64->V26[0], SystemContext.SystemContextAArch64->V27[1], SystemContext.SystemContextAArch64->V27[0])); | ||||
|   DEBUG ((EFI_D_ERROR, " V28 0x%016lx %016lx  V29 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V28[1], SystemContext.SystemContextAArch64->V28[0], SystemContext.SystemContextAArch64->V29[1], SystemContext.SystemContextAArch64->V29[0])); | ||||
|   DEBUG ((EFI_D_ERROR, " V30 0x%016lx %016lx  V31 0x%016lx %016lx\n", SystemContext.SystemContextAArch64->V30[1], SystemContext.SystemContextAArch64->V30[0], SystemContext.SystemContextAArch64->V31[1], SystemContext.SystemContextAArch64->V31[0])); | ||||
|  | ||||
|   DEBUG ((DEBUG_ERROR, "\n  SP 0x%016lx  ELR 0x%016lx  SPSR 0x%08lx  FPSR 0x%08lx\n ESR 0x%08lx          FAR 0x%016lx\n", SystemContext.SystemContextAArch64->SP, SystemContext.SystemContextAArch64->ELR, SystemContext.SystemContextAArch64->SPSR, SystemContext.SystemContextAArch64->FPSR, SystemContext.SystemContextAArch64->ESR, SystemContext.SystemContextAArch64->FAR)); | ||||
|   DEBUG ((EFI_D_ERROR, "\n  SP 0x%016lx  ELR 0x%016lx  SPSR 0x%08lx  FPSR 0x%08lx\n ESR 0x%08lx          FAR 0x%016lx\n", SystemContext.SystemContextAArch64->SP, SystemContext.SystemContextAArch64->ELR, SystemContext.SystemContextAArch64->SPSR, SystemContext.SystemContextAArch64->FPSR, SystemContext.SystemContextAArch64->ESR, SystemContext.SystemContextAArch64->FAR)); | ||||
|  | ||||
|   DEBUG ((DEBUG_ERROR, "\n ESR : EC 0x%02x  IL 0x%x  ISS 0x%08x\n", (SystemContext.SystemContextAArch64->ESR & 0xFC000000) >> 26, (SystemContext.SystemContextAArch64->ESR >> 25) & 0x1, SystemContext.SystemContextAArch64->ESR & 0x1FFFFFF)); | ||||
|   DEBUG ((EFI_D_ERROR, "\n ESR : EC 0x%02x  IL 0x%x  ISS 0x%08x\n", (SystemContext.SystemContextAArch64->ESR & 0xFC000000) >> 26, (SystemContext.SystemContextAArch64->ESR >> 25) & 0x1, SystemContext.SystemContextAArch64->ESR & 0x1FFFFFF )); | ||||
|  | ||||
|   DescribeExceptionSyndrome (SystemContext.SystemContextAArch64->ESR); | ||||
|  | ||||
|   DEBUG ((DEBUG_ERROR, "\nStack dump:\n")); | ||||
|   DEBUG ((EFI_D_ERROR, "\nStack dump:\n")); | ||||
|   for (Offset = -256; Offset < 256; Offset += 32) { | ||||
|     DEBUG (( | ||||
|       DEBUG_ERROR, | ||||
|       "%c %013lx: %016lx %016lx %016lx %016lx\n", | ||||
|     DEBUG  ((EFI_D_ERROR, "%c %013lx: %016lx %016lx %016lx %016lx\n", | ||||
|       Offset == 0 ? '>' : ' ', | ||||
|       SystemContext.SystemContextAArch64->SP + Offset, | ||||
|       *(UINT64 *)(SystemContext.SystemContextAArch64->SP + Offset), | ||||
|       *(UINT64 *)(SystemContext.SystemContextAArch64->SP + Offset + 8), | ||||
|       *(UINT64 *)(SystemContext.SystemContextAArch64->SP + Offset + 16), | ||||
|       *(UINT64 *)(SystemContext.SystemContextAArch64->SP + Offset + 24) | ||||
|       )); | ||||
|       *(UINT64 *)(SystemContext.SystemContextAArch64->SP + Offset + 24))); | ||||
|   } | ||||
|  | ||||
|   ASSERT (FALSE); | ||||
|   | ||||
| @@ -134,38 +134,22 @@ FaultStatusToString ( | ||||
|   CHAR8 *FaultSource; | ||||
|  | ||||
|   switch (Status) { | ||||
|     case 0x01: FaultSource = "Alignment fault"; | ||||
|       break; | ||||
|     case 0x02: FaultSource = "Debug event fault"; | ||||
|       break; | ||||
|     case 0x03: FaultSource = "Access Flag fault on Section"; | ||||
|       break; | ||||
|     case 0x04: FaultSource = "Cache maintenance operation fault[2]"; | ||||
|       break; | ||||
|     case 0x05: FaultSource = "Translation fault on Section"; | ||||
|       break; | ||||
|     case 0x06: FaultSource = "Access Flag fault on Page"; | ||||
|       break; | ||||
|     case 0x07: FaultSource = "Translation fault on Page"; | ||||
|       break; | ||||
|     case 0x08: FaultSource = "Precise External Abort"; | ||||
|       break; | ||||
|     case 0x09: FaultSource = "Domain fault on Section"; | ||||
|       break; | ||||
|     case 0x0b: FaultSource = "Domain fault on Page"; | ||||
|       break; | ||||
|     case 0x0c: FaultSource = "External abort on translation, first level"; | ||||
|       break; | ||||
|     case 0x0d: FaultSource = "Permission fault on Section"; | ||||
|       break; | ||||
|     case 0x0e: FaultSource = "External abort on translation, second level"; | ||||
|       break; | ||||
|     case 0x0f: FaultSource = "Permission fault on Page"; | ||||
|       break; | ||||
|     case 0x16: FaultSource = "Imprecise External Abort"; | ||||
|       break; | ||||
|     default:   FaultSource = "No function"; | ||||
|       break; | ||||
|     case 0x01: FaultSource = "Alignment fault"; break; | ||||
|     case 0x02: FaultSource = "Debug event fault"; break; | ||||
|     case 0x03: FaultSource = "Access Flag fault on Section"; break; | ||||
|     case 0x04: FaultSource = "Cache maintenance operation fault[2]"; break; | ||||
|     case 0x05: FaultSource = "Translation fault on Section"; break; | ||||
|     case 0x06: FaultSource = "Access Flag fault on Page"; break; | ||||
|     case 0x07: FaultSource = "Translation fault on Page"; break; | ||||
|     case 0x08: FaultSource = "Precise External Abort"; break; | ||||
|     case 0x09: FaultSource = "Domain fault on Section"; break; | ||||
|     case 0x0b: FaultSource = "Domain fault on Page"; break; | ||||
|     case 0x0c: FaultSource = "External abort on translation, first level"; break; | ||||
|     case 0x0d: FaultSource = "Permission fault on Section"; break; | ||||
|     case 0x0e: FaultSource = "External abort on translation, second level"; break; | ||||
|     case 0x0f: FaultSource = "Permission fault on Page"; break; | ||||
|     case 0x16: FaultSource = "Imprecise External Abort"; break; | ||||
|     default:   FaultSource = "No function"; break; | ||||
|     } | ||||
|  | ||||
|   return FaultSource; | ||||
| @@ -207,14 +191,8 @@ DefaultExceptionHandler ( | ||||
|  | ||||
|   PcAdjust = 0; | ||||
|  | ||||
|   CharCount = AsciiSPrint ( | ||||
|                 Buffer, | ||||
|                 sizeof (Buffer), | ||||
|                 "\n%a Exception PC at 0x%08x  CPSR 0x%08x ", | ||||
|                 gExceptionTypeString[ExceptionType], | ||||
|                 SystemContext.SystemContextArm->PC, | ||||
|                 SystemContext.SystemContextArm->CPSR | ||||
|                 ); | ||||
|   CharCount = AsciiSPrint (Buffer,sizeof (Buffer),"\n%a Exception PC at 0x%08x  CPSR 0x%08x ", | ||||
|          gExceptionTypeString[ExceptionType], SystemContext.SystemContextArm->PC, SystemContext.SystemContextArm->CPSR); | ||||
|   SerialPortWrite ((UINT8 *)Buffer, CharCount); | ||||
|   if (gST->ConOut != NULL) { | ||||
|     AsciiPrint (Buffer); | ||||
| @@ -232,12 +210,12 @@ DefaultExceptionHandler ( | ||||
|     UINT32  ItBlock; | ||||
|  | ||||
|     CpsrString (SystemContext.SystemContextArm->CPSR, CpsrStr); | ||||
|   DEBUG ((DEBUG_ERROR, "%a\n", CpsrStr)); | ||||
|     DEBUG ((EFI_D_ERROR, "%a\n", CpsrStr)); | ||||
|  | ||||
|     Pdb = GetImageName (SystemContext.SystemContextArm->PC, &ImageBase, &PeCoffSizeOfHeader); | ||||
|     Offset = SystemContext.SystemContextArm->PC - ImageBase; | ||||
|     if (Pdb != NULL) { | ||||
|     DEBUG ((DEBUG_ERROR, "%a\n", Pdb)); | ||||
|       DEBUG ((EFI_D_ERROR, "%a\n", Pdb)); | ||||
|  | ||||
|       // | ||||
|       // A PE/COFF image loads its headers into memory so the headers are | ||||
| @@ -247,13 +225,13 @@ DefaultExceptionHandler ( | ||||
|       // you need to subtract out the size of the PE/COFF header to get | ||||
|       // get the offset that matches the link map. | ||||
|       // | ||||
|     DEBUG ((DEBUG_ERROR, "loaded at 0x%08x (PE/COFF offset) 0x%x (ELF or Mach-O offset) 0x%x", ImageBase, Offset, Offset - PeCoffSizeOfHeader)); | ||||
|       DEBUG ((EFI_D_ERROR, "loaded at 0x%08x (PE/COFF offset) 0x%x (ELF or Mach-O offset) 0x%x", ImageBase, Offset, Offset - PeCoffSizeOfHeader)); | ||||
|  | ||||
|       // If we come from an image it is safe to show the instruction. We know it should not fault | ||||
|       DisAsm = (UINT8 *)(UINTN)SystemContext.SystemContextArm->PC; | ||||
|       ItBlock = 0; | ||||
|       DisassembleInstruction (&DisAsm, (SystemContext.SystemContextArm->CPSR & BIT5) == BIT5, TRUE, &ItBlock, Buffer, sizeof (Buffer)); | ||||
|     DEBUG ((DEBUG_ERROR, "\n%a", Buffer)); | ||||
|       DEBUG ((EFI_D_ERROR, "\n%a", Buffer)); | ||||
|  | ||||
|       switch (ExceptionType) { | ||||
|       case EXCEPT_ARM_UNDEFINED_INSTRUCTION: | ||||
| @@ -267,28 +245,28 @@ DefaultExceptionHandler ( | ||||
|       default: | ||||
|         break; | ||||
|       } | ||||
|   } | ||||
|  | ||||
|     } | ||||
|   DEBUG_CODE_END (); | ||||
|   DEBUG ((DEBUG_ERROR, "\n  R0 0x%08x   R1 0x%08x   R2 0x%08x   R3 0x%08x\n", SystemContext.SystemContextArm->R0, SystemContext.SystemContextArm->R1, SystemContext.SystemContextArm->R2, SystemContext.SystemContextArm->R3)); | ||||
|   DEBUG ((DEBUG_ERROR, "  R4 0x%08x   R5 0x%08x   R6 0x%08x   R7 0x%08x\n", SystemContext.SystemContextArm->R4, SystemContext.SystemContextArm->R5, SystemContext.SystemContextArm->R6, SystemContext.SystemContextArm->R7)); | ||||
|   DEBUG ((DEBUG_ERROR, "  R8 0x%08x   R9 0x%08x  R10 0x%08x  R11 0x%08x\n", SystemContext.SystemContextArm->R8, SystemContext.SystemContextArm->R9, SystemContext.SystemContextArm->R10, SystemContext.SystemContextArm->R11)); | ||||
|   DEBUG ((DEBUG_ERROR, " R12 0x%08x   SP 0x%08x   LR 0x%08x   PC 0x%08x\n", SystemContext.SystemContextArm->R12, SystemContext.SystemContextArm->SP, SystemContext.SystemContextArm->LR, SystemContext.SystemContextArm->PC)); | ||||
|   DEBUG ((DEBUG_ERROR, "DFSR 0x%08x DFAR 0x%08x IFSR 0x%08x IFAR 0x%08x\n", SystemContext.SystemContextArm->DFSR, SystemContext.SystemContextArm->DFAR, SystemContext.SystemContextArm->IFSR, SystemContext.SystemContextArm->IFAR)); | ||||
|   DEBUG ((EFI_D_ERROR, "\n  R0 0x%08x   R1 0x%08x   R2 0x%08x   R3 0x%08x\n", SystemContext.SystemContextArm->R0, SystemContext.SystemContextArm->R1, SystemContext.SystemContextArm->R2, SystemContext.SystemContextArm->R3)); | ||||
|   DEBUG ((EFI_D_ERROR, "  R4 0x%08x   R5 0x%08x   R6 0x%08x   R7 0x%08x\n", SystemContext.SystemContextArm->R4, SystemContext.SystemContextArm->R5, SystemContext.SystemContextArm->R6, SystemContext.SystemContextArm->R7)); | ||||
|   DEBUG ((EFI_D_ERROR, "  R8 0x%08x   R9 0x%08x  R10 0x%08x  R11 0x%08x\n", SystemContext.SystemContextArm->R8, SystemContext.SystemContextArm->R9, SystemContext.SystemContextArm->R10, SystemContext.SystemContextArm->R11)); | ||||
|   DEBUG ((EFI_D_ERROR, " R12 0x%08x   SP 0x%08x   LR 0x%08x   PC 0x%08x\n", SystemContext.SystemContextArm->R12, SystemContext.SystemContextArm->SP, SystemContext.SystemContextArm->LR, SystemContext.SystemContextArm->PC)); | ||||
|   DEBUG ((EFI_D_ERROR, "DFSR 0x%08x DFAR 0x%08x IFSR 0x%08x IFAR 0x%08x\n", SystemContext.SystemContextArm->DFSR, SystemContext.SystemContextArm->DFAR, SystemContext.SystemContextArm->IFSR, SystemContext.SystemContextArm->IFAR)); | ||||
|  | ||||
|   // Bit10 is Status[4] Bit3:0 is Status[3:0] | ||||
|   DfsrStatus = (SystemContext.SystemContextArm->DFSR & 0xf) | ((SystemContext.SystemContextArm->DFSR >> 6) & 0x10); | ||||
|   DfsrWrite = (SystemContext.SystemContextArm->DFSR & BIT11) != 0; | ||||
|   if (DfsrStatus != 0x00) { | ||||
|     DEBUG ((DEBUG_ERROR, " %a: %a 0x%08x\n", FaultStatusToString (DfsrStatus), DfsrWrite ? "write to" : "read from", SystemContext.SystemContextArm->DFAR)); | ||||
|     DEBUG ((EFI_D_ERROR, " %a: %a 0x%08x\n", FaultStatusToString (DfsrStatus), DfsrWrite ? "write to" : "read from", SystemContext.SystemContextArm->DFAR)); | ||||
|   } | ||||
|  | ||||
|   IfsrStatus = (SystemContext.SystemContextArm->IFSR & 0xf) | ((SystemContext.SystemContextArm->IFSR >> 6) & 0x10); | ||||
|   if (IfsrStatus != 0) { | ||||
|     DEBUG ((DEBUG_ERROR, " Instruction %a at 0x%08x\n", FaultStatusToString (SystemContext.SystemContextArm->IFSR & 0xf), SystemContext.SystemContextArm->IFAR)); | ||||
|     DEBUG ((EFI_D_ERROR, " Instruction %a at 0x%08x\n", FaultStatusToString (SystemContext.SystemContextArm->IFSR & 0xf), SystemContext.SystemContextArm->IFAR)); | ||||
|   } | ||||
|  | ||||
|   DEBUG ((DEBUG_ERROR, "\n")); | ||||
|   DEBUG ((EFI_D_ERROR, "\n")); | ||||
|   ASSERT (FALSE); | ||||
|  | ||||
|   CpuDeadLoop ();   // may return if executing under a debugger | ||||
|   | ||||
| @@ -53,11 +53,9 @@ GetImageName ( | ||||
|   for (Entry = 0; Entry < DebugTableHeader->TableSize; Entry++, DebugTable++) { | ||||
|     if (DebugTable->NormalImage != NULL) { | ||||
|       if ((DebugTable->NormalImage->ImageInfoType == EFI_DEBUG_IMAGE_INFO_TYPE_NORMAL) && | ||||
|           (DebugTable->NormalImage->LoadedImageProtocolInstance != NULL)) | ||||
|       { | ||||
|           (DebugTable->NormalImage->LoadedImageProtocolInstance != NULL)) { | ||||
|         if ((Address >= (CHAR8 *)DebugTable->NormalImage->LoadedImageProtocolInstance->ImageBase) && | ||||
|             (Address <= ((CHAR8 *)DebugTable->NormalImage->LoadedImageProtocolInstance->ImageBase + DebugTable->NormalImage->LoadedImageProtocolInstance->ImageSize))) | ||||
|         { | ||||
|             (Address <= ((CHAR8 *)DebugTable->NormalImage->LoadedImageProtocolInstance->ImageBase + DebugTable->NormalImage->LoadedImageProtocolInstance->ImageSize))) { | ||||
|           *ImageBase = (UINTN)DebugTable->NormalImage->LoadedImageProtocolInstance->ImageBase; | ||||
|           *PeCoffSizeOfHeaders = PeCoffGetSizeOfHeaders ((VOID *)(UINTN)*ImageBase); | ||||
|           return PeCoffLoaderGetPdbPointer (DebugTable->NormalImage->LoadedImageProtocolInstance->ImageBase); | ||||
| @@ -68,3 +66,4 @@ GetImageName ( | ||||
|  | ||||
|   return NULL; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -1,187 +0,0 @@ | ||||
| /** @file | ||||
|   Implementation for PlatformBootManagerLib library class interfaces. | ||||
|  | ||||
|   Copyright (C) 2015-2016, Red Hat, Inc. | ||||
|   Copyright (c) 2014 - 2019, ARM Ltd. All rights reserved.<BR> | ||||
|   Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> | ||||
|   Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> | ||||
|   Copyright (c) 2020 - 2021, Ampere Computing LLC. All rights reserved.<BR> | ||||
|  | ||||
|   SPDX-License-Identifier: BSD-2-Clause-Patent | ||||
|  | ||||
| **/ | ||||
|  | ||||
| #include <Uefi.h> | ||||
|  | ||||
| #include <Guid/EventGroup.h> | ||||
| #include <Library/BaseLib.h> | ||||
| #include <Library/BaseMemoryLib.h> | ||||
| #include <Library/DebugLib.h> | ||||
| #include <Library/DevicePathLib.h> | ||||
| #include <Library/MemoryAllocationLib.h> | ||||
| #include <Library/PcdLib.h> | ||||
| #include <Library/UefiBootManagerLib.h> | ||||
| #include <Library/UefiBootServicesTableLib.h> | ||||
| #include <Library/UefiLib.h> | ||||
| #include <Library/UefiRuntimeServicesTableLib.h> | ||||
| #include <Protocol/LoadedImage.h> | ||||
| #include <Protocol/PlatformBootManager.h> | ||||
|  | ||||
| /** | ||||
|   Register a boot option using a file GUID in the FV. | ||||
|  | ||||
|   @param  FileGuid     The file GUID name in the FV. | ||||
|   @param  Description  The description of the boot option. | ||||
|   @param  Attributes   The attributes of the boot option. | ||||
|  | ||||
| **/ | ||||
| STATIC | ||||
| VOID | ||||
| PlatformRegisterFvBootOption ( | ||||
|   CONST EFI_GUID  *FileGuid, | ||||
|   CHAR16          *Description, | ||||
|   UINT32          Attributes | ||||
|   ) | ||||
| { | ||||
|   EFI_STATUS                         Status; | ||||
|   INTN                               OptionIndex; | ||||
|   EFI_BOOT_MANAGER_LOAD_OPTION       NewOption; | ||||
|   EFI_BOOT_MANAGER_LOAD_OPTION       *BootOptions; | ||||
|   UINTN                              BootOptionCount; | ||||
|   MEDIA_FW_VOL_FILEPATH_DEVICE_PATH  FileNode; | ||||
|   EFI_LOADED_IMAGE_PROTOCOL          *LoadedImage; | ||||
|   EFI_DEVICE_PATH_PROTOCOL           *DevicePath; | ||||
|  | ||||
|   Status = gBS->HandleProtocol ( | ||||
|                   gImageHandle, | ||||
|                   &gEfiLoadedImageProtocolGuid, | ||||
|                   (VOID **)&LoadedImage | ||||
|                   ); | ||||
|   ASSERT_EFI_ERROR (Status); | ||||
|  | ||||
|   EfiInitializeFwVolDevicepathNode (&FileNode, FileGuid); | ||||
|   DevicePath = DevicePathFromHandle (LoadedImage->DeviceHandle); | ||||
|   ASSERT (DevicePath != NULL); | ||||
|   DevicePath = AppendDevicePathNode ( | ||||
|                  DevicePath, | ||||
|                  (EFI_DEVICE_PATH_PROTOCOL *)&FileNode | ||||
|                  ); | ||||
|   ASSERT (DevicePath != NULL); | ||||
|  | ||||
|   Status = EfiBootManagerInitializeLoadOption ( | ||||
|              &NewOption, | ||||
|              LoadOptionNumberUnassigned, | ||||
|              LoadOptionTypeBoot, | ||||
|              Attributes, | ||||
|              Description, | ||||
|              DevicePath, | ||||
|              NULL, | ||||
|              0 | ||||
|              ); | ||||
|   ASSERT_EFI_ERROR (Status); | ||||
|   FreePool (DevicePath); | ||||
|  | ||||
|   BootOptions = EfiBootManagerGetLoadOptions ( | ||||
|                   &BootOptionCount, | ||||
|                   LoadOptionTypeBoot | ||||
|                   ); | ||||
|  | ||||
|   OptionIndex = EfiBootManagerFindLoadOption ( | ||||
|                   &NewOption, | ||||
|                   BootOptions, | ||||
|                   BootOptionCount | ||||
|                   ); | ||||
|  | ||||
|   if (OptionIndex == -1) { | ||||
|     Status = EfiBootManagerAddLoadOptionVariable (&NewOption, MAX_UINTN); | ||||
|     ASSERT_EFI_ERROR (Status); | ||||
|   } | ||||
|  | ||||
|   EfiBootManagerFreeLoadOption (&NewOption); | ||||
|   EfiBootManagerFreeLoadOptions (BootOptions, BootOptionCount); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   Do the platform specific action before the console is connected. | ||||
|  | ||||
|   Such as: | ||||
|     Update console variable; | ||||
|     Register new Driver#### or Boot####; | ||||
|     Signal ReadyToLock event. | ||||
| **/ | ||||
| VOID | ||||
| EFIAPI | ||||
| PlatformBootManagerBeforeConsole ( | ||||
|   VOID | ||||
|   ) | ||||
| { | ||||
|   // | ||||
|   // Signal EndOfDxe PI Event | ||||
|   // | ||||
|   EfiEventGroupSignal (&gEfiEndOfDxeEventGroupGuid); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   Do the platform specific action after the console is connected. | ||||
|  | ||||
|   Such as: | ||||
|     Dynamically switch output mode; | ||||
|     Signal console ready platform customized event; | ||||
|     Run diagnostics like memory testing; | ||||
|     Connect certain devices; | ||||
|     Dispatch additional option roms. | ||||
| **/ | ||||
| VOID | ||||
| EFIAPI | ||||
| PlatformBootManagerAfterConsole ( | ||||
|   VOID | ||||
|   ) | ||||
| { | ||||
|   EFI_GUID  LinuxBootFileGuid; | ||||
|  | ||||
|   CopyGuid (&LinuxBootFileGuid, PcdGetPtr (PcdLinuxBootFileGuid)); | ||||
|  | ||||
|   if (!CompareGuid (&LinuxBootFileGuid, &gZeroGuid)) { | ||||
|     // | ||||
|     // Register LinuxBoot | ||||
|     // | ||||
|     PlatformRegisterFvBootOption ( | ||||
|       &LinuxBootFileGuid, | ||||
|       L"LinuxBoot", | ||||
|       LOAD_OPTION_ACTIVE | ||||
|       ); | ||||
|   } else { | ||||
|     DEBUG ((DEBUG_ERROR, "%a: PcdLinuxBootFileGuid was not set!\n", __FUNCTION__)); | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** | ||||
|   This function is called each second during the boot manager waits the | ||||
|   timeout. | ||||
|  | ||||
|   @param TimeoutRemain  The remaining timeout. | ||||
| **/ | ||||
| VOID | ||||
| EFIAPI | ||||
| PlatformBootManagerWaitCallback ( | ||||
|   UINT16  TimeoutRemain | ||||
|   ) | ||||
| { | ||||
|   return; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   The function is called when no boot option could be launched, | ||||
|   including platform recovery options and options pointing to applications | ||||
|   built into firmware volumes. | ||||
|  | ||||
|   If this function returns, BDS attempts to enter an infinite loop. | ||||
| **/ | ||||
| VOID | ||||
| EFIAPI | ||||
| PlatformBootManagerUnableToBoot ( | ||||
|   VOID | ||||
|   ) | ||||
| { | ||||
|   return; | ||||
| } | ||||
| @@ -1,58 +0,0 @@ | ||||
| ## @file | ||||
| #  Implementation for PlatformBootManagerLib library class interfaces. | ||||
| # | ||||
| #  Copyright (C) 2015-2016, Red Hat, Inc. | ||||
| #  Copyright (c) 2014, ARM Ltd. All rights reserved.<BR> | ||||
| #  Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR> | ||||
| #  Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> | ||||
| #  Copyright (c) 2020 - 2021, Ampere Computing LLC. All rights reserved.<BR> | ||||
| # | ||||
| #  SPDX-License-Identifier: BSD-2-Clause-Patent | ||||
| # | ||||
| ## | ||||
|  | ||||
| [Defines] | ||||
|   INF_VERSION                    = 0x0001001B | ||||
|   BASE_NAME                      = LinuxBootBootManagerLib | ||||
|   FILE_GUID                      = 1FA91547-DB23-4F6A-8AF8-3B9782A7F917 | ||||
|   MODULE_TYPE                    = DXE_DRIVER | ||||
|   VERSION_STRING                 = 1.0 | ||||
|   LIBRARY_CLASS                  = PlatformBootManagerLib|DXE_DRIVER | ||||
|  | ||||
| # | ||||
| # The following information is for reference only and not required by the build tools. | ||||
| # | ||||
| #  VALID_ARCHITECTURES           = ARM AARCH64 | ||||
| # | ||||
|  | ||||
| [Sources] | ||||
|   LinuxBootBm.c | ||||
|  | ||||
| [Packages] | ||||
|   ArmPkg/ArmPkg.dec | ||||
|   MdeModulePkg/MdeModulePkg.dec | ||||
|   MdePkg/MdePkg.dec | ||||
|   ShellPkg/ShellPkg.dec | ||||
|  | ||||
| [LibraryClasses] | ||||
|   BaseLib | ||||
|   BaseMemoryLib | ||||
|   DebugLib | ||||
|   MemoryAllocationLib | ||||
|   PcdLib | ||||
|   PrintLib | ||||
|   UefiBootManagerLib | ||||
|   UefiBootServicesTableLib | ||||
|   UefiLib | ||||
|   UefiRuntimeServicesTableLib | ||||
|  | ||||
| [Pcd] | ||||
|   gArmTokenSpaceGuid.PcdLinuxBootFileGuid | ||||
|  | ||||
| [Guids] | ||||
|   gEfiEndOfDxeEventGroupGuid | ||||
|   gUefiShellFileGuid | ||||
|   gZeroGuid | ||||
|  | ||||
| [Protocols] | ||||
|   gEfiLoadedImageProtocolGuid | ||||
| @@ -41,8 +41,7 @@ IsOpteePresent ( | ||||
|   if ((ArmSmcArgs.Arg0 == OPTEE_OS_UID0) && | ||||
|       (ArmSmcArgs.Arg1 == OPTEE_OS_UID1) && | ||||
|       (ArmSmcArgs.Arg2 == OPTEE_OS_UID2) && | ||||
|       (ArmSmcArgs.Arg3 == OPTEE_OS_UID3)) | ||||
|   { | ||||
|       (ArmSmcArgs.Arg3 == OPTEE_OS_UID3)) { | ||||
|     return TRUE; | ||||
|   } else { | ||||
|     return FALSE; | ||||
| @@ -442,8 +441,7 @@ OpteeInvokeFunction ( | ||||
|         InvokeFunctionArg->Params, | ||||
|         OPTEE_MAX_CALL_PARAMS, | ||||
|         MessageArg->Params | ||||
|         ) != 0) | ||||
|   { | ||||
|         ) != 0) { | ||||
|     MessageArg->Return = OPTEE_ERROR_COMMUNICATION; | ||||
|     MessageArg->ReturnOrigin = OPTEE_ORIGIN_COMMUNICATION; | ||||
|   } | ||||
|   | ||||
| @@ -2,10 +2,9 @@ | ||||
|   Implementation for PlatformBootManagerLib library class interfaces. | ||||
|  | ||||
|   Copyright (C) 2015-2016, Red Hat, Inc. | ||||
|   Copyright (c) 2014 - 2021, ARM Ltd. All rights reserved.<BR> | ||||
|   Copyright (c) 2014 - 2019, ARM Ltd. All rights reserved.<BR> | ||||
|   Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> | ||||
|   Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> | ||||
|   Copyright (c) 2021, Semihalf All rights reserved.<BR> | ||||
|  | ||||
|   SPDX-License-Identifier: BSD-2-Clause-Patent | ||||
|  | ||||
| @@ -20,7 +19,6 @@ | ||||
| #include <Library/UefiBootManagerLib.h> | ||||
| #include <Library/UefiLib.h> | ||||
| #include <Library/UefiRuntimeServicesTableLib.h> | ||||
| #include <Protocol/BootManagerPolicy.h> | ||||
| #include <Protocol/DevicePath.h> | ||||
| #include <Protocol/EsrtManagement.h> | ||||
| #include <Protocol/GraphicsOutput.h> | ||||
| @@ -29,7 +27,6 @@ | ||||
| #include <Protocol/PciIo.h> | ||||
| #include <Protocol/PciRootBridgeIo.h> | ||||
| #include <Protocol/PlatformBootManager.h> | ||||
| #include <Guid/BootDiscoveryPolicy.h> | ||||
| #include <Guid/EventGroup.h> | ||||
| #include <Guid/NonDiscoverableDevice.h> | ||||
| #include <Guid/TtyTerm.h> | ||||
| @@ -91,6 +88,7 @@ STATIC PLATFORM_SERIAL_CONSOLE  mSerialConsole = { | ||||
|   } | ||||
| }; | ||||
|  | ||||
|  | ||||
| #pragma pack (1) | ||||
| typedef struct { | ||||
|   USB_CLASS_DEVICE_PATH    Keyboard; | ||||
| @@ -123,6 +121,7 @@ STATIC PLATFORM_USB_KEYBOARD  mUsbKeyboard = { | ||||
|   } | ||||
| }; | ||||
|  | ||||
|  | ||||
| /** | ||||
|   Check if the handle satisfies a particular condition. | ||||
|  | ||||
| @@ -141,6 +140,7 @@ BOOLEAN | ||||
|   IN CONST CHAR16 *ReportText | ||||
|   ); | ||||
|  | ||||
|  | ||||
| /** | ||||
|   Process a handle. | ||||
|  | ||||
| @@ -181,24 +181,14 @@ FilterAndProcess ( | ||||
|   UINTN      NoHandles; | ||||
|   UINTN      Idx; | ||||
|  | ||||
|   Status = gBS->LocateHandleBuffer ( | ||||
|                   ByProtocol, | ||||
|                   ProtocolGuid, | ||||
|                   NULL /* SearchKey */, | ||||
|                   &NoHandles, | ||||
|                   &Handles | ||||
|                   ); | ||||
|   Status = gBS->LocateHandleBuffer (ByProtocol, ProtocolGuid, | ||||
|                   NULL /* SearchKey */, &NoHandles, &Handles); | ||||
|   if (EFI_ERROR (Status)) { | ||||
|     // | ||||
|     // This is not an error, just an informative condition. | ||||
|     // | ||||
|     DEBUG (( | ||||
|       DEBUG_VERBOSE, | ||||
|       "%a: %g: %r\n", | ||||
|       __FUNCTION__, | ||||
|       ProtocolGuid, | ||||
|       Status | ||||
|       )); | ||||
|     DEBUG ((EFI_D_VERBOSE, "%a: %g: %r\n", __FUNCTION__, ProtocolGuid, | ||||
|       Status)); | ||||
|     return; | ||||
|   } | ||||
|  | ||||
| @@ -219,7 +209,7 @@ FilterAndProcess ( | ||||
|       DevicePathText = Fallback; | ||||
|     } | ||||
|  | ||||
|     if ((Filter == NULL) || Filter (Handles[Idx], DevicePathText)) { | ||||
|     if (Filter == NULL || Filter (Handles[Idx], DevicePathText)) { | ||||
|       Process (Handles[Idx], DevicePathText); | ||||
|     } | ||||
|  | ||||
| @@ -227,10 +217,10 @@ FilterAndProcess ( | ||||
|       FreePool (DevicePathText); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   gBS->FreePool (Handles); | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   This FILTER_FUNCTION checks if a handle corresponds to a PCI display device. | ||||
| **/ | ||||
| @@ -246,11 +236,8 @@ IsPciDisplay ( | ||||
|   EFI_PCI_IO_PROTOCOL *PciIo; | ||||
|   PCI_TYPE00          Pci; | ||||
|  | ||||
|   Status = gBS->HandleProtocol ( | ||||
|                   Handle, | ||||
|                   &gEfiPciIoProtocolGuid, | ||||
|                   (VOID **)&PciIo | ||||
|                   ); | ||||
|   Status = gBS->HandleProtocol (Handle, &gEfiPciIoProtocolGuid, | ||||
|                   (VOID**)&PciIo); | ||||
|   if (EFI_ERROR (Status)) { | ||||
|     // | ||||
|     // This is not an error worth reporting. | ||||
| @@ -258,21 +245,17 @@ IsPciDisplay ( | ||||
|     return FALSE; | ||||
|   } | ||||
|  | ||||
|   Status = PciIo->Pci.Read ( | ||||
|                         PciIo, | ||||
|                         EfiPciIoWidthUint32, | ||||
|                         0 /* Offset */, | ||||
|                         sizeof Pci / sizeof (UINT32), | ||||
|                         &Pci | ||||
|                         ); | ||||
|   Status = PciIo->Pci.Read (PciIo, EfiPciIoWidthUint32, 0 /* Offset */, | ||||
|                         sizeof Pci / sizeof (UINT32), &Pci); | ||||
|   if (EFI_ERROR (Status)) { | ||||
|     DEBUG ((DEBUG_ERROR, "%a: %s: %r\n", __FUNCTION__, ReportText, Status)); | ||||
|     DEBUG ((EFI_D_ERROR, "%a: %s: %r\n", __FUNCTION__, ReportText, Status)); | ||||
|     return FALSE; | ||||
|   } | ||||
|  | ||||
|   return IS_PCI_DISPLAY (&Pci); | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   This FILTER_FUNCTION checks if a handle corresponds to a non-discoverable | ||||
|   USB host controller. | ||||
| @@ -288,25 +271,22 @@ IsUsbHost ( | ||||
|   NON_DISCOVERABLE_DEVICE   *Device; | ||||
|   EFI_STATUS                Status; | ||||
|  | ||||
|   Status = gBS->HandleProtocol ( | ||||
|                   Handle, | ||||
|   Status = gBS->HandleProtocol (Handle, | ||||
|                   &gEdkiiNonDiscoverableDeviceProtocolGuid, | ||||
|                   (VOID **)&Device | ||||
|                   ); | ||||
|                   (VOID **)&Device); | ||||
|   if (EFI_ERROR (Status)) { | ||||
|     return FALSE; | ||||
|   } | ||||
|  | ||||
|   if (CompareGuid (Device->Type, &gEdkiiNonDiscoverableUhciDeviceGuid) || | ||||
|       CompareGuid (Device->Type, &gEdkiiNonDiscoverableEhciDeviceGuid) || | ||||
|       CompareGuid (Device->Type, &gEdkiiNonDiscoverableXhciDeviceGuid)) | ||||
|   { | ||||
|       CompareGuid (Device->Type, &gEdkiiNonDiscoverableXhciDeviceGuid)) { | ||||
|     return TRUE; | ||||
|   } | ||||
|  | ||||
|   return FALSE; | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   This CALLBACK_FUNCTION attempts to connect a handle non-recursively, asking | ||||
|   the matching driver to produce all first-level child handles. | ||||
| @@ -327,15 +307,11 @@ Connect ( | ||||
|                   NULL,   // RemainingDevicePath -- produce all children | ||||
|                   FALSE   // Recursive | ||||
|                   ); | ||||
|   DEBUG (( | ||||
|     EFI_ERROR (Status) ? DEBUG_ERROR : DEBUG_VERBOSE, | ||||
|     "%a: %s: %r\n", | ||||
|     __FUNCTION__, | ||||
|     ReportText, | ||||
|     Status | ||||
|     )); | ||||
|   DEBUG ((EFI_ERROR (Status) ? EFI_D_ERROR : EFI_D_VERBOSE, "%a: %s: %r\n", | ||||
|     __FUNCTION__, ReportText, Status)); | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   This CALLBACK_FUNCTION retrieves the EFI_DEVICE_PATH_PROTOCOL from the | ||||
|   handle, and adds it to ConOut and ErrOut. | ||||
| @@ -353,46 +329,27 @@ AddOutput ( | ||||
|  | ||||
|   DevicePath = DevicePathFromHandle (Handle); | ||||
|   if (DevicePath == NULL) { | ||||
|     DEBUG (( | ||||
|       DEBUG_ERROR, | ||||
|       "%a: %s: handle %p: device path not found\n", | ||||
|       __FUNCTION__, | ||||
|       ReportText, | ||||
|       Handle | ||||
|       )); | ||||
|     DEBUG ((EFI_D_ERROR, "%a: %s: handle %p: device path not found\n", | ||||
|       __FUNCTION__, ReportText, Handle)); | ||||
|     return; | ||||
|   } | ||||
|  | ||||
|   Status = EfiBootManagerUpdateConsoleVariable (ConOut, DevicePath, NULL); | ||||
|   if (EFI_ERROR (Status)) { | ||||
|     DEBUG (( | ||||
|       DEBUG_ERROR, | ||||
|       "%a: %s: adding to ConOut: %r\n", | ||||
|       __FUNCTION__, | ||||
|       ReportText, | ||||
|       Status | ||||
|       )); | ||||
|     DEBUG ((EFI_D_ERROR, "%a: %s: adding to ConOut: %r\n", __FUNCTION__, | ||||
|       ReportText, Status)); | ||||
|     return; | ||||
|   } | ||||
|  | ||||
|   Status = EfiBootManagerUpdateConsoleVariable (ErrOut, DevicePath, NULL); | ||||
|   if (EFI_ERROR (Status)) { | ||||
|     DEBUG (( | ||||
|       DEBUG_ERROR, | ||||
|       "%a: %s: adding to ErrOut: %r\n", | ||||
|       __FUNCTION__, | ||||
|       ReportText, | ||||
|       Status | ||||
|       )); | ||||
|     DEBUG ((EFI_D_ERROR, "%a: %s: adding to ErrOut: %r\n", __FUNCTION__, | ||||
|       ReportText, Status)); | ||||
|     return; | ||||
|   } | ||||
|  | ||||
|   DEBUG (( | ||||
|     DEBUG_VERBOSE, | ||||
|     "%a: %s: added to ConOut and ErrOut\n", | ||||
|     __FUNCTION__, | ||||
|     ReportText | ||||
|     )); | ||||
|   DEBUG ((EFI_D_VERBOSE, "%a: %s: added to ConOut and ErrOut\n", __FUNCTION__, | ||||
|     ReportText)); | ||||
| } | ||||
|  | ||||
| STATIC | ||||
| @@ -443,33 +400,25 @@ PlatformRegisterFvBootOption ( | ||||
|   FreePool (DevicePath); | ||||
|  | ||||
|   BootOptions = EfiBootManagerGetLoadOptions ( | ||||
|                   &BootOptionCount, | ||||
|                   LoadOptionTypeBoot | ||||
|                   &BootOptionCount, LoadOptionTypeBoot | ||||
|                   ); | ||||
|  | ||||
|   OptionIndex = EfiBootManagerFindLoadOption ( | ||||
|                   &NewOption, | ||||
|                   BootOptions, | ||||
|                   BootOptionCount | ||||
|                   &NewOption, BootOptions, BootOptionCount | ||||
|                   ); | ||||
|  | ||||
|   if (OptionIndex == -1) { | ||||
|     Status = EfiBootManagerAddLoadOptionVariable (&NewOption, MAX_UINTN); | ||||
|     ASSERT_EFI_ERROR (Status); | ||||
|     Status = EfiBootManagerAddKeyOptionVariable ( | ||||
|                NULL, | ||||
|                (UINT16)NewOption.OptionNumber, | ||||
|                0, | ||||
|                Key, | ||||
|                NULL | ||||
|                ); | ||||
|     Status = EfiBootManagerAddKeyOptionVariable (NULL, | ||||
|                (UINT16)NewOption.OptionNumber, 0, Key, NULL); | ||||
|     ASSERT (Status == EFI_SUCCESS || Status == EFI_ALREADY_STARTED); | ||||
|   } | ||||
|  | ||||
|   EfiBootManagerFreeLoadOption (&NewOption); | ||||
|   EfiBootManagerFreeLoadOptions (BootOptions, BootOptionCount); | ||||
| } | ||||
|  | ||||
|  | ||||
| STATIC | ||||
| VOID | ||||
| GetPlatformOptions ( | ||||
| @@ -485,15 +434,11 @@ GetPlatformOptions ( | ||||
|   UINTN                           Index; | ||||
|   UINTN                           BootCount; | ||||
|  | ||||
|   Status = gBS->LocateProtocol ( | ||||
|                   &gPlatformBootManagerProtocolGuid, | ||||
|                   NULL, | ||||
|                   (VOID **)&PlatformBootManager | ||||
|                   ); | ||||
|   Status = gBS->LocateProtocol (&gPlatformBootManagerProtocolGuid, NULL, | ||||
|                   (VOID **)&PlatformBootManager); | ||||
|   if (EFI_ERROR (Status)) { | ||||
|     return; | ||||
|   } | ||||
|  | ||||
|   Status = PlatformBootManager->GetPlatformBootOptionsAndKeys ( | ||||
|                                   &BootCount, | ||||
|                                   &BootOptions, | ||||
| @@ -502,7 +447,6 @@ GetPlatformOptions ( | ||||
|   if (EFI_ERROR (Status)) { | ||||
|     return; | ||||
|   } | ||||
|  | ||||
|   // | ||||
|   // Fetch the existent boot options. If there are none, CurrentBootCount | ||||
|   // will be zeroed. | ||||
| @@ -544,16 +488,10 @@ GetPlatformOptions ( | ||||
|                  MAX_UINTN | ||||
|                  ); | ||||
|       if (EFI_ERROR (Status)) { | ||||
|         DEBUG (( | ||||
|           DEBUG_ERROR, | ||||
|           "%a: failed to register \"%s\": %r\n", | ||||
|           __FUNCTION__, | ||||
|           BootOptions[Index].Description, | ||||
|           Status | ||||
|           )); | ||||
|         DEBUG ((DEBUG_ERROR, "%a: failed to register \"%s\": %r\n", | ||||
|           __FUNCTION__, BootOptions[Index].Description, Status)); | ||||
|         continue; | ||||
|       } | ||||
|  | ||||
|       BootOptionNumber = BootOptions[Index].OptionNumber; | ||||
|     } | ||||
|  | ||||
| @@ -572,16 +510,10 @@ GetPlatformOptions ( | ||||
|                NULL | ||||
|                ); | ||||
|     if (EFI_ERROR (Status)) { | ||||
|       DEBUG (( | ||||
|         DEBUG_ERROR, | ||||
|         "%a: failed to register hotkey for \"%s\": %r\n", | ||||
|         __FUNCTION__, | ||||
|         BootOptions[Index].Description, | ||||
|         Status | ||||
|         )); | ||||
|       DEBUG ((DEBUG_ERROR, "%a: failed to register hotkey for \"%s\": %r\n", | ||||
|         __FUNCTION__, BootOptions[Index].Description, Status)); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   EfiBootManagerFreeLoadOptions (CurrentBootOptions, CurrentBootOptionCount); | ||||
|   EfiBootManagerFreeLoadOptions (BootOptions, BootCount); | ||||
|   FreePool (BootKeys); | ||||
| @@ -619,27 +551,19 @@ PlatformRegisterOptionsAndKeys ( | ||||
|   Status = EfiBootManagerGetBootManagerMenu (&BootOption); | ||||
|   ASSERT_EFI_ERROR (Status); | ||||
|   Status = EfiBootManagerAddKeyOptionVariable ( | ||||
|              NULL, | ||||
|              (UINT16)BootOption.OptionNumber, | ||||
|              0, | ||||
|              &F2, | ||||
|              NULL | ||||
|              NULL, (UINT16) BootOption.OptionNumber, 0, &F2, NULL | ||||
|              ); | ||||
|   ASSERT (Status == EFI_SUCCESS || Status == EFI_ALREADY_STARTED); | ||||
|   Status = EfiBootManagerAddKeyOptionVariable ( | ||||
|              NULL, | ||||
|              (UINT16)BootOption.OptionNumber, | ||||
|              0, | ||||
|              &Esc, | ||||
|              NULL | ||||
|              NULL, (UINT16) BootOption.OptionNumber, 0, &Esc, NULL | ||||
|              ); | ||||
|   ASSERT (Status == EFI_SUCCESS || Status == EFI_ALREADY_STARTED); | ||||
| } | ||||
|  | ||||
|  | ||||
| // | ||||
| // BDS Platform Functions | ||||
| // | ||||
|  | ||||
| /** | ||||
|   Do the platform init, can be customized by OEM/IBV | ||||
|   Possible things that can be done in PlatformBootManagerBeforeConsole: | ||||
| @@ -699,45 +623,27 @@ PlatformBootManagerBeforeConsole ( | ||||
|   // | ||||
|   // Add the hardcoded short-form USB keyboard device path to ConIn. | ||||
|   // | ||||
|   EfiBootManagerUpdateConsoleVariable ( | ||||
|     ConIn, | ||||
|     (EFI_DEVICE_PATH_PROTOCOL *)&mUsbKeyboard, | ||||
|     NULL | ||||
|     ); | ||||
|   EfiBootManagerUpdateConsoleVariable (ConIn, | ||||
|     (EFI_DEVICE_PATH_PROTOCOL *)&mUsbKeyboard, NULL); | ||||
|  | ||||
|   // | ||||
|   // Add the hardcoded serial console device path to ConIn, ConOut, ErrOut. | ||||
|   // | ||||
|   STATIC_ASSERT ( | ||||
|     FixedPcdGet8 (PcdDefaultTerminalType) == 4, | ||||
|     "PcdDefaultTerminalType must be TTYTERM" | ||||
|     ); | ||||
|   STATIC_ASSERT ( | ||||
|     FixedPcdGet8 (PcdUartDefaultParity) != 0, | ||||
|     "PcdUartDefaultParity must be set to an actual value, not 'default'" | ||||
|     ); | ||||
|   STATIC_ASSERT ( | ||||
|     FixedPcdGet8 (PcdUartDefaultStopBits) != 0, | ||||
|     "PcdUartDefaultStopBits must be set to an actual value, not 'default'" | ||||
|     ); | ||||
|   STATIC_ASSERT (FixedPcdGet8 (PcdDefaultTerminalType) == 4, | ||||
|     "PcdDefaultTerminalType must be TTYTERM"); | ||||
|   STATIC_ASSERT (FixedPcdGet8 (PcdUartDefaultParity) != 0, | ||||
|     "PcdUartDefaultParity must be set to an actual value, not 'default'"); | ||||
|   STATIC_ASSERT (FixedPcdGet8 (PcdUartDefaultStopBits) != 0, | ||||
|     "PcdUartDefaultStopBits must be set to an actual value, not 'default'"); | ||||
|  | ||||
|   CopyGuid (&mSerialConsole.TermType.Guid, &gEfiTtyTermGuid); | ||||
|  | ||||
|   EfiBootManagerUpdateConsoleVariable ( | ||||
|     ConIn, | ||||
|     (EFI_DEVICE_PATH_PROTOCOL *)&mSerialConsole, | ||||
|     NULL | ||||
|     ); | ||||
|   EfiBootManagerUpdateConsoleVariable ( | ||||
|     ConOut, | ||||
|     (EFI_DEVICE_PATH_PROTOCOL *)&mSerialConsole, | ||||
|     NULL | ||||
|     ); | ||||
|   EfiBootManagerUpdateConsoleVariable ( | ||||
|     ErrOut, | ||||
|     (EFI_DEVICE_PATH_PROTOCOL *)&mSerialConsole, | ||||
|     NULL | ||||
|     ); | ||||
|   EfiBootManagerUpdateConsoleVariable (ConIn, | ||||
|     (EFI_DEVICE_PATH_PROTOCOL *)&mSerialConsole, NULL); | ||||
|   EfiBootManagerUpdateConsoleVariable (ConOut, | ||||
|     (EFI_DEVICE_PATH_PROTOCOL *)&mSerialConsole, NULL); | ||||
|   EfiBootManagerUpdateConsoleVariable (ErrOut, | ||||
|     (EFI_DEVICE_PATH_PROTOCOL *)&mSerialConsole, NULL); | ||||
|  | ||||
|   // | ||||
|   // Register platform-specific boot options and keyboard shortcuts. | ||||
| @@ -759,11 +665,8 @@ HandleCapsules ( | ||||
|  | ||||
|   DEBUG ((DEBUG_INFO, "%a: processing capsules ...\n", __FUNCTION__)); | ||||
|  | ||||
|   Status = gBS->LocateProtocol ( | ||||
|                   &gEsrtManagementProtocolGuid, | ||||
|                   NULL, | ||||
|                   (VOID **)&EsrtManagement | ||||
|                   ); | ||||
|   Status = gBS->LocateProtocol (&gEsrtManagementProtocolGuid, NULL, | ||||
|                   (VOID **)&EsrtManagement); | ||||
|   if (!EFI_ERROR (Status)) { | ||||
|     EsrtManagement->SyncEsrtFmp (); | ||||
|   } | ||||
| @@ -773,22 +676,14 @@ HandleCapsules ( | ||||
|   // | ||||
|   HobPointer.Raw = GetHobList (); | ||||
|   NeedReset = FALSE; | ||||
|   while ((HobPointer.Raw = GetNextHob ( | ||||
|                              EFI_HOB_TYPE_UEFI_CAPSULE, | ||||
|                              HobPointer.Raw | ||||
|                              )) != NULL) | ||||
|   { | ||||
|   while ((HobPointer.Raw = GetNextHob (EFI_HOB_TYPE_UEFI_CAPSULE, | ||||
|                              HobPointer.Raw)) != NULL) { | ||||
|     CapsuleHeader = (VOID *)(UINTN)HobPointer.Capsule->BaseAddress; | ||||
|  | ||||
|     Status = ProcessCapsuleImage (CapsuleHeader); | ||||
|     if (EFI_ERROR (Status)) { | ||||
|       DEBUG (( | ||||
|         DEBUG_ERROR, | ||||
|         "%a: failed to process capsule %p - %r\n", | ||||
|         __FUNCTION__, | ||||
|         CapsuleHeader, | ||||
|         Status | ||||
|         )); | ||||
|       DEBUG ((DEBUG_ERROR, "%a: failed to process capsule %p - %r\n", | ||||
|         __FUNCTION__, CapsuleHeader, Status)); | ||||
|       return; | ||||
|     } | ||||
|  | ||||
| @@ -797,130 +692,17 @@ HandleCapsules ( | ||||
|   } | ||||
|  | ||||
|   if (NeedReset) { | ||||
|     DEBUG (( | ||||
|       DEBUG_WARN, | ||||
|       "%a: capsule update successful, resetting ...\n", | ||||
|       __FUNCTION__ | ||||
|       )); | ||||
|       DEBUG ((DEBUG_WARN, "%a: capsule update successful, resetting ...\n", | ||||
|         __FUNCTION__)); | ||||
|  | ||||
|       gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL); | ||||
|       CpuDeadLoop(); | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| #define VERSION_STRING_PREFIX    L"Tianocore/EDK2 firmware version " | ||||
|  | ||||
| /** | ||||
|   This functions checks the value of BootDiscoverPolicy variable and | ||||
|   connect devices of class specified by that variable. Then it refreshes | ||||
|   Boot order for newly discovered boot device. | ||||
|  | ||||
|   @retval  EFI_SUCCESS  Devices connected successfully or connection | ||||
|                         not required. | ||||
|   @retval  others       Return values from GetVariable(), LocateProtocol() | ||||
|                         and ConnectDeviceClass(). | ||||
| **/ | ||||
| STATIC | ||||
| EFI_STATUS | ||||
| BootDiscoveryPolicyHandler ( | ||||
|   VOID | ||||
|   ) | ||||
| { | ||||
|   EFI_STATUS                        Status; | ||||
|   UINT32                            DiscoveryPolicy; | ||||
|   UINT32                            DiscoveryPolicyOld; | ||||
|   UINTN                             Size; | ||||
|   EFI_BOOT_MANAGER_POLICY_PROTOCOL  *BMPolicy; | ||||
|   EFI_GUID                          *Class; | ||||
|  | ||||
|   Size   = sizeof (DiscoveryPolicy); | ||||
|   Status = gRT->GetVariable ( | ||||
|                   BOOT_DISCOVERY_POLICY_VAR, | ||||
|                   &gBootDiscoveryPolicyMgrFormsetGuid, | ||||
|                   NULL, | ||||
|                   &Size, | ||||
|                   &DiscoveryPolicy | ||||
|                   ); | ||||
|   if (Status == EFI_NOT_FOUND) { | ||||
|     DiscoveryPolicy = PcdGet32 (PcdBootDiscoveryPolicy); | ||||
|     Status          = PcdSet32S (PcdBootDiscoveryPolicy, DiscoveryPolicy); | ||||
|     if (Status == EFI_NOT_FOUND) { | ||||
|       return EFI_SUCCESS; | ||||
|     } else if (EFI_ERROR (Status)) { | ||||
|       return Status; | ||||
|     } | ||||
|   } else if (EFI_ERROR (Status)) { | ||||
|     return Status; | ||||
|   } | ||||
|  | ||||
|   if (DiscoveryPolicy == BDP_CONNECT_MINIMAL) { | ||||
|     return EFI_SUCCESS; | ||||
|   } | ||||
|  | ||||
|   switch (DiscoveryPolicy) { | ||||
|     case BDP_CONNECT_NET: | ||||
|       Class = &gEfiBootManagerPolicyNetworkGuid; | ||||
|       break; | ||||
|     case BDP_CONNECT_ALL: | ||||
|       Class = &gEfiBootManagerPolicyConnectAllGuid; | ||||
|       break; | ||||
|     default: | ||||
|       DEBUG (( | ||||
|         DEBUG_INFO, | ||||
|         "%a - Unexpected DiscoveryPolicy (0x%x). Run Minimal Discovery Policy\n", | ||||
|         __FUNCTION__, | ||||
|         DiscoveryPolicy | ||||
|         )); | ||||
|       return EFI_SUCCESS; | ||||
|   } | ||||
|  | ||||
|   Status = gBS->LocateProtocol ( | ||||
|                   &gEfiBootManagerPolicyProtocolGuid, | ||||
|                   NULL, | ||||
|                   (VOID **)&BMPolicy | ||||
|                   ); | ||||
|   if (EFI_ERROR (Status)) { | ||||
|     DEBUG (( | ||||
|       DEBUG_INFO, | ||||
|       "%a - Failed to locate gEfiBootManagerPolicyProtocolGuid." | ||||
|       "Driver connect will be skipped.\n", | ||||
|       __FUNCTION__ | ||||
|       )); | ||||
|     return Status; | ||||
|   } | ||||
|  | ||||
|   Status = BMPolicy->ConnectDeviceClass (BMPolicy, Class); | ||||
|   if (EFI_ERROR (Status)) { | ||||
|     DEBUG ((DEBUG_ERROR, "%a - ConnectDeviceClass returns - %r\n", __FUNCTION__, Status)); | ||||
|     return Status; | ||||
|   } | ||||
|  | ||||
|   // | ||||
|   // Refresh Boot Options if Boot Discovery Policy has been changed | ||||
|   // | ||||
|   Size   = sizeof (DiscoveryPolicyOld); | ||||
|   Status = gRT->GetVariable ( | ||||
|                   BOOT_DISCOVERY_POLICY_OLD_VAR, | ||||
|                   &gBootDiscoveryPolicyMgrFormsetGuid, | ||||
|                   NULL, | ||||
|                   &Size, | ||||
|                   &DiscoveryPolicyOld | ||||
|                   ); | ||||
|   if ((Status == EFI_NOT_FOUND) || (DiscoveryPolicyOld != DiscoveryPolicy)) { | ||||
|     EfiBootManagerRefreshAllBootOption (); | ||||
|  | ||||
|     Status = gRT->SetVariable ( | ||||
|                     BOOT_DISCOVERY_POLICY_OLD_VAR, | ||||
|                     &gBootDiscoveryPolicyMgrFormsetGuid, | ||||
|                     EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS, | ||||
|                     sizeof (DiscoveryPolicyOld), | ||||
|                     &DiscoveryPolicy | ||||
|                     ); | ||||
|   } | ||||
|  | ||||
|   return EFI_SUCCESS; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   Do the platform specific action after the console is ready | ||||
|   Possible things that can be done in PlatformBootManagerAfterConsole: | ||||
| @@ -953,42 +735,24 @@ PlatformBootManagerAfterConsole ( | ||||
|   Status = BootLogoEnableLogo (); | ||||
|   if (EFI_ERROR (Status)) { | ||||
|     if (FirmwareVerLength > 0) { | ||||
|       Print ( | ||||
|         VERSION_STRING_PREFIX L"%s\n", | ||||
|         PcdGetPtr (PcdFirmwareVersionString) | ||||
|         ); | ||||
|       Print (VERSION_STRING_PREFIX L"%s\n", | ||||
|         PcdGetPtr (PcdFirmwareVersionString)); | ||||
|     } | ||||
|  | ||||
|     Print (L"Press ESCAPE for boot options "); | ||||
|   } else if (FirmwareVerLength > 0) { | ||||
|     Status = gBS->HandleProtocol ( | ||||
|                     gST->ConsoleOutHandle, | ||||
|                     &gEfiGraphicsOutputProtocolGuid, | ||||
|                     (VOID **)&GraphicsOutput | ||||
|                     ); | ||||
|     Status = gBS->HandleProtocol (gST->ConsoleOutHandle, | ||||
|                     &gEfiGraphicsOutputProtocolGuid, (VOID **)&GraphicsOutput); | ||||
|     if (!EFI_ERROR (Status)) { | ||||
|       PosX = (GraphicsOutput->Mode->Info->HorizontalResolution - | ||||
|               (StrLen (VERSION_STRING_PREFIX) + FirmwareVerLength) * | ||||
|               EFI_GLYPH_WIDTH) / 2; | ||||
|       PosY = 0; | ||||
|  | ||||
|       PrintXY ( | ||||
|         PosX, | ||||
|         PosY, | ||||
|         NULL, | ||||
|         NULL, | ||||
|         VERSION_STRING_PREFIX L"%s", | ||||
|         PcdGetPtr (PcdFirmwareVersionString) | ||||
|         ); | ||||
|       PrintXY (PosX, PosY, NULL, NULL, VERSION_STRING_PREFIX L"%s", | ||||
|         PcdGetPtr (PcdFirmwareVersionString)); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   // | ||||
|   // Connect device specified by BootDiscoverPolicy variable and | ||||
|   // refresh Boot order for newly discovered boot devices | ||||
|   // | ||||
|   BootDiscoveryPolicyHandler (); | ||||
|  | ||||
|   // | ||||
|   // On ARM, there is currently no reason to use the phased capsule | ||||
|   // update approach where some capsules are dispatched before EndOfDxe | ||||
| @@ -1063,10 +827,8 @@ PlatformBootManagerUnableToBoot ( | ||||
|   // | ||||
|   // Record the total number of boot configured boot options | ||||
|   // | ||||
|   BootOptions = EfiBootManagerGetLoadOptions ( | ||||
|                   &OldBootOptionCount, | ||||
|                   LoadOptionTypeBoot | ||||
|                   ); | ||||
|   BootOptions = EfiBootManagerGetLoadOptions (&OldBootOptionCount, | ||||
|                   LoadOptionTypeBoot); | ||||
|   EfiBootManagerFreeLoadOptions (BootOptions, OldBootOptionCount); | ||||
|  | ||||
|   // | ||||
| @@ -1078,10 +840,8 @@ PlatformBootManagerUnableToBoot ( | ||||
|   // | ||||
|   // Record the updated number of boot configured boot options | ||||
|   // | ||||
|   BootOptions = EfiBootManagerGetLoadOptions ( | ||||
|                   &NewBootOptionCount, | ||||
|                   LoadOptionTypeBoot | ||||
|                   ); | ||||
|   BootOptions = EfiBootManagerGetLoadOptions (&NewBootOptionCount, | ||||
|                   LoadOptionTypeBoot); | ||||
|   EfiBootManagerFreeLoadOptions (BootOptions, NewBootOptionCount); | ||||
|  | ||||
|   // | ||||
| @@ -1093,11 +853,8 @@ PlatformBootManagerUnableToBoot ( | ||||
|   // | ||||
|   if (!PcdGetBool (PcdEmuVariableNvModeEnable)) { | ||||
|     if (NewBootOptionCount != OldBootOptionCount) { | ||||
|       DEBUG (( | ||||
|         DEBUG_WARN, | ||||
|         "%a: rebooting after refreshing all boot options\n", | ||||
|         __FUNCTION__ | ||||
|         )); | ||||
|       DEBUG ((DEBUG_WARN, "%a: rebooting after refreshing all boot options\n", | ||||
|         __FUNCTION__)); | ||||
|       gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL); | ||||
|     } | ||||
|   } | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user