Compare commits
	
		
			96 Commits
		
	
	
		
			edk2-stabl
			...
			system76-s
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					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:
 | 
					jobs:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- job: Build_${{ parameters.tool_chain_tag }}
 | 
					- job: Build_${{ parameters.tool_chain_tag }}
 | 
				
			||||||
  timeoutInMinutes: 120
 | 
					
 | 
				
			||||||
  #Use matrix to speed up the build process
 | 
					  #Use matrix to speed up the build process
 | 
				
			||||||
  strategy:
 | 
					  strategy:
 | 
				
			||||||
    matrix:
 | 
					    matrix:
 | 
				
			||||||
@@ -48,9 +48,6 @@ jobs:
 | 
				
			|||||||
      TARGET_SECURITY:
 | 
					      TARGET_SECURITY:
 | 
				
			||||||
        Build.Pkgs: 'SecurityPkg'
 | 
					        Build.Pkgs: 'SecurityPkg'
 | 
				
			||||||
        Build.Targets: 'DEBUG,RELEASE,NO-TARGET'
 | 
					        Build.Targets: 'DEBUG,RELEASE,NO-TARGET'
 | 
				
			||||||
      TARGET_UEFIPAYLOAD:
 | 
					 | 
				
			||||||
        Build.Pkgs: 'UefiPayloadPkg'
 | 
					 | 
				
			||||||
        Build.Targets: 'DEBUG,RELEASE,NO-TARGET'
 | 
					 | 
				
			||||||
      TARGET_PLATFORMS:
 | 
					      TARGET_PLATFORMS:
 | 
				
			||||||
        # For Platforms only check code. Leave it to Platform CI
 | 
					        # For Platforms only check code. Leave it to Platform CI
 | 
				
			||||||
        # to build them.
 | 
					        # to build them.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -67,8 +67,7 @@ class Settings(CiBuildSettingsManager, UpdateSettingsManager, SetupSettingsManag
 | 
				
			|||||||
                "CryptoPkg",
 | 
					                "CryptoPkg",
 | 
				
			||||||
                "UnitTestFrameworkPkg",
 | 
					                "UnitTestFrameworkPkg",
 | 
				
			||||||
                "OvmfPkg",
 | 
					                "OvmfPkg",
 | 
				
			||||||
                "RedfishPkg",
 | 
					                "RedfishPkg"
 | 
				
			||||||
                "UefiPayloadPkg"
 | 
					 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def GetArchitecturesSupported(self):
 | 
					    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\/(.*)')
 | 
					    FindModifyFile = re.compile(r'\+\+\+ b\/(.*)')
 | 
				
			||||||
    LineScopePattern = (r'@@ -\d*\,*\d* \+\d*\,*\d* @@.*')
 | 
					    LineScopePattern = (r'@@ -\d*\,*\d* \+\d*\,*\d* @@.*')
 | 
				
			||||||
    LineNumRange = re.compile(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('WORKSPACE', workspace_path)
 | 
				
			||||||
        env.set_shell_var('PACKAGES_PATH', os.pathsep.join(Edk2pathObj.PackagePathList))
 | 
					        env.set_shell_var('PACKAGES_PATH', os.pathsep.join(Edk2pathObj.PackagePathList))
 | 
				
			||||||
        self.ECC_PASS = True
 | 
					        self.ECC_PASS = True
 | 
				
			||||||
 | 
					        self.ApplyConfig(pkgconfig, workspace_path, basetools_path, packagename)
 | 
				
			||||||
        # Create temp directory
 | 
					        modify_dir_list = self.GetModifyDir(packagename)
 | 
				
			||||||
        temp_path = os.path.join(workspace_path, 'Build', '.pytool', 'Plugin', 'EccCheck')
 | 
					        patch = self.GetDiff(packagename)
 | 
				
			||||||
        try:
 | 
					        ecc_diff_range = self.GetDiffRange(patch, packagename, workspace_path)
 | 
				
			||||||
            # Delete temp directory
 | 
					        self.GenerateEccReport(modify_dir_list, ecc_diff_range, workspace_path, basetools_path)
 | 
				
			||||||
            if os.path.exists(temp_path):
 | 
					        ecc_log = os.path.join(workspace_path, "Ecc.log")
 | 
				
			||||||
                shutil.rmtree(temp_path)
 | 
					        self.RevertCode()
 | 
				
			||||||
            # 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")
 | 
					 | 
				
			||||||
        if self.ECC_PASS:
 | 
					        if self.ECC_PASS:
 | 
				
			||||||
                # Delete temp directory
 | 
					 | 
				
			||||||
                if os.path.exists(temp_path):
 | 
					 | 
				
			||||||
                    shutil.rmtree(temp_path)
 | 
					 | 
				
			||||||
            tc.SetSuccess()
 | 
					            tc.SetSuccess()
 | 
				
			||||||
 | 
					            self.RemoveFile(ecc_log)
 | 
				
			||||||
            return 0
 | 
					            return 0
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            with open(ecc_log, encoding='utf8') as output:
 | 
					            with open(ecc_log, encoding='utf8') as output:
 | 
				
			||||||
                ecc_output = output.readlines()
 | 
					                ecc_output = output.readlines()
 | 
				
			||||||
                for line in ecc_output:
 | 
					                for line in ecc_output:
 | 
				
			||||||
                    logging.error(line.strip())
 | 
					                    logging.error(line.strip())
 | 
				
			||||||
                # Delete temp directory
 | 
					            self.RemoveFile(ecc_log)
 | 
				
			||||||
                if os.path.exists(temp_path):
 | 
					            tc.SetFailed("EccCheck failed for {0}".format(packagename), "Ecc detected issues")
 | 
				
			||||||
                    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
 | 
					 | 
				
			||||||
            return 1
 | 
					            return 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def GetDiff(self, pkg: str, temp_diff_output: str) -> List[str]:
 | 
					    def RevertCode(self) -> None:
 | 
				
			||||||
        patch = []
 | 
					        submoudle_params = "submodule update --init"
 | 
				
			||||||
        #
 | 
					        RunCmd("git", submoudle_params)
 | 
				
			||||||
        # Generate unified diff between origin/master and HEAD.
 | 
					        reset_params = "reset HEAD --hard"
 | 
				
			||||||
        #
 | 
					        RunCmd("git", reset_params)
 | 
				
			||||||
        params = "diff --output={} --unified=0 origin/master HEAD".format(temp_diff_output)
 | 
					
 | 
				
			||||||
        RunCmd("git", params)
 | 
					    def GetDiff(self, pkg: str) -> List[str]:
 | 
				
			||||||
        with open(temp_diff_output) as file:
 | 
					        return_buffer = StringIO()
 | 
				
			||||||
            patch = file.read().strip().split('\n')
 | 
					        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
 | 
					        return patch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def GetModifyDir(self, pkg: str, temp_diff_output: str) -> List[str]:
 | 
					    def RemoveFile(self, file: str) -> None:
 | 
				
			||||||
        #
 | 
					        if os.path.exists(file):
 | 
				
			||||||
        # Generate diff between origin/master and HEAD using --diff-filter to
 | 
					            os.remove(file)
 | 
				
			||||||
        # exclude deleted and renamed files that do not need to be scanned by
 | 
					        return
 | 
				
			||||||
        # 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 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 = []
 | 
					        modify_dir_list = []
 | 
				
			||||||
        for modify_dir in dir_list:
 | 
					        for modify_dir in dir_list:
 | 
				
			||||||
            #
 | 
					            file_path = self.ReModifyFile.findall(modify_dir)
 | 
				
			||||||
            # Parse file name from the end of the line
 | 
					            if file_path:
 | 
				
			||||||
            #
 | 
					                file_dir = os.path.dirname(file_path[0])
 | 
				
			||||||
            file_path = modify_dir.strip().split()
 | 
					            else:
 | 
				
			||||||
            #
 | 
					 | 
				
			||||||
            # Skip lines that do not have at least 2 elements (status and file name)
 | 
					 | 
				
			||||||
            #
 | 
					 | 
				
			||||||
            if len(file_path) < 2:
 | 
					 | 
				
			||||||
                continue
 | 
					                continue
 | 
				
			||||||
            #
 | 
					            if pkg in file_dir and file_dir != pkg:
 | 
				
			||||||
            # Parse the directory name from the file name
 | 
					                modify_dir_list.append('%s' % file_dir)
 | 
				
			||||||
            #
 | 
					            else:
 | 
				
			||||||
            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:
 | 
					 | 
				
			||||||
                continue
 | 
					                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)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        #
 | 
					        modify_dir_list = list(set(modify_dir_list))
 | 
				
			||||||
        # Remove duplicates from modify_dir_list
 | 
					        return 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
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    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
 | 
					        IsDelete = True
 | 
				
			||||||
        StartCheck = False
 | 
					        StartCheck = False
 | 
				
			||||||
        range_directory: Dict[str, List[Tuple[int, int]]] = {}
 | 
					        range_directory: Dict[str, List[Tuple[int, int]]] = {}
 | 
				
			||||||
        for line in patch_diff:
 | 
					        for line in patch_diff:
 | 
				
			||||||
            modify_file = self.FindModifyFile.findall(line)
 | 
					            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]):
 | 
					            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
 | 
					                IsDelete = False
 | 
				
			||||||
                StartCheck = True
 | 
					                StartCheck = True
 | 
				
			||||||
                modify_file_dic = modify_file[0]
 | 
					                modify_file_dic = modify_file[0]
 | 
				
			||||||
@@ -254,13 +158,11 @@ class EccCheck(ICiBuildPlugin):
 | 
				
			|||||||
                        range_directory[modify_file_dic].append(i)
 | 
					                        range_directory[modify_file_dic].append(i)
 | 
				
			||||||
        return range_directory
 | 
					        return range_directory
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def GetCommentRange(self, modify_file: str, temp_path: str) -> List[Tuple[int, int]]:
 | 
					    def GetCommentRange(self, modify_file: str, workingdir: str) -> List[Tuple[int, int]]:
 | 
				
			||||||
        comment_range: List[Tuple[int, int]] = []
 | 
					        modify_file_path = os.path.join(workingdir, modify_file)
 | 
				
			||||||
        modify_file_path = os.path.join(temp_path, modify_file)
 | 
					 | 
				
			||||||
        if not os.path.exists (modify_file_path):
 | 
					 | 
				
			||||||
            return comment_range
 | 
					 | 
				
			||||||
        with open(modify_file_path) as f:
 | 
					        with open(modify_file_path) as f:
 | 
				
			||||||
            line_no = 1
 | 
					            line_no = 1
 | 
				
			||||||
 | 
					            comment_range: List[Tuple[int, int]] = []
 | 
				
			||||||
            Start = False
 | 
					            Start = False
 | 
				
			||||||
            for line in f:
 | 
					            for line in f:
 | 
				
			||||||
                if line.startswith('/**'):
 | 
					                if line.startswith('/**'):
 | 
				
			||||||
@@ -277,33 +179,35 @@ class EccCheck(ICiBuildPlugin):
 | 
				
			|||||||
        return comment_range
 | 
					        return comment_range
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def GenerateEccReport(self, modify_dir_list: List[str], ecc_diff_range: Dict[str, List[Tuple[int, int]]],
 | 
					    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_need = False
 | 
				
			||||||
        ecc_run = True
 | 
					        ecc_run = True
 | 
				
			||||||
        config    = os.path.normpath(os.path.join(basetools_path, "Source", "Python", "Ecc", "config.ini"))
 | 
					        config = os.path.join(basetools_path, "Source", "Python", "Ecc", "config.ini")
 | 
				
			||||||
        exception = os.path.normpath(os.path.join(temp_path, "exception.xml"))
 | 
					        exception = os.path.join(basetools_path, "Source", "Python", "Ecc", "exception.xml")
 | 
				
			||||||
        report    = os.path.normpath(os.path.join(temp_path, "Ecc.csv"))
 | 
					        report = os.path.join(workspace_path, "Ecc.csv")
 | 
				
			||||||
        for modify_dir in modify_dir_list:
 | 
					        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)
 | 
					            logging.info('Run ECC tool for the commit in %s' % modify_dir)
 | 
				
			||||||
            ecc_need = True
 | 
					            ecc_need = True
 | 
				
			||||||
            ecc_params = "-c {0} -e {1} -t {2} -r {3}".format(config, exception, target, report)
 | 
					            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:
 | 
					            if return_code != 0:
 | 
				
			||||||
                ecc_run = False
 | 
					                ecc_run = False
 | 
				
			||||||
                break
 | 
					                break
 | 
				
			||||||
            if not ecc_run:
 | 
					            if not ecc_run:
 | 
				
			||||||
                logging.error('Fail to run ECC tool')
 | 
					                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:
 | 
					        if not ecc_need:
 | 
				
			||||||
            logging.info("Doesn't need run ECC check")
 | 
					            logging.info("Doesn't need run ECC check")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        revert_params = "checkout -- {}".format(exception)
 | 
				
			||||||
 | 
					        RunCmd("git", revert_params)
 | 
				
			||||||
        return
 | 
					        return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def ParseEccReport(self, ecc_diff_range: Dict[str, List[Tuple[int, int]]], temp_path: str) -> None:
 | 
					    def ParseEccReport(self, ecc_diff_range: Dict[str, List[Tuple[int, int]]], workspace_path: str) -> None:
 | 
				
			||||||
        ecc_log = os.path.join(temp_path, "Ecc.log")
 | 
					        ecc_log = os.path.join(workspace_path, "Ecc.log")
 | 
				
			||||||
        ecc_csv = os.path.join(temp_path, "Ecc.csv")
 | 
					        ecc_csv = os.path.join(workspace_path, "Ecc.csv")
 | 
				
			||||||
        row_lines = []
 | 
					        row_lines = []
 | 
				
			||||||
        ignore_error_code = self.GetIgnoreErrorCode()
 | 
					        ignore_error_code = self.GetIgnoreErrorCode()
 | 
				
			||||||
        if os.path.exists(ecc_csv):
 | 
					        if os.path.exists(ecc_csv):
 | 
				
			||||||
@@ -332,16 +236,16 @@ class EccCheck(ICiBuildPlugin):
 | 
				
			|||||||
            log.writelines(all_line)
 | 
					            log.writelines(all_line)
 | 
				
			||||||
        return
 | 
					        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:
 | 
					        if "IgnoreFiles" in pkgconfig:
 | 
				
			||||||
            for a in pkgconfig["IgnoreFiles"]:
 | 
					            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, "/")
 | 
					                a = a.replace(os.sep, "/")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                logging.info("Ignoring Files {0}".format(a))
 | 
					                logging.info("Ignoring Files {0}".format(a))
 | 
				
			||||||
                if os.path.exists(a):
 | 
					                if os.path.exists(a):
 | 
				
			||||||
                    if os.path.isfile(a):
 | 
					                    if os.path.isfile(a):
 | 
				
			||||||
                        os.remove(a)
 | 
					                        self.RemoveFile(a)
 | 
				
			||||||
                    elif os.path.isdir(a):
 | 
					                    elif os.path.isdir(a):
 | 
				
			||||||
                        shutil.rmtree(a)
 | 
					                        shutil.rmtree(a)
 | 
				
			||||||
                else:
 | 
					                else:
 | 
				
			||||||
@@ -349,7 +253,7 @@ class EccCheck(ICiBuildPlugin):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        if "ExceptionList" in pkgconfig:
 | 
					        if "ExceptionList" in pkgconfig:
 | 
				
			||||||
            exception_list = pkgconfig["ExceptionList"]
 | 
					            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:
 | 
					            try:
 | 
				
			||||||
                logging.info("Appending exceptions")
 | 
					                logging.info("Appending exceptions")
 | 
				
			||||||
                self.AppendException(exception_list, exception_xml)
 | 
					                self.AppendException(exception_list, exception_xml)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,6 @@
 | 
				
			|||||||
##
 | 
					##
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
import shutil
 | 
					 | 
				
			||||||
import logging
 | 
					import logging
 | 
				
			||||||
import re
 | 
					import re
 | 
				
			||||||
from io import StringIO
 | 
					from io import StringIO
 | 
				
			||||||
@@ -62,19 +61,12 @@ class LicenseCheck(ICiBuildPlugin):
 | 
				
			|||||||
    #   - Junit Logger
 | 
					    #   - Junit Logger
 | 
				
			||||||
    #   - output_stream the StringIO output stream from this plugin via logging
 | 
					    #   - output_stream the StringIO output stream from this plugin via logging
 | 
				
			||||||
    def RunBuildPlugin(self, packagename, Edk2pathObj, pkgconfig, environment, PLM, PLMHelper, tc, output_stream=None):
 | 
					    def RunBuildPlugin(self, packagename, Edk2pathObj, pkgconfig, environment, PLM, PLMHelper, tc, output_stream=None):
 | 
				
			||||||
        # Create temp directory
 | 
					        return_buffer = StringIO()
 | 
				
			||||||
        temp_path = os.path.join(Edk2pathObj.WorkspacePath, 'Build', '.pytool', 'Plugin', 'LicenseCheck')
 | 
					        params = "diff --unified=0 origin/master HEAD"
 | 
				
			||||||
        if not os.path.exists(temp_path):
 | 
					        RunCmd("git", params, outstream=return_buffer)
 | 
				
			||||||
            os.makedirs(temp_path)
 | 
					        p = return_buffer.getvalue().strip()
 | 
				
			||||||
        # Output file to use for git diff operations
 | 
					        patch = p.split("\n")
 | 
				
			||||||
        temp_diff_output = os.path.join (temp_path, 'diff.txt')
 | 
					        return_buffer.close()
 | 
				
			||||||
        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)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ignore_files = []
 | 
					        ignore_files = []
 | 
				
			||||||
        if "IgnoreFiles" in pkgconfig:
 | 
					        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
 | 
					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.
 | 
					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
 | 
					## PyTool Scopes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Scopes are how the PyTool ext_dep, path_env, and plugins are activated.  Meaning
 | 
					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.
 | 
					        ## Both file path and directory path are accepted.
 | 
				
			||||||
        "IgnoreFiles": [
 | 
					        "IgnoreFiles": [
 | 
				
			||||||
            "Library/ArmSoftFloatLib/berkeley-softfloat-3",
 | 
					            "Library/ArmSoftFloatLib/berkeley-softfloat-3"
 | 
				
			||||||
            "Library/ArmSoftFloatLib/ArmSoftFloatLib.c",
 | 
					 | 
				
			||||||
            "Library/CompilerIntrinsicsLib",
 | 
					 | 
				
			||||||
            "Universal/Smbios/SmbiosMiscDxe"
 | 
					 | 
				
			||||||
        ]
 | 
					        ]
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,7 +3,6 @@
 | 
				
			|||||||
#
 | 
					#
 | 
				
			||||||
# Copyright (c) 2009 - 2010, Apple Inc. All rights reserved.<BR>
 | 
					# Copyright (c) 2009 - 2010, Apple Inc. All rights reserved.<BR>
 | 
				
			||||||
# Copyright (c) 2011 - 2021, ARM Limited. All rights reserved.
 | 
					# 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
 | 
					#    SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
@@ -338,9 +337,9 @@
 | 
				
			|||||||
  #   UINT64 Mmio32CpuBase; // mapping target in 64-bit cpu-physical space
 | 
					  #   UINT64 Mmio32CpuBase; // mapping target in 64-bit cpu-physical space
 | 
				
			||||||
  #   UINT64 Mmio64CpuBase; // mapping target in 64-bit cpu-physical space
 | 
					  #   UINT64 Mmio64CpuBase; // mapping target in 64-bit cpu-physical space
 | 
				
			||||||
  #
 | 
					  #
 | 
				
			||||||
  #   gEfiMdePkgTokenSpaceGuid.PcdPciIoTranslation = IoCpuBase - PcdPciIoBase;
 | 
					  #   PcdPciIoTranslation     = IoCpuBase     - PcdPciIoBase;
 | 
				
			||||||
  #   gEfiMdePkgTokenSpaceGuid.PcdPciMmio32Translation = Mmio32CpuBase - (UINT64)PcdPciMmio32Base;
 | 
					  #   PcdPciMmio32Translation = Mmio32CpuBase - (UINT64)PcdPciMmio32Base;
 | 
				
			||||||
  #   gEfiMdePkgTokenSpaceGuid.PcdPciMmio64Translation = Mmio64CpuBase - PcdPciMmio64Base;
 | 
					  #   PcdPciMmio64Translation = Mmio64CpuBase - PcdPciMmio64Base;
 | 
				
			||||||
  #
 | 
					  #
 | 
				
			||||||
  # because (a) the target address space (ie. the cpu-physical space) is
 | 
					  # 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*
 | 
					  # 64-bit, and (b) the translation values are meant as offsets for *modular*
 | 
				
			||||||
@@ -357,11 +356,11 @@
 | 
				
			|||||||
  #   UINT64 TranslatedMmio64Address;   // output parameter
 | 
					  #   UINT64 TranslatedMmio64Address;   // output parameter
 | 
				
			||||||
  #
 | 
					  #
 | 
				
			||||||
  #   TranslatedIoAddress     = UntranslatedIoAddress +
 | 
					  #   TranslatedIoAddress     = UntranslatedIoAddress +
 | 
				
			||||||
  #                             gEfiMdePkgTokenSpaceGuid.PcdPciIoTranslation;
 | 
					  #                             PcdPciIoTranslation;
 | 
				
			||||||
  #   TranslatedMmio32Address = (UINT64)UntranslatedMmio32Address +
 | 
					  #   TranslatedMmio32Address = (UINT64)UntranslatedMmio32Address +
 | 
				
			||||||
  #                             gEfiMdePkgTokenSpaceGuid.PcdPciMmio32Translation;
 | 
					  #                             PcdPciMmio32Translation;
 | 
				
			||||||
  #   TranslatedMmio64Address = UntranslatedMmio64Address +
 | 
					  #   TranslatedMmio64Address = UntranslatedMmio64Address +
 | 
				
			||||||
  #                             gEfiMdePkgTokenSpaceGuid.PcdPciMmio64Translation;
 | 
					  #                             PcdPciMmio64Translation;
 | 
				
			||||||
  #
 | 
					  #
 | 
				
			||||||
  #  The modular arithmetic performed in UINT64 ensures that the translation
 | 
					  #  The modular arithmetic performed in UINT64 ensures that the translation
 | 
				
			||||||
  #  works correctly regardless of the relation between IoCpuBase and
 | 
					  #  works correctly regardless of the relation between IoCpuBase and
 | 
				
			||||||
@@ -370,20 +369,16 @@
 | 
				
			|||||||
  #
 | 
					  #
 | 
				
			||||||
  gArmTokenSpaceGuid.PcdPciIoBase|0x0|UINT64|0x00000050
 | 
					  gArmTokenSpaceGuid.PcdPciIoBase|0x0|UINT64|0x00000050
 | 
				
			||||||
  gArmTokenSpaceGuid.PcdPciIoSize|0x0|UINT64|0x00000051
 | 
					  gArmTokenSpaceGuid.PcdPciIoSize|0x0|UINT64|0x00000051
 | 
				
			||||||
 | 
					  gArmTokenSpaceGuid.PcdPciIoTranslation|0x0|UINT64|0x00000052
 | 
				
			||||||
  gArmTokenSpaceGuid.PcdPciMmio32Base|0x0|UINT32|0x00000053
 | 
					  gArmTokenSpaceGuid.PcdPciMmio32Base|0x0|UINT32|0x00000053
 | 
				
			||||||
  gArmTokenSpaceGuid.PcdPciMmio32Size|0x0|UINT32|0x00000054
 | 
					  gArmTokenSpaceGuid.PcdPciMmio32Size|0x0|UINT32|0x00000054
 | 
				
			||||||
 | 
					  gArmTokenSpaceGuid.PcdPciMmio32Translation|0x0|UINT64|0x00000055
 | 
				
			||||||
  gArmTokenSpaceGuid.PcdPciMmio64Base|0x0|UINT64|0x00000056
 | 
					  gArmTokenSpaceGuid.PcdPciMmio64Base|0x0|UINT64|0x00000056
 | 
				
			||||||
  gArmTokenSpaceGuid.PcdPciMmio64Size|0x0|UINT64|0x00000057
 | 
					  gArmTokenSpaceGuid.PcdPciMmio64Size|0x0|UINT64|0x00000057
 | 
				
			||||||
 | 
					  gArmTokenSpaceGuid.PcdPciMmio64Translation|0x0|UINT64|0x00000058
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  #
 | 
					  #
 | 
				
			||||||
  # Inclusive range of allowed PCI buses.
 | 
					  # Inclusive range of allowed PCI buses.
 | 
				
			||||||
  #
 | 
					  #
 | 
				
			||||||
  gArmTokenSpaceGuid.PcdPciBusMin|0x0|UINT32|0x00000059
 | 
					  gArmTokenSpaceGuid.PcdPciBusMin|0x0|UINT32|0x00000059
 | 
				
			||||||
  gArmTokenSpaceGuid.PcdPciBusMax|0x0|UINT32|0x0000005A
 | 
					  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) 2011 - 2021, Arm Limited. All rights reserved.<BR>
 | 
				
			||||||
# Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
 | 
					# Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
 | 
				
			||||||
# Copyright (c) Microsoft Corporation.<BR>
 | 
					# Copyright (c) Microsoft Corporation.<BR>
 | 
				
			||||||
# Copyright (c) 2021, Ampere Computing LLC. All rights reserved.
 | 
					 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
#    SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
					#    SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
@@ -151,7 +150,6 @@
 | 
				
			|||||||
  ArmPkg/Library/ArmSmcPsciResetSystemLib/ArmSmcPsciResetSystemLib.inf
 | 
					  ArmPkg/Library/ArmSmcPsciResetSystemLib/ArmSmcPsciResetSystemLib.inf
 | 
				
			||||||
  ArmPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf
 | 
					  ArmPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf
 | 
				
			||||||
  ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
 | 
					  ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
 | 
				
			||||||
  ArmPkg/Library/LinuxBootBootManagerLib/LinuxBootBootManagerLib.inf
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ArmPkg/Drivers/ArmCrashDumpDxe/ArmCrashDumpDxe.inf
 | 
					  ArmPkg/Drivers/ArmCrashDumpDxe/ArmCrashDumpDxe.inf
 | 
				
			||||||
  ArmPkg/Drivers/ArmScmiDxe/ArmScmiDxe.inf
 | 
					  ArmPkg/Drivers/ArmScmiDxe/ArmScmiDxe.inf
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,11 +24,9 @@ ArmCrashDumpDxeInitialize (
 | 
				
			|||||||
  EFI_STATUS      Status;
 | 
					  EFI_STATUS      Status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **)&mCpu);
 | 
					  Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **)&mCpu);
 | 
				
			||||||
  ASSERT_EFI_ERROR (Status);
 | 
					  ASSERT_EFI_ERROR(Status);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return mCpu->RegisterInterruptHandler (
 | 
					  return mCpu->RegisterInterruptHandler (mCpu,
 | 
				
			||||||
                 mCpu,
 | 
					 | 
				
			||||||
                                         EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS,
 | 
					                                         EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS,
 | 
				
			||||||
                 &DefaultExceptionHandler
 | 
					                                         &DefaultExceptionHandler);
 | 
				
			||||||
                 );
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -33,6 +33,7 @@ UINTN  mGicNumInterrupts = 0;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
HARDWARE_INTERRUPT_HANDLER  *gRegisteredInterruptHandlers = NULL;
 | 
					HARDWARE_INTERRUPT_HANDLER  *gRegisteredInterruptHandlers = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
  Calculate GICD_ICFGRn base address and corresponding bit
 | 
					  Calculate GICD_ICFGRn base address and corresponding bit
 | 
				
			||||||
  field Int_config[1] of the GIC distributor register.
 | 
					  field Int_config[1] of the GIC distributor register.
 | 
				
			||||||
@@ -55,7 +56,7 @@ GicGetDistributorIcfgBaseAndBit (
 | 
				
			|||||||
  UINTN                  Field;
 | 
					  UINTN                  Field;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (Source >= mGicNumInterrupts) {
 | 
					  if (Source >= mGicNumInterrupts) {
 | 
				
			||||||
    ASSERT (Source < mGicNumInterrupts);
 | 
					    ASSERT(Source < mGicNumInterrupts);
 | 
				
			||||||
    return EFI_UNSUPPORTED;
 | 
					    return EFI_UNSUPPORTED;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -70,6 +71,8 @@ GicGetDistributorIcfgBaseAndBit (
 | 
				
			|||||||
  return EFI_SUCCESS;
 | 
					  return EFI_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
  Register Handler for the specified interrupt source.
 | 
					  Register Handler for the specified interrupt source.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -90,7 +93,7 @@ RegisterInterruptSource (
 | 
				
			|||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (Source >= mGicNumInterrupts) {
 | 
					  if (Source >= mGicNumInterrupts) {
 | 
				
			||||||
    ASSERT (FALSE);
 | 
					    ASSERT(FALSE);
 | 
				
			||||||
    return EFI_UNSUPPORTED;
 | 
					    return EFI_UNSUPPORTED;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -105,7 +108,7 @@ RegisterInterruptSource (
 | 
				
			|||||||
  gRegisteredInterruptHandlers[Source] = Handler;
 | 
					  gRegisteredInterruptHandlers[Source] = Handler;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // If the interrupt handler is unregistered then disable the interrupt
 | 
					  // If the interrupt handler is unregistered then disable the interrupt
 | 
				
			||||||
  if (NULL == Handler) {
 | 
					  if (NULL == Handler){
 | 
				
			||||||
    return This->DisableInterruptSource (This, Source);
 | 
					    return This->DisableInterruptSource (This, Source);
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    return This->EnableInterruptSource (This, Source);
 | 
					    return This->EnableInterruptSource (This, Source);
 | 
				
			||||||
@@ -134,28 +137,17 @@ CpuArchEventProtocolNotify (
 | 
				
			|||||||
  // Unregister the default exception handler.
 | 
					  // Unregister the default exception handler.
 | 
				
			||||||
  Status = Cpu->RegisterInterruptHandler (Cpu, ARM_ARCH_EXCEPTION_IRQ, NULL);
 | 
					  Status = Cpu->RegisterInterruptHandler (Cpu, ARM_ARCH_EXCEPTION_IRQ, NULL);
 | 
				
			||||||
  if (EFI_ERROR (Status)) {
 | 
					  if (EFI_ERROR (Status)) {
 | 
				
			||||||
    DEBUG ((
 | 
					    DEBUG ((DEBUG_ERROR, "%a: Cpu->RegisterInterruptHandler() - %r\n",
 | 
				
			||||||
      DEBUG_ERROR,
 | 
					      __FUNCTION__, Status));
 | 
				
			||||||
      "%a: Cpu->RegisterInterruptHandler() - %r\n",
 | 
					 | 
				
			||||||
      __FUNCTION__,
 | 
					 | 
				
			||||||
      Status
 | 
					 | 
				
			||||||
      ));
 | 
					 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Register to receive interrupts
 | 
					  // Register to receive interrupts
 | 
				
			||||||
  Status = Cpu->RegisterInterruptHandler (
 | 
					  Status = Cpu->RegisterInterruptHandler (Cpu, ARM_ARCH_EXCEPTION_IRQ,
 | 
				
			||||||
                  Cpu,
 | 
					                  Context);
 | 
				
			||||||
                  ARM_ARCH_EXCEPTION_IRQ,
 | 
					 | 
				
			||||||
                  Context
 | 
					 | 
				
			||||||
                  );
 | 
					 | 
				
			||||||
  if (EFI_ERROR (Status)) {
 | 
					  if (EFI_ERROR (Status)) {
 | 
				
			||||||
    DEBUG ((
 | 
					    DEBUG ((DEBUG_ERROR, "%a: Cpu->RegisterInterruptHandler() - %r\n",
 | 
				
			||||||
      DEBUG_ERROR,
 | 
					      __FUNCTION__, Status));
 | 
				
			||||||
      "%a: Cpu->RegisterInterruptHandler() - %r\n",
 | 
					 | 
				
			||||||
      __FUNCTION__,
 | 
					 | 
				
			||||||
      Status
 | 
					 | 
				
			||||||
      ));
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  gBS->CloseEvent (Event);
 | 
					  gBS->CloseEvent (Event);
 | 
				
			||||||
@@ -171,7 +163,7 @@ InstallAndRegisterInterruptService (
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS               Status;
 | 
					  EFI_STATUS               Status;
 | 
				
			||||||
  CONST UINTN              RihArraySize =
 | 
					  CONST UINTN              RihArraySize =
 | 
				
			||||||
    (sizeof (HARDWARE_INTERRUPT_HANDLER) * mGicNumInterrupts);
 | 
					    (sizeof(HARDWARE_INTERRUPT_HANDLER) * mGicNumInterrupts);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Initialize the array for the Interrupt Handlers
 | 
					  // Initialize the array for the Interrupt Handlers
 | 
				
			||||||
  gRegisteredInterruptHandlers = AllocateZeroPool (RihArraySize);
 | 
					  gRegisteredInterruptHandlers = AllocateZeroPool (RihArraySize);
 | 
				
			||||||
@@ -199,8 +191,7 @@ InstallAndRegisterInterruptService (
 | 
				
			|||||||
    TPL_CALLBACK,
 | 
					    TPL_CALLBACK,
 | 
				
			||||||
    CpuArchEventProtocolNotify,
 | 
					    CpuArchEventProtocolNotify,
 | 
				
			||||||
    InterruptHandler,
 | 
					    InterruptHandler,
 | 
				
			||||||
    &mCpuArchProtocolNotifyEventRegistration
 | 
					    &mCpuArchProtocolNotifyEventRegistration);
 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Register for an ExitBootServicesEvent
 | 
					  // Register for an ExitBootServicesEvent
 | 
				
			||||||
  Status = gBS->CreateEvent (
 | 
					  Status = gBS->CreateEvent (
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -55,6 +55,7 @@ GicV3DxeInitialize (
 | 
				
			|||||||
  IN EFI_SYSTEM_TABLE   *SystemTable
 | 
					  IN EFI_SYSTEM_TABLE   *SystemTable
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Shared code
 | 
					// Shared code
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,13 +24,13 @@
 | 
				
			|||||||
                                           + ARM_GICR_SGI_VLPI_FRAME_SIZE     \
 | 
					                                           + ARM_GICR_SGI_VLPI_FRAME_SIZE     \
 | 
				
			||||||
                                           + ARM_GICR_SGI_RESERVED_FRAME_SIZE)
 | 
					                                           + ARM_GICR_SGI_RESERVED_FRAME_SIZE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ISENABLER_ADDRESS(base, offset)  ((base) +\
 | 
					#define ISENABLER_ADDRESS(base,offset) ((base) + \
 | 
				
			||||||
          ARM_GICR_CTLR_FRAME_SIZE + ARM_GICR_ISENABLER + 4 * (offset))
 | 
					          ARM_GICR_CTLR_FRAME_SIZE + ARM_GICR_ISENABLER + 4 * (offset))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ICENABLER_ADDRESS(base, offset)  ((base) +\
 | 
					#define ICENABLER_ADDRESS(base,offset) ((base) + \
 | 
				
			||||||
          ARM_GICR_CTLR_FRAME_SIZE + ARM_GICR_ICENABLER + 4 * (offset))
 | 
					          ARM_GICR_CTLR_FRAME_SIZE + ARM_GICR_ICENABLER + 4 * (offset))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define IPRIORITY_ADDRESS(base, offset)  ((base) +\
 | 
					#define IPRIORITY_ADDRESS(base,offset) ((base) + \
 | 
				
			||||||
          ARM_GICR_CTLR_FRAME_SIZE + ARM_GIC_ICDIPR + 4 * (offset))
 | 
					          ARM_GICR_CTLR_FRAME_SIZE + ARM_GIC_ICDIPR + 4 * (offset))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@@ -230,8 +230,7 @@ ArmGicSetInterruptPriority (
 | 
				
			|||||||
  Revision = ArmGicGetSupportedArchRevision ();
 | 
					  Revision = ArmGicGetSupportedArchRevision ();
 | 
				
			||||||
  if ((Revision == ARM_GIC_ARCH_REVISION_2) ||
 | 
					  if ((Revision == ARM_GIC_ARCH_REVISION_2) ||
 | 
				
			||||||
      FeaturePcdGet (PcdArmGicV3WithV2Legacy) ||
 | 
					      FeaturePcdGet (PcdArmGicV3WithV2Legacy) ||
 | 
				
			||||||
      SourceIsSpi (Source))
 | 
					      SourceIsSpi (Source)) {
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    MmioAndThenOr32 (
 | 
					    MmioAndThenOr32 (
 | 
				
			||||||
      GicDistributorBase + ARM_GIC_ICDIPR + (4 * RegOffset),
 | 
					      GicDistributorBase + ARM_GIC_ICDIPR + (4 * RegOffset),
 | 
				
			||||||
      ~(0xff << RegShift),
 | 
					      ~(0xff << RegShift),
 | 
				
			||||||
@@ -274,8 +273,7 @@ ArmGicEnableInterrupt (
 | 
				
			|||||||
  Revision = ArmGicGetSupportedArchRevision ();
 | 
					  Revision = ArmGicGetSupportedArchRevision ();
 | 
				
			||||||
  if ((Revision == ARM_GIC_ARCH_REVISION_2) ||
 | 
					  if ((Revision == ARM_GIC_ARCH_REVISION_2) ||
 | 
				
			||||||
      FeaturePcdGet (PcdArmGicV3WithV2Legacy) ||
 | 
					      FeaturePcdGet (PcdArmGicV3WithV2Legacy) ||
 | 
				
			||||||
      SourceIsSpi (Source))
 | 
					      SourceIsSpi (Source)) {
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    // Write set-enable register
 | 
					    // Write set-enable register
 | 
				
			||||||
    MmioWrite32 (
 | 
					    MmioWrite32 (
 | 
				
			||||||
      GicDistributorBase + ARM_GIC_ICDISER + (4 * RegOffset),
 | 
					      GicDistributorBase + ARM_GIC_ICDISER + (4 * RegOffset),
 | 
				
			||||||
@@ -293,7 +291,7 @@ ArmGicEnableInterrupt (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // Write set-enable register
 | 
					    // Write set-enable register
 | 
				
			||||||
    MmioWrite32 (
 | 
					    MmioWrite32 (
 | 
				
			||||||
      ISENABLER_ADDRESS (GicCpuRedistributorBase, RegOffset),
 | 
					      ISENABLER_ADDRESS(GicCpuRedistributorBase, RegOffset),
 | 
				
			||||||
      1 << RegShift
 | 
					      1 << RegShift
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -319,8 +317,7 @@ ArmGicDisableInterrupt (
 | 
				
			|||||||
  Revision = ArmGicGetSupportedArchRevision ();
 | 
					  Revision = ArmGicGetSupportedArchRevision ();
 | 
				
			||||||
  if ((Revision == ARM_GIC_ARCH_REVISION_2) ||
 | 
					  if ((Revision == ARM_GIC_ARCH_REVISION_2) ||
 | 
				
			||||||
      FeaturePcdGet (PcdArmGicV3WithV2Legacy) ||
 | 
					      FeaturePcdGet (PcdArmGicV3WithV2Legacy) ||
 | 
				
			||||||
      SourceIsSpi (Source))
 | 
					      SourceIsSpi (Source)) {
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    // Write clear-enable register
 | 
					    // Write clear-enable register
 | 
				
			||||||
    MmioWrite32 (
 | 
					    MmioWrite32 (
 | 
				
			||||||
      GicDistributorBase + ARM_GIC_ICDICER + (4 * RegOffset),
 | 
					      GicDistributorBase + ARM_GIC_ICDICER + (4 * RegOffset),
 | 
				
			||||||
@@ -337,7 +334,7 @@ ArmGicDisableInterrupt (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // Write clear-enable register
 | 
					    // Write clear-enable register
 | 
				
			||||||
    MmioWrite32 (
 | 
					    MmioWrite32 (
 | 
				
			||||||
      ICENABLER_ADDRESS (GicCpuRedistributorBase, RegOffset),
 | 
					      ICENABLER_ADDRESS(GicCpuRedistributorBase, RegOffset),
 | 
				
			||||||
      1 << RegShift
 | 
					      1 << RegShift
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -364,8 +361,7 @@ ArmGicIsInterruptEnabled (
 | 
				
			|||||||
  Revision = ArmGicGetSupportedArchRevision ();
 | 
					  Revision = ArmGicGetSupportedArchRevision ();
 | 
				
			||||||
  if ((Revision == ARM_GIC_ARCH_REVISION_2) ||
 | 
					  if ((Revision == ARM_GIC_ARCH_REVISION_2) ||
 | 
				
			||||||
      FeaturePcdGet (PcdArmGicV3WithV2Legacy) ||
 | 
					      FeaturePcdGet (PcdArmGicV3WithV2Legacy) ||
 | 
				
			||||||
      SourceIsSpi (Source))
 | 
					      SourceIsSpi (Source)) {
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    Interrupts = ((MmioRead32 (
 | 
					    Interrupts = ((MmioRead32 (
 | 
				
			||||||
                     GicDistributorBase + ARM_GIC_ICDISER + (4 * RegOffset)
 | 
					                     GicDistributorBase + ARM_GIC_ICDISER + (4 * RegOffset)
 | 
				
			||||||
                     )
 | 
					                     )
 | 
				
			||||||
@@ -381,7 +377,7 @@ ArmGicIsInterruptEnabled (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // Read set-enable register
 | 
					    // Read set-enable register
 | 
				
			||||||
    Interrupts = MmioRead32 (
 | 
					    Interrupts = MmioRead32 (
 | 
				
			||||||
                   ISENABLER_ADDRESS (GicCpuRedistributorBase, RegOffset)
 | 
					                   ISENABLER_ADDRESS(GicCpuRedistributorBase, RegOffset)
 | 
				
			||||||
                   );
 | 
					                   );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -47,7 +47,7 @@ GicV2EnableInterruptSource (
 | 
				
			|||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (Source >= mGicNumInterrupts) {
 | 
					  if (Source >= mGicNumInterrupts) {
 | 
				
			||||||
    ASSERT (FALSE);
 | 
					    ASSERT(FALSE);
 | 
				
			||||||
    return EFI_UNSUPPORTED;
 | 
					    return EFI_UNSUPPORTED;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -75,7 +75,7 @@ GicV2DisableInterruptSource (
 | 
				
			|||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (Source >= mGicNumInterrupts) {
 | 
					  if (Source >= mGicNumInterrupts) {
 | 
				
			||||||
    ASSERT (FALSE);
 | 
					    ASSERT(FALSE);
 | 
				
			||||||
    return EFI_UNSUPPORTED;
 | 
					    return EFI_UNSUPPORTED;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -105,7 +105,7 @@ GicV2GetInterruptSourceState (
 | 
				
			|||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (Source >= mGicNumInterrupts) {
 | 
					  if (Source >= mGicNumInterrupts) {
 | 
				
			||||||
    ASSERT (FALSE);
 | 
					    ASSERT(FALSE);
 | 
				
			||||||
    return EFI_UNSUPPORTED;
 | 
					    return EFI_UNSUPPORTED;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -134,7 +134,7 @@ GicV2EndOfInterrupt (
 | 
				
			|||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (Source >= mGicNumInterrupts) {
 | 
					  if (Source >= mGicNumInterrupts) {
 | 
				
			||||||
    ASSERT (FALSE);
 | 
					    ASSERT(FALSE);
 | 
				
			||||||
    return EFI_UNSUPPORTED;
 | 
					    return EFI_UNSUPPORTED;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -261,13 +261,9 @@ GicV2SetTriggerType (
 | 
				
			|||||||
  BOOLEAN                 SourceEnabled;
 | 
					  BOOLEAN                 SourceEnabled;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (   (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING)
 | 
					  if (   (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING)
 | 
				
			||||||
     && (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_LEVEL_HIGH))
 | 
					      && (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_LEVEL_HIGH)) {
 | 
				
			||||||
  {
 | 
					          DEBUG ((DEBUG_ERROR, "Invalid interrupt trigger type: %d\n", \
 | 
				
			||||||
    DEBUG ((
 | 
					                  TriggerType));
 | 
				
			||||||
      DEBUG_ERROR,
 | 
					 | 
				
			||||||
      "Invalid interrupt trigger type: %d\n", \
 | 
					 | 
				
			||||||
      TriggerType
 | 
					 | 
				
			||||||
      ));
 | 
					 | 
				
			||||||
          ASSERT (FALSE);
 | 
					          ASSERT (FALSE);
 | 
				
			||||||
          return EFI_UNSUPPORTED;
 | 
					          return EFI_UNSUPPORTED;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -283,7 +279,7 @@ GicV2SetTriggerType (
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Status = GicV2GetInterruptSourceState (
 | 
					  Status = GicV2GetInterruptSourceState (
 | 
				
			||||||
             (EFI_HARDWARE_INTERRUPT_PROTOCOL *)This,
 | 
					             (EFI_HARDWARE_INTERRUPT_PROTOCOL*)This,
 | 
				
			||||||
             Source,
 | 
					             Source,
 | 
				
			||||||
             &SourceEnabled
 | 
					             &SourceEnabled
 | 
				
			||||||
             );
 | 
					             );
 | 
				
			||||||
@@ -300,7 +296,7 @@ GicV2SetTriggerType (
 | 
				
			|||||||
  // otherwise GIC behavior is UNPREDICTABLE.
 | 
					  // otherwise GIC behavior is UNPREDICTABLE.
 | 
				
			||||||
  if (SourceEnabled) {
 | 
					  if (SourceEnabled) {
 | 
				
			||||||
    GicV2DisableInterruptSource (
 | 
					    GicV2DisableInterruptSource (
 | 
				
			||||||
      (EFI_HARDWARE_INTERRUPT_PROTOCOL *)This,
 | 
					      (EFI_HARDWARE_INTERRUPT_PROTOCOL*)This,
 | 
				
			||||||
      Source
 | 
					      Source
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -314,7 +310,7 @@ GicV2SetTriggerType (
 | 
				
			|||||||
  // Restore interrupt state
 | 
					  // Restore interrupt state
 | 
				
			||||||
  if (SourceEnabled) {
 | 
					  if (SourceEnabled) {
 | 
				
			||||||
    GicV2EnableInterruptSource (
 | 
					    GicV2EnableInterruptSource (
 | 
				
			||||||
      (EFI_HARDWARE_INTERRUPT_PROTOCOL *)This,
 | 
					      (EFI_HARDWARE_INTERRUPT_PROTOCOL*)This,
 | 
				
			||||||
      Source
 | 
					      Source
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,6 +10,7 @@
 | 
				
			|||||||
#include <Library/IoLib.h>
 | 
					#include <Library/IoLib.h>
 | 
				
			||||||
#include <Library/ArmGicLib.h>
 | 
					#include <Library/ArmGicLib.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicV2EnableInterruptInterface (
 | 
					ArmGicV2EnableInterruptInterface (
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -37,7 +37,7 @@ GicV3EnableInterruptSource (
 | 
				
			|||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (Source >= mGicNumInterrupts) {
 | 
					  if (Source >= mGicNumInterrupts) {
 | 
				
			||||||
    ASSERT (FALSE);
 | 
					    ASSERT(FALSE);
 | 
				
			||||||
    return EFI_UNSUPPORTED;
 | 
					    return EFI_UNSUPPORTED;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -65,7 +65,7 @@ GicV3DisableInterruptSource (
 | 
				
			|||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (Source >= mGicNumInterrupts) {
 | 
					  if (Source >= mGicNumInterrupts) {
 | 
				
			||||||
    ASSERT (FALSE);
 | 
					    ASSERT(FALSE);
 | 
				
			||||||
    return EFI_UNSUPPORTED;
 | 
					    return EFI_UNSUPPORTED;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -95,7 +95,7 @@ GicV3GetInterruptSourceState (
 | 
				
			|||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (Source >= mGicNumInterrupts) {
 | 
					  if (Source >= mGicNumInterrupts) {
 | 
				
			||||||
    ASSERT (FALSE);
 | 
					    ASSERT(FALSE);
 | 
				
			||||||
    return EFI_UNSUPPORTED;
 | 
					    return EFI_UNSUPPORTED;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -128,7 +128,7 @@ GicV3EndOfInterrupt (
 | 
				
			|||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (Source >= mGicNumInterrupts) {
 | 
					  if (Source >= mGicNumInterrupts) {
 | 
				
			||||||
    ASSERT (FALSE);
 | 
					    ASSERT(FALSE);
 | 
				
			||||||
    return EFI_UNSUPPORTED;
 | 
					    return EFI_UNSUPPORTED;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -255,13 +255,9 @@ GicV3SetTriggerType (
 | 
				
			|||||||
  BOOLEAN                 SourceEnabled;
 | 
					  BOOLEAN                 SourceEnabled;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (   (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING)
 | 
					  if (   (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING)
 | 
				
			||||||
     && (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_LEVEL_HIGH))
 | 
					      && (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_LEVEL_HIGH)) {
 | 
				
			||||||
  {
 | 
					          DEBUG ((DEBUG_ERROR, "Invalid interrupt trigger type: %d\n", \
 | 
				
			||||||
    DEBUG ((
 | 
					                 TriggerType));
 | 
				
			||||||
      DEBUG_ERROR,
 | 
					 | 
				
			||||||
      "Invalid interrupt trigger type: %d\n", \
 | 
					 | 
				
			||||||
      TriggerType
 | 
					 | 
				
			||||||
      ));
 | 
					 | 
				
			||||||
          ASSERT (FALSE);
 | 
					          ASSERT (FALSE);
 | 
				
			||||||
          return EFI_UNSUPPORTED;
 | 
					          return EFI_UNSUPPORTED;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -277,7 +273,7 @@ GicV3SetTriggerType (
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Status = GicV3GetInterruptSourceState (
 | 
					  Status = GicV3GetInterruptSourceState (
 | 
				
			||||||
             (EFI_HARDWARE_INTERRUPT_PROTOCOL *)This,
 | 
					             (EFI_HARDWARE_INTERRUPT_PROTOCOL*)This,
 | 
				
			||||||
             Source,
 | 
					             Source,
 | 
				
			||||||
             &SourceEnabled
 | 
					             &SourceEnabled
 | 
				
			||||||
             );
 | 
					             );
 | 
				
			||||||
@@ -294,7 +290,7 @@ GicV3SetTriggerType (
 | 
				
			|||||||
  // otherwise GIC behavior is UNPREDICTABLE.
 | 
					  // otherwise GIC behavior is UNPREDICTABLE.
 | 
				
			||||||
  if (SourceEnabled) {
 | 
					  if (SourceEnabled) {
 | 
				
			||||||
    GicV3DisableInterruptSource (
 | 
					    GicV3DisableInterruptSource (
 | 
				
			||||||
      (EFI_HARDWARE_INTERRUPT_PROTOCOL *)This,
 | 
					      (EFI_HARDWARE_INTERRUPT_PROTOCOL*)This,
 | 
				
			||||||
      Source
 | 
					      Source
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -307,7 +303,7 @@ GicV3SetTriggerType (
 | 
				
			|||||||
  // Restore interrupt state
 | 
					  // Restore interrupt state
 | 
				
			||||||
  if (SourceEnabled) {
 | 
					  if (SourceEnabled) {
 | 
				
			||||||
    GicV3EnableInterruptSource (
 | 
					    GicV3EnableInterruptSource (
 | 
				
			||||||
      (EFI_HARDWARE_INTERRUPT_PROTOCOL *)This,
 | 
					      (EFI_HARDWARE_INTERRUPT_PROTOCOL*)This,
 | 
				
			||||||
      Source
 | 
					      Source
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -348,6 +344,10 @@ GicV3ExitBootServicesEvent (
 | 
				
			|||||||
    GicV3DisableInterruptSource (&gHardwareInterruptV3Protocol, Index);
 | 
					    GicV3DisableInterruptSource (&gHardwareInterruptV3Protocol, Index);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for (Index = 0; Index < mGicNumInterrupts; Index++) {
 | 
				
			||||||
 | 
					    GicV3EndOfInterrupt (&gHardwareInterruptV3Protocol, Index);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Disable Gic Interface
 | 
					  // Disable Gic Interface
 | 
				
			||||||
  ArmGicV3DisableInterruptInterface ();
 | 
					  ArmGicV3DisableInterruptInterface ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -434,8 +434,8 @@ GicV3DxeInitialize (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if ((MmioRead32 (
 | 
					    if ((MmioRead32 (
 | 
				
			||||||
           mGicDistributorBase + ARM_GIC_ICDDCR
 | 
					           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
 | 
					      // 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
 | 
					      // 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)
 | 
					      // executing in non-secure state (which is appropriate for DXE modules)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -117,14 +117,14 @@ CpuIoCheckParameter (
 | 
				
			|||||||
  // For FIFO type, the target address won't increase during the access,
 | 
					  // For FIFO type, the target address won't increase during the access,
 | 
				
			||||||
  // so treat Count as 1
 | 
					  // so treat Count as 1
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  if ((Width >= EfiCpuIoWidthFifoUint8) && (Width <= EfiCpuIoWidthFifoUint64)) {
 | 
					  if (Width >= EfiCpuIoWidthFifoUint8 && Width <= EfiCpuIoWidthFifoUint64) {
 | 
				
			||||||
    Count = 1;
 | 
					    Count = 1;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  // Check to see if Width is in the valid range for I/O Port operations
 | 
					  // Check to see if Width is in the valid range for I/O Port operations
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  Width = (EFI_CPU_IO_PROTOCOL_WIDTH)(Width & 0x03);
 | 
					  Width = (EFI_CPU_IO_PROTOCOL_WIDTH) (Width & 0x03);
 | 
				
			||||||
  if (!MmioOperation && (Width == EfiCpuIoWidthUint64)) {
 | 
					  if (!MmioOperation && (Width == EfiCpuIoWidthUint64)) {
 | 
				
			||||||
    return EFI_INVALID_PARAMETER;
 | 
					    return EFI_INVALID_PARAMETER;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -161,7 +161,6 @@ CpuIoCheckParameter (
 | 
				
			|||||||
    if (MaxCount < (Count - 1)) {
 | 
					    if (MaxCount < (Count - 1)) {
 | 
				
			||||||
      return EFI_UNSUPPORTED;
 | 
					      return EFI_UNSUPPORTED;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (Address > LShiftU64 (MaxCount - Count + 1, Width)) {
 | 
					    if (Address > LShiftU64 (MaxCount - Count + 1, Width)) {
 | 
				
			||||||
      return EFI_UNSUPPORTED;
 | 
					      return EFI_UNSUPPORTED;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -243,7 +242,7 @@ CpuMemoryServiceRead (
 | 
				
			|||||||
  //
 | 
					  //
 | 
				
			||||||
  InStride = mInStride[Width];
 | 
					  InStride = mInStride[Width];
 | 
				
			||||||
  OutStride = mOutStride[Width];
 | 
					  OutStride = mOutStride[Width];
 | 
				
			||||||
  OperationWidth = (EFI_CPU_IO_PROTOCOL_WIDTH)(Width & 0x03);
 | 
					  OperationWidth = (EFI_CPU_IO_PROTOCOL_WIDTH) (Width & 0x03);
 | 
				
			||||||
  for (Uint8Buffer = Buffer; Count > 0; Address += InStride, Uint8Buffer += OutStride, Count--) {
 | 
					  for (Uint8Buffer = Buffer; Count > 0; Address += InStride, Uint8Buffer += OutStride, Count--) {
 | 
				
			||||||
    if (OperationWidth == EfiCpuIoWidthUint8) {
 | 
					    if (OperationWidth == EfiCpuIoWidthUint8) {
 | 
				
			||||||
      *Uint8Buffer = MmioRead8 ((UINTN)Address);
 | 
					      *Uint8Buffer = MmioRead8 ((UINTN)Address);
 | 
				
			||||||
@@ -255,7 +254,6 @@ CpuMemoryServiceRead (
 | 
				
			|||||||
      *((UINT64 *)Uint8Buffer) = MmioRead64 ((UINTN)Address);
 | 
					      *((UINT64 *)Uint8Buffer) = MmioRead64 ((UINTN)Address);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  return EFI_SUCCESS;
 | 
					  return EFI_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -325,7 +323,7 @@ CpuMemoryServiceWrite (
 | 
				
			|||||||
  //
 | 
					  //
 | 
				
			||||||
  InStride = mInStride[Width];
 | 
					  InStride = mInStride[Width];
 | 
				
			||||||
  OutStride = mOutStride[Width];
 | 
					  OutStride = mOutStride[Width];
 | 
				
			||||||
  OperationWidth = (EFI_CPU_IO_PROTOCOL_WIDTH)(Width & 0x03);
 | 
					  OperationWidth = (EFI_CPU_IO_PROTOCOL_WIDTH) (Width & 0x03);
 | 
				
			||||||
  for (Uint8Buffer = Buffer; Count > 0; Address += InStride, Uint8Buffer += OutStride, Count--) {
 | 
					  for (Uint8Buffer = Buffer; Count > 0; Address += InStride, Uint8Buffer += OutStride, Count--) {
 | 
				
			||||||
    if (OperationWidth == EfiCpuIoWidthUint8) {
 | 
					    if (OperationWidth == EfiCpuIoWidthUint8) {
 | 
				
			||||||
      MmioWrite8 ((UINTN)Address, *Uint8Buffer);
 | 
					      MmioWrite8 ((UINTN)Address, *Uint8Buffer);
 | 
				
			||||||
@@ -337,7 +335,6 @@ CpuMemoryServiceWrite (
 | 
				
			|||||||
      MmioWrite64 ((UINTN)Address, *((UINT64 *)Uint8Buffer));
 | 
					      MmioWrite64 ((UINTN)Address, *((UINT64 *)Uint8Buffer));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  return EFI_SUCCESS;
 | 
					  return EFI_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -409,7 +406,7 @@ CpuIoServiceRead (
 | 
				
			|||||||
  //
 | 
					  //
 | 
				
			||||||
  InStride = mInStride[Width];
 | 
					  InStride = mInStride[Width];
 | 
				
			||||||
  OutStride = mOutStride[Width];
 | 
					  OutStride = mOutStride[Width];
 | 
				
			||||||
  OperationWidth = (EFI_CPU_IO_PROTOCOL_WIDTH)(Width & 0x03);
 | 
					  OperationWidth = (EFI_CPU_IO_PROTOCOL_WIDTH) (Width & 0x03);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for (Uint8Buffer = Buffer; Count > 0; Address += InStride, Uint8Buffer += OutStride, Count--) {
 | 
					  for (Uint8Buffer = Buffer; Count > 0; Address += InStride, Uint8Buffer += OutStride, Count--) {
 | 
				
			||||||
    if (OperationWidth == EfiCpuIoWidthUint8) {
 | 
					    if (OperationWidth == EfiCpuIoWidthUint8) {
 | 
				
			||||||
@@ -495,7 +492,7 @@ CpuIoServiceWrite (
 | 
				
			|||||||
  //
 | 
					  //
 | 
				
			||||||
  InStride = mInStride[Width];
 | 
					  InStride = mInStride[Width];
 | 
				
			||||||
  OutStride = mOutStride[Width];
 | 
					  OutStride = mOutStride[Width];
 | 
				
			||||||
  OperationWidth = (EFI_CPU_IO_PROTOCOL_WIDTH)(Width & 0x03);
 | 
					  OperationWidth = (EFI_CPU_IO_PROTOCOL_WIDTH) (Width & 0x03);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for (Uint8Buffer = (UINT8 *)Buffer; Count > 0; Address += InStride, Uint8Buffer += OutStride, Count--) {
 | 
					  for (Uint8Buffer = (UINT8 *)Buffer; Count > 0; Address += InStride, Uint8Buffer += OutStride, Count--) {
 | 
				
			||||||
    if (OperationWidth == EfiCpuIoWidthUint8) {
 | 
					    if (OperationWidth == EfiCpuIoWidthUint8) {
 | 
				
			||||||
@@ -524,6 +521,7 @@ STATIC EFI_CPU_IO2_PROTOCOL  mCpuIo2 = {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
  The user Entry Point for module CpuIo2Dxe. The user code starts with this function.
 | 
					  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);
 | 
					  ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiCpuIo2ProtocolGuid);
 | 
				
			||||||
  Status = gBS->InstallMultipleProtocolInterfaces (
 | 
					  Status = gBS->InstallMultipleProtocolInterfaces (
 | 
				
			||||||
                  &mHandle,
 | 
					                  &mHandle,
 | 
				
			||||||
                  &gEfiCpuIo2ProtocolGuid,
 | 
					                  &gEfiCpuIo2ProtocolGuid, &mCpuIo2,
 | 
				
			||||||
                  &mCpuIo2,
 | 
					 | 
				
			||||||
                  NULL
 | 
					                  NULL
 | 
				
			||||||
                  );
 | 
					                  );
 | 
				
			||||||
  ASSERT_EFI_ERROR (Status);
 | 
					  ASSERT_EFI_ERROR (Status);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -38,7 +38,7 @@
 | 
				
			|||||||
  UefiBootServicesTableLib
 | 
					  UefiBootServicesTableLib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Pcd]
 | 
					[Pcd]
 | 
				
			||||||
  gEfiMdePkgTokenSpaceGuid.PcdPciIoTranslation
 | 
					  gArmTokenSpaceGuid.PcdPciIoTranslation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Protocols]
 | 
					[Protocols]
 | 
				
			||||||
  gEfiCpuIo2ProtocolGuid                         ## PRODUCES
 | 
					  gEfiCpuIo2ProtocolGuid                         ## PRODUCES
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,7 +34,7 @@ typedef struct {
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
ScmiBaseProtocolInit (
 | 
					ScmiBaseProtocolInit (
 | 
				
			||||||
  IN OUT EFI_HANDLE  *Handle
 | 
					  IN OUT EFI_HANDLE* Handle
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* ARM_SCMI_BASE_PROTOCOL_PRIVATE_H_ */
 | 
					#endif /* ARM_SCMI_BASE_PROTOCOL_PRIVATE_H_ */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -53,6 +53,7 @@ typedef struct {
 | 
				
			|||||||
  CLOCK_RATE_DWORD Rate;
 | 
					  CLOCK_RATE_DWORD Rate;
 | 
				
			||||||
} CLOCK_RATE_SET_ATTRIBUTES;
 | 
					} CLOCK_RATE_SET_ATTRIBUTES;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Message parameters for CLOCK_CONFIG_SET command.
 | 
					// Message parameters for CLOCK_CONFIG_SET command.
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  UINT32 ClockId;
 | 
					  UINT32 ClockId;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -43,7 +43,7 @@ typedef struct {
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
ScmiPerformanceProtocolInit (
 | 
					ScmiPerformanceProtocolInit (
 | 
				
			||||||
  IN EFI_HANDLE  *Handle
 | 
					  IN EFI_HANDLE* Handle
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* ARM_SCMI_PERFORMANCE_PROTOCOL_PRIVATE_H_ */
 | 
					#endif /* ARM_SCMI_PERFORMANCE_PROTOCOL_PRIVATE_H_ */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,7 +29,7 @@
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
ScmiCommandGetPayload (
 | 
					ScmiCommandGetPayload (
 | 
				
			||||||
  OUT UINT32  **Payload
 | 
					  OUT UINT32** Payload
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS   Status;
 | 
					  EFI_STATUS   Status;
 | 
				
			||||||
@@ -121,12 +121,10 @@ ScmiCommandExecute (
 | 
				
			|||||||
    return EFI_DEVICE_ERROR;
 | 
					    return EFI_DEVICE_ERROR;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Response = (SCMI_MESSAGE_RESPONSE *)MtlGetChannelPayload (Channel);
 | 
					  Response = (SCMI_MESSAGE_RESPONSE*)MtlGetChannelPayload (Channel);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (Response->Status != ScmiSuccess) {
 | 
					  if (Response->Status != ScmiSuccess) {
 | 
				
			||||||
    DEBUG ((
 | 
					    DEBUG ((DEBUG_ERROR, "SCMI error: ProtocolId = 0x%x, MessageId = 0x%x, error = %d\n",
 | 
				
			||||||
      DEBUG_ERROR,
 | 
					 | 
				
			||||||
      "SCMI error: ProtocolId = 0x%x, MessageId = 0x%x, error = %d\n",
 | 
					 | 
				
			||||||
      Command->ProtocolId,
 | 
					      Command->ProtocolId,
 | 
				
			||||||
      Command->MessageId,
 | 
					      Command->MessageId,
 | 
				
			||||||
      Response->Status
 | 
					      Response->Status
 | 
				
			||||||
@@ -198,7 +196,7 @@ ScmiGetProtocolVersion (
 | 
				
			|||||||
  Status = ScmiProtocolDiscoveryCommon (
 | 
					  Status = ScmiProtocolDiscoveryCommon (
 | 
				
			||||||
             ProtocolId,
 | 
					             ProtocolId,
 | 
				
			||||||
             ScmiMessageIdProtocolVersion,
 | 
					             ScmiMessageIdProtocolVersion,
 | 
				
			||||||
             (UINT32 **)&ProtocolVersion
 | 
					             (UINT32**)&ProtocolVersion
 | 
				
			||||||
             );
 | 
					             );
 | 
				
			||||||
  if (EFI_ERROR (Status)) {
 | 
					  if (EFI_ERROR (Status)) {
 | 
				
			||||||
    return Status;
 | 
					    return Status;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -106,9 +106,9 @@ BaseDiscoverVendorDetails (
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  AsciiStrCpyS (
 | 
					  AsciiStrCpyS (
 | 
				
			||||||
    (CHAR8 *)VendorIdentifier,
 | 
					    (CHAR8*)VendorIdentifier,
 | 
				
			||||||
    SCMI_MAX_STR_LEN,
 | 
					    SCMI_MAX_STR_LEN,
 | 
				
			||||||
    (CONST CHAR8 *)ReturnValues
 | 
					    (CONST CHAR8*)ReturnValues
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return EFI_SUCCESS;
 | 
					  return EFI_SUCCESS;
 | 
				
			||||||
@@ -256,6 +256,7 @@ BaseDiscoverListProtocols (
 | 
				
			|||||||
  Skip = 0;
 | 
					  Skip = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  while (Skip < TotalProtocols) {
 | 
					  while (Skip < TotalProtocols) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    *MessageParams = Skip;
 | 
					    *MessageParams = Skip;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Note PayloadLength is a IN/OUT parameter.
 | 
					    // Note PayloadLength is a IN/OUT parameter.
 | 
				
			||||||
@@ -264,7 +265,7 @@ BaseDiscoverListProtocols (
 | 
				
			|||||||
    Status = ScmiCommandExecute (
 | 
					    Status = ScmiCommandExecute (
 | 
				
			||||||
               &Cmd,
 | 
					               &Cmd,
 | 
				
			||||||
               &PayloadLength,
 | 
					               &PayloadLength,
 | 
				
			||||||
               (UINT32 **)&DiscoverList
 | 
					               (UINT32**)&DiscoverList
 | 
				
			||||||
               );
 | 
					               );
 | 
				
			||||||
    if (EFI_ERROR (Status)) {
 | 
					    if (EFI_ERROR (Status)) {
 | 
				
			||||||
      return Status;
 | 
					      return Status;
 | 
				
			||||||
@@ -299,7 +300,7 @@ STATIC CONST SCMI_BASE_PROTOCOL  BaseProtocol = {
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
ScmiBaseProtocolInit (
 | 
					ScmiBaseProtocolInit (
 | 
				
			||||||
  IN OUT EFI_HANDLE  *Handle
 | 
					  IN OUT EFI_HANDLE* Handle
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return gBS->InstallMultipleProtocolInterfaces (
 | 
					  return gBS->InstallMultipleProtocolInterfaces (
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -130,19 +130,18 @@ ClockGetClockAttributes (
 | 
				
			|||||||
  Status = ScmiCommandExecute (
 | 
					  Status = ScmiCommandExecute (
 | 
				
			||||||
             &Cmd,
 | 
					             &Cmd,
 | 
				
			||||||
             &PayloadLength,
 | 
					             &PayloadLength,
 | 
				
			||||||
             (UINT32 **)&ClockAttributes
 | 
					             (UINT32**)&ClockAttributes
 | 
				
			||||||
             );
 | 
					             );
 | 
				
			||||||
  if (EFI_ERROR (Status)) {
 | 
					  if (EFI_ERROR (Status)) {
 | 
				
			||||||
    return Status;
 | 
					    return Status;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
   // TRUE if bit 0 of ClockAttributes->Attributes is set.
 | 
					   // TRUE if bit 0 of ClockAttributes->Attributes is set.
 | 
				
			||||||
  *Enabled = CLOCK_ENABLED (ClockAttributes->Attributes);
 | 
					  *Enabled = CLOCK_ENABLED (ClockAttributes->Attributes);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  AsciiStrCpyS (
 | 
					  AsciiStrCpyS (
 | 
				
			||||||
    ClockAsciiName,
 | 
					    ClockAsciiName,
 | 
				
			||||||
    SCMI_MAX_STR_LEN,
 | 
					    SCMI_MAX_STR_LEN,
 | 
				
			||||||
    (CONST CHAR8 *)ClockAttributes->ClockName
 | 
					    (CONST CHAR8*)ClockAttributes->ClockName
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return EFI_SUCCESS;
 | 
					  return EFI_SUCCESS;
 | 
				
			||||||
@@ -210,6 +209,7 @@ ClockDescribeRates (
 | 
				
			|||||||
  *MessageParams++  = ClockId;
 | 
					  *MessageParams++  = ClockId;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  do {
 | 
					  do {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    *MessageParams = RateIndex;
 | 
					    *MessageParams = RateIndex;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Set Payload length, note PayloadLength is a IN/OUT parameter.
 | 
					    // Set Payload length, note PayloadLength is a IN/OUT parameter.
 | 
				
			||||||
@@ -219,7 +219,7 @@ ClockDescribeRates (
 | 
				
			|||||||
    Status = ScmiCommandExecute (
 | 
					    Status = ScmiCommandExecute (
 | 
				
			||||||
               &Cmd,
 | 
					               &Cmd,
 | 
				
			||||||
               &PayloadLength,
 | 
					               &PayloadLength,
 | 
				
			||||||
               (UINT32 **)&DescribeRates
 | 
					               (UINT32**)&DescribeRates
 | 
				
			||||||
               );
 | 
					               );
 | 
				
			||||||
    if (EFI_ERROR (Status)) {
 | 
					    if (EFI_ERROR (Status)) {
 | 
				
			||||||
      return Status;
 | 
					      return Status;
 | 
				
			||||||
@@ -329,7 +329,7 @@ ClockRateGet (
 | 
				
			|||||||
  Status = ScmiCommandExecute (
 | 
					  Status = ScmiCommandExecute (
 | 
				
			||||||
             &Cmd,
 | 
					             &Cmd,
 | 
				
			||||||
             &PayloadLength,
 | 
					             &PayloadLength,
 | 
				
			||||||
             (UINT32 **)&ClockRate
 | 
					             (UINT32**)&ClockRate
 | 
				
			||||||
             );
 | 
					             );
 | 
				
			||||||
  if (EFI_ERROR (Status)) {
 | 
					  if (EFI_ERROR (Status)) {
 | 
				
			||||||
    return Status;
 | 
					    return Status;
 | 
				
			||||||
@@ -363,7 +363,7 @@ ClockRateSet (
 | 
				
			|||||||
  SCMI_COMMAND                Cmd;
 | 
					  SCMI_COMMAND                Cmd;
 | 
				
			||||||
  UINT32                      PayloadLength;
 | 
					  UINT32                      PayloadLength;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Status = ScmiCommandGetPayload ((UINT32 **)&ClockRateSetAttributes);
 | 
					  Status = ScmiCommandGetPayload ((UINT32**)&ClockRateSetAttributes);
 | 
				
			||||||
  if (EFI_ERROR (Status)) {
 | 
					  if (EFI_ERROR (Status)) {
 | 
				
			||||||
    return Status;
 | 
					    return Status;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -412,7 +412,7 @@ ClockEnable (
 | 
				
			|||||||
  SCMI_COMMAND                Cmd;
 | 
					  SCMI_COMMAND                Cmd;
 | 
				
			||||||
  UINT32                      PayloadLength;
 | 
					  UINT32                      PayloadLength;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Status = ScmiCommandGetPayload ((UINT32 **)&ClockConfigSetAttributes);
 | 
					  Status = ScmiCommandGetPayload ((UINT32**)&ClockConfigSetAttributes);
 | 
				
			||||||
  if (EFI_ERROR (Status)) {
 | 
					  if (EFI_ERROR (Status)) {
 | 
				
			||||||
    return Status;
 | 
					    return Status;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -444,7 +444,7 @@ STATIC CONST SCMI_CLOCK_PROTOCOL  ScmiClockProtocol = {
 | 
				
			|||||||
  ClockDescribeRates,
 | 
					  ClockDescribeRates,
 | 
				
			||||||
  ClockRateGet,
 | 
					  ClockRateGet,
 | 
				
			||||||
  ClockRateSet
 | 
					  ClockRateSet
 | 
				
			||||||
};
 | 
					 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Instance of the SCMI clock management protocol.
 | 
					// Instance of the SCMI clock management protocol.
 | 
				
			||||||
STATIC CONST SCMI_CLOCK2_PROTOCOL ScmiClock2Protocol = {
 | 
					STATIC CONST SCMI_CLOCK2_PROTOCOL ScmiClock2Protocol = {
 | 
				
			||||||
@@ -456,7 +456,7 @@ STATIC CONST SCMI_CLOCK2_PROTOCOL  ScmiClock2Protocol = {
 | 
				
			|||||||
  (SCMI_CLOCK2_RATE_SET)ClockRateSet,
 | 
					  (SCMI_CLOCK2_RATE_SET)ClockRateSet,
 | 
				
			||||||
  SCMI_CLOCK2_PROTOCOL_VERSION,
 | 
					  SCMI_CLOCK2_PROTOCOL_VERSION,
 | 
				
			||||||
  ClockEnable
 | 
					  ClockEnable
 | 
				
			||||||
};
 | 
					 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Initialize clock management protocol and install protocol on a given handle.
 | 
					/** Initialize clock management protocol and install protocol on a given handle.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -466,7 +466,7 @@ STATIC CONST SCMI_CLOCK2_PROTOCOL  ScmiClock2Protocol = {
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
ScmiClockProtocolInit (
 | 
					ScmiClockProtocolInit (
 | 
				
			||||||
  IN EFI_HANDLE  *Handle
 | 
					  IN EFI_HANDLE* Handle
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return gBS->InstallMultipleProtocolInterfaces (
 | 
					  return gBS->InstallMultipleProtocolInterfaces (
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -72,7 +72,7 @@ ArmScmiDxeEntryPoint (
 | 
				
			|||||||
  Status = gBS->LocateProtocol (
 | 
					  Status = gBS->LocateProtocol (
 | 
				
			||||||
                  &gArmScmiBaseProtocolGuid,
 | 
					                  &gArmScmiBaseProtocolGuid,
 | 
				
			||||||
                  NULL,
 | 
					                  NULL,
 | 
				
			||||||
                  (VOID **)&BaseProtocol
 | 
					                  (VOID**)&BaseProtocol
 | 
				
			||||||
                  );
 | 
					                  );
 | 
				
			||||||
  if (EFI_ERROR (Status)) {
 | 
					  if (EFI_ERROR (Status)) {
 | 
				
			||||||
    ASSERT (FALSE);
 | 
					    ASSERT (FALSE);
 | 
				
			||||||
@@ -88,8 +88,7 @@ ArmScmiDxeEntryPoint (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  // Accept any version between SCMI v1.0 and SCMI v2.0
 | 
					  // Accept any version between SCMI v1.0 and SCMI v2.0
 | 
				
			||||||
  if ((Version < BASE_PROTOCOL_VERSION_V1) ||
 | 
					  if ((Version < BASE_PROTOCOL_VERSION_V1) ||
 | 
				
			||||||
      (Version > BASE_PROTOCOL_VERSION_V2))
 | 
					    (Version > BASE_PROTOCOL_VERSION_V2)) {
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    ASSERT (FALSE);
 | 
					    ASSERT (FALSE);
 | 
				
			||||||
    return EFI_UNSUPPORTED;
 | 
					    return EFI_UNSUPPORTED;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -110,7 +109,7 @@ ArmScmiDxeEntryPoint (
 | 
				
			|||||||
  Status = gBS->AllocatePool (
 | 
					  Status = gBS->AllocatePool (
 | 
				
			||||||
                  EfiBootServicesData,
 | 
					                  EfiBootServicesData,
 | 
				
			||||||
                  SupportedListSize,
 | 
					                  SupportedListSize,
 | 
				
			||||||
                  (VOID **)&SupportedList
 | 
					                  (VOID**)&SupportedList
 | 
				
			||||||
                  );
 | 
					                  );
 | 
				
			||||||
  if (EFI_ERROR (Status)) {
 | 
					  if (EFI_ERROR (Status)) {
 | 
				
			||||||
    ASSERT (FALSE);
 | 
					    ASSERT (FALSE);
 | 
				
			||||||
@@ -131,8 +130,7 @@ ArmScmiDxeEntryPoint (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  // Install supported protocol on ImageHandle.
 | 
					  // Install supported protocol on ImageHandle.
 | 
				
			||||||
  for (ProtocolIndex = 1; ProtocolIndex < ARRAY_SIZE (Protocols);
 | 
					  for (ProtocolIndex = 1; ProtocolIndex < ARRAY_SIZE (Protocols);
 | 
				
			||||||
       ProtocolIndex++)
 | 
					       ProtocolIndex++) {
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    for (Index = 0; Index < NumProtocols; Index++) {
 | 
					    for (Index = 0; Index < NumProtocols; Index++) {
 | 
				
			||||||
      if (Protocols[ProtocolIndex].Id == SupportedList[Index]) {
 | 
					      if (Protocols[ProtocolIndex].Id == SupportedList[Index]) {
 | 
				
			||||||
        Status = Protocols[ProtocolIndex].InitFn (&ImageHandle);
 | 
					        Status = Protocols[ProtocolIndex].InitFn (&ImageHandle);
 | 
				
			||||||
@@ -140,7 +138,6 @@ ArmScmiDxeEntryPoint (
 | 
				
			|||||||
          ASSERT_EFI_ERROR (Status);
 | 
					          ASSERT_EFI_ERROR (Status);
 | 
				
			||||||
          return Status;
 | 
					          return Status;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,6 @@
 | 
				
			|||||||
    http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
 | 
					    http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
 | 
				
			||||||
    DEN0056A_System_Control_and_Management_Interface.pdf
 | 
					    DEN0056A_System_Control_and_Management_Interface.pdf
 | 
				
			||||||
**/
 | 
					**/
 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef SCMI_DXE_H_
 | 
					#ifndef SCMI_DXE_H_
 | 
				
			||||||
#define SCMI_DXE_H_
 | 
					#define SCMI_DXE_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -56,7 +56,7 @@ PerformanceGetAttributes (
 | 
				
			|||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS  Status;
 | 
					  EFI_STATUS  Status;
 | 
				
			||||||
  UINT32      *ReturnValues;
 | 
					  UINT32* ReturnValues;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Status = ScmiGetProtocolAttributes (
 | 
					  Status = ScmiGetProtocolAttributes (
 | 
				
			||||||
             ScmiProtocolIdPerformance,
 | 
					             ScmiProtocolIdPerformance,
 | 
				
			||||||
@@ -160,7 +160,7 @@ PerformanceDescribeLevels (
 | 
				
			|||||||
  EFI_STATUS    Status;
 | 
					  EFI_STATUS    Status;
 | 
				
			||||||
  UINT32        PayloadLength;
 | 
					  UINT32        PayloadLength;
 | 
				
			||||||
  SCMI_COMMAND  Cmd;
 | 
					  SCMI_COMMAND  Cmd;
 | 
				
			||||||
  UINT32        *MessageParams;
 | 
					  UINT32*       MessageParams;
 | 
				
			||||||
  UINT32        LevelIndex;
 | 
					  UINT32        LevelIndex;
 | 
				
			||||||
  UINT32        RequiredSize;
 | 
					  UINT32        RequiredSize;
 | 
				
			||||||
  UINT32        LevelNo;
 | 
					  UINT32        LevelNo;
 | 
				
			||||||
@@ -183,6 +183,7 @@ PerformanceDescribeLevels (
 | 
				
			|||||||
  Cmd.MessageId  = ScmiMessageIdPerformanceDescribeLevels;
 | 
					  Cmd.MessageId  = ScmiMessageIdPerformanceDescribeLevels;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  do {
 | 
					  do {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    *MessageParams = LevelIndex;
 | 
					    *MessageParams = LevelIndex;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Note, PayloadLength is an IN/OUT parameter.
 | 
					    // Note, PayloadLength is an IN/OUT parameter.
 | 
				
			||||||
@@ -191,7 +192,7 @@ PerformanceDescribeLevels (
 | 
				
			|||||||
    Status = ScmiCommandExecute (
 | 
					    Status = ScmiCommandExecute (
 | 
				
			||||||
               &Cmd,
 | 
					               &Cmd,
 | 
				
			||||||
               &PayloadLength,
 | 
					               &PayloadLength,
 | 
				
			||||||
               (UINT32 **)&Levels
 | 
					               (UINT32**)&Levels
 | 
				
			||||||
               );
 | 
					               );
 | 
				
			||||||
    if (EFI_ERROR (Status)) {
 | 
					    if (EFI_ERROR (Status)) {
 | 
				
			||||||
      return Status;
 | 
					      return Status;
 | 
				
			||||||
@@ -218,6 +219,7 @@ PerformanceDescribeLevels (
 | 
				
			|||||||
         sizeof (SCMI_PERFORMANCE_LEVEL)
 | 
					         sizeof (SCMI_PERFORMANCE_LEVEL)
 | 
				
			||||||
         );
 | 
					         );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  } while (ReturnRemainNumLevels != 0);
 | 
					  } while (ReturnRemainNumLevels != 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  *LevelArraySize = RequiredSize;
 | 
					  *LevelArraySize = RequiredSize;
 | 
				
			||||||
@@ -310,7 +312,7 @@ PerformanceLimitsGet (
 | 
				
			|||||||
  Status = ScmiCommandExecute (
 | 
					  Status = ScmiCommandExecute (
 | 
				
			||||||
             &Cmd,
 | 
					             &Cmd,
 | 
				
			||||||
             &PayloadLength,
 | 
					             &PayloadLength,
 | 
				
			||||||
             (UINT32 **)&ReturnValues
 | 
					             (UINT32**)&ReturnValues
 | 
				
			||||||
             );
 | 
					             );
 | 
				
			||||||
  if (EFI_ERROR (Status)) {
 | 
					  if (EFI_ERROR (Status)) {
 | 
				
			||||||
    return Status;
 | 
					    return Status;
 | 
				
			||||||
@@ -437,7 +439,7 @@ STATIC CONST SCMI_PERFORMANCE_PROTOCOL  PerformanceProtocol = {
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
ScmiPerformanceProtocolInit (
 | 
					ScmiPerformanceProtocolInit (
 | 
				
			||||||
  IN EFI_HANDLE  *Handle
 | 
					  IN EFI_HANDLE* Handle
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return gBS->InstallMultipleProtocolInterfaces (
 | 
					  return gBS->InstallMultipleProtocolInterfaces (
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,6 @@
 | 
				
			|||||||
    http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
 | 
					    http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
 | 
				
			||||||
    DEN0056A_System_Control_and_Management_Interface.pdf
 | 
					    DEN0056A_System_Control_and_Management_Interface.pdf
 | 
				
			||||||
**/
 | 
					**/
 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef SCMI_PRIVATE_H_
 | 
					#ifndef SCMI_PRIVATE_H_
 | 
				
			||||||
#define SCMI_PRIVATE_H_
 | 
					#define SCMI_PRIVATE_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -90,7 +89,7 @@ typedef struct {
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
ScmiCommandGetPayload (
 | 
					ScmiCommandGetPayload (
 | 
				
			||||||
  OUT UINT32  **Payload
 | 
					  OUT UINT32** Payload
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Execute a SCMI command and receive a response.
 | 
					/** Execute a SCMI command and receive a response.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -52,11 +52,9 @@ PageAttributeToGcdAttribute (
 | 
				
			|||||||
    GcdAttributes = EFI_MEMORY_WB;
 | 
					    GcdAttributes = EFI_MEMORY_WB;
 | 
				
			||||||
    break;
 | 
					    break;
 | 
				
			||||||
  default:
 | 
					  default:
 | 
				
			||||||
      DEBUG ((
 | 
					    DEBUG ((DEBUG_ERROR,
 | 
				
			||||||
        DEBUG_ERROR,
 | 
					 | 
				
			||||||
      "PageAttributeToGcdAttribute: PageAttributes:0x%lX not supported.\n",
 | 
					      "PageAttributeToGcdAttribute: PageAttributes:0x%lX not supported.\n",
 | 
				
			||||||
        PageAttributes
 | 
					      PageAttributes));
 | 
				
			||||||
        ));
 | 
					 | 
				
			||||||
    ASSERT (0);
 | 
					    ASSERT (0);
 | 
				
			||||||
    // The Global Coherency Domain (GCD) value is defined as a bit set.
 | 
					    // The Global Coherency Domain (GCD) value is defined as a bit set.
 | 
				
			||||||
    // Returning 0 means no attribute has been set.
 | 
					    // Returning 0 means no attribute has been set.
 | 
				
			||||||
@@ -65,8 +63,7 @@ PageAttributeToGcdAttribute (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  // Determine protection attributes
 | 
					  // Determine protection attributes
 | 
				
			||||||
  if (((PageAttributes & TT_AP_MASK) == TT_AP_NO_RO) ||
 | 
					  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
 | 
					    // Read only cases map to write-protect
 | 
				
			||||||
    GcdAttributes |= EFI_MEMORY_RO;
 | 
					    GcdAttributes |= EFI_MEMORY_RO;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -91,11 +88,11 @@ GetFirstPageAttribute (
 | 
				
			|||||||
  // Get the first entry of the table
 | 
					  // Get the first entry of the table
 | 
				
			||||||
  FirstEntry = *FirstLevelTableAddress;
 | 
					  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
 | 
					    // Only valid for Levels 0, 1 and 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Get the attribute of the subsequent table
 | 
					    // Get the attribute of the subsequent table
 | 
				
			||||||
    return GetFirstPageAttribute ((UINT64 *)(FirstEntry & TT_ADDRESS_MASK_DESCRIPTION_TABLE), TableLevel + 1);
 | 
					    return GetFirstPageAttribute ((UINT64*)(FirstEntry & TT_ADDRESS_MASK_DESCRIPTION_TABLE), TableLevel + 1);
 | 
				
			||||||
  } else if (((FirstEntry & TT_TYPE_MASK) == TT_TYPE_BLOCK_ENTRY) ||
 | 
					  } else if (((FirstEntry & TT_TYPE_MASK) == TT_TYPE_BLOCK_ENTRY) ||
 | 
				
			||||||
             ((TableLevel == 3) && ((FirstEntry & TT_TYPE_MASK) == TT_TYPE_BLOCK_ENTRY_LEVEL3)))
 | 
					             ((TableLevel == 3) && ((FirstEntry & TT_TYPE_MASK) == TT_TYPE_BLOCK_ENTRY_LEVEL3)))
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
@@ -141,22 +138,18 @@ GetNextEntryAttribute (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // If Entry is a Table Descriptor type entry then go through the sub-level table
 | 
					    // If Entry is a Table Descriptor type entry then go through the sub-level table
 | 
				
			||||||
    if ((EntryType == TT_TYPE_BLOCK_ENTRY) ||
 | 
					    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) || (EntryAttribute != *PrevEntryAttribute)) {
 | 
				
			||||||
        if (*PrevEntryAttribute != INVALID_ENTRY) {
 | 
					        if (*PrevEntryAttribute != INVALID_ENTRY) {
 | 
				
			||||||
          // Update GCD with the last region
 | 
					          // Update GCD with the last region
 | 
				
			||||||
          SetGcdMemorySpaceAttributes (
 | 
					          SetGcdMemorySpaceAttributes (MemorySpaceMap, NumberOfDescriptors,
 | 
				
			||||||
            MemorySpaceMap,
 | 
					 | 
				
			||||||
            NumberOfDescriptors,
 | 
					 | 
				
			||||||
              *StartGcdRegion,
 | 
					              *StartGcdRegion,
 | 
				
			||||||
            (BaseAddress + (Index * TT_ADDRESS_AT_LEVEL (TableLevel))) - *StartGcdRegion,
 | 
					              (BaseAddress + (Index * TT_ADDRESS_AT_LEVEL(TableLevel))) - *StartGcdRegion,
 | 
				
			||||||
            PageAttributeToGcdAttribute (*PrevEntryAttribute)
 | 
					              PageAttributeToGcdAttribute (*PrevEntryAttribute));
 | 
				
			||||||
            );
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Start of the new region
 | 
					        // Start of the new region
 | 
				
			||||||
        *StartGcdRegion     = BaseAddress + (Index * TT_ADDRESS_AT_LEVEL (TableLevel));
 | 
					        *StartGcdRegion = BaseAddress + (Index * TT_ADDRESS_AT_LEVEL(TableLevel));
 | 
				
			||||||
        *PrevEntryAttribute = EntryAttribute;
 | 
					        *PrevEntryAttribute = EntryAttribute;
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        continue;
 | 
					        continue;
 | 
				
			||||||
@@ -166,27 +159,20 @@ GetNextEntryAttribute (
 | 
				
			|||||||
      ASSERT (TableLevel < 3);
 | 
					      ASSERT (TableLevel < 3);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      // Increase the level number and scan the sub-level table
 | 
					      // Increase the level number and scan the sub-level table
 | 
				
			||||||
      GetNextEntryAttribute (
 | 
					      GetNextEntryAttribute ((UINT64*)(Entry & TT_ADDRESS_MASK_DESCRIPTION_TABLE),
 | 
				
			||||||
        (UINT64 *)(Entry & TT_ADDRESS_MASK_DESCRIPTION_TABLE),
 | 
					                             TT_ENTRY_COUNT, TableLevel + 1,
 | 
				
			||||||
        TT_ENTRY_COUNT,
 | 
					                             (BaseAddress + (Index * TT_ADDRESS_AT_LEVEL(TableLevel))),
 | 
				
			||||||
        TableLevel + 1,
 | 
					                             PrevEntryAttribute, StartGcdRegion);
 | 
				
			||||||
        (BaseAddress + (Index * TT_ADDRESS_AT_LEVEL (TableLevel))),
 | 
					 | 
				
			||||||
        PrevEntryAttribute,
 | 
					 | 
				
			||||||
        StartGcdRegion
 | 
					 | 
				
			||||||
        );
 | 
					 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      if (*PrevEntryAttribute != INVALID_ENTRY) {
 | 
					      if (*PrevEntryAttribute != INVALID_ENTRY) {
 | 
				
			||||||
        // Update GCD with the last region
 | 
					        // Update GCD with the last region
 | 
				
			||||||
        SetGcdMemorySpaceAttributes (
 | 
					        SetGcdMemorySpaceAttributes (MemorySpaceMap, NumberOfDescriptors,
 | 
				
			||||||
          MemorySpaceMap,
 | 
					 | 
				
			||||||
          NumberOfDescriptors,
 | 
					 | 
				
			||||||
            *StartGcdRegion,
 | 
					            *StartGcdRegion,
 | 
				
			||||||
          (BaseAddress + (Index * TT_ADDRESS_AT_LEVEL (TableLevel))) - *StartGcdRegion,
 | 
					            (BaseAddress + (Index * TT_ADDRESS_AT_LEVEL(TableLevel))) - *StartGcdRegion,
 | 
				
			||||||
          PageAttributeToGcdAttribute (*PrevEntryAttribute)
 | 
					            PageAttributeToGcdAttribute (*PrevEntryAttribute));
 | 
				
			||||||
          );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Start of the new region
 | 
					        // Start of the new region
 | 
				
			||||||
        *StartGcdRegion     = BaseAddress + (Index * TT_ADDRESS_AT_LEVEL (TableLevel));
 | 
					        *StartGcdRegion = BaseAddress + (Index * TT_ADDRESS_AT_LEVEL(TableLevel));
 | 
				
			||||||
        *PrevEntryAttribute = INVALID_ENTRY;
 | 
					        *PrevEntryAttribute = INVALID_ENTRY;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -194,7 +180,7 @@ GetNextEntryAttribute (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  FreePool (MemorySpaceMap);
 | 
					  FreePool (MemorySpaceMap);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return BaseAddress + (EntryCount * TT_ADDRESS_AT_LEVEL (TableLevel));
 | 
					  return BaseAddress + (EntryCount * TT_ADDRESS_AT_LEVEL(TableLevel));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
@@ -231,7 +217,7 @@ SyncCacheConfig (
 | 
				
			|||||||
  // with a way for GCD to query the CPU Arch. driver of the existing memory space attributes instead.
 | 
					  // with a way for GCD to query the CPU Arch. driver of the existing memory space attributes instead.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Obtain page table base
 | 
					  // Obtain page table base
 | 
				
			||||||
  FirstLevelTableAddress = (UINT64 *)(ArmGetTTBR0BaseAddress ());
 | 
					  FirstLevelTableAddress = (UINT64*)(ArmGetTTBR0BaseAddress ());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Get Translation Control Register value
 | 
					  // Get Translation Control Register value
 | 
				
			||||||
  Tcr = ArmGetTCR ();
 | 
					  Tcr = ArmGetTCR ();
 | 
				
			||||||
@@ -246,24 +232,17 @@ SyncCacheConfig (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  // We scan from the start of the memory map (ie: at the address 0x0)
 | 
					  // We scan from the start of the memory map (ie: at the address 0x0)
 | 
				
			||||||
  BaseAddressGcdRegion = 0x0;
 | 
					  BaseAddressGcdRegion = 0x0;
 | 
				
			||||||
  EndAddressGcdRegion  = GetNextEntryAttribute (
 | 
					  EndAddressGcdRegion = GetNextEntryAttribute (FirstLevelTableAddress,
 | 
				
			||||||
                           FirstLevelTableAddress,
 | 
					                                               TableCount, TableLevel,
 | 
				
			||||||
                           TableCount,
 | 
					 | 
				
			||||||
                           TableLevel,
 | 
					 | 
				
			||||||
                                               BaseAddressGcdRegion,
 | 
					                                               BaseAddressGcdRegion,
 | 
				
			||||||
                           &PageAttribute,
 | 
					                                               &PageAttribute, &BaseAddressGcdRegion);
 | 
				
			||||||
                           &BaseAddressGcdRegion
 | 
					 | 
				
			||||||
                           );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Update GCD with the last region if valid
 | 
					  // Update GCD with the last region if valid
 | 
				
			||||||
  if (PageAttribute != INVALID_ENTRY) {
 | 
					  if (PageAttribute != INVALID_ENTRY) {
 | 
				
			||||||
    SetGcdMemorySpaceAttributes (
 | 
					    SetGcdMemorySpaceAttributes (MemorySpaceMap, NumberOfDescriptors,
 | 
				
			||||||
      MemorySpaceMap,
 | 
					 | 
				
			||||||
      NumberOfDescriptors,
 | 
					 | 
				
			||||||
        BaseAddressGcdRegion,
 | 
					        BaseAddressGcdRegion,
 | 
				
			||||||
        EndAddressGcdRegion - BaseAddressGcdRegion,
 | 
					        EndAddressGcdRegion - BaseAddressGcdRegion,
 | 
				
			||||||
      PageAttributeToGcdAttribute (PageAttribute)
 | 
					        PageAttributeToGcdAttribute (PageAttribute));
 | 
				
			||||||
      );
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  FreePool (MemorySpaceMap);
 | 
					  FreePool (MemorySpaceMap);
 | 
				
			||||||
@@ -285,7 +264,6 @@ EfiAttributeToArmAttribute (
 | 
				
			|||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      ArmAttributes = TT_ATTR_INDX_DEVICE_MEMORY | TT_UXN_MASK | TT_PXN_MASK;
 | 
					      ArmAttributes = TT_ATTR_INDX_DEVICE_MEMORY | TT_UXN_MASK | TT_PXN_MASK;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    break;
 | 
					    break;
 | 
				
			||||||
  case EFI_MEMORY_WC:
 | 
					  case EFI_MEMORY_WC:
 | 
				
			||||||
    ArmAttributes = TT_ATTR_INDX_MEMORY_NON_CACHEABLE;
 | 
					    ArmAttributes = TT_ATTR_INDX_MEMORY_NON_CACHEABLE;
 | 
				
			||||||
@@ -305,7 +283,7 @@ EfiAttributeToArmAttribute (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  // Determine protection attributes
 | 
					  // Determine protection attributes
 | 
				
			||||||
  if ((EfiAttributes & EFI_MEMORY_RO) != 0) {
 | 
					  if ((EfiAttributes & EFI_MEMORY_RO) != 0) {
 | 
				
			||||||
    ArmAttributes |= TT_AP_NO_RO;
 | 
					    ArmAttributes |= TT_AP_RO_RO;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Process eXecute Never attribute
 | 
					  // Process eXecute Never attribute
 | 
				
			||||||
@@ -341,25 +319,22 @@ GetMemoryRegionRec (
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Find the block entry linked to the Base Address
 | 
					  // Find the block entry linked to the Base Address
 | 
				
			||||||
  BlockEntry = (UINT64 *)TT_GET_ENTRY_FOR_ADDRESS (TranslationTable, TableLevel, *BaseAddress);
 | 
					  BlockEntry = (UINT64*)TT_GET_ENTRY_FOR_ADDRESS (TranslationTable, TableLevel, *BaseAddress);
 | 
				
			||||||
  EntryType = *BlockEntry & TT_TYPE_MASK;
 | 
					  EntryType = *BlockEntry & TT_TYPE_MASK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if ((TableLevel < 3) && (EntryType == TT_TYPE_TABLE_ENTRY)) {
 | 
					  if ((TableLevel < 3) && (EntryType == TT_TYPE_TABLE_ENTRY)) {
 | 
				
			||||||
    NextTranslationTable = (UINT64 *)(*BlockEntry & TT_ADDRESS_MASK_DESCRIPTION_TABLE);
 | 
					    NextTranslationTable = (UINT64*)(*BlockEntry & TT_ADDRESS_MASK_DESCRIPTION_TABLE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // The entry is a page table, so we go to the next level
 | 
					    // The entry is a page table, so we go to the next level
 | 
				
			||||||
    Status = GetMemoryRegionRec (
 | 
					    Status = GetMemoryRegionRec (
 | 
				
			||||||
        NextTranslationTable, // Address of the next level page table
 | 
					        NextTranslationTable, // Address of the next level page table
 | 
				
			||||||
        TableLevel + 1, // Next Page Table level
 | 
					        TableLevel + 1, // Next Page Table level
 | 
				
			||||||
               (UINTN *)TT_LAST_BLOCK_ADDRESS (NextTranslationTable, TT_ENTRY_COUNT),
 | 
					        (UINTN*)TT_LAST_BLOCK_ADDRESS(NextTranslationTable, TT_ENTRY_COUNT),
 | 
				
			||||||
               BaseAddress,
 | 
					        BaseAddress, RegionLength, RegionAttributes);
 | 
				
			||||||
               RegionLength,
 | 
					 | 
				
			||||||
               RegionAttributes
 | 
					 | 
				
			||||||
               );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // In case of 'Success', it means the end of the block region has been found into the upper
 | 
					    // In case of 'Success', it means the end of the block region has been found into the upper
 | 
				
			||||||
    // level translation table
 | 
					    // level translation table
 | 
				
			||||||
    if (!EFI_ERROR (Status)) {
 | 
					    if (!EFI_ERROR(Status)) {
 | 
				
			||||||
      return EFI_SUCCESS;
 | 
					      return EFI_SUCCESS;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -368,7 +343,7 @@ GetMemoryRegionRec (
 | 
				
			|||||||
  } else if (EntryType == BlockEntryType) {
 | 
					  } else if (EntryType == BlockEntryType) {
 | 
				
			||||||
    // We have found the BlockEntry attached to the address. We save its start address (the start
 | 
					    // We have found the BlockEntry attached to the address. We save its start address (the start
 | 
				
			||||||
    // address might be before the 'BaseAddress') and attributes
 | 
					    // address might be before the 'BaseAddress') and attributes
 | 
				
			||||||
    *BaseAddress      = *BaseAddress & ~(TT_ADDRESS_AT_LEVEL (TableLevel) - 1);
 | 
					    *BaseAddress      = *BaseAddress & ~(TT_ADDRESS_AT_LEVEL(TableLevel) - 1);
 | 
				
			||||||
    *RegionLength     = 0;
 | 
					    *RegionLength     = 0;
 | 
				
			||||||
    *RegionAttributes = *BlockEntry & TT_ATTRIBUTES_MASK;
 | 
					    *RegionAttributes = *BlockEntry & TT_ATTRIBUTES_MASK;
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
@@ -378,12 +353,11 @@ GetMemoryRegionRec (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  while (BlockEntry <= LastBlockEntry) {
 | 
					  while (BlockEntry <= LastBlockEntry) {
 | 
				
			||||||
    if ((*BlockEntry & TT_ATTRIBUTES_MASK) == *RegionAttributes) {
 | 
					    if ((*BlockEntry & TT_ATTRIBUTES_MASK) == *RegionAttributes) {
 | 
				
			||||||
      *RegionLength = *RegionLength + TT_BLOCK_ENTRY_SIZE_AT_LEVEL (TableLevel);
 | 
					      *RegionLength = *RegionLength + TT_BLOCK_ENTRY_SIZE_AT_LEVEL(TableLevel);
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      // In case we have found the end of the region we return success
 | 
					      // In case we have found the end of the region we return success
 | 
				
			||||||
      return EFI_SUCCESS;
 | 
					      return EFI_SUCCESS;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    BlockEntry++;
 | 
					    BlockEntry++;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -414,14 +388,9 @@ GetMemoryRegion (
 | 
				
			|||||||
  // Get the Table info from T0SZ
 | 
					  // Get the Table info from T0SZ
 | 
				
			||||||
  GetRootTranslationTableInfo (T0SZ, &TableLevel, &EntryCount);
 | 
					  GetRootTranslationTableInfo (T0SZ, &TableLevel, &EntryCount);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Status = GetMemoryRegionRec (
 | 
					  Status = GetMemoryRegionRec (TranslationTable, TableLevel,
 | 
				
			||||||
             TranslationTable,
 | 
					      (UINTN*)TT_LAST_BLOCK_ADDRESS(TranslationTable, EntryCount),
 | 
				
			||||||
             TableLevel,
 | 
					      BaseAddress, RegionLength, RegionAttributes);
 | 
				
			||||||
             (UINTN *)TT_LAST_BLOCK_ADDRESS (TranslationTable, EntryCount),
 | 
					 | 
				
			||||||
             BaseAddress,
 | 
					 | 
				
			||||||
             RegionLength,
 | 
					 | 
				
			||||||
             RegionAttributes
 | 
					 | 
				
			||||||
             );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // If the region continues up to the end of the root table then GetMemoryRegionRec()
 | 
					  // If the region continues up to the end of the root table then GetMemoryRegionRec()
 | 
				
			||||||
  // will return EFI_NOT_FOUND
 | 
					  // will return EFI_NOT_FOUND
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,7 +22,7 @@ SectionToGcdAttributes (
 | 
				
			|||||||
  *GcdAttributes = 0;
 | 
					  *GcdAttributes = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // determine cacheability attributes
 | 
					  // determine cacheability attributes
 | 
				
			||||||
  switch (SectionAttributes & TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK) {
 | 
					  switch(SectionAttributes & TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK) {
 | 
				
			||||||
    case TT_DESCRIPTOR_SECTION_CACHE_POLICY_STRONGLY_ORDERED:
 | 
					    case TT_DESCRIPTOR_SECTION_CACHE_POLICY_STRONGLY_ORDERED:
 | 
				
			||||||
      *GcdAttributes |= EFI_MEMORY_UC;
 | 
					      *GcdAttributes |= EFI_MEMORY_UC;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
@@ -49,9 +49,9 @@ SectionToGcdAttributes (
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // determine protection attributes
 | 
					  // determine protection attributes
 | 
				
			||||||
  switch (SectionAttributes & TT_DESCRIPTOR_SECTION_AP_MASK) {
 | 
					  switch(SectionAttributes & TT_DESCRIPTOR_SECTION_AP_MASK) {
 | 
				
			||||||
    case TT_DESCRIPTOR_SECTION_AP_NO_NO: // no read, no write
 | 
					    case TT_DESCRIPTOR_SECTION_AP_NO_NO: // no read, no write
 | 
				
			||||||
      // *GcdAttributes |= EFI_MEMORY_RO | EFI_MEMORY_RP;
 | 
					      //*GcdAttributes |= EFI_MEMORY_RO | EFI_MEMORY_RP;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case TT_DESCRIPTOR_SECTION_AP_RW_NO:
 | 
					    case TT_DESCRIPTOR_SECTION_AP_RW_NO:
 | 
				
			||||||
@@ -86,7 +86,7 @@ PageToGcdAttributes (
 | 
				
			|||||||
  *GcdAttributes = 0;
 | 
					  *GcdAttributes = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // determine cacheability attributes
 | 
					  // determine cacheability attributes
 | 
				
			||||||
  switch (PageAttributes & TT_DESCRIPTOR_PAGE_CACHE_POLICY_MASK) {
 | 
					  switch(PageAttributes & TT_DESCRIPTOR_PAGE_CACHE_POLICY_MASK) {
 | 
				
			||||||
    case TT_DESCRIPTOR_PAGE_CACHE_POLICY_STRONGLY_ORDERED:
 | 
					    case TT_DESCRIPTOR_PAGE_CACHE_POLICY_STRONGLY_ORDERED:
 | 
				
			||||||
      *GcdAttributes |= EFI_MEMORY_UC;
 | 
					      *GcdAttributes |= EFI_MEMORY_UC;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
@@ -113,9 +113,9 @@ PageToGcdAttributes (
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // determine protection attributes
 | 
					  // determine protection attributes
 | 
				
			||||||
  switch (PageAttributes & TT_DESCRIPTOR_PAGE_AP_MASK) {
 | 
					  switch(PageAttributes & TT_DESCRIPTOR_PAGE_AP_MASK) {
 | 
				
			||||||
    case TT_DESCRIPTOR_PAGE_AP_NO_NO: // no read, no write
 | 
					    case TT_DESCRIPTOR_PAGE_AP_NO_NO: // no read, no write
 | 
				
			||||||
      // *GcdAttributes |= EFI_MEMORY_RO | EFI_MEMORY_RP;
 | 
					      //*GcdAttributes |= EFI_MEMORY_RO | EFI_MEMORY_RP;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case TT_DESCRIPTOR_PAGE_AP_RW_NO:
 | 
					    case TT_DESCRIPTOR_PAGE_AP_RW_NO:
 | 
				
			||||||
@@ -161,17 +161,17 @@ SyncCacheConfigPage (
 | 
				
			|||||||
  UINT64                              GcdAttributes;
 | 
					  UINT64                              GcdAttributes;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Get the Base Address from FirstLevelDescriptor;
 | 
					  // Get the Base Address from FirstLevelDescriptor;
 | 
				
			||||||
  BaseAddress = TT_DESCRIPTOR_PAGE_BASE_ADDRESS (SectionIndex << TT_DESCRIPTOR_SECTION_BASE_SHIFT);
 | 
					  BaseAddress = TT_DESCRIPTOR_PAGE_BASE_ADDRESS(SectionIndex << TT_DESCRIPTOR_SECTION_BASE_SHIFT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Convert SectionAttributes into PageAttributes
 | 
					  // Convert SectionAttributes into PageAttributes
 | 
				
			||||||
  NextPageAttributes =
 | 
					  NextPageAttributes =
 | 
				
			||||||
    TT_DESCRIPTOR_CONVERT_TO_PAGE_CACHE_POLICY (*NextSectionAttributes, 0) |
 | 
					      TT_DESCRIPTOR_CONVERT_TO_PAGE_CACHE_POLICY(*NextSectionAttributes,0) |
 | 
				
			||||||
    TT_DESCRIPTOR_CONVERT_TO_PAGE_AP (*NextSectionAttributes);
 | 
					      TT_DESCRIPTOR_CONVERT_TO_PAGE_AP(*NextSectionAttributes);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // obtain page table base
 | 
					  // obtain page table base
 | 
				
			||||||
  SecondLevelTable = (ARM_PAGE_TABLE_ENTRY *)(FirstLevelDescriptor & TT_DESCRIPTOR_SECTION_PAGETABLE_ADDRESS_MASK);
 | 
					  SecondLevelTable = (ARM_PAGE_TABLE_ENTRY *)(FirstLevelDescriptor & TT_DESCRIPTOR_SECTION_PAGETABLE_ADDRESS_MASK);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for (i = 0; i < TRANSLATION_TABLE_PAGE_COUNT; i++) {
 | 
					  for (i=0; i < TRANSLATION_TABLE_PAGE_COUNT; i++) {
 | 
				
			||||||
    if ((SecondLevelTable[i] & TT_DESCRIPTOR_PAGE_TYPE_MASK) == TT_DESCRIPTOR_PAGE_TYPE_PAGE) {
 | 
					    if ((SecondLevelTable[i] & TT_DESCRIPTOR_PAGE_TYPE_MASK) == TT_DESCRIPTOR_PAGE_TYPE_PAGE) {
 | 
				
			||||||
      // extract attributes (cacheability and permissions)
 | 
					      // extract attributes (cacheability and permissions)
 | 
				
			||||||
      PageAttributes = SecondLevelTable[i] & (TT_DESCRIPTOR_PAGE_CACHE_POLICY_MASK | TT_DESCRIPTOR_PAGE_AP_MASK);
 | 
					      PageAttributes = SecondLevelTable[i] & (TT_DESCRIPTOR_PAGE_CACHE_POLICY_MASK | TT_DESCRIPTOR_PAGE_AP_MASK);
 | 
				
			||||||
@@ -206,14 +206,13 @@ SyncCacheConfigPage (
 | 
				
			|||||||
      *NextRegionBase = BaseAddress | (i << TT_DESCRIPTOR_PAGE_BASE_SHIFT);
 | 
					      *NextRegionBase = BaseAddress | (i << TT_DESCRIPTOR_PAGE_BASE_SHIFT);
 | 
				
			||||||
      NextPageAttributes = 0;
 | 
					      NextPageAttributes = 0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    *NextRegionLength += TT_DESCRIPTOR_PAGE_SIZE;
 | 
					    *NextRegionLength += TT_DESCRIPTOR_PAGE_SIZE;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Convert back PageAttributes into SectionAttributes
 | 
					  // Convert back PageAttributes into SectionAttributes
 | 
				
			||||||
  *NextSectionAttributes =
 | 
					  *NextSectionAttributes =
 | 
				
			||||||
    TT_DESCRIPTOR_CONVERT_TO_SECTION_CACHE_POLICY (NextPageAttributes, 0) |
 | 
					      TT_DESCRIPTOR_CONVERT_TO_SECTION_CACHE_POLICY(NextPageAttributes,0) |
 | 
				
			||||||
    TT_DESCRIPTOR_CONVERT_TO_SECTION_AP (NextPageAttributes);
 | 
					      TT_DESCRIPTOR_CONVERT_TO_SECTION_AP(NextPageAttributes);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return EFI_SUCCESS;
 | 
					  return EFI_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -234,6 +233,7 @@ SyncCacheConfig (
 | 
				
			|||||||
  UINTN                               NumberOfDescriptors;
 | 
					  UINTN                               NumberOfDescriptors;
 | 
				
			||||||
  EFI_GCD_MEMORY_SPACE_DESCRIPTOR     *MemorySpaceMap;
 | 
					  EFI_GCD_MEMORY_SPACE_DESCRIPTOR     *MemorySpaceMap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  DEBUG ((DEBUG_PAGE, "SyncCacheConfig()\n"));
 | 
					  DEBUG ((DEBUG_PAGE, "SyncCacheConfig()\n"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // This code assumes MMU is enabled and filed with section translations
 | 
					  // This code assumes MMU is enabled and filed with section translations
 | 
				
			||||||
@@ -246,6 +246,7 @@ SyncCacheConfig (
 | 
				
			|||||||
  Status = gDS->GetMemorySpaceMap (&NumberOfDescriptors, &MemorySpaceMap);
 | 
					  Status = gDS->GetMemorySpaceMap (&NumberOfDescriptors, &MemorySpaceMap);
 | 
				
			||||||
  ASSERT_EFI_ERROR (Status);
 | 
					  ASSERT_EFI_ERROR (Status);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // The GCD implementation maintains its own copy of the state of memory space attributes.  GCD needs
 | 
					  // 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
 | 
					  // 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
 | 
					  // GetMemoryAttributes function for GCD to get this so we must resort to calling GCD (as if we were
 | 
				
			||||||
@@ -260,7 +261,7 @@ SyncCacheConfig (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  // iterate through each 1MB descriptor
 | 
					  // iterate through each 1MB descriptor
 | 
				
			||||||
  NextRegionBase = NextRegionLength = 0;
 | 
					  NextRegionBase = NextRegionLength = 0;
 | 
				
			||||||
  for (i = 0; i < TRANSLATION_TABLE_SECTION_COUNT; i++) {
 | 
					  for (i=0; i < TRANSLATION_TABLE_SECTION_COUNT; i++) {
 | 
				
			||||||
    if ((FirstLevelTable[i] & TT_DESCRIPTOR_SECTION_TYPE_MASK) == TT_DESCRIPTOR_SECTION_TYPE_SECTION) {
 | 
					    if ((FirstLevelTable[i] & TT_DESCRIPTOR_SECTION_TYPE_MASK) == TT_DESCRIPTOR_SECTION_TYPE_SECTION) {
 | 
				
			||||||
      // extract attributes (cacheability and permissions)
 | 
					      // extract attributes (cacheability and permissions)
 | 
				
			||||||
      SectionAttributes = FirstLevelTable[i] & (TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK | TT_DESCRIPTOR_SECTION_AP_MASK);
 | 
					      SectionAttributes = FirstLevelTable[i] & (TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK | TT_DESCRIPTOR_SECTION_AP_MASK);
 | 
				
			||||||
@@ -268,7 +269,7 @@ SyncCacheConfig (
 | 
				
			|||||||
      if (NextSectionAttributes == 0) {
 | 
					      if (NextSectionAttributes == 0) {
 | 
				
			||||||
        // start on a new region
 | 
					        // start on a new region
 | 
				
			||||||
        NextRegionLength = 0;
 | 
					        NextRegionLength = 0;
 | 
				
			||||||
        NextRegionBase        = TT_DESCRIPTOR_SECTION_BASE_ADDRESS (i << TT_DESCRIPTOR_SECTION_BASE_SHIFT);
 | 
					        NextRegionBase = TT_DESCRIPTOR_SECTION_BASE_ADDRESS(i << TT_DESCRIPTOR_SECTION_BASE_SHIFT);
 | 
				
			||||||
        NextSectionAttributes = SectionAttributes;
 | 
					        NextSectionAttributes = SectionAttributes;
 | 
				
			||||||
      } else if (SectionAttributes != NextSectionAttributes) {
 | 
					      } else if (SectionAttributes != NextSectionAttributes) {
 | 
				
			||||||
        // Convert Section Attributes into GCD Attributes
 | 
					        // Convert Section Attributes into GCD Attributes
 | 
				
			||||||
@@ -280,26 +281,20 @@ SyncCacheConfig (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        // start on a new region
 | 
					        // start on a new region
 | 
				
			||||||
        NextRegionLength = 0;
 | 
					        NextRegionLength = 0;
 | 
				
			||||||
        NextRegionBase        = TT_DESCRIPTOR_SECTION_BASE_ADDRESS (i << TT_DESCRIPTOR_SECTION_BASE_SHIFT);
 | 
					        NextRegionBase = TT_DESCRIPTOR_SECTION_BASE_ADDRESS(i << TT_DESCRIPTOR_SECTION_BASE_SHIFT);
 | 
				
			||||||
        NextSectionAttributes = SectionAttributes;
 | 
					        NextSectionAttributes = SectionAttributes;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					 | 
				
			||||||
      NextRegionLength += TT_DESCRIPTOR_SECTION_SIZE;
 | 
					      NextRegionLength += TT_DESCRIPTOR_SECTION_SIZE;
 | 
				
			||||||
    } else if (TT_DESCRIPTOR_SECTION_TYPE_IS_PAGE_TABLE (FirstLevelTable[i])) {
 | 
					    } 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
 | 
					      // In this case any bits set in the 'NextSectionAttributes' are garbage and were set from
 | 
				
			||||||
      // bits that are actually part of the pagetable address.  We clear it out to zero so that
 | 
					      // bits that are actually part of the pagetable address.  We clear it out to zero so that
 | 
				
			||||||
      // the SyncCacheConfigPage will use the page attributes instead of trying to convert the
 | 
					      // the SyncCacheConfigPage will use the page attributes instead of trying to convert the
 | 
				
			||||||
      // section attributes into page attributes
 | 
					      // section attributes into page attributes
 | 
				
			||||||
      NextSectionAttributes = 0;
 | 
					      NextSectionAttributes = 0;
 | 
				
			||||||
      Status = SyncCacheConfigPage (
 | 
					      Status = SyncCacheConfigPage (
 | 
				
			||||||
                                i,
 | 
					          i,FirstLevelTable[i],
 | 
				
			||||||
                                FirstLevelTable[i],
 | 
					          NumberOfDescriptors, MemorySpaceMap,
 | 
				
			||||||
                                NumberOfDescriptors,
 | 
					          &NextRegionBase,&NextRegionLength,&NextSectionAttributes);
 | 
				
			||||||
                                MemorySpaceMap,
 | 
					 | 
				
			||||||
                                &NextRegionBase,
 | 
					 | 
				
			||||||
                                &NextRegionLength,
 | 
					 | 
				
			||||||
                                &NextSectionAttributes
 | 
					 | 
				
			||||||
                                );
 | 
					 | 
				
			||||||
      ASSERT_EFI_ERROR (Status);
 | 
					      ASSERT_EFI_ERROR (Status);
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      // We do not support yet 16MB sections
 | 
					      // We do not support yet 16MB sections
 | 
				
			||||||
@@ -315,10 +310,9 @@ SyncCacheConfig (
 | 
				
			|||||||
        SetGcdMemorySpaceAttributes (MemorySpaceMap, NumberOfDescriptors, NextRegionBase, NextRegionLength, GcdAttributes);
 | 
					        SetGcdMemorySpaceAttributes (MemorySpaceMap, NumberOfDescriptors, NextRegionBase, NextRegionLength, GcdAttributes);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        NextRegionLength = 0;
 | 
					        NextRegionLength = 0;
 | 
				
			||||||
        NextRegionBase        = TT_DESCRIPTOR_SECTION_BASE_ADDRESS (i << TT_DESCRIPTOR_SECTION_BASE_SHIFT);
 | 
					        NextRegionBase = TT_DESCRIPTOR_SECTION_BASE_ADDRESS(i << TT_DESCRIPTOR_SECTION_BASE_SHIFT);
 | 
				
			||||||
        NextSectionAttributes = 0;
 | 
					        NextSectionAttributes = 0;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					 | 
				
			||||||
      NextRegionLength += TT_DESCRIPTOR_SECTION_SIZE;
 | 
					      NextRegionLength += TT_DESCRIPTOR_SECTION_SIZE;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  } // section entry loop
 | 
					  } // section entry loop
 | 
				
			||||||
@@ -406,7 +400,7 @@ GetMemoryRegionPage (
 | 
				
			|||||||
  ASSERT (TableIndex < TRANSLATION_TABLE_PAGE_COUNT);
 | 
					  ASSERT (TableIndex < TRANSLATION_TABLE_PAGE_COUNT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Go through the page table to find the end of the section
 | 
					  // Go through the page table to find the end of the section
 | 
				
			||||||
  for ( ; TableIndex < TRANSLATION_TABLE_PAGE_COUNT; TableIndex++) {
 | 
					  for (; TableIndex < TRANSLATION_TABLE_PAGE_COUNT; TableIndex++) {
 | 
				
			||||||
    // Get the section at the given index
 | 
					    // Get the section at the given index
 | 
				
			||||||
    PageDescriptor = PageTable[TableIndex];
 | 
					    PageDescriptor = PageTable[TableIndex];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -422,7 +416,7 @@ GetMemoryRegionPage (
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      // We do not support Large Page yet. We return EFI_SUCCESS that means end of the region.
 | 
					      // We do not support Large Page yet. We return EFI_SUCCESS that means end of the region.
 | 
				
			||||||
      ASSERT (0);
 | 
					      ASSERT(0);
 | 
				
			||||||
      return EFI_SUCCESS;
 | 
					      return EFI_SUCCESS;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -472,7 +466,7 @@ GetMemoryRegion (
 | 
				
			|||||||
    *BaseAddress = (*BaseAddress) & TT_DESCRIPTOR_PAGE_BASE_ADDRESS_MASK;
 | 
					    *BaseAddress = (*BaseAddress) & TT_DESCRIPTOR_PAGE_BASE_ADDRESS_MASK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Get the attribute at the page table level (Level 2)
 | 
					    // Get the attribute at the page table level (Level 2)
 | 
				
			||||||
    PageTable = (UINT32 *)(SectionDescriptor & TT_DESCRIPTOR_SECTION_PAGETABLE_ADDRESS_MASK);
 | 
					    PageTable = (UINT32*)(SectionDescriptor & TT_DESCRIPTOR_SECTION_PAGETABLE_ADDRESS_MASK);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Calculate index into first level translation table for start of modification
 | 
					    // Calculate index into first level translation table for start of modification
 | 
				
			||||||
    PageTableIndex = ((*BaseAddress) & TT_DESCRIPTOR_PAGE_INDEX_MASK)  >> TT_DESCRIPTOR_PAGE_BASE_SHIFT;
 | 
					    PageTableIndex = ((*BaseAddress) & TT_DESCRIPTOR_PAGE_INDEX_MASK)  >> TT_DESCRIPTOR_PAGE_BASE_SHIFT;
 | 
				
			||||||
@@ -483,14 +477,14 @@ GetMemoryRegion (
 | 
				
			|||||||
                        TT_DESCRIPTOR_CONVERT_TO_SECTION_AP (PageAttributes);
 | 
					                        TT_DESCRIPTOR_CONVERT_TO_SECTION_AP (PageAttributes);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for ( ; TableIndex < TRANSLATION_TABLE_SECTION_COUNT; TableIndex++) {
 | 
					  for (;TableIndex < TRANSLATION_TABLE_SECTION_COUNT; TableIndex++) {
 | 
				
			||||||
    // Get the section at the given index
 | 
					    // Get the section at the given index
 | 
				
			||||||
    SectionDescriptor = FirstLevelTable[TableIndex];
 | 
					    SectionDescriptor = FirstLevelTable[TableIndex];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // If the entry is a level-2 page table then we scan it to find the end of the region
 | 
					    // If the entry is a level-2 page table then we scan it to find the end of the region
 | 
				
			||||||
    if (TT_DESCRIPTOR_SECTION_TYPE_IS_PAGE_TABLE (SectionDescriptor)) {
 | 
					    if (TT_DESCRIPTOR_SECTION_TYPE_IS_PAGE_TABLE (SectionDescriptor)) {
 | 
				
			||||||
      // Extract the page table location from the descriptor
 | 
					      // Extract the page table location from the descriptor
 | 
				
			||||||
      PageTable = (UINT32 *)(SectionDescriptor & TT_DESCRIPTOR_SECTION_PAGETABLE_ADDRESS_MASK);
 | 
					      PageTable = (UINT32*)(SectionDescriptor & TT_DESCRIPTOR_SECTION_PAGETABLE_ADDRESS_MASK);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      // Scan the page table to find the end of the region.
 | 
					      // Scan the page table to find the end of the region.
 | 
				
			||||||
      Status = GetMemoryRegionPage (PageTable, BaseAddress, RegionLength, RegionAttributes);
 | 
					      Status = GetMemoryRegionPage (PageTable, BaseAddress, RegionLength, RegionAttributes);
 | 
				
			||||||
@@ -500,8 +494,7 @@ GetMemoryRegion (
 | 
				
			|||||||
        break;
 | 
					        break;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    } else if (((SectionDescriptor & TT_DESCRIPTOR_SECTION_TYPE_MASK) == TT_DESCRIPTOR_SECTION_TYPE_SECTION) ||
 | 
					    } 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 ((SectionDescriptor & TT_DESCRIPTOR_SECTION_ATTRIBUTE_MASK) != *RegionAttributes) {
 | 
				
			||||||
        // If the attributes of the section differ from the one targeted then we exit the loop
 | 
					        // If the attributes of the section differ from the one targeted then we exit the loop
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -49,6 +49,7 @@ CpuFlushCpuDataCache (
 | 
				
			|||||||
  IN EFI_CPU_FLUSH_TYPE              FlushType
 | 
					  IN EFI_CPU_FLUSH_TYPE              FlushType
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  switch (FlushType) {
 | 
					  switch (FlushType) {
 | 
				
			||||||
    case EfiCpuFlushTypeWriteBack:
 | 
					    case EfiCpuFlushTypeWriteBack:
 | 
				
			||||||
      WriteBackDataCacheRange ((VOID *)(UINTN)Start, (UINTN)Length);
 | 
					      WriteBackDataCacheRange ((VOID *)(UINTN)Start, (UINTN)Length);
 | 
				
			||||||
@@ -66,6 +67,7 @@ CpuFlushCpuDataCache (
 | 
				
			|||||||
  return EFI_SUCCESS;
 | 
					  return EFI_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
  This function enables interrupt processing by the processor.
 | 
					  This function enables interrupt processing by the processor.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -86,6 +88,7 @@ CpuEnableInterrupt (
 | 
				
			|||||||
  return EFI_SUCCESS;
 | 
					  return EFI_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
  This function disables interrupt processing by the processor.
 | 
					  This function disables interrupt processing by the processor.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -106,6 +109,7 @@ CpuDisableInterrupt (
 | 
				
			|||||||
  return EFI_SUCCESS;
 | 
					  return EFI_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
  This function retrieves the processor's current interrupt state a returns it in
 | 
					  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
 | 
					  State. If interrupts are currently enabled, then TRUE is returned. If interrupts
 | 
				
			||||||
@@ -130,10 +134,11 @@ CpuGetInterruptState (
 | 
				
			|||||||
    return EFI_INVALID_PARAMETER;
 | 
					    return EFI_INVALID_PARAMETER;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  *State = ArmGetInterruptState ();
 | 
					  *State = ArmGetInterruptState();
 | 
				
			||||||
  return EFI_SUCCESS;
 | 
					  return EFI_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
  This function generates an INIT on the processor. If this function succeeds, then the
 | 
					  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
 | 
					  processor will be reset, and control will not be returned to the caller. If InitType is
 | 
				
			||||||
@@ -242,8 +247,7 @@ CpuDxeInitialize (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  Status = gBS->InstallMultipleProtocolInterfaces (
 | 
					  Status = gBS->InstallMultipleProtocolInterfaces (
 | 
				
			||||||
                &mCpuHandle,
 | 
					                &mCpuHandle,
 | 
				
			||||||
                  &gEfiCpuArchProtocolGuid,
 | 
					                &gEfiCpuArchProtocolGuid,           &mCpu,
 | 
				
			||||||
                  &mCpu,
 | 
					 | 
				
			||||||
                NULL
 | 
					                NULL
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -258,8 +262,8 @@ CpuDxeInitialize (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  // If the platform is a MPCore system then install the Configuration Table describing the
 | 
					  // If the platform is a MPCore system then install the Configuration Table describing the
 | 
				
			||||||
  // secondary core states
 | 
					  // secondary core states
 | 
				
			||||||
  if (ArmIsMpCore ()) {
 | 
					  if (ArmIsMpCore()) {
 | 
				
			||||||
    PublishArmProcessorTable ();
 | 
					    PublishArmProcessorTable();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -59,6 +59,7 @@ RegisterInterruptHandler (
 | 
				
			|||||||
  IN EFI_CPU_INTERRUPT_HANDLER      InterruptHandler
 | 
					  IN EFI_CPU_INTERRUPT_HANDLER      InterruptHandler
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
  This function registers and enables the handler specified by InterruptHandler for a processor
 | 
					  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
 | 
					  interrupt or exception type specified by InterruptType. If InterruptHandler is NULL, then the
 | 
				
			||||||
@@ -85,6 +86,7 @@ RegisterDebuggerInterruptHandler (
 | 
				
			|||||||
  IN EFI_CPU_INTERRUPT_HANDLER      InterruptHandler
 | 
					  IN EFI_CPU_INTERRUPT_HANDLER      InterruptHandler
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
CpuSetMemoryAttributes (
 | 
					CpuSetMemoryAttributes (
 | 
				
			||||||
@@ -115,7 +117,7 @@ SyncCacheConfig (
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
PublishArmProcessorTable (
 | 
					PublishArmProcessorTable(
 | 
				
			||||||
  VOID
 | 
					  VOID
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -43,22 +43,19 @@ SearchGcdMemorySpaces (
 | 
				
			|||||||
  *EndIndex   = 0;
 | 
					  *EndIndex   = 0;
 | 
				
			||||||
  for (Index = 0; Index < NumberOfDescriptors; Index++) {
 | 
					  for (Index = 0; Index < NumberOfDescriptors; Index++) {
 | 
				
			||||||
    if ((BaseAddress >= MemorySpaceMap[Index].BaseAddress) &&
 | 
					    if ((BaseAddress >= MemorySpaceMap[Index].BaseAddress) &&
 | 
				
			||||||
        (BaseAddress < (MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length)))
 | 
					        (BaseAddress < (MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length))) {
 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      *StartIndex = Index;
 | 
					      *StartIndex = Index;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (((BaseAddress + Length - 1) >= MemorySpaceMap[Index].BaseAddress) &&
 | 
					    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;
 | 
					      *EndIndex = Index;
 | 
				
			||||||
      return EFI_SUCCESS;
 | 
					      return EFI_SUCCESS;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  return EFI_NOT_FOUND;
 | 
					  return EFI_NOT_FOUND;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
  Sets the attributes for a specified range in Gcd Memory Space Map.
 | 
					  Sets the attributes for a specified range in Gcd Memory Space Map.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -91,21 +88,14 @@ SetGcdMemorySpaceAttributes (
 | 
				
			|||||||
  EFI_PHYSICAL_ADDRESS  RegionStart;
 | 
					  EFI_PHYSICAL_ADDRESS  RegionStart;
 | 
				
			||||||
  UINT64                RegionLength;
 | 
					  UINT64                RegionLength;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  DEBUG ((
 | 
					  DEBUG ((DEBUG_GCD, "SetGcdMemorySpaceAttributes[0x%lX; 0x%lX] = 0x%lX\n",
 | 
				
			||||||
    DEBUG_GCD,
 | 
					      BaseAddress, BaseAddress + Length, Attributes));
 | 
				
			||||||
    "SetGcdMemorySpaceAttributes[0x%lX; 0x%lX] = 0x%lX\n",
 | 
					 | 
				
			||||||
    BaseAddress,
 | 
					 | 
				
			||||||
    BaseAddress + Length,
 | 
					 | 
				
			||||||
    Attributes
 | 
					 | 
				
			||||||
    ));
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // We do not support a smaller granularity than 4KB on ARM Architecture
 | 
					  // We do not support a smaller granularity than 4KB on ARM Architecture
 | 
				
			||||||
  if ((Length & EFI_PAGE_MASK) != 0) {
 | 
					  if ((Length & EFI_PAGE_MASK) != 0) {
 | 
				
			||||||
    DEBUG ((
 | 
					    DEBUG ((DEBUG_WARN,
 | 
				
			||||||
      DEBUG_WARN,
 | 
					 | 
				
			||||||
            "Warning: We do not support smaller granularity than 4KB on ARM Architecture (passed length: 0x%lX).\n",
 | 
					            "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) {
 | 
					    if (MemorySpaceMap[Index].GcdMemoryType == EfiGcdMemoryTypeNonExistent) {
 | 
				
			||||||
      continue;
 | 
					      continue;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    //
 | 
					    //
 | 
				
			||||||
    // Calculate the start and end address of the overlapping range
 | 
					    // Calculate the start and end address of the overlapping range
 | 
				
			||||||
    //
 | 
					    //
 | 
				
			||||||
@@ -139,13 +128,11 @@ SetGcdMemorySpaceAttributes (
 | 
				
			|||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      RegionStart = MemorySpaceMap[Index].BaseAddress;
 | 
					      RegionStart = MemorySpaceMap[Index].BaseAddress;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    if ((BaseAddress + Length - 1) < (MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length)) {
 | 
					    if ((BaseAddress + Length - 1) < (MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length)) {
 | 
				
			||||||
      RegionLength = BaseAddress + Length - RegionStart;
 | 
					      RegionLength = BaseAddress + Length - RegionStart;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      RegionLength = MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length - RegionStart;
 | 
					      RegionLength = MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length - RegionStart;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    //
 | 
					    //
 | 
				
			||||||
    // Set memory attributes according to MTRR attribute and the original attribute of descriptor
 | 
					    // Set memory attributes according to MTRR attribute and the original attribute of descriptor
 | 
				
			||||||
    //
 | 
					    //
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,7 +26,7 @@ ARM_PROCESSOR_TABLE  mArmProcessorTableTemplate = {
 | 
				
			|||||||
    EFI_ARM_PROCESSOR_TABLE_CREATOR_REVISION,
 | 
					    EFI_ARM_PROCESSOR_TABLE_CREATOR_REVISION,
 | 
				
			||||||
    { 0 },
 | 
					    { 0 },
 | 
				
			||||||
    0
 | 
					    0
 | 
				
			||||||
  },   // ARM Processor table header
 | 
					  },   //ARM Processor table header
 | 
				
			||||||
  0,   // Number of entries in ARM processor Table
 | 
					  0,   // Number of entries in ARM processor Table
 | 
				
			||||||
  NULL // ARM Processor Table
 | 
					  NULL // ARM Processor Table
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
@@ -50,43 +50,42 @@ PublishArmProcessorTable (
 | 
				
			|||||||
  Hob.Raw = GetHobList ();
 | 
					  Hob.Raw = GetHobList ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Iterate through the HOBs and find if there is ARM PROCESSOR ENTRY HOB
 | 
					  // Iterate through the HOBs and find if there is ARM PROCESSOR ENTRY HOB
 | 
				
			||||||
  for ( ; !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) {
 | 
					  for (; !END_OF_HOB_LIST(Hob); Hob.Raw = GET_NEXT_HOB(Hob)) {
 | 
				
			||||||
    // Check for Correct HOB type
 | 
					    // Check for Correct HOB type
 | 
				
			||||||
    if ((GET_HOB_TYPE (Hob)) == EFI_HOB_TYPE_GUID_EXTENSION) {
 | 
					    if ((GET_HOB_TYPE (Hob)) == EFI_HOB_TYPE_GUID_EXTENSION) {
 | 
				
			||||||
      // Check for correct GUID type
 | 
					      // Check for correct GUID type
 | 
				
			||||||
      if (CompareGuid (&(Hob.Guid->Name), &gArmMpCoreInfoGuid)) {
 | 
					      if (CompareGuid(&(Hob.Guid->Name), &gArmMpCoreInfoGuid)) {
 | 
				
			||||||
        ARM_PROCESSOR_TABLE     *ArmProcessorTable;
 | 
					        ARM_PROCESSOR_TABLE     *ArmProcessorTable;
 | 
				
			||||||
        EFI_STATUS              Status;
 | 
					        EFI_STATUS              Status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Allocate Runtime memory for ARM processor table
 | 
					        // Allocate Runtime memory for ARM processor table
 | 
				
			||||||
        ArmProcessorTable = (ARM_PROCESSOR_TABLE *)AllocateRuntimePool (sizeof (ARM_PROCESSOR_TABLE));
 | 
					        ArmProcessorTable = (ARM_PROCESSOR_TABLE*)AllocateRuntimePool(sizeof(ARM_PROCESSOR_TABLE));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Check if the memory allocation is successful or not
 | 
					        // Check if the memory allocation is successful or not
 | 
				
			||||||
        ASSERT (NULL != ArmProcessorTable);
 | 
					        ASSERT(NULL != ArmProcessorTable);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Set ARM processor table to default values
 | 
					        // Set ARM processor table to default values
 | 
				
			||||||
        CopyMem (ArmProcessorTable, &mArmProcessorTableTemplate, sizeof (ARM_PROCESSOR_TABLE));
 | 
					        CopyMem(ArmProcessorTable,&mArmProcessorTableTemplate,sizeof(ARM_PROCESSOR_TABLE));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Fill in Length fields of ARM processor table
 | 
					        // Fill in Length fields of ARM processor table
 | 
				
			||||||
        ArmProcessorTable->Header.Length  = sizeof (ARM_PROCESSOR_TABLE);
 | 
					        ArmProcessorTable->Header.Length = sizeof(ARM_PROCESSOR_TABLE);
 | 
				
			||||||
        ArmProcessorTable->Header.DataLen = GET_GUID_HOB_DATA_SIZE (Hob);
 | 
					        ArmProcessorTable->Header.DataLen = GET_GUID_HOB_DATA_SIZE(Hob);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Fill in Identifier(ARM processor table GUID)
 | 
					        // Fill in Identifier(ARM processor table GUID)
 | 
				
			||||||
        ArmProcessorTable->Header.Identifier = gArmMpCoreInfoGuid;
 | 
					        ArmProcessorTable->Header.Identifier = gArmMpCoreInfoGuid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Set Number of ARM core entries in the Table
 | 
					        // Set Number of ARM core entries in the Table
 | 
				
			||||||
        ArmProcessorTable->NumberOfEntries = GET_GUID_HOB_DATA_SIZE (Hob)/sizeof (ARM_CORE_INFO);
 | 
					        ArmProcessorTable->NumberOfEntries = GET_GUID_HOB_DATA_SIZE(Hob)/sizeof(ARM_CORE_INFO);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Allocate runtime memory for ARM processor Table entries
 | 
					        // Allocate runtime memory for ARM processor Table entries
 | 
				
			||||||
        ArmProcessorTable->ArmCpus = (ARM_CORE_INFO *)AllocateRuntimePool (
 | 
					        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
 | 
					        // Check if the memory allocation is successful or not
 | 
				
			||||||
        ASSERT (NULL != ArmProcessorTable->ArmCpus);
 | 
					        ASSERT(NULL != ArmProcessorTable->ArmCpus);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Copy ARM Processor Table data from HOB list to newly allocated memory
 | 
					        // Copy ARM Processor Table data from HOB list to newly allocated memory
 | 
				
			||||||
        CopyMem (ArmProcessorTable->ArmCpus, GET_GUID_HOB_DATA (Hob), ArmProcessorTable->Header.DataLen);
 | 
					        CopyMem(ArmProcessorTable->ArmCpus,GET_GUID_HOB_DATA(Hob), ArmProcessorTable->Header.DataLen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Install the ARM Processor table into EFI system configuration table
 | 
					        // Install the ARM Processor table into EFI system configuration table
 | 
				
			||||||
        Status = gBS->InstallConfigurationTable (&gArmMpCoreInfoGuid, ArmProcessorTable);
 | 
					        Status = gBS->InstallConfigurationTable (&gArmMpCoreInfoGuid, ArmProcessorTable);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,13 +23,13 @@ InitializeExceptions (
 | 
				
			|||||||
  BOOLEAN                         FiqEnabled;
 | 
					  BOOLEAN                         FiqEnabled;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  VectorInfo = (EFI_VECTOR_HANDOFF_INFO *)NULL;
 | 
					  VectorInfo = (EFI_VECTOR_HANDOFF_INFO *)NULL;
 | 
				
			||||||
  Status     = EfiGetSystemConfigurationTable (&gEfiVectorHandoffTableGuid, (VOID **)&VectorInfoList);
 | 
					  Status = EfiGetSystemConfigurationTable(&gEfiVectorHandoffTableGuid, (VOID **)&VectorInfoList);
 | 
				
			||||||
  if ((Status == EFI_SUCCESS) && (VectorInfoList != NULL)) {
 | 
					  if (Status == EFI_SUCCESS && VectorInfoList != NULL) {
 | 
				
			||||||
    VectorInfo = VectorInfoList;
 | 
					    VectorInfo = VectorInfoList;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // initialize the CpuExceptionHandlerLib so we take over the exception vector table from the DXE Core
 | 
					  // initialize the CpuExceptionHandlerLib so we take over the exception vector table from the DXE Core
 | 
				
			||||||
  InitializeCpuExceptionHandlers (VectorInfo);
 | 
					  InitializeCpuExceptionHandlers(VectorInfo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Status = EFI_SUCCESS;
 | 
					  Status = EFI_SUCCESS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -90,11 +90,11 @@ previously installed.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
RegisterInterruptHandler (
 | 
					RegisterInterruptHandler(
 | 
				
			||||||
  IN EFI_EXCEPTION_TYPE             InterruptType,
 | 
					  IN EFI_EXCEPTION_TYPE             InterruptType,
 | 
				
			||||||
  IN EFI_CPU_INTERRUPT_HANDLER      InterruptHandler
 | 
					  IN EFI_CPU_INTERRUPT_HANDLER      InterruptHandler
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  // pass down to CpuExceptionHandlerLib
 | 
					  // pass down to CpuExceptionHandlerLib
 | 
				
			||||||
  return (EFI_STATUS)RegisterCpuInterruptHandler (InterruptType, InterruptHandler);
 | 
					  return (EFI_STATUS)RegisterCpuInterruptHandler(InterruptType, InterruptHandler);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,6 +16,8 @@ Abstract:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
**/
 | 
					**/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// The package level header files this module uses
 | 
					// The package level header files this module uses
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
@@ -68,12 +70,12 @@ InitializeCpuPeim (
 | 
				
			|||||||
  BuildCpuHob (ArmGetPhysicalAddressBits (), PcdGet8 (PcdPrePiCpuIoSize));
 | 
					  BuildCpuHob (ArmGetPhysicalAddressBits (), PcdGet8 (PcdPrePiCpuIoSize));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Only MP Core platform need to produce gArmMpCoreInfoPpiGuid
 | 
					  // Only MP Core platform need to produce gArmMpCoreInfoPpiGuid
 | 
				
			||||||
  Status = PeiServicesLocatePpi (&gArmMpCoreInfoPpiGuid, 0, NULL, (VOID **)&ArmMpCoreInfoPpi);
 | 
					  Status = PeiServicesLocatePpi (&gArmMpCoreInfoPpiGuid, 0, NULL, (VOID**)&ArmMpCoreInfoPpi);
 | 
				
			||||||
  if (!EFI_ERROR (Status)) {
 | 
					  if (!EFI_ERROR(Status)) {
 | 
				
			||||||
    // Build the MP Core Info Table
 | 
					    // Build the MP Core Info Table
 | 
				
			||||||
    ArmCoreCount = 0;
 | 
					    ArmCoreCount = 0;
 | 
				
			||||||
    Status = ArmMpCoreInfoPpi->GetMpCoreInfo (&ArmCoreCount, &ArmCoreInfoTable);
 | 
					    Status = ArmMpCoreInfoPpi->GetMpCoreInfo (&ArmCoreCount, &ArmCoreInfoTable);
 | 
				
			||||||
    if (!EFI_ERROR (Status) && (ArmCoreCount > 0)) {
 | 
					    if (!EFI_ERROR(Status) && (ArmCoreCount > 0)) {
 | 
				
			||||||
      // Build MPCore Info HOB
 | 
					      // Build MPCore Info HOB
 | 
				
			||||||
      BuildGuidDataHob (&gArmMpCoreInfoGuid, ArmCoreInfoTable, sizeof (ARM_CORE_INFO) * ArmCoreCount);
 | 
					      BuildGuidDataHob (&gArmMpCoreInfoGuid, ArmCoreInfoTable, sizeof (ARM_CORE_INFO) * ArmCoreCount);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,6 @@
 | 
				
			|||||||
*  SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
					*  SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
**/
 | 
					**/
 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef GENERIC_WATCHDOG_H_
 | 
					#ifndef GENERIC_WATCHDOG_H_
 | 
				
			||||||
#define GENERIC_WATCHDOG_H_
 | 
					#define GENERIC_WATCHDOG_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -101,7 +101,7 @@ WatchdogInterruptHandler (
 | 
				
			|||||||
  IN  EFI_SYSTEM_CONTEXT          SystemContext
 | 
					  IN  EFI_SYSTEM_CONTEXT          SystemContext
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  STATIC CONST CHAR16  ResetString[] = L"The generic watchdog timer ran out.";
 | 
					  STATIC CONST CHAR16 ResetString[]= L"The generic watchdog timer ran out.";
 | 
				
			||||||
  UINT64              TimerPeriod;
 | 
					  UINT64              TimerPeriod;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  WatchdogDisable ();
 | 
					  WatchdogDisable ();
 | 
				
			||||||
@@ -119,12 +119,8 @@ WatchdogInterruptHandler (
 | 
				
			|||||||
    mWatchdogNotify (TimerPeriod + 1);
 | 
					    mWatchdogNotify (TimerPeriod + 1);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  gRT->ResetSystem (
 | 
					  gRT->ResetSystem (EfiResetCold, EFI_TIMEOUT, StrSize (ResetString),
 | 
				
			||||||
         EfiResetCold,
 | 
					         (CHAR16 *)ResetString);
 | 
				
			||||||
         EFI_TIMEOUT,
 | 
					 | 
				
			||||||
         StrSize (ResetString),
 | 
					 | 
				
			||||||
         (CHAR16 *)ResetString
 | 
					 | 
				
			||||||
         );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // If we got here then the reset didn't work
 | 
					  // If we got here then the reset didn't work
 | 
				
			||||||
  ASSERT (FALSE);
 | 
					  ASSERT (FALSE);
 | 
				
			||||||
@@ -162,11 +158,11 @@ WatchdogRegisterHandler (
 | 
				
			|||||||
  IN EFI_WATCHDOG_TIMER_NOTIFY                NotifyFunction
 | 
					  IN EFI_WATCHDOG_TIMER_NOTIFY                NotifyFunction
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if ((mWatchdogNotify == NULL) && (NotifyFunction == NULL)) {
 | 
					  if (mWatchdogNotify == NULL && NotifyFunction == NULL) {
 | 
				
			||||||
    return EFI_INVALID_PARAMETER;
 | 
					    return EFI_INVALID_PARAMETER;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if ((mWatchdogNotify != NULL) && (NotifyFunction != NULL)) {
 | 
					  if (mWatchdogNotify != NULL && NotifyFunction != NULL) {
 | 
				
			||||||
    return EFI_ALREADY_STARTED;
 | 
					    return EFI_ALREADY_STARTED;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -311,11 +307,8 @@ GenericWatchdogEntry (
 | 
				
			|||||||
  EFI_STATUS                      Status;
 | 
					  EFI_STATUS                      Status;
 | 
				
			||||||
  EFI_HANDLE                      Handle;
 | 
					  EFI_HANDLE                      Handle;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Status = gBS->LocateProtocol (
 | 
					  Status = gBS->LocateProtocol (&gHardwareInterrupt2ProtocolGuid, NULL,
 | 
				
			||||||
                  &gHardwareInterrupt2ProtocolGuid,
 | 
					                  (VOID **)&mInterruptProtocol);
 | 
				
			||||||
                  NULL,
 | 
					 | 
				
			||||||
                  (VOID **)&mInterruptProtocol
 | 
					 | 
				
			||||||
                  );
 | 
					 | 
				
			||||||
  ASSERT_EFI_ERROR (Status);
 | 
					  ASSERT_EFI_ERROR (Status);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* Make sure the Watchdog Timer Architectural Protocol has not been installed
 | 
					  /* Make sure the Watchdog Timer Architectural Protocol has not been installed
 | 
				
			||||||
@@ -327,44 +320,33 @@ GenericWatchdogEntry (
 | 
				
			|||||||
  ASSERT (mTimerFrequencyHz != 0);
 | 
					  ASSERT (mTimerFrequencyHz != 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Install interrupt handler
 | 
					  // Install interrupt handler
 | 
				
			||||||
  Status = mInterruptProtocol->RegisterInterruptSource (
 | 
					  Status = mInterruptProtocol->RegisterInterruptSource (mInterruptProtocol,
 | 
				
			||||||
                                 mInterruptProtocol,
 | 
					 | 
				
			||||||
                                 FixedPcdGet32 (PcdGenericWatchdogEl2IntrNum),
 | 
					                                 FixedPcdGet32 (PcdGenericWatchdogEl2IntrNum),
 | 
				
			||||||
                                 WatchdogInterruptHandler
 | 
					                                 WatchdogInterruptHandler);
 | 
				
			||||||
                                 );
 | 
					 | 
				
			||||||
  if (EFI_ERROR (Status)) {
 | 
					  if (EFI_ERROR (Status)) {
 | 
				
			||||||
    return Status;
 | 
					    return Status;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Status = mInterruptProtocol->SetTriggerType (
 | 
					  Status = mInterruptProtocol->SetTriggerType (mInterruptProtocol,
 | 
				
			||||||
                                 mInterruptProtocol,
 | 
					 | 
				
			||||||
                                 FixedPcdGet32 (PcdGenericWatchdogEl2IntrNum),
 | 
					                                 FixedPcdGet32 (PcdGenericWatchdogEl2IntrNum),
 | 
				
			||||||
                                 EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING
 | 
					                                 EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING);
 | 
				
			||||||
                                 );
 | 
					 | 
				
			||||||
  if (EFI_ERROR (Status)) {
 | 
					  if (EFI_ERROR (Status)) {
 | 
				
			||||||
    goto UnregisterHandler;
 | 
					    goto UnregisterHandler;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Install the Timer Architectural Protocol onto a new handle
 | 
					  // Install the Timer Architectural Protocol onto a new handle
 | 
				
			||||||
  Handle = NULL;
 | 
					  Handle = NULL;
 | 
				
			||||||
  Status = gBS->InstallMultipleProtocolInterfaces (
 | 
					  Status = gBS->InstallMultipleProtocolInterfaces (&Handle,
 | 
				
			||||||
                  &Handle,
 | 
					                  &gEfiWatchdogTimerArchProtocolGuid, &mWatchdogTimer,
 | 
				
			||||||
                  &gEfiWatchdogTimerArchProtocolGuid,
 | 
					                  NULL);
 | 
				
			||||||
                  &mWatchdogTimer,
 | 
					 | 
				
			||||||
                  NULL
 | 
					 | 
				
			||||||
                  );
 | 
					 | 
				
			||||||
  if (EFI_ERROR (Status)) {
 | 
					  if (EFI_ERROR (Status)) {
 | 
				
			||||||
    goto UnregisterHandler;
 | 
					    goto UnregisterHandler;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Register for an ExitBootServicesEvent
 | 
					  // Register for an ExitBootServicesEvent
 | 
				
			||||||
  Status = gBS->CreateEvent (
 | 
					  Status = gBS->CreateEvent (EVT_SIGNAL_EXIT_BOOT_SERVICES, TPL_NOTIFY,
 | 
				
			||||||
                  EVT_SIGNAL_EXIT_BOOT_SERVICES,
 | 
					                  WatchdogExitBootServicesEvent, NULL,
 | 
				
			||||||
                  TPL_NOTIFY,
 | 
					                  &mEfiExitBootServicesEvent);
 | 
				
			||||||
                  WatchdogExitBootServicesEvent,
 | 
					 | 
				
			||||||
                  NULL,
 | 
					 | 
				
			||||||
                  &mEfiExitBootServicesEvent
 | 
					 | 
				
			||||||
                  );
 | 
					 | 
				
			||||||
  ASSERT_EFI_ERROR (Status);
 | 
					  ASSERT_EFI_ERROR (Status);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  mNumTimerTicks = 0;
 | 
					  mNumTimerTicks = 0;
 | 
				
			||||||
@@ -374,10 +356,8 @@ GenericWatchdogEntry (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
UnregisterHandler:
 | 
					UnregisterHandler:
 | 
				
			||||||
  // Unregister the handler
 | 
					  // Unregister the handler
 | 
				
			||||||
  mInterruptProtocol->RegisterInterruptSource (
 | 
					  mInterruptProtocol->RegisterInterruptSource (mInterruptProtocol,
 | 
				
			||||||
                        mInterruptProtocol,
 | 
					 | 
				
			||||||
                        FixedPcdGet32 (PcdGenericWatchdogEl2IntrNum),
 | 
					                        FixedPcdGet32 (PcdGenericWatchdogEl2IntrNum),
 | 
				
			||||||
                        NULL
 | 
					                        NULL);
 | 
				
			||||||
                        );
 | 
					 | 
				
			||||||
  return Status;
 | 
					  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.
 | 
					  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] This                The EFI_MM_COMMUNICATION_PROTOCOL instance.
 | 
				
			||||||
  @param[in, out] CommBufferPhysical  Physical address of the MM communication buffer
 | 
					  @param[in] CommBufferPhysical  Physical address of the MM communication buffer
 | 
				
			||||||
  @param[in, out] CommBufferVirtual   Virtual address of the MM communication buffer
 | 
					  @param[in] CommBufferVirtual   Virtual address of the MM communication buffer
 | 
				
			||||||
  @param[in, out] CommSize            The size of the data buffer being passed in. On input,
 | 
					  @param[in] CommSize            The size of the data buffer being passed in. On exit, the size of data
 | 
				
			||||||
                                      when not omitted, the buffer should cover EFI_MM_COMMUNICATE_HEADER
 | 
					                                 being returned. Zero if the handler does not wish to reply with any data.
 | 
				
			||||||
                                      and the value of MessageLength field. On exit, the size
 | 
					                                 This parameter is optional and may be NULL.
 | 
				
			||||||
                                      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_SUCCESS            The message was successfully posted.
 | 
				
			||||||
  @retval EFI_INVALID_PARAMETER  CommBufferPhysical or CommBufferVirtual was NULL, or
 | 
					  @retval EFI_INVALID_PARAMETER  CommBufferPhysical was NULL or CommBufferVirtual was NULL.
 | 
				
			||||||
                                 integer value pointed by CommSize does not cover
 | 
					 | 
				
			||||||
                                 EFI_MM_COMMUNICATE_HEADER and the value of MessageLength
 | 
					 | 
				
			||||||
                                 field.
 | 
					 | 
				
			||||||
  @retval EFI_BAD_BUFFER_SIZE    The buffer is too large for the MM implementation.
 | 
					  @retval EFI_BAD_BUFFER_SIZE    The buffer is too large for the MM implementation.
 | 
				
			||||||
                                 If this error is returned, the MessageLength field
 | 
					                                 If this error is returned, the MessageLength field
 | 
				
			||||||
                                 in the CommBuffer header or the integer pointed by
 | 
					                                 in the CommBuffer header or the integer pointed by
 | 
				
			||||||
@@ -88,11 +82,10 @@ MmCommunication2Communicate (
 | 
				
			|||||||
  //
 | 
					  //
 | 
				
			||||||
  // Check parameters
 | 
					  // Check parameters
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  if ((CommBufferVirtual == NULL) || (CommBufferPhysical == NULL)) {
 | 
					  if (CommBufferVirtual == NULL) {
 | 
				
			||||||
    return EFI_INVALID_PARAMETER;
 | 
					    return EFI_INVALID_PARAMETER;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Status            = EFI_SUCCESS;
 | 
					 | 
				
			||||||
  CommunicateHeader = CommBufferVirtual;
 | 
					  CommunicateHeader = CommBufferVirtual;
 | 
				
			||||||
  // CommBuffer is a mandatory parameter. Hence, Rely on
 | 
					  // CommBuffer is a mandatory parameter. Hence, Rely on
 | 
				
			||||||
  // MessageLength + Header to ascertain the
 | 
					  // MessageLength + Header to ascertain the
 | 
				
			||||||
@@ -102,41 +95,33 @@ MmCommunication2Communicate (
 | 
				
			|||||||
               sizeof (CommunicateHeader->HeaderGuid) +
 | 
					               sizeof (CommunicateHeader->HeaderGuid) +
 | 
				
			||||||
               sizeof (CommunicateHeader->MessageLength);
 | 
					               sizeof (CommunicateHeader->MessageLength);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // If CommSize is not omitted, perform size inspection before proceeding.
 | 
					  // If the length of the CommBuffer is 0 then return the expected length.
 | 
				
			||||||
  if (CommSize != NULL) {
 | 
					  if (CommSize != 0) {
 | 
				
			||||||
    // This case can be used by the consumer of this driver to find out the
 | 
					    // This case can be used by the consumer of this driver to find out the
 | 
				
			||||||
    // max size that can be used for allocating CommBuffer.
 | 
					    // max size that can be used for allocating CommBuffer.
 | 
				
			||||||
    if ((*CommSize == 0) ||
 | 
					    if ((*CommSize == 0) ||
 | 
				
			||||||
        (*CommSize > mNsCommBuffMemRegion.Length))
 | 
					        (*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) {
 | 
					    if (*CommSize != BufferSize) {
 | 
				
			||||||
      Status = EFI_INVALID_PARAMETER;
 | 
					        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.
 | 
					  // environment then return the expected size.
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  if ((CommunicateHeader->MessageLength == 0) ||
 | 
					  if ((BufferSize == 0) ||
 | 
				
			||||||
      (BufferSize > mNsCommBuffMemRegion.Length))
 | 
					      (BufferSize > mNsCommBuffMemRegion.Length)) {
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    CommunicateHeader->MessageLength = mNsCommBuffMemRegion.Length -
 | 
					    CommunicateHeader->MessageLength = mNsCommBuffMemRegion.Length -
 | 
				
			||||||
                                       sizeof (CommunicateHeader->HeaderGuid) -
 | 
					                                       sizeof (CommunicateHeader->HeaderGuid) -
 | 
				
			||||||
                                       sizeof (CommunicateHeader->MessageLength);
 | 
					                                       sizeof (CommunicateHeader->MessageLength);
 | 
				
			||||||
    Status = EFI_BAD_BUFFER_SIZE;
 | 
					    return EFI_BAD_BUFFER_SIZE;
 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // MessageLength or CommSize check has failed, return here.
 | 
					 | 
				
			||||||
  if (EFI_ERROR (Status)) {
 | 
					 | 
				
			||||||
    return Status;
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // SMC Function ID
 | 
					  // SMC Function ID
 | 
				
			||||||
@@ -234,19 +219,15 @@ NotifySetVirtualAddressMap (
 | 
				
			|||||||
                  (VOID **)&mNsCommBuffMemRegion.VirtualBase
 | 
					                  (VOID **)&mNsCommBuffMemRegion.VirtualBase
 | 
				
			||||||
                  );
 | 
					                  );
 | 
				
			||||||
  if (EFI_ERROR (Status)) {
 | 
					  if (EFI_ERROR (Status)) {
 | 
				
			||||||
    DEBUG ((
 | 
					    DEBUG ((DEBUG_ERROR, "NotifySetVirtualAddressMap():"
 | 
				
			||||||
      DEBUG_ERROR,
 | 
					            " Unable to convert MM runtime pointer. Status:0x%r\n", Status));
 | 
				
			||||||
      "NotifySetVirtualAddressMap():"
 | 
					 | 
				
			||||||
      " Unable to convert MM runtime pointer. Status:0x%r\n",
 | 
					 | 
				
			||||||
      Status
 | 
					 | 
				
			||||||
      ));
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
STATIC
 | 
					STATIC
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
GetMmCompatibility (
 | 
					GetMmCompatibility ()
 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS   Status;
 | 
					  EFI_STATUS   Status;
 | 
				
			||||||
  UINT32       MmVersion;
 | 
					  UINT32       MmVersion;
 | 
				
			||||||
@@ -259,32 +240,21 @@ GetMmCompatibility (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  MmVersion = MmVersionArgs.Arg0;
 | 
					  MmVersion = MmVersionArgs.Arg0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if ((MM_MAJOR_VER (MmVersion) == MM_CALLER_MAJOR_VER) &&
 | 
					  if ((MM_MAJOR_VER(MmVersion) == MM_CALLER_MAJOR_VER) &&
 | 
				
			||||||
      (MM_MINOR_VER (MmVersion) >= MM_CALLER_MINOR_VER))
 | 
					      (MM_MINOR_VER(MmVersion) >= MM_CALLER_MINOR_VER)) {
 | 
				
			||||||
  {
 | 
					    DEBUG ((DEBUG_INFO, "MM Version: Major=0x%x, Minor=0x%x\n",
 | 
				
			||||||
    DEBUG ((
 | 
					            MM_MAJOR_VER(MmVersion), MM_MINOR_VER(MmVersion)));
 | 
				
			||||||
      DEBUG_INFO,
 | 
					 | 
				
			||||||
      "MM Version: Major=0x%x, Minor=0x%x\n",
 | 
					 | 
				
			||||||
      MM_MAJOR_VER (MmVersion),
 | 
					 | 
				
			||||||
      MM_MINOR_VER (MmVersion)
 | 
					 | 
				
			||||||
      ));
 | 
					 | 
				
			||||||
    Status = EFI_SUCCESS;
 | 
					    Status = EFI_SUCCESS;
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    DEBUG ((
 | 
					    DEBUG ((DEBUG_ERROR, "Incompatible MM Versions.\n Current Version: Major=0x%x, Minor=0x%x.\n Expected: Major=0x%x, Minor>=0x%x.\n",
 | 
				
			||||||
      DEBUG_ERROR,
 | 
					            MM_MAJOR_VER(MmVersion), MM_MINOR_VER(MmVersion), MM_CALLER_MAJOR_VER, MM_CALLER_MINOR_VER));
 | 
				
			||||||
      "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;
 | 
					    Status = EFI_UNSUPPORTED;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return Status;
 | 
					  return Status;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
STATIC EFI_GUID *CONST  mGuidedEventGuid[] = {
 | 
					STATIC EFI_GUID* CONST mGuidedEventGuid[] = {
 | 
				
			||||||
  &gEfiEndOfDxeEventGroupGuid,
 | 
					  &gEfiEndOfDxeEventGroupGuid,
 | 
				
			||||||
  &gEfiEventExitBootServicesGuid,
 | 
					  &gEfiEventExitBootServicesGuid,
 | 
				
			||||||
  &gEfiEventReadyToBootGuid,
 | 
					  &gEfiEventReadyToBootGuid,
 | 
				
			||||||
@@ -347,7 +317,7 @@ MmCommunication2Initialize (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  // Check if we can make the MM call
 | 
					  // Check if we can make the MM call
 | 
				
			||||||
  Status = GetMmCompatibility ();
 | 
					  Status = GetMmCompatibility ();
 | 
				
			||||||
  if (EFI_ERROR (Status)) {
 | 
					  if (EFI_ERROR(Status)) {
 | 
				
			||||||
    goto ReturnErrorStatus;
 | 
					    goto ReturnErrorStatus;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -369,11 +339,8 @@ MmCommunication2Initialize (
 | 
				
			|||||||
                  EFI_MEMORY_RUNTIME
 | 
					                  EFI_MEMORY_RUNTIME
 | 
				
			||||||
                  );
 | 
					                  );
 | 
				
			||||||
  if (EFI_ERROR (Status)) {
 | 
					  if (EFI_ERROR (Status)) {
 | 
				
			||||||
    DEBUG ((
 | 
					    DEBUG ((DEBUG_ERROR, "MmCommunicateInitialize: "
 | 
				
			||||||
      DEBUG_ERROR,
 | 
					            "Failed to add MM-NS Buffer Memory Space\n"));
 | 
				
			||||||
      "MmCommunicateInitialize: "
 | 
					 | 
				
			||||||
      "Failed to add MM-NS Buffer Memory Space\n"
 | 
					 | 
				
			||||||
      ));
 | 
					 | 
				
			||||||
    goto ReturnErrorStatus;
 | 
					    goto ReturnErrorStatus;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -383,11 +350,8 @@ MmCommunication2Initialize (
 | 
				
			|||||||
                  EFI_MEMORY_WB | EFI_MEMORY_XP | EFI_MEMORY_RUNTIME
 | 
					                  EFI_MEMORY_WB | EFI_MEMORY_XP | EFI_MEMORY_RUNTIME
 | 
				
			||||||
                  );
 | 
					                  );
 | 
				
			||||||
  if (EFI_ERROR (Status)) {
 | 
					  if (EFI_ERROR (Status)) {
 | 
				
			||||||
    DEBUG ((
 | 
					    DEBUG ((DEBUG_ERROR, "MmCommunicateInitialize: "
 | 
				
			||||||
      DEBUG_ERROR,
 | 
					            "Failed to set MM-NS Buffer Memory attributes\n"));
 | 
				
			||||||
      "MmCommunicateInitialize: "
 | 
					 | 
				
			||||||
      "Failed to set MM-NS Buffer Memory attributes\n"
 | 
					 | 
				
			||||||
      ));
 | 
					 | 
				
			||||||
    goto CleanAddedMemorySpace;
 | 
					    goto CleanAddedMemorySpace;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -398,12 +362,9 @@ MmCommunication2Initialize (
 | 
				
			|||||||
                  EFI_NATIVE_INTERFACE,
 | 
					                  EFI_NATIVE_INTERFACE,
 | 
				
			||||||
                  &mMmCommunication2
 | 
					                  &mMmCommunication2
 | 
				
			||||||
                  );
 | 
					                  );
 | 
				
			||||||
  if (EFI_ERROR (Status)) {
 | 
					  if (EFI_ERROR(Status)) {
 | 
				
			||||||
    DEBUG ((
 | 
					    DEBUG ((DEBUG_ERROR, "MmCommunicationInitialize: "
 | 
				
			||||||
      DEBUG_ERROR,
 | 
					            "Failed to install MM communication protocol\n"));
 | 
				
			||||||
      "MmCommunicationInitialize: "
 | 
					 | 
				
			||||||
      "Failed to install MM communication protocol\n"
 | 
					 | 
				
			||||||
      ));
 | 
					 | 
				
			||||||
    goto CleanAddedMemorySpace;
 | 
					    goto CleanAddedMemorySpace;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -420,24 +381,17 @@ MmCommunication2Initialize (
 | 
				
			|||||||
  ASSERT_EFI_ERROR (Status);
 | 
					  ASSERT_EFI_ERROR (Status);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for (Index = 0; Index < ARRAY_SIZE (mGuidedEventGuid); Index++) {
 | 
					  for (Index = 0; Index < ARRAY_SIZE (mGuidedEventGuid); Index++) {
 | 
				
			||||||
    Status = gBS->CreateEventEx (
 | 
					    Status = gBS->CreateEventEx (EVT_NOTIFY_SIGNAL, TPL_CALLBACK,
 | 
				
			||||||
                    EVT_NOTIFY_SIGNAL,
 | 
					                    MmGuidedEventNotify, mGuidedEventGuid[Index],
 | 
				
			||||||
                    TPL_CALLBACK,
 | 
					                    mGuidedEventGuid[Index], &mGuidedEvent[Index]);
 | 
				
			||||||
                    MmGuidedEventNotify,
 | 
					 | 
				
			||||||
                    mGuidedEventGuid[Index],
 | 
					 | 
				
			||||||
                    mGuidedEventGuid[Index],
 | 
					 | 
				
			||||||
                    &mGuidedEvent[Index]
 | 
					 | 
				
			||||||
                    );
 | 
					 | 
				
			||||||
    ASSERT_EFI_ERROR (Status);
 | 
					    ASSERT_EFI_ERROR (Status);
 | 
				
			||||||
    if (EFI_ERROR (Status)) {
 | 
					    if (EFI_ERROR (Status)) {
 | 
				
			||||||
      while (Index-- > 0) {
 | 
					      while (Index-- > 0) {
 | 
				
			||||||
        gBS->CloseEvent (mGuidedEvent[Index]);
 | 
					        gBS->CloseEvent (mGuidedEvent[Index]);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					 | 
				
			||||||
      goto UninstallProtocol;
 | 
					      goto UninstallProtocol;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  return EFI_SUCCESS;
 | 
					  return EFI_SUCCESS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UninstallProtocol:
 | 
					UninstallProtocol:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,6 +7,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
**/
 | 
					**/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <PiDxe.h>
 | 
					#include <PiDxe.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <Library/ArmLib.h>
 | 
					#include <Library/ArmLib.h>
 | 
				
			||||||
@@ -304,7 +305,8 @@ TimerInterruptHandler (
 | 
				
			|||||||
  gInterrupt->EndOfInterrupt (gInterrupt, Source);
 | 
					  gInterrupt->EndOfInterrupt (gInterrupt, Source);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Check if the timer interrupt is active
 | 
					  // Check if the timer interrupt is active
 | 
				
			||||||
  if ((ArmGenericTimerGetTimerCtrlReg ()) & ARM_ARCH_TIMER_ISTATUS) {
 | 
					  if ((ArmGenericTimerGetTimerCtrlReg () ) & ARM_ARCH_TIMER_ISTATUS) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (mTimerNotifyFunction != 0) {
 | 
					    if (mTimerNotifyFunction != 0) {
 | 
				
			||||||
      mTimerNotifyFunction (mTimerPeriod * mElapsedPeriod);
 | 
					      mTimerNotifyFunction (mTimerPeriod * mElapsedPeriod);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -336,6 +338,7 @@ TimerInterruptHandler (
 | 
				
			|||||||
  gBS->RestoreTPL (OriginalTPL);
 | 
					  gBS->RestoreTPL (OriginalTPL);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
  Initialize the state information for the Timer Architectural Protocol and
 | 
					  Initialize the state information for the Timer Architectural Protocol and
 | 
				
			||||||
  the Timer Debug support protocol that allows the debugger to break into a
 | 
					  the Timer Debug support protocol that allows the debugger to break into a
 | 
				
			||||||
@@ -402,18 +405,17 @@ TimerInitialize (
 | 
				
			|||||||
  ASSERT_EFI_ERROR (Status);
 | 
					  ASSERT_EFI_ERROR (Status);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Set up default timer
 | 
					  // Set up default timer
 | 
				
			||||||
  Status = TimerDriverSetTimerPeriod (&gTimer, FixedPcdGet32 (PcdTimerPeriod)); // TIMER_DEFAULT_PERIOD
 | 
					  Status = TimerDriverSetTimerPeriod (&gTimer, FixedPcdGet32(PcdTimerPeriod)); // TIMER_DEFAULT_PERIOD
 | 
				
			||||||
  ASSERT_EFI_ERROR (Status);
 | 
					  ASSERT_EFI_ERROR (Status);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Handle = NULL;
 | 
					  Handle = NULL;
 | 
				
			||||||
  // Install the Timer Architectural Protocol onto a new handle
 | 
					  // Install the Timer Architectural Protocol onto a new handle
 | 
				
			||||||
  Status = gBS->InstallMultipleProtocolInterfaces (
 | 
					  Status = gBS->InstallMultipleProtocolInterfaces(
 | 
				
			||||||
                  &Handle,
 | 
					                  &Handle,
 | 
				
			||||||
                  &gEfiTimerArchProtocolGuid,
 | 
					                  &gEfiTimerArchProtocolGuid,      &gTimer,
 | 
				
			||||||
                  &gTimer,
 | 
					 | 
				
			||||||
                  NULL
 | 
					                  NULL
 | 
				
			||||||
                  );
 | 
					                  );
 | 
				
			||||||
  ASSERT_EFI_ERROR (Status);
 | 
					  ASSERT_EFI_ERROR(Status);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Everything is ready, unmask and enable timer interrupts
 | 
					  // Everything is ready, unmask and enable timer interrupts
 | 
				
			||||||
  TimerCtrlReg = ARM_ARCH_TIMER_ENABLE;
 | 
					  TimerCtrlReg = ARM_ARCH_TIMER_ENABLE;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -60,12 +60,10 @@ typedef struct {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
SEMIHOST_DEVICE_PATH gDevicePath = {
 | 
					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
 | 
					    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 {
 | 
					typedef struct {
 | 
				
			||||||
@@ -117,6 +115,8 @@ FreeFCB (
 | 
				
			|||||||
  FreePool (Fcb);
 | 
					  FreePool (Fcb);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
VolumeOpen (
 | 
					VolumeOpen (
 | 
				
			||||||
  IN  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,
 | 
					  IN  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,
 | 
				
			||||||
@@ -191,16 +191,14 @@ FileOpen (
 | 
				
			|||||||
    return EFI_INVALID_PARAMETER;
 | 
					    return EFI_INVALID_PARAMETER;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if ((OpenMode != EFI_FILE_MODE_READ) &&
 | 
					  if ( (OpenMode != EFI_FILE_MODE_READ) &&
 | 
				
			||||||
       (OpenMode != (EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE)) &&
 | 
					       (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;
 | 
					    return EFI_INVALID_PARAMETER;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (((OpenMode & EFI_FILE_MODE_CREATE) != 0) &&
 | 
					  if (((OpenMode & EFI_FILE_MODE_CREATE) != 0) &&
 | 
				
			||||||
      ((Attributes & EFI_FILE_DIRECTORY) != 0))
 | 
					      ((Attributes & EFI_FILE_DIRECTORY) != 0)) {
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    return EFI_WRITE_PROTECTED;
 | 
					    return EFI_WRITE_PROTECTED;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -209,15 +207,13 @@ FileOpen (
 | 
				
			|||||||
  if (AsciiFileName == NULL) {
 | 
					  if (AsciiFileName == NULL) {
 | 
				
			||||||
    return EFI_OUT_OF_RESOURCES;
 | 
					    return EFI_OUT_OF_RESOURCES;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  UnicodeStrToAsciiStrS (FileName, AsciiFileName, Length);
 | 
					  UnicodeStrToAsciiStrS (FileName, AsciiFileName, Length);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Opening '/', '\', '.', or the NULL pathname is trying to open the root directory
 | 
					  // Opening '/', '\', '.', or the NULL pathname is trying to open the root directory
 | 
				
			||||||
  if ((AsciiStrCmp (AsciiFileName, "\\") == 0) ||
 | 
					  if ((AsciiStrCmp (AsciiFileName, "\\") == 0) ||
 | 
				
			||||||
      (AsciiStrCmp (AsciiFileName, "/")  == 0) ||
 | 
					      (AsciiStrCmp (AsciiFileName, "/")  == 0) ||
 | 
				
			||||||
      (AsciiStrCmp (AsciiFileName, "")   == 0) ||
 | 
					      (AsciiStrCmp (AsciiFileName, "")   == 0) ||
 | 
				
			||||||
      (AsciiStrCmp (AsciiFileName, ".")  == 0))
 | 
					      (AsciiStrCmp (AsciiFileName, ".")  == 0)    ) {
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    FreePool (AsciiFileName);
 | 
					    FreePool (AsciiFileName);
 | 
				
			||||||
    return (VolumeOpen (&gSemihostFs, NewHandle));
 | 
					    return (VolumeOpen (&gSemihostFs, NewHandle));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -236,7 +232,6 @@ FileOpen (
 | 
				
			|||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    SemihostMode = SEMIHOST_FILE_MODE_READ | SEMIHOST_FILE_MODE_BINARY | SEMIHOST_FILE_MODE_UPDATE;
 | 
					    SemihostMode = SEMIHOST_FILE_MODE_READ | SEMIHOST_FILE_MODE_BINARY | SEMIHOST_FILE_MODE_UPDATE;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  Return = SemihostFileOpen (AsciiFileName, SemihostMode, &SemihostHandle);
 | 
					  Return = SemihostFileOpen (AsciiFileName, SemihostMode, &SemihostHandle);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (RETURN_ERROR (Return)) {
 | 
					  if (RETURN_ERROR (Return)) {
 | 
				
			||||||
@@ -351,7 +346,6 @@ TruncateFile (
 | 
				
			|||||||
    if (RETURN_ERROR (Return)) {
 | 
					    if (RETURN_ERROR (Return)) {
 | 
				
			||||||
      goto Error;
 | 
					      goto Error;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    Remaining -= ToRead;
 | 
					    Remaining -= ToRead;
 | 
				
			||||||
    Read      += ToRead;
 | 
					    Read      += ToRead;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -385,12 +379,12 @@ Error:
 | 
				
			|||||||
  if (FileHandle != 0) {
 | 
					  if (FileHandle != 0) {
 | 
				
			||||||
    SemihostFileClose (FileHandle);
 | 
					    SemihostFileClose (FileHandle);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (Buffer != NULL) {
 | 
					  if (Buffer != NULL) {
 | 
				
			||||||
    FreePool (Buffer);
 | 
					    FreePool (Buffer);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return (Status);
 | 
					  return (Status);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@@ -414,7 +408,7 @@ FileClose (
 | 
				
			|||||||
    return EFI_INVALID_PARAMETER;
 | 
					    return EFI_INVALID_PARAMETER;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Fcb = SEMIHOST_FCB_FROM_THIS (This);
 | 
					  Fcb = SEMIHOST_FCB_FROM_THIS(This);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (!Fcb->IsRoot) {
 | 
					  if (!Fcb->IsRoot) {
 | 
				
			||||||
    SemihostFileClose (Fcb->SemihostHandle);
 | 
					    SemihostFileClose (Fcb->SemihostHandle);
 | 
				
			||||||
@@ -426,7 +420,6 @@ FileClose (
 | 
				
			|||||||
    if (Fcb->Info.FileSize < Fcb->Info.PhysicalSize) {
 | 
					    if (Fcb->Info.FileSize < Fcb->Info.PhysicalSize) {
 | 
				
			||||||
      TruncateFile (Fcb->FileName, Fcb->Info.FileSize);
 | 
					      TruncateFile (Fcb->FileName, Fcb->Info.FileSize);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    FreePool (Fcb->FileName);
 | 
					    FreePool (Fcb->FileName);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -478,7 +471,6 @@ FileDelete (
 | 
				
			|||||||
    if (RETURN_ERROR (Return)) {
 | 
					    if (RETURN_ERROR (Return)) {
 | 
				
			||||||
      return EFI_WARN_DELETE_FAILURE;
 | 
					      return EFI_WARN_DELETE_FAILURE;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    return EFI_SUCCESS;
 | 
					    return EFI_SUCCESS;
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    return EFI_WARN_DELETE_FAILURE;
 | 
					    return EFI_WARN_DELETE_FAILURE;
 | 
				
			||||||
@@ -574,15 +566,14 @@ ExtendFile (
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Remaining = Size;
 | 
					  Remaining = Size;
 | 
				
			||||||
  SetMem (WriteBuffer, 0, sizeof (WriteBuffer));
 | 
					  SetMem (WriteBuffer, 0, sizeof(WriteBuffer));
 | 
				
			||||||
  while (Remaining > 0) {
 | 
					  while (Remaining > 0) {
 | 
				
			||||||
    WriteNb   = MIN (Remaining, sizeof (WriteBuffer));
 | 
					    WriteNb = MIN (Remaining, sizeof(WriteBuffer));
 | 
				
			||||||
    WriteSize = WriteNb;
 | 
					    WriteSize = WriteNb;
 | 
				
			||||||
    Return = SemihostFileWrite (Fcb->SemihostHandle, &WriteSize, WriteBuffer);
 | 
					    Return = SemihostFileWrite (Fcb->SemihostHandle, &WriteSize, WriteBuffer);
 | 
				
			||||||
    if (RETURN_ERROR (Return)) {
 | 
					    if (RETURN_ERROR (Return)) {
 | 
				
			||||||
      return EFI_DEVICE_ERROR;
 | 
					      return EFI_DEVICE_ERROR;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    Remaining -= WriteNb;
 | 
					    Remaining -= WriteNb;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -626,9 +617,8 @@ FileWrite (
 | 
				
			|||||||
  Fcb = SEMIHOST_FCB_FROM_THIS (This);
 | 
					  Fcb = SEMIHOST_FCB_FROM_THIS (This);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // We cannot write a read-only file
 | 
					  // We cannot write a read-only file
 | 
				
			||||||
  if (  (Fcb->Info.Attribute & EFI_FILE_READ_ONLY)
 | 
					  if ((Fcb->Info.Attribute & EFI_FILE_READ_ONLY)
 | 
				
			||||||
     || !(Fcb->OpenMode & EFI_FILE_MODE_WRITE))
 | 
					      || !(Fcb->OpenMode & EFI_FILE_MODE_WRITE)) {
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    return EFI_ACCESS_DENIED;
 | 
					    return EFI_ACCESS_DENIED;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -642,7 +632,6 @@ FileWrite (
 | 
				
			|||||||
    if (EFI_ERROR (Status)) {
 | 
					    if (EFI_ERROR (Status)) {
 | 
				
			||||||
      return Status;
 | 
					      return Status;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    Fcb->Info.FileSize = Fcb->Position;
 | 
					    Fcb->Info.FileSize = Fcb->Position;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -661,7 +650,6 @@ FileWrite (
 | 
				
			|||||||
  if (RETURN_ERROR (Return)) {
 | 
					  if (RETURN_ERROR (Return)) {
 | 
				
			||||||
    return EFI_DEVICE_ERROR;
 | 
					    return EFI_DEVICE_ERROR;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  Fcb->Info.PhysicalSize = Length;
 | 
					  Fcb->Info.PhysicalSize = Length;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return EFI_SUCCESS;
 | 
					  return EFI_SUCCESS;
 | 
				
			||||||
@@ -690,7 +678,7 @@ FileGetPosition (
 | 
				
			|||||||
    return EFI_INVALID_PARAMETER;
 | 
					    return EFI_INVALID_PARAMETER;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Fcb = SEMIHOST_FCB_FROM_THIS (This);
 | 
					  Fcb = SEMIHOST_FCB_FROM_THIS(This);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  *Position = Fcb->Position;
 | 
					  *Position = Fcb->Position;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -730,7 +718,8 @@ FileSetPosition (
 | 
				
			|||||||
    if (Position != 0) {
 | 
					    if (Position != 0) {
 | 
				
			||||||
      return EFI_UNSUPPORTED;
 | 
					      return EFI_UNSUPPORTED;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  } else {
 | 
					  }
 | 
				
			||||||
 | 
					  else {
 | 
				
			||||||
    //
 | 
					    //
 | 
				
			||||||
    // UEFI Spec section 12.5:
 | 
					    // UEFI Spec section 12.5:
 | 
				
			||||||
    // "Seeking to position 0xFFFFFFFFFFFFFFFF causes the current position to
 | 
					    // "Seeking to position 0xFFFFFFFFFFFFFFFF causes the current position to
 | 
				
			||||||
@@ -739,7 +728,6 @@ FileSetPosition (
 | 
				
			|||||||
    if (Position == 0xFFFFFFFFFFFFFFFF) {
 | 
					    if (Position == 0xFFFFFFFFFFFFFFFF) {
 | 
				
			||||||
      Position = Fcb->Info.FileSize;
 | 
					      Position = Fcb->Info.FileSize;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    Return = SemihostFileSeek (Fcb->SemihostHandle, MIN (Position, Fcb->Info.FileSize));
 | 
					    Return = SemihostFileSeek (Fcb->SemihostHandle, MIN (Position, Fcb->Info.FileSize));
 | 
				
			||||||
    if (RETURN_ERROR (Return)) {
 | 
					    if (RETURN_ERROR (Return)) {
 | 
				
			||||||
      return EFI_DEVICE_ERROR;
 | 
					      return EFI_DEVICE_ERROR;
 | 
				
			||||||
@@ -779,7 +767,7 @@ GetFileInfo (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  if (Fcb->IsRoot) {
 | 
					  if (Fcb->IsRoot) {
 | 
				
			||||||
    NameSize = 0;
 | 
					    NameSize = 0;
 | 
				
			||||||
    ResultSize = SIZE_OF_EFI_FILE_INFO + sizeof (CHAR16);
 | 
					    ResultSize = SIZE_OF_EFI_FILE_INFO + sizeof(CHAR16);
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    NameSize   = AsciiStrLen (Fcb->FileName) + 1;
 | 
					    NameSize   = AsciiStrLen (Fcb->FileName) + 1;
 | 
				
			||||||
    ResultSize = SIZE_OF_EFI_FILE_INFO + NameSize * sizeof (CHAR16);
 | 
					    ResultSize = SIZE_OF_EFI_FILE_INFO + NameSize * sizeof (CHAR16);
 | 
				
			||||||
@@ -901,12 +889,11 @@ FileGetInfo (
 | 
				
			|||||||
  if ((This == NULL)                         ||
 | 
					  if ((This == NULL)                         ||
 | 
				
			||||||
      (InformationType == NULL)              ||
 | 
					      (InformationType == NULL)              ||
 | 
				
			||||||
      (BufferSize == NULL)                   ||
 | 
					      (BufferSize == NULL)                   ||
 | 
				
			||||||
      ((Buffer == NULL) && (*BufferSize > 0)))
 | 
					      ((Buffer == NULL) && (*BufferSize > 0))  ) {
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    return EFI_INVALID_PARAMETER;
 | 
					    return EFI_INVALID_PARAMETER;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Fcb = SEMIHOST_FCB_FROM_THIS (This);
 | 
					  Fcb = SEMIHOST_FCB_FROM_THIS(This);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {
 | 
					  if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {
 | 
				
			||||||
    Status = GetFilesystemInfo (Fcb, BufferSize, Buffer);
 | 
					    Status = GetFilesystemInfo (Fcb, BufferSize, Buffer);
 | 
				
			||||||
@@ -981,7 +968,6 @@ SetFileInfo (
 | 
				
			|||||||
  if (AsciiFileName == NULL) {
 | 
					  if (AsciiFileName == NULL) {
 | 
				
			||||||
    return EFI_OUT_OF_RESOURCES;
 | 
					    return EFI_OUT_OF_RESOURCES;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  UnicodeStrToAsciiStrS (Info->FileName, AsciiFileName, Length);
 | 
					  UnicodeStrToAsciiStrS (Info->FileName, AsciiFileName, Length);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  FileSizeIsDifferent = (Info->FileSize != Fcb->Info.FileSize);
 | 
					  FileSizeIsDifferent = (Info->FileSize != Fcb->Info.FileSize);
 | 
				
			||||||
@@ -999,8 +985,7 @@ SetFileInfo (
 | 
				
			|||||||
  // description.
 | 
					  // description.
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  if ((Fcb->OpenMode == EFI_FILE_MODE_READ)     ||
 | 
					  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) {
 | 
					    if (FileSizeIsDifferent || FileNameIsDifferent || ReadOnlyIsDifferent) {
 | 
				
			||||||
      Status = EFI_ACCESS_DENIED;
 | 
					      Status = EFI_ACCESS_DENIED;
 | 
				
			||||||
      goto Error;
 | 
					      goto Error;
 | 
				
			||||||
@@ -1021,7 +1006,6 @@ SetFileInfo (
 | 
				
			|||||||
      if (EFI_ERROR (Status)) {
 | 
					      if (EFI_ERROR (Status)) {
 | 
				
			||||||
        goto Error;
 | 
					        goto Error;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					 | 
				
			||||||
      //
 | 
					      //
 | 
				
			||||||
      // The read/write position from the host file system point of view
 | 
					      // 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
 | 
					      // is at the end of the file. If the position from this module
 | 
				
			||||||
@@ -1032,14 +1016,12 @@ SetFileInfo (
 | 
				
			|||||||
        FileSetPosition (&Fcb->File, Fcb->Position);
 | 
					        FileSetPosition (&Fcb->File, Fcb->Position);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    Fcb->Info.FileSize = FileSize;
 | 
					    Fcb->Info.FileSize = FileSize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Return = SemihostFileLength (Fcb->SemihostHandle, &Length);
 | 
					    Return = SemihostFileLength (Fcb->SemihostHandle, &Length);
 | 
				
			||||||
    if (RETURN_ERROR (Return)) {
 | 
					    if (RETURN_ERROR (Return)) {
 | 
				
			||||||
      goto Error;
 | 
					      goto Error;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    Fcb->Info.PhysicalSize = Length;
 | 
					    Fcb->Info.PhysicalSize = Length;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1066,7 +1048,6 @@ SetFileInfo (
 | 
				
			|||||||
    if (RETURN_ERROR (Return)) {
 | 
					    if (RETURN_ERROR (Return)) {
 | 
				
			||||||
      goto Error;
 | 
					      goto Error;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    FreePool (Fcb->FileName);
 | 
					    FreePool (Fcb->FileName);
 | 
				
			||||||
    Fcb->FileName = AsciiFileName;
 | 
					    Fcb->FileName = AsciiFileName;
 | 
				
			||||||
    AsciiFileName = NULL;
 | 
					    AsciiFileName = NULL;
 | 
				
			||||||
@@ -1138,24 +1119,19 @@ FileSetInfo (
 | 
				
			|||||||
    if (Info->Size < (SIZE_OF_EFI_FILE_INFO + StrSize (Info->FileName))) {
 | 
					    if (Info->Size < (SIZE_OF_EFI_FILE_INFO + StrSize (Info->FileName))) {
 | 
				
			||||||
      return EFI_INVALID_PARAMETER;
 | 
					      return EFI_INVALID_PARAMETER;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (BufferSize < Info->Size) {
 | 
					    if (BufferSize < Info->Size) {
 | 
				
			||||||
      return EFI_BAD_BUFFER_SIZE;
 | 
					      return EFI_BAD_BUFFER_SIZE;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    return SetFileInfo (Fcb, Info);
 | 
					    return SetFileInfo (Fcb, Info);
 | 
				
			||||||
  } else if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {
 | 
					  } else if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {
 | 
				
			||||||
    SystemInfo = Buffer;
 | 
					    SystemInfo = Buffer;
 | 
				
			||||||
    if (SystemInfo->Size <
 | 
					    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;
 | 
					      return EFI_INVALID_PARAMETER;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (BufferSize < SystemInfo->Size) {
 | 
					    if (BufferSize < SystemInfo->Size) {
 | 
				
			||||||
      return EFI_BAD_BUFFER_SIZE;
 | 
					      return EFI_BAD_BUFFER_SIZE;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    Buffer = SystemInfo->VolumeLabel;
 | 
					    Buffer = SystemInfo->VolumeLabel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (StrSize (Buffer) > 0) {
 | 
					    if (StrSize (Buffer) > 0) {
 | 
				
			||||||
@@ -1184,14 +1160,13 @@ FileFlush (
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  SEMIHOST_FCB *Fcb;
 | 
					  SEMIHOST_FCB *Fcb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Fcb = SEMIHOST_FCB_FROM_THIS (File);
 | 
					  Fcb = SEMIHOST_FCB_FROM_THIS(File);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (Fcb->IsRoot) {
 | 
					  if (Fcb->IsRoot) {
 | 
				
			||||||
    return EFI_SUCCESS;
 | 
					    return EFI_SUCCESS;
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    if (  (Fcb->Info.Attribute & EFI_FILE_READ_ONLY)
 | 
					    if ((Fcb->Info.Attribute & EFI_FILE_READ_ONLY)
 | 
				
			||||||
       || !(Fcb->OpenMode & EFI_FILE_MODE_WRITE))
 | 
					        || !(Fcb->OpenMode & EFI_FILE_MODE_WRITE)) {
 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      return EFI_ACCESS_DENIED;
 | 
					      return EFI_ACCESS_DENIED;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      return EFI_SUCCESS;
 | 
					      return EFI_SUCCESS;
 | 
				
			||||||
@@ -1217,14 +1192,12 @@ SemihostFsEntryPoint (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    Status = gBS->InstallMultipleProtocolInterfaces (
 | 
					    Status = gBS->InstallMultipleProtocolInterfaces (
 | 
				
			||||||
                    &gInstallHandle,
 | 
					                    &gInstallHandle,
 | 
				
			||||||
                    &gEfiSimpleFileSystemProtocolGuid,
 | 
					                    &gEfiSimpleFileSystemProtocolGuid, &gSemihostFs,
 | 
				
			||||||
                    &gSemihostFs,
 | 
					                    &gEfiDevicePathProtocolGuid,       &gDevicePath,
 | 
				
			||||||
                    &gEfiDevicePathProtocolGuid,
 | 
					 | 
				
			||||||
                    &gDevicePath,
 | 
					 | 
				
			||||||
                    NULL
 | 
					                    NULL
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (EFI_ERROR (Status)) {
 | 
					    if (EFI_ERROR(Status)) {
 | 
				
			||||||
      FreePool (mSemihostFsLabel);
 | 
					      FreePool (mSemihostFsLabel);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -243,3 +243,4 @@ FileFlush (
 | 
				
			|||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // SEMIHOST_FS_H_
 | 
					#endif // SEMIHOST_FS_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,6 +9,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
**/
 | 
					**/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef ASM_MACRO_IO_LIB_H_
 | 
					#ifndef ASM_MACRO_IO_LIB_H_
 | 
				
			||||||
#define ASM_MACRO_IO_LIB_H_
 | 
					#define ASM_MACRO_IO_LIB_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,6 +9,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
**/
 | 
					**/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef ASM_MACRO_IO_LIBV8_H_
 | 
					#ifndef ASM_MACRO_IO_LIBV8_H_
 | 
				
			||||||
#define ASM_MACRO_IO_LIBV8_H_
 | 
					#define ASM_MACRO_IO_LIBV8_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,6 +24,7 @@
 | 
				
			|||||||
        cbnz   SAFE_XREG, 1f        ;\
 | 
					        cbnz   SAFE_XREG, 1f        ;\
 | 
				
			||||||
        b      .                    ;// We should never get here
 | 
					        b      .                    ;// We should never get here
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// CurrentEL : 0xC = EL3; 8 = EL2; 4 = EL1
 | 
					// CurrentEL : 0xC = EL3; 8 = EL2; 4 = EL1
 | 
				
			||||||
// This only selects between EL1 and EL2 and EL3, else we die.
 | 
					// This only selects between EL1 and EL2 and EL3, else we die.
 | 
				
			||||||
// Provide the Macro with a safe temp xreg to use.
 | 
					// Provide the Macro with a safe temp xreg to use.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,7 +17,7 @@
 | 
				
			|||||||
#define MAIR_ATTR_NORMAL_MEMORY_WRITE_THROUGH   0xBBULL
 | 
					#define MAIR_ATTR_NORMAL_MEMORY_WRITE_THROUGH   0xBBULL
 | 
				
			||||||
#define MAIR_ATTR_NORMAL_MEMORY_WRITE_BACK      0xFFULL
 | 
					#define MAIR_ATTR_NORMAL_MEMORY_WRITE_BACK      0xFFULL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MAIR_ATTR(n, value)  ((value) << (((n) >> 2)*8))
 | 
					#define MAIR_ATTR(n,value)                      ((value) << (((n) >> 2)*8))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// Long-descriptor Translation Table format
 | 
					// Long-descriptor Translation Table format
 | 
				
			||||||
@@ -152,6 +152,7 @@
 | 
				
			|||||||
#define TCR_EL1_TBI0_MASK                    (0x01UL << TCR_EL1_TBI0_FIELD)
 | 
					#define TCR_EL1_TBI0_MASK                    (0x01UL << TCR_EL1_TBI0_FIELD)
 | 
				
			||||||
#define TCR_EL1_TBI1_MASK                    (0x01UL << TCR_EL1_TBI1_FIELD)
 | 
					#define TCR_EL1_TBI1_MASK                    (0x01UL << TCR_EL1_TBI1_FIELD)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TCR_EL23_T0SZ_FIELD                  (0)
 | 
					#define TCR_EL23_T0SZ_FIELD                  (0)
 | 
				
			||||||
#define TCR_EL23_IRGN0_FIELD                 (8)
 | 
					#define TCR_EL23_IRGN0_FIELD                 (8)
 | 
				
			||||||
#define TCR_EL23_ORGN0_FIELD                 (10)
 | 
					#define TCR_EL23_ORGN0_FIELD                 (10)
 | 
				
			||||||
@@ -165,6 +166,7 @@
 | 
				
			|||||||
#define TCR_EL23_TG0_MASK                    (0x01UL << TCR_EL23_TG0_FIELD)
 | 
					#define TCR_EL23_TG0_MASK                    (0x01UL << TCR_EL23_TG0_FIELD)
 | 
				
			||||||
#define TCR_EL23_PS_MASK                     (0x07UL << TCR_EL23_PS_FIELD)
 | 
					#define TCR_EL23_PS_MASK                     (0x07UL << TCR_EL23_PS_FIELD)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TCR_RGN_OUTER_NON_CACHEABLE          (0x0UL << 10)
 | 
					#define TCR_RGN_OUTER_NON_CACHEABLE          (0x0UL << 10)
 | 
				
			||||||
#define TCR_RGN_OUTER_WRITE_BACK_ALLOC       (0x1UL << 10)
 | 
					#define TCR_RGN_OUTER_WRITE_BACK_ALLOC       (0x1UL << 10)
 | 
				
			||||||
#define TCR_RGN_OUTER_WRITE_THROUGH          (0x2UL << 10)
 | 
					#define TCR_RGN_OUTER_WRITE_THROUGH          (0x2UL << 10)
 | 
				
			||||||
@@ -193,3 +195,4 @@
 | 
				
			|||||||
// Uses LPAE Page Table format
 | 
					// Uses LPAE Page Table format
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // AARCH64_MMU_H_
 | 
					#endif // AARCH64_MMU_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -48,6 +48,7 @@
 | 
				
			|||||||
#define A9_SCU_SACR_OFFSET          0x50
 | 
					#define A9_SCU_SACR_OFFSET          0x50
 | 
				
			||||||
#define A9_SCU_SSACR_OFFSET         0x54
 | 
					#define A9_SCU_SSACR_OFFSET         0x54
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UINTN
 | 
					UINTN
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGetScuBaseAddress (
 | 
					ArmGetScuBaseAddress (
 | 
				
			||||||
@@ -55,3 +56,4 @@ ArmGetScuBaseAddress (
 | 
				
			|||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // ARM_CORTEX_A9_H_
 | 
					#endif // ARM_CORTEX_A9_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -41,6 +41,7 @@
 | 
				
			|||||||
#define CPSR_IRQ             (1 << 7)
 | 
					#define CPSR_IRQ             (1 << 7)
 | 
				
			||||||
#define CPSR_FIQ             (1 << 6)
 | 
					#define CPSR_FIQ             (1 << 6)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// CPACR - Coprocessor Access Control Register definitions
 | 
					// CPACR - Coprocessor Access Control Register definitions
 | 
				
			||||||
#define CPACR_CP_DENIED(cp)     0x00
 | 
					#define CPACR_CP_DENIED(cp)     0x00
 | 
				
			||||||
#define CPACR_CP_PRIV(cp)       ((0x1 << ((cp) << 1)) & 0x0FFFFFFF)
 | 
					#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_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 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_COUNT                 4096
 | 
				
			||||||
#define TRANSLATION_TABLE_SECTION_SIZE                  (sizeof(UINT32) * TRANSLATION_TABLE_SECTION_COUNT)
 | 
					#define TRANSLATION_TABLE_SECTION_SIZE                  (sizeof(UINT32) * TRANSLATION_TABLE_SECTION_COUNT)
 | 
				
			||||||
#define TRANSLATION_TABLE_SECTION_ALIGNMENT             (sizeof(UINT32) * TRANSLATION_TABLE_SECTION_COUNT)
 | 
					#define TRANSLATION_TABLE_SECTION_ALIGNMENT             (sizeof(UINT32) * TRANSLATION_TABLE_SECTION_COUNT)
 | 
				
			||||||
@@ -136,16 +137,16 @@
 | 
				
			|||||||
#define TT_DESCRIPTOR_CONVERT_TO_PAGE_AP(Desc)                  ((((Desc) & TT_DESCRIPTOR_SECTION_AP_MASK) >> 6) & TT_DESCRIPTOR_PAGE_AP_MASK)
 | 
					#define TT_DESCRIPTOR_CONVERT_TO_PAGE_AP(Desc)                  ((((Desc) & TT_DESCRIPTOR_SECTION_AP_MASK) >> 6) & TT_DESCRIPTOR_PAGE_AP_MASK)
 | 
				
			||||||
#define TT_DESCRIPTOR_CONVERT_TO_PAGE_NG(Desc)                  ((((Desc) & TT_DESCRIPTOR_SECTION_NG_MASK) >> 6) & TT_DESCRIPTOR_PAGE_NG_MASK)
 | 
					#define TT_DESCRIPTOR_CONVERT_TO_PAGE_NG(Desc)                  ((((Desc) & TT_DESCRIPTOR_SECTION_NG_MASK) >> 6) & TT_DESCRIPTOR_PAGE_NG_MASK)
 | 
				
			||||||
#define TT_DESCRIPTOR_CONVERT_TO_PAGE_S(Desc)                  ((((Desc) & TT_DESCRIPTOR_SECTION_S_MASK) >> 6) & TT_DESCRIPTOR_PAGE_S_MASK)
 | 
					#define TT_DESCRIPTOR_CONVERT_TO_PAGE_S(Desc)                  ((((Desc) & TT_DESCRIPTOR_SECTION_S_MASK) >> 6) & TT_DESCRIPTOR_PAGE_S_MASK)
 | 
				
			||||||
#define TT_DESCRIPTOR_CONVERT_TO_PAGE_XN(Desc, IsLargePage)            ((IsLargePage)?\
 | 
					#define TT_DESCRIPTOR_CONVERT_TO_PAGE_XN(Desc,IsLargePage)      ((IsLargePage)? \
 | 
				
			||||||
                                                                    ((((Desc) & TT_DESCRIPTOR_SECTION_XN_MASK) << 11) & TT_DESCRIPTOR_LARGEPAGE_XN_MASK):    \
 | 
					                                                                    ((((Desc) & TT_DESCRIPTOR_SECTION_XN_MASK) << 11) & TT_DESCRIPTOR_LARGEPAGE_XN_MASK):    \
 | 
				
			||||||
                                                                    ((((Desc) & TT_DESCRIPTOR_SECTION_XN_MASK) >> 4) & TT_DESCRIPTOR_PAGE_XN_MASK))
 | 
					                                                                    ((((Desc) & TT_DESCRIPTOR_SECTION_XN_MASK) >> 4) & TT_DESCRIPTOR_PAGE_XN_MASK))
 | 
				
			||||||
#define TT_DESCRIPTOR_CONVERT_TO_PAGE_CACHE_POLICY(Desc, IsLargePage)  (IsLargePage?    \
 | 
					#define TT_DESCRIPTOR_CONVERT_TO_PAGE_CACHE_POLICY(Desc,IsLargePage)      (IsLargePage? \
 | 
				
			||||||
                                                                    (((Desc) & TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK) & TT_DESCRIPTOR_LARGEPAGE_CACHE_POLICY_MASK): \
 | 
					                                                                    (((Desc) & TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK) & TT_DESCRIPTOR_LARGEPAGE_CACHE_POLICY_MASK): \
 | 
				
			||||||
                                                                    (((((Desc) & (0x3 << 12)) >> 6) | (Desc & (0x3 << 2)))))
 | 
					                                                                    (((((Desc) & (0x3 << 12)) >> 6) | (Desc & (0x3 << 2)))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_DESCRIPTOR_CONVERT_TO_SECTION_AP(Desc)                  ((((Desc) & TT_DESCRIPTOR_PAGE_AP_MASK) << 6) & TT_DESCRIPTOR_SECTION_AP_MASK)
 | 
					#define TT_DESCRIPTOR_CONVERT_TO_SECTION_AP(Desc)                  ((((Desc) & TT_DESCRIPTOR_PAGE_AP_MASK) << 6) & TT_DESCRIPTOR_SECTION_AP_MASK)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_DESCRIPTOR_CONVERT_TO_SECTION_CACHE_POLICY(Desc, IsLargePage)  (IsLargePage?    \
 | 
					#define TT_DESCRIPTOR_CONVERT_TO_SECTION_CACHE_POLICY(Desc,IsLargePage)      (IsLargePage? \
 | 
				
			||||||
                                                                    (((Desc) & TT_DESCRIPTOR_LARGEPAGE_CACHE_POLICY_MASK) & TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK): \
 | 
					                                                                    (((Desc) & TT_DESCRIPTOR_LARGEPAGE_CACHE_POLICY_MASK) & TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK): \
 | 
				
			||||||
                                                                    (((((Desc) & (0x3 << 6)) << 6) | (Desc & (0x3 << 2)))))
 | 
					                                                                    (((((Desc) & (0x3 << 6)) << 6) | (Desc & (0x3 << 2)))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,7 +14,8 @@
 | 
				
			|||||||
#define MPIDR_U_BIT_MASK              0x40000000
 | 
					#define MPIDR_U_BIT_MASK              0x40000000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  UINT64                  Mpidr;
 | 
					  UINT32                ClusterId;
 | 
				
			||||||
 | 
					  UINT32                CoreId;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // MP Core Mailbox
 | 
					  // MP Core Mailbox
 | 
				
			||||||
  EFI_PHYSICAL_ADDRESS  MailboxSetAddress;
 | 
					  EFI_PHYSICAL_ADDRESS  MailboxSetAddress;
 | 
				
			||||||
@@ -23,7 +24,7 @@ typedef struct {
 | 
				
			|||||||
  UINT64                MailboxClearValue;
 | 
					  UINT64                MailboxClearValue;
 | 
				
			||||||
} ARM_CORE_INFO;
 | 
					} ARM_CORE_INFO;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct{
 | 
				
			||||||
        UINT64   Signature;
 | 
					        UINT64   Signature;
 | 
				
			||||||
        UINT32   Length;
 | 
					        UINT32   Length;
 | 
				
			||||||
        UINT32   Revision;
 | 
					        UINT32   Revision;
 | 
				
			||||||
@@ -42,11 +43,12 @@ typedef struct {
 | 
				
			|||||||
        ARM_CORE_INFO                *ArmCpus;
 | 
					        ARM_CORE_INFO                *ArmCpus;
 | 
				
			||||||
} ARM_PROCESSOR_TABLE;
 | 
					} ARM_PROCESSOR_TABLE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ARM_MP_CORE_INFO_GUID \
 | 
					#define ARM_MP_CORE_INFO_GUID \
 | 
				
			||||||
  { 0xa4ee0728, 0xe5d7, 0x4ac5,  {0xb2, 0x1e, 0x65, 0x8e, 0xd8, 0x57, 0xe8, 0x34} }
 | 
					  { 0xa4ee0728, 0xe5d7, 0x4ac5,  {0xb2, 0x1e, 0x65, 0x8e, 0xd8, 0x57, 0xe8, 0x34} }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define EFI_ARM_PROCESSOR_TABLE_SIGNATURE        SIGNATURE_64 ('C', 'P', 'U', 'T', 'A', 'B', 'L', 'E')
 | 
					#define EFI_ARM_PROCESSOR_TABLE_SIGNATURE        SIGNATURE_64 ('C', 'P', 'U', 'T', 'A', 'B', 'L', 'E')
 | 
				
			||||||
#define EFI_ARM_PROCESSOR_TABLE_REVISION          0x00010000// 1.0
 | 
					#define EFI_ARM_PROCESSOR_TABLE_REVISION         0x00010000 //1.0
 | 
				
			||||||
#define EFI_ARM_PROCESSOR_TABLE_OEM_ID           SIGNATURE_64('A','R','M',' ', 'L', 't', 'd', ' ')
 | 
					#define EFI_ARM_PROCESSOR_TABLE_OEM_ID           SIGNATURE_64('A','R','M',' ', 'L', 't', 'd', ' ')
 | 
				
			||||||
#define EFI_ARM_PROCESSOR_TABLE_OEM_TABLE_ID     SIGNATURE_64('V', 'E', 'R', 'S', 'A', 'T', 'I', 'L')
 | 
					#define EFI_ARM_PROCESSOR_TABLE_OEM_TABLE_ID     SIGNATURE_64('V', 'E', 'R', 'S', 'A', 'T', 'I', 'L')
 | 
				
			||||||
#define EFI_ARM_PROCESSOR_TABLE_OEM_REVISION     0x00000001
 | 
					#define EFI_ARM_PROCESSOR_TABLE_OEM_REVISION     0x00000001
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,16 +18,17 @@
 | 
				
			|||||||
/// Defines the structure of the CSSELR (Cache Size Selection) register
 | 
					/// Defines the structure of the CSSELR (Cache Size Selection) register
 | 
				
			||||||
typedef union {
 | 
					typedef union {
 | 
				
			||||||
  struct {
 | 
					  struct {
 | 
				
			||||||
    UINT32    InD      : 1;  ///< Instruction not Data bit
 | 
					    UINT32    InD       :1;  ///< Instruction not Data bit
 | 
				
			||||||
    UINT32    Level    : 3;  ///< Cache level (zero based)
 | 
					    UINT32    Level     :3;  ///< Cache level (zero based)
 | 
				
			||||||
    UINT32    TnD      : 1;  ///< Allocation not Data bit
 | 
					    UINT32    TnD       :1;  ///< Allocation not Data bit
 | 
				
			||||||
    UINT32    Reserved : 27; ///< Reserved, RES0
 | 
					    UINT32    Reserved  :27; ///< Reserved, RES0
 | 
				
			||||||
  } Bits; ///< Bitfield definition of the register
 | 
					  } Bits; ///< Bitfield definition of the register
 | 
				
			||||||
  UINT32 Data; ///< The entire 32-bit value
 | 
					  UINT32 Data; ///< The entire 32-bit value
 | 
				
			||||||
} CSSELR_DATA;
 | 
					} CSSELR_DATA;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// The cache type values for the InD field of the CSSELR register
 | 
					/// The cache type values for the InD field of the CSSELR register
 | 
				
			||||||
typedef enum {
 | 
					typedef enum
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
  /// Select the data or unified cache
 | 
					  /// Select the data or unified cache
 | 
				
			||||||
  CsselrCacheTypeDataOrUnified = 0,
 | 
					  CsselrCacheTypeDataOrUnified = 0,
 | 
				
			||||||
  /// Select the instruction cache
 | 
					  /// Select the instruction cache
 | 
				
			||||||
@@ -38,18 +39,18 @@ typedef enum {
 | 
				
			|||||||
/// Defines the structure of the CCSIDR (Current Cache Size ID) register
 | 
					/// Defines the structure of the CCSIDR (Current Cache Size ID) register
 | 
				
			||||||
typedef union {
 | 
					typedef union {
 | 
				
			||||||
  struct {
 | 
					  struct {
 | 
				
			||||||
    UINT64    LineSize      : 3;      ///< Line size (Log2(Num bytes in cache) - 4)
 | 
					    UINT64    LineSize           :3;  ///< Line size (Log2(Num bytes in cache) - 4)
 | 
				
			||||||
    UINT64    Associativity : 10;     ///< Associativity - 1
 | 
					    UINT64    Associativity      :10; ///< Associativity - 1
 | 
				
			||||||
    UINT64    NumSets       : 15;     ///< Number of sets in the cache -1
 | 
					    UINT64    NumSets            :15; ///< Number of sets in the cache -1
 | 
				
			||||||
    UINT64    Unknown       : 4;      ///< Reserved, UNKNOWN
 | 
					    UINT64    Unknown            :4;  ///< Reserved, UNKNOWN
 | 
				
			||||||
    UINT64    Reserved      : 32;     ///< Reserved, RES0
 | 
					    UINT64    Reserved           :32; ///< Reserved, RES0
 | 
				
			||||||
  } BitsNonCcidx; ///< Bitfield definition of the register when FEAT_CCIDX is not supported.
 | 
					  } BitsNonCcidx; ///< Bitfield definition of the register when FEAT_CCIDX is not supported.
 | 
				
			||||||
  struct {
 | 
					  struct {
 | 
				
			||||||
    UINT64    LineSize      : 3;      ///< Line size (Log2(Num bytes in cache) - 4)
 | 
					    UINT64    LineSize           :3;  ///< Line size (Log2(Num bytes in cache) - 4)
 | 
				
			||||||
    UINT64    Associativity : 21;     ///< Associativity - 1
 | 
					    UINT64    Associativity      :21; ///< Associativity - 1
 | 
				
			||||||
    UINT64    Reserved1     : 8;      ///< Reserved, RES0
 | 
					    UINT64    Reserved1          :8;  ///< Reserved, RES0
 | 
				
			||||||
    UINT64    NumSets       : 24;     ///< Number of sets in the cache -1
 | 
					    UINT64    NumSets            :24; ///< Number of sets in the cache -1
 | 
				
			||||||
    UINT64    Reserved2     : 8;      ///< Reserved, RES0
 | 
					    UINT64    Reserved2          :8;  ///< Reserved, RES0
 | 
				
			||||||
  } BitsCcidxAA64; ///< Bitfield definition of the register when FEAT_IDX is supported.
 | 
					  } BitsCcidxAA64; ///< Bitfield definition of the register when FEAT_IDX is supported.
 | 
				
			||||||
  struct {
 | 
					  struct {
 | 
				
			||||||
    UINT64    LineSize           : 3;
 | 
					    UINT64    LineSize           : 3;
 | 
				
			||||||
@@ -63,8 +64,8 @@ typedef union {
 | 
				
			|||||||
/// Defines the structure of the AARCH32 CCSIDR2 register.
 | 
					/// Defines the structure of the AARCH32 CCSIDR2 register.
 | 
				
			||||||
typedef union {
 | 
					typedef union {
 | 
				
			||||||
  struct {
 | 
					  struct {
 | 
				
			||||||
    UINT32    NumSets  : 24;          ///< Number of sets in the cache - 1
 | 
					    UINT32 NumSets               :24; ///< Number of sets in the cache - 1
 | 
				
			||||||
    UINT32    Reserved : 8;           ///< Reserved, RES0
 | 
					    UINT32 Reserved              :8;  ///< Reserved, RES0
 | 
				
			||||||
  } Bits; ///< Bitfield definition of the register
 | 
					  } Bits; ///< Bitfield definition of the register
 | 
				
			||||||
  UINT32 Data; ///< The entire 32-bit value
 | 
					  UINT32 Data; ///< The entire 32-bit value
 | 
				
			||||||
} CCSIDR2_DATA;
 | 
					} CCSIDR2_DATA;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,6 +17,7 @@ typedef enum {
 | 
				
			|||||||
  ARM_GIC_ARCH_REVISION_3
 | 
					  ARM_GIC_ARCH_REVISION_3
 | 
				
			||||||
} ARM_GIC_ARCH_REVISION;
 | 
					} ARM_GIC_ARCH_REVISION;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ARM_GIC_ARCH_REVISION
 | 
					ARM_GIC_ARCH_REVISION
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicGetSupportedArchRevision (
 | 
					ArmGicGetSupportedArchRevision (
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -52,6 +52,7 @@
 | 
				
			|||||||
#define ARM_GIC_ICDICFR_LEVEL_TRIGGERED  0x0  // Level triggered interrupt
 | 
					#define ARM_GIC_ICDICFR_LEVEL_TRIGGERED  0x0  // Level triggered interrupt
 | 
				
			||||||
#define ARM_GIC_ICDICFR_EDGE_TRIGGERED   0x1  // Edge triggered interrupt
 | 
					#define ARM_GIC_ICDICFR_EDGE_TRIGGERED   0x1  // Edge triggered interrupt
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GIC Redistributor
 | 
					// GIC Redistributor
 | 
				
			||||||
#define ARM_GICR_CTLR_FRAME_SIZE         SIZE_64KB
 | 
					#define ARM_GICR_CTLR_FRAME_SIZE         SIZE_64KB
 | 
				
			||||||
#define ARM_GICR_SGI_PPI_FRAME_SIZE      SIZE_64KB
 | 
					#define ARM_GICR_SGI_PPI_FRAME_SIZE      SIZE_64KB
 | 
				
			||||||
@@ -129,7 +130,7 @@ VOID
 | 
				
			|||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicSetSecureInterrupts (
 | 
					ArmGicSetSecureInterrupts (
 | 
				
			||||||
  IN  UINTN         GicDistributorBase,
 | 
					  IN  UINTN         GicDistributorBase,
 | 
				
			||||||
  IN  UINTN  *GicSecureInterruptMask,
 | 
					  IN  UINTN*        GicSecureInterruptMask,
 | 
				
			||||||
  IN  UINTN         GicSecureInterruptMaskSize
 | 
					  IN  UINTN         GicSecureInterruptMaskSize
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#ifdef MDE_CPU_ARM
 | 
					#ifdef MDE_CPU_ARM
 | 
				
			||||||
  #include <Chipset/ArmV7.h>
 | 
					  #include <Chipset/ArmV7.h>
 | 
				
			||||||
#elif defined (MDE_CPU_AARCH64)
 | 
					#elif defined(MDE_CPU_AARCH64)
 | 
				
			||||||
  #include <Chipset/AArch64.h>
 | 
					  #include <Chipset/AArch64.h>
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
 #error "Unknown chipset."
 | 
					 #error "Unknown chipset."
 | 
				
			||||||
@@ -59,12 +59,8 @@ typedef struct {
 | 
				
			|||||||
  ARM_MEMORY_REGION_ATTRIBUTES  Attributes;
 | 
					  ARM_MEMORY_REGION_ATTRIBUTES  Attributes;
 | 
				
			||||||
} ARM_MEMORY_REGION_DESCRIPTOR;
 | 
					} ARM_MEMORY_REGION_DESCRIPTOR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef VOID (*CACHE_OPERATION)(
 | 
					typedef VOID (*CACHE_OPERATION)(VOID);
 | 
				
			||||||
  VOID
 | 
					typedef VOID (*LINE_OPERATION)(UINTN);
 | 
				
			||||||
  );
 | 
					 | 
				
			||||||
typedef VOID (*LINE_OPERATION)(
 | 
					 | 
				
			||||||
  UINTN
 | 
					 | 
				
			||||||
  );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// ARM Processor Mode
 | 
					// ARM Processor Mode
 | 
				
			||||||
@@ -111,10 +107,6 @@ typedef enum {
 | 
				
			|||||||
#define GET_CORE_ID(MpId)     ((MpId) & ARM_CORE_MASK)
 | 
					#define GET_CORE_ID(MpId)     ((MpId) & ARM_CORE_MASK)
 | 
				
			||||||
#define GET_CLUSTER_ID(MpId)  (((MpId) & ARM_CLUSTER_MASK) >> 8)
 | 
					#define GET_CLUSTER_ID(MpId)  (((MpId) & ARM_CLUSTER_MASK) >> 8)
 | 
				
			||||||
#define GET_MPID(ClusterId, CoreId)   (((ClusterId) << 8) | (CoreId))
 | 
					#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)
 | 
					#define PRIMARY_CORE_ID       (PcdGet32(PcdArmPrimaryCore) & ARM_CORE_MASK)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Reads the CCSIDR register for the specified cache.
 | 
					/** Reads the CCSIDR register for the specified cache.
 | 
				
			||||||
@@ -191,6 +183,7 @@ ArmInvalidateDataCache (
 | 
				
			|||||||
  VOID
 | 
					  VOID
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmCleanInvalidateDataCache (
 | 
					ArmCleanInvalidateDataCache (
 | 
				
			||||||
@@ -230,8 +223,8 @@ ArmInvalidateInstructionCacheEntryToPoUByMVA (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmCleanDataCacheEntryByMVA (
 | 
					ArmCleanDataCacheEntryByMVA (
 | 
				
			||||||
  IN  UINTN  Address
 | 
					IN  UINTN   Address
 | 
				
			||||||
  );
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
@@ -580,6 +573,7 @@ ArmWriteHVBar (
 | 
				
			|||||||
  IN  UINTN   HypModeVectorBase
 | 
					  IN  UINTN   HypModeVectorBase
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// Helper functions for accessing CPU ACTLR
 | 
					// Helper functions for accessing CPU ACTLR
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
@@ -742,6 +736,7 @@ ArmGetPhysicalAddressBits (
 | 
				
			|||||||
  VOID
 | 
					  VOID
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
///
 | 
					///
 | 
				
			||||||
///  ID Register Helper functions
 | 
					///  ID Register Helper functions
 | 
				
			||||||
///
 | 
					///
 | 
				
			||||||
@@ -773,7 +768,6 @@ ArmHasCcidx (
 | 
				
			|||||||
///
 | 
					///
 | 
				
			||||||
/// AArch32-only ID Register Helper functions
 | 
					/// AArch32-only ID Register Helper functions
 | 
				
			||||||
///
 | 
					///
 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
  Check whether the CPU supports the Security extensions
 | 
					  Check whether the CPU supports the Security extensions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -785,7 +779,6 @@ EFIAPI
 | 
				
			|||||||
ArmHasSecurityExtensions (
 | 
					ArmHasSecurityExtensions (
 | 
				
			||||||
  VOID
 | 
					  VOID
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif // MDE_CPU_ARM
 | 
					#endif // MDE_CPU_ARM
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // ARM_LIB_H_
 | 
					#endif // ARM_LIB_H_
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -47,7 +47,7 @@ typedef struct {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  MTL_CHANNEL_TYPE ChannelType;
 | 
					  MTL_CHANNEL_TYPE ChannelType;
 | 
				
			||||||
  MTL_MAILBOX      *CONST    MailBox;
 | 
					  MTL_MAILBOX      * CONST MailBox;
 | 
				
			||||||
  MTL_DOORBELL     DoorBell;
 | 
					  MTL_DOORBELL     DoorBell;
 | 
				
			||||||
} MTL_CHANNEL;
 | 
					} MTL_CHANNEL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -71,7 +71,7 @@ MtlWaitUntilChannelFree (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  @retval UINT32*      Pointer to the payload.
 | 
					  @retval UINT32*      Pointer to the payload.
 | 
				
			||||||
**/
 | 
					**/
 | 
				
			||||||
UINT32 *
 | 
					UINT32*
 | 
				
			||||||
MtlGetChannelPayload (
 | 
					MtlGetChannelPayload (
 | 
				
			||||||
  IN MTL_CHANNEL  *Channel
 | 
					  IN MTL_CHANNEL  *Channel
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
@@ -128,3 +128,4 @@ MtlReceiveMessage (
 | 
				
			|||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif  /* ARM_MTL_LIB_H_ */
 | 
					#endif  /* ARM_MTL_LIB_H_ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,5 @@
 | 
				
			|||||||
/** @file
 | 
					/** @file
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
*  Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
 | 
					 | 
				
			||||||
*  Copyright (c) 2012-2014, ARM Limited. All rights reserved.
 | 
					*  Copyright (c) 2012-2014, ARM Limited. All rights reserved.
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
*  SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
					*  SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
				
			||||||
@@ -38,76 +37,4 @@ ArmCallSmc (
 | 
				
			|||||||
  IN OUT ARM_SMC_ARGS *Args
 | 
					  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_
 | 
					#endif // ARM_SMC_LIB_H_
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,13 +8,15 @@
 | 
				
			|||||||
*
 | 
					*
 | 
				
			||||||
**/
 | 
					**/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef OEM_MISC_LIB_H_
 | 
					#ifndef OEM_MISC_LIB_H_
 | 
				
			||||||
#define OEM_MISC_LIB_H_
 | 
					#define OEM_MISC_LIB_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <Uefi.h>
 | 
					#include <Uefi.h>
 | 
				
			||||||
#include <IndustryStandard/SmBios.h>
 | 
					#include <IndustryStandard/SmBios.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef enum {
 | 
					typedef enum
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
  CpuCacheL1 = 1,
 | 
					  CpuCacheL1 = 1,
 | 
				
			||||||
  CpuCacheL2,
 | 
					  CpuCacheL2,
 | 
				
			||||||
  CpuCacheL3,
 | 
					  CpuCacheL3,
 | 
				
			||||||
@@ -25,7 +27,8 @@ typedef enum {
 | 
				
			|||||||
  CpuCacheLevelMax
 | 
					  CpuCacheLevelMax
 | 
				
			||||||
} OEM_MISC_CPU_CACHE_LEVEL;
 | 
					} OEM_MISC_CPU_CACHE_LEVEL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
  UINT8 Voltage;        ///< Processor voltage
 | 
					  UINT8 Voltage;        ///< Processor voltage
 | 
				
			||||||
  UINT16 CurrentSpeed;  ///< Current clock speed in MHz
 | 
					  UINT16 CurrentSpeed;  ///< Current clock speed in MHz
 | 
				
			||||||
  UINT16 MaxSpeed;      ///< Maximum clock speed in MHz
 | 
					  UINT16 MaxSpeed;      ///< Maximum clock speed in MHz
 | 
				
			||||||
@@ -35,19 +38,17 @@ typedef struct {
 | 
				
			|||||||
  UINT16 ThreadCount;   ///< Number of threads per processor
 | 
					  UINT16 ThreadCount;   ///< Number of threads per processor
 | 
				
			||||||
} OEM_MISC_PROCESSOR_DATA;
 | 
					} OEM_MISC_PROCESSOR_DATA;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef enum {
 | 
					typedef enum
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
    ProductNameType01,
 | 
					    ProductNameType01,
 | 
				
			||||||
    SerialNumType01,
 | 
					    SerialNumType01,
 | 
				
			||||||
    UuidType01,
 | 
					    UuidType01,
 | 
				
			||||||
    SystemManufacturerType01,
 | 
					    SystemManufacturerType01,
 | 
				
			||||||
  VersionType01,
 | 
					 | 
				
			||||||
    SkuNumberType01,
 | 
					    SkuNumberType01,
 | 
				
			||||||
    FamilyType01,
 | 
					    FamilyType01,
 | 
				
			||||||
    AssertTagType02,
 | 
					    AssertTagType02,
 | 
				
			||||||
    SerialNumberType02,
 | 
					    SerialNumberType02,
 | 
				
			||||||
    BoardManufacturerType02,
 | 
					    BoardManufacturerType02,
 | 
				
			||||||
  ProductNameType02,
 | 
					 | 
				
			||||||
  VersionType02,
 | 
					 | 
				
			||||||
    SkuNumberType02,
 | 
					    SkuNumberType02,
 | 
				
			||||||
    ChassisLocationType02,
 | 
					    ChassisLocationType02,
 | 
				
			||||||
    AssetTagType03,
 | 
					    AssetTagType03,
 | 
				
			||||||
@@ -56,8 +57,6 @@ typedef enum {
 | 
				
			|||||||
    ChassisTypeType03,
 | 
					    ChassisTypeType03,
 | 
				
			||||||
    ManufacturerType03,
 | 
					    ManufacturerType03,
 | 
				
			||||||
    SkuNumberType03,
 | 
					    SkuNumberType03,
 | 
				
			||||||
  ProcessorPartNumType04,
 | 
					 | 
				
			||||||
  ProcessorSerialNumType04,
 | 
					 | 
				
			||||||
    SmbiosHiiStringFieldMax
 | 
					    SmbiosHiiStringFieldMax
 | 
				
			||||||
} OEM_MISC_SMBIOS_HII_STRING_FIELD;
 | 
					} OEM_MISC_SMBIOS_HII_STRING_FIELD;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -81,7 +81,7 @@ SemihostFileLength (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
**/
 | 
					**/
 | 
				
			||||||
RETURN_STATUS
 | 
					RETURN_STATUS
 | 
				
			||||||
SemihostFileTmpName (
 | 
					SemihostFileTmpName(
 | 
				
			||||||
  OUT  VOID   *Buffer,
 | 
					  OUT  VOID   *Buffer,
 | 
				
			||||||
  IN   UINT8  Identifier,
 | 
					  IN   UINT8  Identifier,
 | 
				
			||||||
  IN   UINTN  Length
 | 
					  IN   UINTN  Length
 | 
				
			||||||
@@ -104,7 +104,7 @@ SemihostFileRemove (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
**/
 | 
					**/
 | 
				
			||||||
RETURN_STATUS
 | 
					RETURN_STATUS
 | 
				
			||||||
SemihostFileRename (
 | 
					SemihostFileRename(
 | 
				
			||||||
  IN  CHAR8  *FileName,
 | 
					  IN  CHAR8  *FileName,
 | 
				
			||||||
  IN  CHAR8  *NewFileName
 | 
					  IN  CHAR8  *NewFileName
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,10 +32,10 @@
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *ARM_MP_CORE_INFO_GET)(
 | 
					(EFIAPI * ARM_MP_CORE_INFO_GET) (
 | 
				
			||||||
  OUT UINTN                   *ArmCoreCount,
 | 
					  OUT UINTN                   *ArmCoreCount,
 | 
				
			||||||
  OUT ARM_CORE_INFO           **ArmCoreTable
 | 
					  OUT ARM_CORE_INFO           **ArmCoreTable
 | 
				
			||||||
  );
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
///
 | 
					///
 | 
				
			||||||
/// This service abstracts the ability to migrate contents of the platform early memory store.
 | 
					/// This service abstracts the ability to migrate contents of the platform early memory store.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,3 +18,4 @@
 | 
				
			|||||||
#define SCMI_MAX_STR_LEN          16
 | 
					#define SCMI_MAX_STR_LEN          16
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* ARM_SCMI_H_ */
 | 
					#endif /* ARM_SCMI_H_ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -50,7 +50,7 @@ typedef struct _SCMI_BASE_PROTOCOL SCMI_BASE_PROTOCOL;
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_BASE_GET_VERSION)(
 | 
					(EFIAPI *SCMI_BASE_GET_VERSION) (
 | 
				
			||||||
  IN  SCMI_BASE_PROTOCOL  *This,
 | 
					  IN  SCMI_BASE_PROTOCOL  *This,
 | 
				
			||||||
  OUT UINT32              *Version
 | 
					  OUT UINT32              *Version
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
@@ -67,7 +67,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_BASE_GET_TOTAL_PROTOCOLS)(
 | 
					(EFIAPI *SCMI_BASE_GET_TOTAL_PROTOCOLS) (
 | 
				
			||||||
  IN  SCMI_BASE_PROTOCOL  *This,
 | 
					  IN  SCMI_BASE_PROTOCOL  *This,
 | 
				
			||||||
  OUT UINT32              *TotalProtocols
 | 
					  OUT UINT32              *TotalProtocols
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
@@ -85,7 +85,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_BASE_DISCOVER_VENDOR)(
 | 
					(EFIAPI *SCMI_BASE_DISCOVER_VENDOR) (
 | 
				
			||||||
  IN  SCMI_BASE_PROTOCOL  *This,
 | 
					  IN  SCMI_BASE_PROTOCOL  *This,
 | 
				
			||||||
  OUT UINT8               VendorIdentifier[SCMI_MAX_STR_LEN]
 | 
					  OUT UINT8               VendorIdentifier[SCMI_MAX_STR_LEN]
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
@@ -103,7 +103,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_BASE_DISCOVER_SUB_VENDOR)(
 | 
					(EFIAPI *SCMI_BASE_DISCOVER_SUB_VENDOR) (
 | 
				
			||||||
  IN  SCMI_BASE_PROTOCOL  *This,
 | 
					  IN  SCMI_BASE_PROTOCOL  *This,
 | 
				
			||||||
  OUT UINT8               VendorIdentifier[SCMI_MAX_STR_LEN]
 | 
					  OUT UINT8               VendorIdentifier[SCMI_MAX_STR_LEN]
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
@@ -120,7 +120,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_BASE_DISCOVER_IMPLEMENTATION_VERSION)(
 | 
					(EFIAPI *SCMI_BASE_DISCOVER_IMPLEMENTATION_VERSION) (
 | 
				
			||||||
  IN  SCMI_BASE_PROTOCOL  *This,
 | 
					  IN  SCMI_BASE_PROTOCOL  *This,
 | 
				
			||||||
  OUT UINT32              *ImplementationVersion
 | 
					  OUT UINT32              *ImplementationVersion
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
@@ -141,7 +141,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_BASE_DISCOVER_LIST_PROTOCOLS)(
 | 
					(EFIAPI *SCMI_BASE_DISCOVER_LIST_PROTOCOLS) (
 | 
				
			||||||
  IN     SCMI_BASE_PROTOCOL  *This,
 | 
					  IN     SCMI_BASE_PROTOCOL  *This,
 | 
				
			||||||
  IN OUT UINT32              *ProtocolListSize,
 | 
					  IN OUT UINT32              *ProtocolListSize,
 | 
				
			||||||
  OUT    UINT8               *ProtocolList
 | 
					  OUT    UINT8               *ProtocolList
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@
 | 
				
			|||||||
#include <Protocol/ArmScmi.h>
 | 
					#include <Protocol/ArmScmi.h>
 | 
				
			||||||
#include <Protocol/ArmScmiClockProtocol.h>
 | 
					#include <Protocol/ArmScmiClockProtocol.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ARM_SCMI_CLOCK2_PROTOCOL_GUID  {\
 | 
					#define ARM_SCMI_CLOCK2_PROTOCOL_GUID { \
 | 
				
			||||||
  0xb8d8caf2, 0x9e94, 0x462c, { 0xa8, 0x34, 0x6c, 0x99, 0xfc, 0x05, 0xef, 0xcf } \
 | 
					  0xb8d8caf2, 0x9e94, 0x462c, { 0xa8, 0x34, 0x6c, 0x99, 0xfc, 0x05, 0xef, 0xcf } \
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -39,7 +39,7 @@ typedef struct _SCMI_CLOCK2_PROTOCOL SCMI_CLOCK2_PROTOCOL;
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_CLOCK2_GET_VERSION)(
 | 
					(EFIAPI *SCMI_CLOCK2_GET_VERSION) (
 | 
				
			||||||
  IN  SCMI_CLOCK2_PROTOCOL  *This,
 | 
					  IN  SCMI_CLOCK2_PROTOCOL  *This,
 | 
				
			||||||
  OUT UINT32                *Version
 | 
					  OUT UINT32                *Version
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
@@ -57,7 +57,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_CLOCK2_GET_TOTAL_CLOCKS)(
 | 
					(EFIAPI *SCMI_CLOCK2_GET_TOTAL_CLOCKS) (
 | 
				
			||||||
  IN  SCMI_CLOCK2_PROTOCOL  *This,
 | 
					  IN  SCMI_CLOCK2_PROTOCOL  *This,
 | 
				
			||||||
  OUT UINT32                *TotalClocks
 | 
					  OUT UINT32                *TotalClocks
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
@@ -77,7 +77,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_CLOCK2_GET_CLOCK_ATTRIBUTES)(
 | 
					(EFIAPI *SCMI_CLOCK2_GET_CLOCK_ATTRIBUTES) (
 | 
				
			||||||
  IN  SCMI_CLOCK2_PROTOCOL  *This,
 | 
					  IN  SCMI_CLOCK2_PROTOCOL  *This,
 | 
				
			||||||
  IN  UINT32                ClockId,
 | 
					  IN  UINT32                ClockId,
 | 
				
			||||||
  OUT BOOLEAN               *Enabled,
 | 
					  OUT BOOLEAN               *Enabled,
 | 
				
			||||||
@@ -109,7 +109,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_CLOCK2_DESCRIBE_RATES)(
 | 
					(EFIAPI *SCMI_CLOCK2_DESCRIBE_RATES) (
 | 
				
			||||||
  IN     SCMI_CLOCK2_PROTOCOL     *This,
 | 
					  IN     SCMI_CLOCK2_PROTOCOL     *This,
 | 
				
			||||||
  IN     UINT32                   ClockId,
 | 
					  IN     UINT32                   ClockId,
 | 
				
			||||||
  OUT    SCMI_CLOCK_RATE_FORMAT   *Format,
 | 
					  OUT    SCMI_CLOCK_RATE_FORMAT   *Format,
 | 
				
			||||||
@@ -131,7 +131,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_CLOCK2_RATE_GET)(
 | 
					(EFIAPI *SCMI_CLOCK2_RATE_GET) (
 | 
				
			||||||
  IN  SCMI_CLOCK2_PROTOCOL  *This,
 | 
					  IN  SCMI_CLOCK2_PROTOCOL  *This,
 | 
				
			||||||
  IN  UINT32                ClockId,
 | 
					  IN  UINT32                ClockId,
 | 
				
			||||||
  OUT UINT64                *Rate
 | 
					  OUT UINT64                *Rate
 | 
				
			||||||
@@ -149,7 +149,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_CLOCK2_RATE_SET)(
 | 
					(EFIAPI *SCMI_CLOCK2_RATE_SET) (
 | 
				
			||||||
  IN SCMI_CLOCK2_PROTOCOL   *This,
 | 
					  IN SCMI_CLOCK2_PROTOCOL   *This,
 | 
				
			||||||
  IN UINT32                 ClockId,
 | 
					  IN UINT32                 ClockId,
 | 
				
			||||||
  IN UINT64                 Rate
 | 
					  IN UINT64                 Rate
 | 
				
			||||||
@@ -168,7 +168,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_CLOCK2_ENABLE)(
 | 
					(EFIAPI *SCMI_CLOCK2_ENABLE) (
 | 
				
			||||||
  IN SCMI_CLOCK2_PROTOCOL   *This,
 | 
					  IN SCMI_CLOCK2_PROTOCOL   *This,
 | 
				
			||||||
  IN UINT32                 ClockId,
 | 
					  IN UINT32                 ClockId,
 | 
				
			||||||
  IN BOOLEAN                Enable
 | 
					  IN BOOLEAN                Enable
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,7 +14,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <Protocol/ArmScmi.h>
 | 
					#include <Protocol/ArmScmi.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ARM_SCMI_CLOCK_PROTOCOL_GUID  {\
 | 
					#define ARM_SCMI_CLOCK_PROTOCOL_GUID { \
 | 
				
			||||||
  0x91ce67a8, 0xe0aa, 0x4012, {0xb9, 0x9f, 0xb6, 0xfc, 0xf3, 0x4, 0x8e, 0xaa} \
 | 
					  0x91ce67a8, 0xe0aa, 0x4012, {0xb9, 0x9f, 0xb6, 0xfc, 0xf3, 0x4, 0x8e, 0xaa} \
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -89,7 +89,7 @@ typedef struct _SCMI_CLOCK_PROTOCOL SCMI_CLOCK_PROTOCOL;
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_CLOCK_GET_VERSION)(
 | 
					(EFIAPI *SCMI_CLOCK_GET_VERSION) (
 | 
				
			||||||
  IN  SCMI_CLOCK_PROTOCOL  *This,
 | 
					  IN  SCMI_CLOCK_PROTOCOL  *This,
 | 
				
			||||||
  OUT UINT32               *Version
 | 
					  OUT UINT32               *Version
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
@@ -107,7 +107,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_CLOCK_GET_TOTAL_CLOCKS)(
 | 
					(EFIAPI *SCMI_CLOCK_GET_TOTAL_CLOCKS) (
 | 
				
			||||||
  IN  SCMI_CLOCK_PROTOCOL  *This,
 | 
					  IN  SCMI_CLOCK_PROTOCOL  *This,
 | 
				
			||||||
  OUT UINT32               *TotalClocks
 | 
					  OUT UINT32               *TotalClocks
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
@@ -127,7 +127,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_CLOCK_GET_CLOCK_ATTRIBUTES)(
 | 
					(EFIAPI *SCMI_CLOCK_GET_CLOCK_ATTRIBUTES) (
 | 
				
			||||||
  IN  SCMI_CLOCK_PROTOCOL  *This,
 | 
					  IN  SCMI_CLOCK_PROTOCOL  *This,
 | 
				
			||||||
  IN  UINT32               ClockId,
 | 
					  IN  UINT32               ClockId,
 | 
				
			||||||
  OUT BOOLEAN              *Enabled,
 | 
					  OUT BOOLEAN              *Enabled,
 | 
				
			||||||
@@ -159,7 +159,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_CLOCK_DESCRIBE_RATES)(
 | 
					(EFIAPI *SCMI_CLOCK_DESCRIBE_RATES) (
 | 
				
			||||||
  IN     SCMI_CLOCK_PROTOCOL     *This,
 | 
					  IN     SCMI_CLOCK_PROTOCOL     *This,
 | 
				
			||||||
  IN     UINT32                   ClockId,
 | 
					  IN     UINT32                   ClockId,
 | 
				
			||||||
  OUT    SCMI_CLOCK_RATE_FORMAT  *Format,
 | 
					  OUT    SCMI_CLOCK_RATE_FORMAT  *Format,
 | 
				
			||||||
@@ -181,7 +181,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_CLOCK_RATE_GET)(
 | 
					(EFIAPI *SCMI_CLOCK_RATE_GET) (
 | 
				
			||||||
  IN  SCMI_CLOCK_PROTOCOL  *This,
 | 
					  IN  SCMI_CLOCK_PROTOCOL  *This,
 | 
				
			||||||
  IN  UINT32               ClockId,
 | 
					  IN  UINT32               ClockId,
 | 
				
			||||||
  OUT UINT64               *Rate
 | 
					  OUT UINT64               *Rate
 | 
				
			||||||
@@ -199,7 +199,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_CLOCK_RATE_SET)(
 | 
					(EFIAPI *SCMI_CLOCK_RATE_SET) (
 | 
				
			||||||
  IN SCMI_CLOCK_PROTOCOL  *This,
 | 
					  IN SCMI_CLOCK_PROTOCOL  *This,
 | 
				
			||||||
  IN UINT32               ClockId,
 | 
					  IN UINT32               ClockId,
 | 
				
			||||||
  IN UINT64               Rate
 | 
					  IN UINT64               Rate
 | 
				
			||||||
@@ -215,3 +215,4 @@ typedef struct _SCMI_CLOCK_PROTOCOL {
 | 
				
			|||||||
} SCMI_CLOCK_PROTOCOL;
 | 
					} SCMI_CLOCK_PROTOCOL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* ARM_SCMI_CLOCK_PROTOCOL_H_ */
 | 
					#endif /* ARM_SCMI_CLOCK_PROTOCOL_H_ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -92,7 +92,7 @@ typedef struct {
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_PERFORMANCE_GET_VERSION)(
 | 
					(EFIAPI *SCMI_PERFORMANCE_GET_VERSION) (
 | 
				
			||||||
  IN  SCMI_PERFORMANCE_PROTOCOL  *This,
 | 
					  IN  SCMI_PERFORMANCE_PROTOCOL  *This,
 | 
				
			||||||
  OUT UINT32                     *Version
 | 
					  OUT UINT32                     *Version
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
@@ -109,7 +109,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_PERFORMANCE_GET_ATTRIBUTES)(
 | 
					(EFIAPI *SCMI_PERFORMANCE_GET_ATTRIBUTES) (
 | 
				
			||||||
  IN  SCMI_PERFORMANCE_PROTOCOL              *This,
 | 
					  IN  SCMI_PERFORMANCE_PROTOCOL              *This,
 | 
				
			||||||
  OUT SCMI_PERFORMANCE_PROTOCOL_ATTRIBUTES   *Attributes
 | 
					  OUT SCMI_PERFORMANCE_PROTOCOL_ATTRIBUTES   *Attributes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -128,7 +128,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_PERFORMANCE_GET_DOMAIN_ATTRIBUTES)(
 | 
					(EFIAPI *SCMI_PERFORMANCE_GET_DOMAIN_ATTRIBUTES) (
 | 
				
			||||||
  IN  SCMI_PERFORMANCE_PROTOCOL           *This,
 | 
					  IN  SCMI_PERFORMANCE_PROTOCOL           *This,
 | 
				
			||||||
  IN  UINT32                               DomainId,
 | 
					  IN  UINT32                               DomainId,
 | 
				
			||||||
  OUT SCMI_PERFORMANCE_DOMAIN_ATTRIBUTES  *DomainAttributes
 | 
					  OUT SCMI_PERFORMANCE_DOMAIN_ATTRIBUTES  *DomainAttributes
 | 
				
			||||||
@@ -153,7 +153,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_PERFORMANCE_DESCRIBE_LEVELS)(
 | 
					(EFIAPI *SCMI_PERFORMANCE_DESCRIBE_LEVELS) (
 | 
				
			||||||
  IN     SCMI_PERFORMANCE_PROTOCOL  *This,
 | 
					  IN     SCMI_PERFORMANCE_PROTOCOL  *This,
 | 
				
			||||||
  IN     UINT32                     DomainId,
 | 
					  IN     UINT32                     DomainId,
 | 
				
			||||||
  OUT    UINT32                     *NumLevels,
 | 
					  OUT    UINT32                     *NumLevels,
 | 
				
			||||||
@@ -173,7 +173,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_PERFORMANCE_LIMITS_SET)(
 | 
					(EFIAPI *SCMI_PERFORMANCE_LIMITS_SET) (
 | 
				
			||||||
  IN SCMI_PERFORMANCE_PROTOCOL *This,
 | 
					  IN SCMI_PERFORMANCE_PROTOCOL *This,
 | 
				
			||||||
  IN UINT32                    DomainId,
 | 
					  IN UINT32                    DomainId,
 | 
				
			||||||
  IN SCMI_PERFORMANCE_LIMITS   *Limits
 | 
					  IN SCMI_PERFORMANCE_LIMITS   *Limits
 | 
				
			||||||
@@ -192,7 +192,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_PERFORMANCE_LIMITS_GET)(
 | 
					(EFIAPI *SCMI_PERFORMANCE_LIMITS_GET) (
 | 
				
			||||||
  SCMI_PERFORMANCE_PROTOCOL *This,
 | 
					  SCMI_PERFORMANCE_PROTOCOL *This,
 | 
				
			||||||
  UINT32                    DomainId,
 | 
					  UINT32                    DomainId,
 | 
				
			||||||
  SCMI_PERFORMANCE_LIMITS   *Limits
 | 
					  SCMI_PERFORMANCE_LIMITS   *Limits
 | 
				
			||||||
@@ -210,7 +210,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_PERFORMANCE_LEVEL_SET)(
 | 
					(EFIAPI *SCMI_PERFORMANCE_LEVEL_SET) (
 | 
				
			||||||
  IN SCMI_PERFORMANCE_PROTOCOL *This,
 | 
					  IN SCMI_PERFORMANCE_PROTOCOL *This,
 | 
				
			||||||
  IN UINT32                    DomainId,
 | 
					  IN UINT32                    DomainId,
 | 
				
			||||||
  IN UINT32                    Level
 | 
					  IN UINT32                    Level
 | 
				
			||||||
@@ -229,7 +229,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_PERFORMANCE_LEVEL_GET)(
 | 
					(EFIAPI *SCMI_PERFORMANCE_LEVEL_GET) (
 | 
				
			||||||
  IN  SCMI_PERFORMANCE_PROTOCOL *This,
 | 
					  IN  SCMI_PERFORMANCE_PROTOCOL *This,
 | 
				
			||||||
  IN  UINT32                    DomainId,
 | 
					  IN  UINT32                    DomainId,
 | 
				
			||||||
  OUT UINT32                    *Level
 | 
					  OUT UINT32                    *Level
 | 
				
			||||||
@@ -256,3 +256,4 @@ typedef enum {
 | 
				
			|||||||
} SCMI_MESSAGE_ID_PERFORMANCE;
 | 
					} SCMI_MESSAGE_ID_PERFORMANCE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* ARM_SCMI_PERFORMANCE_PROTOCOL_H_ */
 | 
					#endif /* ARM_SCMI_PERFORMANCE_PROTOCOL_H_ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,6 +7,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
**/
 | 
					**/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <Base.h>
 | 
					#include <Base.h>
 | 
				
			||||||
#include <Library/ArmLib.h>
 | 
					#include <Library/ArmLib.h>
 | 
				
			||||||
#include <Library/BaseLib.h>
 | 
					#include <Library/BaseLib.h>
 | 
				
			||||||
@@ -24,6 +25,7 @@
 | 
				
			|||||||
#define MULT_U64_X_N MultU64x64
 | 
					#define MULT_U64_X_N MultU64x64
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RETURN_STATUS
 | 
					RETURN_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
TimerConstructor (
 | 
					TimerConstructor (
 | 
				
			||||||
@@ -34,6 +36,7 @@ TimerConstructor (
 | 
				
			|||||||
  // Check if the ARM Generic Timer Extension is implemented.
 | 
					  // Check if the ARM Generic Timer Extension is implemented.
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  if (ArmIsArchTimerImplemented ()) {
 | 
					  if (ArmIsArchTimerImplemented ()) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    //
 | 
					    //
 | 
				
			||||||
    // Check if Architectural Timer frequency is pre-determined by the platform
 | 
					    // Check if Architectural Timer frequency is pre-determined by the platform
 | 
				
			||||||
    // (ie. nonzero).
 | 
					    // (ie. nonzero).
 | 
				
			||||||
@@ -46,7 +49,7 @@ TimerConstructor (
 | 
				
			|||||||
      //
 | 
					      //
 | 
				
			||||||
      ASSERT (TICKS_PER_MICRO_SEC);
 | 
					      ASSERT (TICKS_PER_MICRO_SEC);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 #ifdef MDE_CPU_ARM
 | 
					#ifdef MDE_CPU_ARM
 | 
				
			||||||
      //
 | 
					      //
 | 
				
			||||||
      // Only set the frequency for ARMv7. We expect the secure firmware to
 | 
					      // Only set the frequency for ARMv7. We expect the secure firmware to
 | 
				
			||||||
      // have already done it.
 | 
					      // have already done it.
 | 
				
			||||||
@@ -56,8 +59,7 @@ TimerConstructor (
 | 
				
			|||||||
      if (ArmHasSecurityExtensions ()) {
 | 
					      if (ArmHasSecurityExtensions ()) {
 | 
				
			||||||
        ArmGenericTimerSetTimerFreq (PcdGet32 (PcdArmArchTimerFreqInHz));
 | 
					        ArmGenericTimerSetTimerFreq (PcdGet32 (PcdArmArchTimerFreqInHz));
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 #endif
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    //
 | 
					    //
 | 
				
			||||||
@@ -66,8 +68,9 @@ TimerConstructor (
 | 
				
			|||||||
    // If the reset value (0) is returned, just ASSERT.
 | 
					    // If the reset value (0) is returned, just ASSERT.
 | 
				
			||||||
    //
 | 
					    //
 | 
				
			||||||
    ASSERT (ArmGenericTimerGetTimerFreq () != 0);
 | 
					    ASSERT (ArmGenericTimerGetTimerFreq () != 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  } else {
 | 
					  } 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);
 | 
					    ASSERT (0);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -93,10 +96,10 @@ GetPlatformTimerFreq (
 | 
				
			|||||||
  if (TimerFreq == 0) {
 | 
					  if (TimerFreq == 0) {
 | 
				
			||||||
    TimerFreq = ArmGenericTimerGetTimerFreq ();
 | 
					    TimerFreq = ArmGenericTimerGetTimerFreq ();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  return TimerFreq;
 | 
					  return TimerFreq;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
  Stalls the CPU for the number of microseconds specified by MicroSeconds.
 | 
					  Stalls the CPU for the number of microseconds specified by MicroSeconds.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -138,6 +141,7 @@ MicroSecondDelay (
 | 
				
			|||||||
  return MicroSeconds;
 | 
					  return MicroSeconds;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
  Stalls the CPU for at least the given number of nanoseconds.
 | 
					  Stalls the CPU for at least the given number of nanoseconds.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -215,13 +219,13 @@ GetPerformanceCounter (
 | 
				
			|||||||
UINT64
 | 
					UINT64
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
GetPerformanceCounterProperties (
 | 
					GetPerformanceCounterProperties (
 | 
				
			||||||
  OUT      UINT64  *StartValue   OPTIONAL,
 | 
					  OUT      UINT64                    *StartValue,  OPTIONAL
 | 
				
			||||||
  OUT      UINT64                    *EndValue     OPTIONAL
 | 
					  OUT      UINT64                    *EndValue     OPTIONAL
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (StartValue != NULL) {
 | 
					  if (StartValue != NULL) {
 | 
				
			||||||
    // Timer starts at 0
 | 
					    // Timer starts at 0
 | 
				
			||||||
    *StartValue = (UINT64)0ULL;
 | 
					    *StartValue = (UINT64)0ULL ;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (EndValue != NULL) {
 | 
					  if (EndValue != NULL) {
 | 
				
			||||||
@@ -263,8 +267,7 @@ GetTimeInNanoSecond (
 | 
				
			|||||||
                  DivU64x32Remainder (
 | 
					                  DivU64x32Remainder (
 | 
				
			||||||
                    Ticks,
 | 
					                    Ticks,
 | 
				
			||||||
                    TimerFreq,
 | 
					                    TimerFreq,
 | 
				
			||||||
                    &Remainder
 | 
					                    &Remainder),
 | 
				
			||||||
                    ),
 | 
					 | 
				
			||||||
                  1000000000U
 | 
					                  1000000000U
 | 
				
			||||||
                  );
 | 
					                  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -274,9 +277,8 @@ GetTimeInNanoSecond (
 | 
				
			|||||||
  //
 | 
					  //
 | 
				
			||||||
  NanoSeconds += DivU64x32 (
 | 
					  NanoSeconds += DivU64x32 (
 | 
				
			||||||
                   MULT_U64_X_N (
 | 
					                   MULT_U64_X_N (
 | 
				
			||||||
                     (UINT64)Remainder,
 | 
					                     (UINT64) Remainder,
 | 
				
			||||||
                     1000000000U
 | 
					                     1000000000U),
 | 
				
			||||||
                     ),
 | 
					 | 
				
			||||||
                   TimerFreq
 | 
					                   TimerFreq
 | 
				
			||||||
                   );
 | 
					                   );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,10 +31,9 @@ CacheRangeOperation (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  // Perform the line operation on an address in each cache line
 | 
					  // Perform the line operation on an address in each cache line
 | 
				
			||||||
  while (AlignedAddress < EndAddress) {
 | 
					  while (AlignedAddress < EndAddress) {
 | 
				
			||||||
    LineOperation (AlignedAddress);
 | 
					    LineOperation(AlignedAddress);
 | 
				
			||||||
    AlignedAddress += LineLength;
 | 
					    AlignedAddress += LineLength;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  ArmDataSynchronizationBarrier ();
 | 
					  ArmDataSynchronizationBarrier ();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -63,18 +62,11 @@ InvalidateInstructionCacheRange (
 | 
				
			|||||||
  IN      UINTN                     Length
 | 
					  IN      UINTN                     Length
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  CacheRangeOperation (
 | 
					  CacheRangeOperation (Address, Length, ArmCleanDataCacheEntryToPoUByMVA,
 | 
				
			||||||
    Address,
 | 
					    ArmDataCacheLineLength ());
 | 
				
			||||||
    Length,
 | 
					  CacheRangeOperation (Address, Length,
 | 
				
			||||||
    ArmCleanDataCacheEntryToPoUByMVA,
 | 
					 | 
				
			||||||
    ArmDataCacheLineLength ()
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
  CacheRangeOperation (
 | 
					 | 
				
			||||||
    Address,
 | 
					 | 
				
			||||||
    Length,
 | 
					 | 
				
			||||||
    ArmInvalidateInstructionCacheEntryToPoUByMVA,
 | 
					    ArmInvalidateInstructionCacheEntryToPoUByMVA,
 | 
				
			||||||
    ArmInstructionCacheLineLength ()
 | 
					    ArmInstructionCacheLineLength ());
 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ArmInstructionSynchronizationBarrier ();
 | 
					  ArmInstructionSynchronizationBarrier ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -97,12 +89,8 @@ WriteBackInvalidateDataCacheRange (
 | 
				
			|||||||
  IN      UINTN                     Length
 | 
					  IN      UINTN                     Length
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  CacheRangeOperation (
 | 
					  CacheRangeOperation(Address, Length, ArmCleanInvalidateDataCacheEntryByMVA,
 | 
				
			||||||
    Address,
 | 
					    ArmDataCacheLineLength ());
 | 
				
			||||||
    Length,
 | 
					 | 
				
			||||||
    ArmCleanInvalidateDataCacheEntryByMVA,
 | 
					 | 
				
			||||||
    ArmDataCacheLineLength ()
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
  return Address;
 | 
					  return Address;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -122,12 +110,8 @@ WriteBackDataCacheRange (
 | 
				
			|||||||
  IN      UINTN                     Length
 | 
					  IN      UINTN                     Length
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  CacheRangeOperation (
 | 
					  CacheRangeOperation(Address, Length, ArmCleanDataCacheEntryByMVA,
 | 
				
			||||||
    Address,
 | 
					    ArmDataCacheLineLength ());
 | 
				
			||||||
    Length,
 | 
					 | 
				
			||||||
    ArmCleanDataCacheEntryByMVA,
 | 
					 | 
				
			||||||
    ArmDataCacheLineLength ()
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
  return Address;
 | 
					  return Address;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -138,11 +122,7 @@ InvalidateDataCacheRange (
 | 
				
			|||||||
  IN      UINTN                     Length
 | 
					  IN      UINTN                     Length
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  CacheRangeOperation (
 | 
					  CacheRangeOperation(Address, Length, ArmInvalidateDataCacheEntryByMVA,
 | 
				
			||||||
    Address,
 | 
					    ArmDataCacheLineLength ());
 | 
				
			||||||
    Length,
 | 
					 | 
				
			||||||
    ArmInvalidateDataCacheEntryByMVA,
 | 
					 | 
				
			||||||
    ArmDataCacheLineLength ()
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
  return Address;
 | 
					  return Address;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -69,6 +69,7 @@ CHAR8  *gLdmStack[] = {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#define LDM_EXT(_reg, _off) ((_reg == 13) ? gLdmStack[(_off)] : gLdmAdr[(_off)])
 | 
					#define LDM_EXT(_reg, _off) ((_reg == 13) ? gLdmStack[(_off)] : gLdmAdr[(_off)])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SIGN(_U)  ((_U) ? "" : "-")
 | 
					#define SIGN(_U)  ((_U) ? "" : "-")
 | 
				
			||||||
#define WRITE(_Write) ((_Write) ? "!" : "")
 | 
					#define WRITE(_Write) ((_Write) ? "!" : "")
 | 
				
			||||||
#define BYTE(_B)  ((_B) ? "B":"")
 | 
					#define BYTE(_B)  ((_B) ? "B":"")
 | 
				
			||||||
@@ -109,11 +110,9 @@ MRegList (
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (First) {
 | 
					  if (First) {
 | 
				
			||||||
    AsciiStrCatS (mMregListStr, sizeof mMregListStr, "ERROR");
 | 
					    AsciiStrCatS (mMregListStr, sizeof mMregListStr, "ERROR");
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  AsciiStrCatS (mMregListStr, sizeof mMregListStr, "}");
 | 
					  AsciiStrCatS (mMregListStr, sizeof mMregListStr, "}");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // BugBug: Make caller pass in buffer it is cleaner
 | 
					  // BugBug: Make caller pass in buffer it is cleaner
 | 
				
			||||||
@@ -137,6 +136,7 @@ RotateRight (
 | 
				
			|||||||
  return (Op >> Shift) | (Op << (32 - Shift));
 | 
					  return (Op >> Shift) | (Op << (32 - Shift));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
  Place a disassembly of **OpCodePtr into buffer, and update OpCodePtr to
 | 
					  Place a disassembly of **OpCodePtr into buffer, and update OpCodePtr to
 | 
				
			||||||
  point to next instruction.
 | 
					  point to next instruction.
 | 
				
			||||||
@@ -181,6 +181,7 @@ DisassembleArmInstruction (
 | 
				
			|||||||
  Rd = (OpCode >> 12) & 0xf;
 | 
					  Rd = (OpCode >> 12) & 0xf;
 | 
				
			||||||
  Rm = (OpCode & 0xf);
 | 
					  Rm = (OpCode & 0xf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (Extended) {
 | 
					  if (Extended) {
 | 
				
			||||||
    Index = AsciiSPrint (Buf, Size, "0x%08x   ", OpCode);
 | 
					    Index = AsciiSPrint (Buf, Size, "0x%08x   ", OpCode);
 | 
				
			||||||
    Buf += Index;
 | 
					    Buf += Index;
 | 
				
			||||||
@@ -196,7 +197,6 @@ DisassembleArmInstruction (
 | 
				
			|||||||
     // A4.1.103  STREX{<cond>} <Rd>, <Rm>, [<Rn>]
 | 
					     // A4.1.103  STREX{<cond>} <Rd>, <Rm>, [<Rn>]
 | 
				
			||||||
      AsciiSPrint (Buf, Size, "STREX%a %a, %a, [%a]", COND (OpCode), gReg[Rd], gReg[Rn], gReg[Rn]);
 | 
					      AsciiSPrint (Buf, Size, "STREX%a %a, %a, [%a]", COND (OpCode), gReg[Rd], gReg[Rn], gReg[Rn]);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -206,25 +206,23 @@ DisassembleArmInstruction (
 | 
				
			|||||||
      // A4.1.20 LDM{<cond>}<addressing_mode> <Rn>{!}, <registers>
 | 
					      // A4.1.20 LDM{<cond>}<addressing_mode> <Rn>{!}, <registers>
 | 
				
			||||||
      // A4.1.21 LDM{<cond>}<addressing_mode> <Rn>, <registers_without_pc>^
 | 
					      // A4.1.21 LDM{<cond>}<addressing_mode> <Rn>, <registers_without_pc>^
 | 
				
			||||||
      // A4.1.22 LDM{<cond>}<addressing_mode> <Rn>{!}, <registers_and_pc>^
 | 
					      // A4.1.22 LDM{<cond>}<addressing_mode> <Rn>{!}, <registers_and_pc>^
 | 
				
			||||||
      AsciiSPrint (Buf, Size, "LDM%a%a, %a%a, %a", COND (OpCode), LDM_EXT (Rn, (OpCode >> 23) & 3), gReg[Rn], WRITE (Write), MRegList (OpCode), USER (WriteBack));
 | 
					      AsciiSPrint (Buf, Size, "LDM%a%a, %a%a, %a", COND (OpCode), LDM_EXT (Rn ,(OpCode >> 23) & 3), gReg[Rn], WRITE (Write), MRegList (OpCode), USER (WriteBack));
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      // A4.1.97 STM{<cond>}<addressing_mode> <Rn>{!}, <registers>
 | 
					      // A4.1.97 STM{<cond>}<addressing_mode> <Rn>{!}, <registers>
 | 
				
			||||||
      // A4.1.98 STM{<cond>}<addressing_mode> <Rn>, <registers>^
 | 
					      // 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));
 | 
					      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;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // LDR/STR Address Mode 2
 | 
					  // LDR/STR Address Mode 2
 | 
				
			||||||
  if (((OpCode  & 0x0c000000) == 0x04000000) || ((OpCode & 0xfd70f000) == 0xf550f000)) {
 | 
					  if ( ((OpCode  & 0x0c000000) == 0x04000000) || ((OpCode & 0xfd70f000 ) == 0xf550f000) ) {
 | 
				
			||||||
    Offset12 = OpCode & 0xfff;
 | 
					    Offset12 = OpCode & 0xfff;
 | 
				
			||||||
    if ((OpCode & 0xfd70f000) == 0xf550f000) {
 | 
					    if ((OpCode & 0xfd70f000 ) == 0xf550f000) {
 | 
				
			||||||
      Index = AsciiSPrint (Buf, Size, "PLD");
 | 
					      Index = AsciiSPrint (Buf, Size, "PLD");
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      Index = AsciiSPrint (Buf, Size, "%a%a%a%a %a, ", Load ? "LDR" : "STR", COND (OpCode), BYTE (WriteBack), (!(Pre) && Write) ? "T" : "", gReg[Rd]);
 | 
					      Index = AsciiSPrint (Buf, Size, "%a%a%a%a %a, ", Load ? "LDR" : "STR", COND (OpCode), BYTE (WriteBack), (!(Pre) && Write) ? "T":"", gReg[Rd]);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (Pre) {
 | 
					    if (Pre) {
 | 
				
			||||||
      if (!Imm) {
 | 
					      if (!Imm) {
 | 
				
			||||||
        // A5.2.2 [<Rn>, #+/-<offset_12>]
 | 
					        // 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));
 | 
					        AsciiSPrint (&Buf[Index], Size - Index, "[%a, #%a%a, %a, #%d]%a", gReg[Rn], SIGN (Up), gReg[Rm], Type, ShiftImm, WRITE (Write));
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    } else {
 | 
					    } else {  // !Pre
 | 
				
			||||||
      // !Pre
 | 
					 | 
				
			||||||
      if (!Imm) {
 | 
					      if (!Imm) {
 | 
				
			||||||
        // A5.2.8  [<Rn>], #+/-<offset_12>
 | 
					        // A5.2.8  [<Rn>], #+/-<offset_12>
 | 
				
			||||||
        AsciiSPrint (&Buf[Index], Size - Index, "[%a], #%a0x%x", gReg[Rn], SIGN (Up), Offset12);
 | 
					        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);
 | 
					        AsciiSPrint (&Buf[Index], Size - Index, "[%a], #%a%a, %a, #%d", gReg[Rn], SIGN (Up), gReg[Rm], Type, ShiftImm);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -341,7 +337,6 @@ DisassembleArmInstruction (
 | 
				
			|||||||
        AsciiSPrint  (&Buf[Index], Size - Index, "[%a], #%a%a", gReg[Rn], SIGN (Up), gReg[Rm]);
 | 
					        AsciiSPrint  (&Buf[Index], Size - Index, "[%a], #%a%a", gReg[Rn], SIGN (Up), gReg[Rm]);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -376,20 +371,15 @@ DisassembleArmInstruction (
 | 
				
			|||||||
      AsciiSPrint (Buf, Size, "CPS #0x%x", (OpCode & 0x2f));
 | 
					      AsciiSPrint (Buf, Size, "CPS #0x%x", (OpCode & 0x2f));
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      IMod = (OpCode >> 18) & 0x3;
 | 
					      IMod = (OpCode >> 18) & 0x3;
 | 
				
			||||||
      Index = AsciiSPrint (
 | 
					      Index = AsciiSPrint (Buf, Size, "CPS%a %a%a%a",
 | 
				
			||||||
                Buf,
 | 
					                      (IMod == 3) ? "ID":"IE",
 | 
				
			||||||
                Size,
 | 
					                      ((OpCode & BIT8) != 0) ? "A":"",
 | 
				
			||||||
                "CPS%a %a%a%a",
 | 
					                      ((OpCode & BIT7) != 0) ? "I":"",
 | 
				
			||||||
                (IMod == 3) ? "ID" : "IE",
 | 
					                      ((OpCode & BIT6) != 0) ? "F":"");
 | 
				
			||||||
                ((OpCode & BIT8) != 0) ? "A" : "",
 | 
					 | 
				
			||||||
                ((OpCode & BIT7) != 0) ? "I" : "",
 | 
					 | 
				
			||||||
                ((OpCode & BIT6) != 0) ? "F" : ""
 | 
					 | 
				
			||||||
                );
 | 
					 | 
				
			||||||
      if ((OpCode & BIT17) != 0) {
 | 
					      if ((OpCode & BIT17) != 0) {
 | 
				
			||||||
        AsciiSPrint (&Buf[Index], Size - Index, ", #0x%x", OpCode & 0x1f);
 | 
					        AsciiSPrint (&Buf[Index], Size - Index, ", #0x%x", OpCode & 0x1f);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -405,6 +395,7 @@ DisassembleArmInstruction (
 | 
				
			|||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if ((OpCode  & 0x0db00000) == 0x01200000) {
 | 
					  if ((OpCode  & 0x0db00000) == 0x01200000) {
 | 
				
			||||||
    // A4.1.38 MSR{<cond>} CPSR_<fields>, #<immediate> MSR{<cond>} CPSR_<fields>, <Rm>
 | 
					    // A4.1.38 MSR{<cond>} CPSR_<fields>, #<immediate> MSR{<cond>} CPSR_<fields>, <Rm>
 | 
				
			||||||
    if (Imm) {
 | 
					    if (Imm) {
 | 
				
			||||||
@@ -414,7 +405,6 @@ DisassembleArmInstruction (
 | 
				
			|||||||
      // MSR{<cond>} CPSR_<fields>, <Rm>
 | 
					      // MSR{<cond>} CPSR_<fields>, <Rm>
 | 
				
			||||||
      AsciiSPrint (Buf, Size, "MRS%a %a_%a, %a", COND (OpCode), WriteBack ? "SPSR" : "CPSR", gReg[Rd]);
 | 
					      AsciiSPrint (Buf, Size, "MRS%a %a_%a, %a", COND (OpCode), WriteBack ? "SPSR" : "CPSR", gReg[Rd]);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -427,9 +417,9 @@ DisassembleArmInstruction (
 | 
				
			|||||||
  if ((OpCode  & 0x0e000000) == 0x0c000000) {
 | 
					  if ((OpCode  & 0x0e000000) == 0x0c000000) {
 | 
				
			||||||
    // A4.1.19 LDC and A4.1.96 SDC
 | 
					    // A4.1.19 LDC and A4.1.96 SDC
 | 
				
			||||||
    if ((OpCode & 0xf0000000) == 0xf0000000) {
 | 
					    if ((OpCode & 0xf0000000) == 0xf0000000) {
 | 
				
			||||||
      Index = AsciiSPrint (Buf, Size, "%a2 0x%x, CR%d, ", Load ? "LDC" : "SDC", (OpCode >> 8) & 0xf, Rd);
 | 
					      Index = AsciiSPrint (Buf, Size, "%a2 0x%x, CR%d, ", Load ? "LDC":"SDC", (OpCode >> 8) & 0xf, Rd);
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      Index = AsciiSPrint (Buf, Size, "%a%a 0x%x, CR%d, ", Load ? "LDC" : "SDC", COND (OpCode), (OpCode >> 8) & 0xf, Rd);
 | 
					      Index = AsciiSPrint (Buf, Size, "%a%a 0x%x, CR%d, ",  Load ? "LDC":"SDC", COND (OpCode), (OpCode >> 8) & 0xf, Rd);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!Pre) {
 | 
					    if (!Pre) {
 | 
				
			||||||
@@ -444,17 +434,18 @@ DisassembleArmInstruction (
 | 
				
			|||||||
      // A5.5.5.2 [<Rn>, #+/-<offset_8>*4 ]!
 | 
					      // 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));
 | 
					      AsciiSPrint (&Buf[Index], Size - Index, "[%a, #%a0x%x*4]%a", gReg[Rn], SIGN (Up), OpCode & 0xff, WRITE (Write));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if ((OpCode  & 0x0f000010) == 0x0e000010) {
 | 
					  if ((OpCode  & 0x0f000010) == 0x0e000010) {
 | 
				
			||||||
    // A4.1.32 MRC2, MCR2
 | 
					    // A4.1.32 MRC2, MCR2
 | 
				
			||||||
    AsciiSPrint (Buf, Size, "%a%a 0x%x, 0x%x, %a, CR%d, CR%d, 0x%x", Load ? "MRC" : "MCR", COND (OpCode), (OpCode >> 8) & 0xf, (OpCode >> 20) & 0xf, gReg[Rd], Rn, Rm, (OpCode >> 5) &0x7);
 | 
					    AsciiSPrint (Buf, Size, "%a%a 0x%x, 0x%x, %a, CR%d, CR%d, 0x%x", Load ? "MRC":"MCR", COND (OpCode), (OpCode >> 8) & 0xf, (OpCode >> 20) & 0xf, gReg[Rd], Rn, Rm, (OpCode >> 5) &0x7);
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if ((OpCode  & 0x0ff00000) == 0x0c400000) {
 | 
					  if ((OpCode  & 0x0ff00000) == 0x0c400000) {
 | 
				
			||||||
    // A4.1.33 MRRC2, MCRR2
 | 
					    // A4.1.33 MRRC2, MCRR2
 | 
				
			||||||
    AsciiSPrint (Buf, Size, "%a%a 0x%x, 0x%x, %a, %a, CR%d", Load ? "MRRC" : "MCRR", COND (OpCode), (OpCode >> 4) & 0xf, (OpCode >> 20) & 0xf, gReg[Rd], gReg[Rn], Rm);
 | 
					    AsciiSPrint (Buf, Size, "%a%a 0x%x, 0x%x, %a, %a, CR%d", Load ? "MRRC":"MCRR", COND (OpCode), (OpCode >> 4) & 0xf, (OpCode >> 20) & 0xf, gReg[Rd], gReg[Rn], Rm);
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -463,3 +454,4 @@ DisassembleArmInstruction (
 | 
				
			|||||||
  *OpCodePtr += 1;
 | 
					  *OpCodePtr += 1;
 | 
				
			||||||
  return;
 | 
					  return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -93,6 +93,9 @@ extern CHAR8  *gReg[];
 | 
				
			|||||||
#define THUMB2_MRS                  235
 | 
					#define THUMB2_MRS                  235
 | 
				
			||||||
#define THUMB2_MSR                  236
 | 
					#define THUMB2_MSR                  236
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  CHAR8   *Start;
 | 
					  CHAR8   *Start;
 | 
				
			||||||
  UINT32  OpCode;
 | 
					  UINT32  OpCode;
 | 
				
			||||||
@@ -101,108 +104,109 @@ typedef struct {
 | 
				
			|||||||
} THUMB_INSTRUCTIONS;
 | 
					} THUMB_INSTRUCTIONS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
THUMB_INSTRUCTIONS gOpThumb[] = {
 | 
					THUMB_INSTRUCTIONS gOpThumb[] = {
 | 
				
			||||||
  // Thumb 16-bit instructions
 | 
					// Thumb 16-bit instructions
 | 
				
			||||||
  //          Op       Mask   Format
 | 
					//          Op       Mask   Format
 | 
				
			||||||
  { "ADC",    0x4140, 0xffc0, DATA_FORMAT5                }, // ADC <Rndn>, <Rm>
 | 
					  { "ADC" , 0x4140, 0xffc0, DATA_FORMAT5 },  // ADC <Rndn>, <Rm>
 | 
				
			||||||
  { "ADR",  0xa000, 0xf800, ADR_FORMAT   },  // ADR <Rd>, <label>
 | 
					  { "ADR",  0xa000, 0xf800, ADR_FORMAT   },  // ADR <Rd>, <label>
 | 
				
			||||||
  { "ADD",    0x1c00, 0xfe00, DATA_FORMAT2                },
 | 
					  { "ADD" , 0x1c00, 0xfe00, DATA_FORMAT2 },
 | 
				
			||||||
  { "ADD",    0x3000, 0xf800, DATA_FORMAT3                },
 | 
					  { "ADD" , 0x3000, 0xf800, DATA_FORMAT3 },
 | 
				
			||||||
  { "ADD",    0x1800, 0xfe00, DATA_FORMAT1                },
 | 
					  { "ADD" , 0x1800, 0xfe00, DATA_FORMAT1 },
 | 
				
			||||||
  { "ADD",    0x4400, 0xff00, DATA_FORMAT8                }, // A8.6.9
 | 
					  { "ADD" , 0x4400, 0xff00, DATA_FORMAT8 },   // A8.6.9
 | 
				
			||||||
  { "ADD",    0xa000, 0xf100, DATA_FORMAT6_PC             },
 | 
					  { "ADD" , 0xa000, 0xf100, DATA_FORMAT6_PC },
 | 
				
			||||||
  { "ADD",    0xa800, 0xf800, DATA_FORMAT6_SP             },
 | 
					  { "ADD" , 0xa800, 0xf800, DATA_FORMAT6_SP },
 | 
				
			||||||
  { "ADD",    0xb000, 0xff80, DATA_FORMAT7                },
 | 
					  { "ADD" , 0xb000, 0xff80, DATA_FORMAT7 },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  { "AND",    0x4000, 0xffc0, DATA_FORMAT5                },
 | 
					  { "AND" , 0x4000, 0xffc0, DATA_FORMAT5 },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  { "ASR",    0x1000, 0xf800, DATA_FORMAT4                },
 | 
					  { "ASR" , 0x1000, 0xf800, DATA_FORMAT4 },
 | 
				
			||||||
  { "ASR",    0x4100, 0xffc0, DATA_FORMAT5                },
 | 
					  { "ASR" , 0x4100, 0xffc0, DATA_FORMAT5 },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  { "B",      0xd000, 0xf000, CONDITIONAL_BRANCH          },
 | 
					  { "B"   , 0xd000, 0xf000, CONDITIONAL_BRANCH },
 | 
				
			||||||
  { "B",      0xe000, 0xf800, UNCONDITIONAL_BRANCH_SHORT  },
 | 
					  { "B"   , 0xe000, 0xf800, UNCONDITIONAL_BRANCH_SHORT },
 | 
				
			||||||
  { "BLX",    0x4780, 0xff80, BRANCH_EXCHANGE             },
 | 
					  { "BLX" , 0x4780, 0xff80, BRANCH_EXCHANGE },
 | 
				
			||||||
  { "BX",     0x4700, 0xff87, BRANCH_EXCHANGE             },
 | 
					  { "BX"  , 0x4700, 0xff87, BRANCH_EXCHANGE },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  { "BIC",    0x4380, 0xffc0, DATA_FORMAT5                },
 | 
					  { "BIC" , 0x4380, 0xffc0, DATA_FORMAT5 },
 | 
				
			||||||
  { "BKPT", 0xdf00, 0xff00, IMMED_8 },
 | 
					  { "BKPT", 0xdf00, 0xff00, IMMED_8 },
 | 
				
			||||||
  { "CBZ",  0xb100, 0xfd00, DATA_CBZ },
 | 
					  { "CBZ",  0xb100, 0xfd00, DATA_CBZ },
 | 
				
			||||||
  { "CBNZ", 0xb900, 0xfd00, DATA_CBZ },
 | 
					  { "CBNZ", 0xb900, 0xfd00, DATA_CBZ },
 | 
				
			||||||
  { "CMN",    0x42c0, 0xffc0, DATA_FORMAT5                },
 | 
					  { "CMN" , 0x42c0, 0xffc0, DATA_FORMAT5 },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  { "CMP",    0x2800, 0xf800, DATA_FORMAT3                },
 | 
					  { "CMP" , 0x2800, 0xf800, DATA_FORMAT3 },
 | 
				
			||||||
  { "CMP",    0x4280, 0xffc0, DATA_FORMAT5                },
 | 
					  { "CMP" , 0x4280, 0xffc0, DATA_FORMAT5 },
 | 
				
			||||||
  { "CMP",    0x4500, 0xff00, DATA_FORMAT8                },
 | 
					  { "CMP" , 0x4500, 0xff00, DATA_FORMAT8 },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  { "CPS",    0xb660, 0xffe8, CPS_FORMAT                  },
 | 
					  { "CPS" , 0xb660, 0xffe8, CPS_FORMAT },
 | 
				
			||||||
  { "MOV",    0x4600, 0xff00, DATA_FORMAT8                },
 | 
					  { "MOV" , 0x4600, 0xff00, DATA_FORMAT8 },
 | 
				
			||||||
  { "EOR",    0x4040, 0xffc0, DATA_FORMAT5                },
 | 
					  { "EOR" , 0x4040, 0xffc0, DATA_FORMAT5 },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  { "LDMIA",  0xc800, 0xf800, LOAD_STORE_MULTIPLE_FORMAT1 },
 | 
					  { "LDMIA" , 0xc800, 0xf800, LOAD_STORE_MULTIPLE_FORMAT1 },
 | 
				
			||||||
  { "LDR",    0x6800, 0xf800, LOAD_STORE_FORMAT1          }, // LDR <Rt>, [<Rn> {,#<imm>}]
 | 
					  { "LDR"   , 0x6800, 0xf800, LOAD_STORE_FORMAT1 },  // LDR <Rt>, [<Rn> {,#<imm>}]
 | 
				
			||||||
  { "LDR",    0x5800, 0xfe00, LOAD_STORE_FORMAT2          }, // STR <Rt>, [<Rn>, <Rm>]
 | 
					  { "LDR"   , 0x5800, 0xfe00, LOAD_STORE_FORMAT2 },  // STR <Rt>, [<Rn>, <Rm>]
 | 
				
			||||||
  { "LDR",    0x4800, 0xf800, LOAD_STORE_FORMAT3          },
 | 
					  { "LDR"   , 0x4800, 0xf800, LOAD_STORE_FORMAT3 },
 | 
				
			||||||
  { "LDR",    0x9800, 0xf800, LOAD_STORE_FORMAT4          }, // LDR <Rt>, [SP, #<imm>]
 | 
					  { "LDR"   , 0x9800, 0xf800, LOAD_STORE_FORMAT4 },  // LDR <Rt>, [SP, #<imm>]
 | 
				
			||||||
  { "LDRB",   0x7800, 0xf800, LOAD_STORE_FORMAT1_B        },
 | 
					  { "LDRB"  , 0x7800, 0xf800, LOAD_STORE_FORMAT1_B },
 | 
				
			||||||
  { "LDRB",   0x5c00, 0xfe00, LOAD_STORE_FORMAT2          }, // STR <Rt>, [<Rn>, <Rm>]
 | 
					  { "LDRB"  , 0x5c00, 0xfe00, LOAD_STORE_FORMAT2 },  // STR <Rt>, [<Rn>, <Rm>]
 | 
				
			||||||
  { "LDRH",   0x8800, 0xf800, LOAD_STORE_FORMAT1_H        },
 | 
					  { "LDRH"  , 0x8800, 0xf800, LOAD_STORE_FORMAT1_H },
 | 
				
			||||||
  { "LDRH",   0x7a00, 0xfe00, LOAD_STORE_FORMAT2          },
 | 
					  { "LDRH"  , 0x7a00, 0xfe00, LOAD_STORE_FORMAT2 },
 | 
				
			||||||
  { "LDRSB",  0x5600, 0xfe00, LOAD_STORE_FORMAT2          }, // STR <Rt>, [<Rn>, <Rm>]
 | 
					  { "LDRSB" , 0x5600, 0xfe00, LOAD_STORE_FORMAT2 },  // STR <Rt>, [<Rn>, <Rm>]
 | 
				
			||||||
  { "LDRSH",  0x5e00, 0xfe00, LOAD_STORE_FORMAT2          },
 | 
					  { "LDRSH" , 0x5e00, 0xfe00, LOAD_STORE_FORMAT2 },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  { "MOVS", 0x0000, 0xffc0, DATA_FORMAT5 },   // LSL with imm5 == 0 is a MOVS, so this must go before LSL
 | 
					  { "MOVS", 0x0000, 0xffc0, DATA_FORMAT5 },   // LSL with imm5 == 0 is a MOVS, so this must go before LSL
 | 
				
			||||||
  { "LSL",    0x0000, 0xf800, DATA_FORMAT4                },
 | 
					  { "LSL" , 0x0000, 0xf800, DATA_FORMAT4 },
 | 
				
			||||||
  { "LSL",    0x4080, 0xffc0, DATA_FORMAT5                },
 | 
					  { "LSL" , 0x4080, 0xffc0, DATA_FORMAT5 },
 | 
				
			||||||
  { "LSR",    0x0001, 0xf800, DATA_FORMAT4                },
 | 
					  { "LSR" , 0x0001, 0xf800, DATA_FORMAT4 },
 | 
				
			||||||
  { "LSR",    0x40c0, 0xffc0, DATA_FORMAT5                },
 | 
					  { "LSR" , 0x40c0, 0xffc0, DATA_FORMAT5 },
 | 
				
			||||||
  { "LSRS", 0x0800, 0xf800, DATA_FORMAT4 },  // LSRS <Rd>, <Rm>, #<imm5>
 | 
					  { "LSRS", 0x0800, 0xf800, DATA_FORMAT4 },  // LSRS <Rd>, <Rm>, #<imm5>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  { "MOVS", 0x2000, 0xf800, DATA_FORMAT3 },
 | 
					  { "MOVS", 0x2000, 0xf800, DATA_FORMAT3 },
 | 
				
			||||||
  { "MOV",    0x1c00, 0xffc0, DATA_FORMAT3                },
 | 
					  { "MOV" , 0x1c00, 0xffc0, DATA_FORMAT3 },
 | 
				
			||||||
  { "MOV",    0x4600, 0xff00, DATA_FORMAT8                },
 | 
					  { "MOV" , 0x4600, 0xff00, DATA_FORMAT8 },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  { "MUL",    0x4340, 0xffc0, DATA_FORMAT5                },
 | 
					  { "MUL" , 0x4340, 0xffc0, DATA_FORMAT5 },
 | 
				
			||||||
  { "MVN",    0x41c0, 0xffc0, DATA_FORMAT5                },
 | 
					  { "MVN" , 0x41c0, 0xffc0, DATA_FORMAT5 },
 | 
				
			||||||
  { "NEG",    0x4240, 0xffc0, DATA_FORMAT5                },
 | 
					  { "NEG" , 0x4240, 0xffc0, DATA_FORMAT5 },
 | 
				
			||||||
  { "ORR",    0x4300, 0xffc0, DATA_FORMAT5                },
 | 
					  { "ORR" , 0x4300, 0xffc0, DATA_FORMAT5 },
 | 
				
			||||||
  { "POP",    0xbc00, 0xfe00, POP_FORMAT                  },
 | 
					  { "POP" , 0xbc00, 0xfe00, POP_FORMAT },
 | 
				
			||||||
  { "PUSH", 0xb400, 0xfe00, PUSH_FORMAT },
 | 
					  { "PUSH", 0xb400, 0xfe00, PUSH_FORMAT },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  { "REV",    0xba00, 0xffc0, DATA_FORMAT5                },
 | 
					  { "REV"   , 0xba00, 0xffc0, DATA_FORMAT5 },
 | 
				
			||||||
  { "REV16",  0xba40, 0xffc0, DATA_FORMAT5                },
 | 
					  { "REV16" , 0xba40, 0xffc0, DATA_FORMAT5 },
 | 
				
			||||||
  { "REVSH",  0xbac0, 0xffc0, DATA_FORMAT5                },
 | 
					  { "REVSH" , 0xbac0, 0xffc0, DATA_FORMAT5 },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  { "ROR",    0x41c0, 0xffc0, DATA_FORMAT5                },
 | 
					  { "ROR"    , 0x41c0, 0xffc0, DATA_FORMAT5 },
 | 
				
			||||||
  { "SBC",    0x4180, 0xffc0, DATA_FORMAT5                },
 | 
					  { "SBC"    , 0x4180, 0xffc0, DATA_FORMAT5 },
 | 
				
			||||||
  { "SETEND", 0xb650, 0xfff0, ENDIAN_FORMAT               },
 | 
					  { "SETEND" , 0xb650, 0xfff0, ENDIAN_FORMAT },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  { "STMIA",  0xc000, 0xf800, LOAD_STORE_MULTIPLE_FORMAT1 },
 | 
					  { "STMIA" , 0xc000, 0xf800, LOAD_STORE_MULTIPLE_FORMAT1 },
 | 
				
			||||||
  { "STR",    0x6000, 0xf800, LOAD_STORE_FORMAT1          }, // STR  <Rt>, [<Rn> {,#<imm>}]
 | 
					  { "STR"   , 0x6000, 0xf800, LOAD_STORE_FORMAT1 },   // STR  <Rt>, [<Rn> {,#<imm>}]
 | 
				
			||||||
  { "STR",    0x5000, 0xfe00, LOAD_STORE_FORMAT2          }, // STR  <Rt>, [<Rn>, <Rm>]
 | 
					  { "STR"   , 0x5000, 0xfe00, LOAD_STORE_FORMAT2 },   // STR  <Rt>, [<Rn>, <Rm>]
 | 
				
			||||||
  { "STR",    0x9000, 0xf800, LOAD_STORE_FORMAT4          }, // STR  <Rt>, [SP, #<imm>]
 | 
					  { "STR"   , 0x9000, 0xf800, LOAD_STORE_FORMAT4 },   // STR  <Rt>, [SP, #<imm>]
 | 
				
			||||||
  { "STRB",   0x7000, 0xf800, LOAD_STORE_FORMAT1_B        }, // STRB <Rt>, [<Rn>, #<imm5>]
 | 
					  { "STRB"  , 0x7000, 0xf800, LOAD_STORE_FORMAT1_B }, // STRB <Rt>, [<Rn>, #<imm5>]
 | 
				
			||||||
  { "STRB",   0x5400, 0xfe00, LOAD_STORE_FORMAT2          }, // STRB <Rt>, [<Rn>, <Rm>]
 | 
					  { "STRB"  , 0x5400, 0xfe00, LOAD_STORE_FORMAT2 },   // STRB <Rt>, [<Rn>, <Rm>]
 | 
				
			||||||
  { "STRH",   0x8000, 0xf800, LOAD_STORE_FORMAT1_H        }, // STRH <Rt>, [<Rn>{,#<imm>}]
 | 
					  { "STRH"  , 0x8000, 0xf800, LOAD_STORE_FORMAT1_H }, // STRH <Rt>, [<Rn>{,#<imm>}]
 | 
				
			||||||
  { "STRH",   0x5200, 0xfe00, LOAD_STORE_FORMAT2          }, // STRH <Rt>, [<Rn>, <Rm>]
 | 
					  { "STRH"  , 0x5200, 0xfe00, LOAD_STORE_FORMAT2 },   // STRH <Rt>, [<Rn>, <Rm>]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  { "SUB",    0x1e00, 0xfe00, DATA_FORMAT2                },
 | 
					  { "SUB" , 0x1e00, 0xfe00, DATA_FORMAT2 },
 | 
				
			||||||
  { "SUB",    0x3800, 0xf800, DATA_FORMAT3                },
 | 
					  { "SUB" , 0x3800, 0xf800, DATA_FORMAT3 },
 | 
				
			||||||
  { "SUB",    0x1a00, 0xfe00, DATA_FORMAT1                },
 | 
					  { "SUB" , 0x1a00, 0xfe00, DATA_FORMAT1 },
 | 
				
			||||||
  { "SUB",    0xb080, 0xff80, DATA_FORMAT7                },
 | 
					  { "SUB" , 0xb080, 0xff80, DATA_FORMAT7 },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  { "SBC",    0x4180, 0xffc0, DATA_FORMAT5                },
 | 
					  { "SBC" , 0x4180, 0xffc0, DATA_FORMAT5 },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  { "SWI",    0xdf00, 0xff00, IMMED_8                     },
 | 
					  { "SWI" , 0xdf00, 0xff00, IMMED_8 },
 | 
				
			||||||
  { "SXTB", 0xb240, 0xffc0, DATA_FORMAT5 },
 | 
					  { "SXTB", 0xb240, 0xffc0, DATA_FORMAT5 },
 | 
				
			||||||
  { "SXTH", 0xb200, 0xffc0, DATA_FORMAT5 },
 | 
					  { "SXTH", 0xb200, 0xffc0, DATA_FORMAT5 },
 | 
				
			||||||
  { "TST",    0x4200, 0xffc0, DATA_FORMAT5                },
 | 
					  { "TST" , 0x4200, 0xffc0, DATA_FORMAT5 },
 | 
				
			||||||
  { "UXTB", 0xb2c0, 0xffc0, DATA_FORMAT5 },
 | 
					  { "UXTB", 0xb2c0, 0xffc0, DATA_FORMAT5 },
 | 
				
			||||||
  { "UXTH", 0xb280, 0xffc0, DATA_FORMAT5 },
 | 
					  { "UXTH", 0xb280, 0xffc0, DATA_FORMAT5 },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  { "IT",   0xbf00, 0xff00, IT_BLOCK }
 | 
					  { "IT",   0xbf00, 0xff00, IT_BLOCK }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
THUMB_INSTRUCTIONS gOpThumb2[] = {
 | 
					THUMB_INSTRUCTIONS gOpThumb2[] = {
 | 
				
			||||||
  // Instruct  OpCode      OpCode Mask  Addressig Mode
 | 
					//Instruct  OpCode      OpCode Mask  Addressig Mode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  { "ADR", 0xf2af0000, 0xfbff8000, ADR_THUMB2    },  // ADDR <Rd>, <label> ;Needs to go before ADDW
 | 
					  { "ADR", 0xf2af0000, 0xfbff8000, ADR_THUMB2    },  // ADDR <Rd>, <label> ;Needs to go before ADDW
 | 
				
			||||||
  { "CMN", 0xf1100f00, 0xfff08f00, CMN_THUMB2    },  // CMN <Rn>, #<const> ;Needs to go before ADD
 | 
					  { "CMN", 0xf1100f00, 0xfff08f00, CMN_THUMB2    },  // CMN <Rn>, #<const> ;Needs to go before ADD
 | 
				
			||||||
@@ -277,6 +281,7 @@ THUMB_INSTRUCTIONS  gOpThumb2[] = {
 | 
				
			|||||||
  { "MLA",   0xfb000000, 0xfff000f0, THUMB2_4REGS }, // MLA <Rd>, <Rn>, <Rm>, <Ra>
 | 
					  { "MLA",   0xfb000000, 0xfff000f0, THUMB2_4REGS }, // MLA <Rd>, <Rn>, <Rm>, <Ra>
 | 
				
			||||||
  { "MLS",   0xfb000010, 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>
 | 
					  { "SMLABB",  0xfb100000, 0xfff000f0, THUMB2_4REGS }, // SMLABB   <Rd>, <Rn>, <Rm>, <Ra>
 | 
				
			||||||
  { "SMLABT",  0xfb100010, 0xfff000f0, THUMB2_4REGS }, // SMLABT   <Rd>, <Rn>, <Rm>, <Ra>
 | 
					  { "SMLABT",  0xfb100010, 0xfff000f0, THUMB2_4REGS }, // SMLABT   <Rd>, <Rn>, <Rm>, <Ra>
 | 
				
			||||||
  { "SMLABB",  0xfb100020, 0xfff000f0, THUMB2_4REGS }, // SMLATB   <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>
 | 
					  { "SMLAD",   0xfb200000, 0xfff000f0, THUMB2_4REGS }, // SMLAD    <Rd>, <Rn>, <Rm>, <Ra>
 | 
				
			||||||
  { "SMLADX",  0xfb200010, 0xfff000f0, THUMB2_4REGS }, // SMLADX   <Rd>, <Rn>, <Rm>, <Ra>
 | 
					  { "SMLADX",  0xfb200010, 0xfff000f0, THUMB2_4REGS }, // SMLADX   <Rd>, <Rn>, <Rm>, <Ra>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  { "B",    0xf0008000, 0xf800d000, B_T3  },             // B<c> <label>
 | 
					  { "B",    0xf0008000, 0xf800d000, B_T3  },             // B<c> <label>
 | 
				
			||||||
  { "B",    0xf0009000, 0xf800d000, B_T4  },             // B<c> <label>
 | 
					  { "B",    0xf0009000, 0xf800d000, B_T4  },             // B<c> <label>
 | 
				
			||||||
  { "BL",   0xf000d000, 0xf800d000, B_T4  },             // BL<c> <label>
 | 
					  { "BL",   0xf000d000, 0xf800d000, B_T4  },             // BL<c> <label>
 | 
				
			||||||
@@ -302,9 +308,9 @@ THUMB_INSTRUCTIONS  gOpThumb2[] = {
 | 
				
			|||||||
  { "POP",   0xf85d0b04, 0xffff0fff, POP_T3 },           // POP <register>
 | 
					  { "POP",   0xf85d0b04, 0xffff0fff, POP_T3 },           // POP <register>
 | 
				
			||||||
  { "PUSH",  0xe8ad0000, 0xffffa000, POP_T2 },           // PUSH <registers>
 | 
					  { "PUSH",  0xe8ad0000, 0xffffa000, POP_T2 },           // PUSH <registers>
 | 
				
			||||||
  { "PUSH",  0xf84d0d04, 0xffff0fff, POP_T3 },           // PUSH <register>
 | 
					  { "PUSH",  0xf84d0d04, 0xffff0fff, POP_T3 },           // PUSH <register>
 | 
				
			||||||
  { "STM",    0xe8800000, 0xffd0a000, STM_FORMAT           }, // STM <Rn>{!},<registers>
 | 
					  { "STM"  , 0xe8800000, 0xffd0a000,  STM_FORMAT },      // STM <Rn>{!},<registers>
 | 
				
			||||||
  { "STMDB", 0xe9800000, 0xffd0a000,  STM_FORMAT },      // STMDB <Rn>{!},<registers>
 | 
					  { "STMDB", 0xe9800000, 0xffd0a000,  STM_FORMAT },      // STMDB <Rn>{!},<registers>
 | 
				
			||||||
  { "LDM",    0xe8900000, 0xffd02000, STM_FORMAT           }, // LDM <Rn>{!},<registers>
 | 
					  { "LDM"  , 0xe8900000, 0xffd02000,  STM_FORMAT },      // LDM <Rn>{!},<registers>
 | 
				
			||||||
  { "LDMDB", 0xe9100000, 0xffd02000,  STM_FORMAT },      // LDMDB <Rn>{!},<registers>
 | 
					  { "LDMDB", 0xe9100000, 0xffd02000,  STM_FORMAT },      // LDMDB <Rn>{!},<registers>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  { "LDR",   0xf8d00000, 0xfff00000,  LDM_REG_IMM12 },          // LDR   <rt>, [<rn>, {, #<imm12>]}
 | 
					  { "LDR",   0xf8d00000, 0xfff00000,  LDM_REG_IMM12 },          // LDR   <rt>, [<rn>, {, #<imm12>]}
 | 
				
			||||||
@@ -329,9 +335,9 @@ THUMB_INSTRUCTIONS  gOpThumb2[] = {
 | 
				
			|||||||
  { "LDRBT", 0xf8100e00, 0xfff00f00,  LDM_REG_IMM8 },           // LDRBT  <rt>, [<rn>, {, #<imm8>]}
 | 
					  { "LDRBT", 0xf8100e00, 0xfff00f00,  LDM_REG_IMM8 },           // LDRBT  <rt>, [<rn>, {, #<imm8>]}
 | 
				
			||||||
  { "LDRHT", 0xf8300e00, 0xfff00f00,  LDM_REG_IMM8 },           // LDRHT  <rt>, [<rn>, {, #<imm8>]}
 | 
					  { "LDRHT", 0xf8300e00, 0xfff00f00,  LDM_REG_IMM8 },           // LDRHT  <rt>, [<rn>, {, #<imm8>]}
 | 
				
			||||||
  { "LDRSB", 0xf9100800, 0xfff00800,  LDM_REG_IMM8 },           // LDRHT  <rt>, [<rn>, {, #<imm8>]}  {!} form?
 | 
					  { "LDRSB", 0xf9100800, 0xfff00800,  LDM_REG_IMM8 },           // LDRHT  <rt>, [<rn>, {, #<imm8>]}  {!} form?
 | 
				
			||||||
  { "LDRSBT", 0xf9100e00, 0xfff00f00, LDM_REG_IMM8         },   // LDRHBT <rt>, [<rn>, {, #<imm8>]}  {!} form?
 | 
					  { "LDRSBT",0xf9100e00, 0xfff00f00,  LDM_REG_IMM8 },           // LDRHBT <rt>, [<rn>, {, #<imm8>]}  {!} form?
 | 
				
			||||||
  { "LDRSH",  0xf9300800, 0xfff00800, LDM_REG_IMM8         },   // LDRSH  <rt>, [<rn>, {, #<imm8>]}
 | 
					  { "LDRSH" ,0xf9300800, 0xfff00800,  LDM_REG_IMM8 },           // LDRSH  <rt>, [<rn>, {, #<imm8>]}
 | 
				
			||||||
  { "LDRSHT", 0xf9300e00, 0xfff00f00, LDM_REG_IMM8         },   // LDRSHT <rt>, [<rn>, {, #<imm8>]}
 | 
					  { "LDRSHT",0xf9300e00, 0xfff00f00,  LDM_REG_IMM8 },           // LDRSHT <rt>, [<rn>, {, #<imm8>]}
 | 
				
			||||||
  { "LDRT",  0xf8500e00, 0xfff00f00,  LDM_REG_IMM8 },           // LDRT   <rt>, [<rn>, {, #<imm8>]}
 | 
					  { "LDRT",  0xf8500e00, 0xfff00f00,  LDM_REG_IMM8 },           // LDRT   <rt>, [<rn>, {, #<imm8>]}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  { "LDRD",  0xe8500000, 0xfe500000,  LDRD_REG_IMM8_SIGNED },   // LDRD <rt>, <rt2>, [<rn>, {, #<imm8>]}{!}
 | 
					  { "LDRD",  0xe8500000, 0xfe500000,  LDRD_REG_IMM8_SIGNED },   // LDRD <rt>, <rt2>, [<rn>, {, #<imm8>]}{!}
 | 
				
			||||||
@@ -366,9 +372,9 @@ THUMB_INSTRUCTIONS  gOpThumb2[] = {
 | 
				
			|||||||
  { "STREXD", 0xe8d00f4f, 0xfff00fff,  LDREXD  },                // STREXD <Rd>, <Rt>, <Rt2>, [<Rn>]
 | 
					  { "STREXD", 0xe8d00f4f, 0xfff00fff,  LDREXD  },                // STREXD <Rd>, <Rt>, <Rt2>, [<Rn>]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  { "SRSDB", 0xe80dc000, 0xffdffff0, SRS_FORMAT },       // SRSDB<c> SP{!},#<mode>
 | 
					  { "SRSDB", 0xe80dc000, 0xffdffff0, SRS_FORMAT },       // SRSDB<c> SP{!},#<mode>
 | 
				
			||||||
  { "SRS",    0xe98dc000, 0xffdffff0, SRS_FORMAT           }, // SRS{IA}<c> SP{!},#<mode>
 | 
					  { "SRS"  , 0xe98dc000, 0xffdffff0, SRS_FORMAT },       // SRS{IA}<c> SP{!},#<mode>
 | 
				
			||||||
  { "RFEDB", 0xe810c000, 0xffd0ffff, RFE_FORMAT },       // RFEDB<c> <Rn>{!}
 | 
					  { "RFEDB", 0xe810c000, 0xffd0ffff, RFE_FORMAT },       // RFEDB<c> <Rn>{!}
 | 
				
			||||||
  { "RFE",    0xe990c000, 0xffd0ffff, RFE_FORMAT           } // RFE{IA}<c> <Rn>{!}
 | 
					  { "RFE"  , 0xe990c000, 0xffd0ffff, RFE_FORMAT }        // RFE{IA}<c> <Rn>{!}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CHAR8 *gShiftType[] = {
 | 
					CHAR8 *gShiftType[] = {
 | 
				
			||||||
@@ -413,11 +419,9 @@ ThumbMRegList (
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (First) {
 | 
					  if (First) {
 | 
				
			||||||
    AsciiStrCatS (mThumbMregListStr, sizeof mThumbMregListStr, "ERROR");
 | 
					    AsciiStrCatS (mThumbMregListStr, sizeof mThumbMregListStr, "ERROR");
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  AsciiStrCatS (mThumbMregListStr, sizeof mThumbMregListStr, "}");
 | 
					  AsciiStrCatS (mThumbMregListStr, sizeof mThumbMregListStr, "}");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // BugBug: Make caller pass in buffer it is cleaner
 | 
					  // BugBug: Make caller pass in buffer it is cleaner
 | 
				
			||||||
@@ -486,7 +490,7 @@ DisassembleThumbInstruction (
 | 
				
			|||||||
  BOOLEAN H1Bit; // H1
 | 
					  BOOLEAN H1Bit; // H1
 | 
				
			||||||
  BOOLEAN H2Bit; // H2
 | 
					  BOOLEAN H2Bit; // H2
 | 
				
			||||||
  BOOLEAN IMod;  // imod
 | 
					  BOOLEAN IMod;  // imod
 | 
				
			||||||
  // BOOLEAN ItFlag;
 | 
					  //BOOLEAN ItFlag;
 | 
				
			||||||
  UINT32  Pc, Target, MsBit, LsBit;
 | 
					  UINT32  Pc, Target, MsBit, LsBit;
 | 
				
			||||||
  CHAR8   *Cond;
 | 
					  CHAR8   *Cond;
 | 
				
			||||||
  BOOLEAN Sign;      // S
 | 
					  BOOLEAN Sign;      // S
 | 
				
			||||||
@@ -517,7 +521,6 @@ DisassembleThumbInstruction (
 | 
				
			|||||||
  *OpCodePtrPtr += 1;
 | 
					  *OpCodePtrPtr += 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Manage IT Block ItFlag TRUE means we are in an IT block
 | 
					  // Manage IT Block ItFlag TRUE means we are in an IT block
 | 
				
			||||||
 | 
					 | 
				
			||||||
  /*if (*ItBlock != 0) {
 | 
					  /*if (*ItBlock != 0) {
 | 
				
			||||||
    ItFlag = TRUE;
 | 
					    ItFlag = TRUE;
 | 
				
			||||||
    *ItBlock -= 1;
 | 
					    *ItBlock -= 1;
 | 
				
			||||||
@@ -532,7 +535,6 @@ DisassembleThumbInstruction (
 | 
				
			|||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        Offset = AsciiSPrint (Buf, Size, "%-6a", gOpThumb[Index].Start);
 | 
					        Offset = AsciiSPrint (Buf, Size, "%-6a", gOpThumb[Index].Start);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					 | 
				
			||||||
      switch (gOpThumb[Index].AddressMode) {
 | 
					      switch (gOpThumb[Index].AddressMode) {
 | 
				
			||||||
      case LOAD_STORE_FORMAT1:
 | 
					      case LOAD_STORE_FORMAT1:
 | 
				
			||||||
        // A6.5.1  <Rd>, [<Rn>, #<5_bit_offset>]
 | 
					        // 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)));
 | 
					        AsciiSPrint (&Buf[Offset], Size - Offset, " %a", ThumbMRegList ((OpCode & 0xff) | ((OpCode & BIT8) == BIT8 ? BIT14 : 0)));
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      case IMMED_8:
 | 
					      case IMMED_8:
 | 
				
			||||||
        // A6.7 <immed_8>
 | 
					        // A6.7 <immed_8>
 | 
				
			||||||
        AsciiSPrint (&Buf[Offset], Size - Offset, " 0x%x", OpCode & 0xff);
 | 
					        AsciiSPrint (&Buf[Offset], Size - Offset, " 0x%x", OpCode & 0xff);
 | 
				
			||||||
@@ -597,7 +600,7 @@ DisassembleThumbInstruction (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      case BRANCH_EXCHANGE:
 | 
					      case BRANCH_EXCHANGE:
 | 
				
			||||||
        // A6.3.3 BX|BLX <Rm>
 | 
					        // A6.3.3 BX|BLX <Rm>
 | 
				
			||||||
          AsciiSPrint (&Buf[Offset], Size - Offset, " %a", gReg[Rn | (H2Bit ? 8 : 0)]);
 | 
					        AsciiSPrint (&Buf[Offset], Size - Offset, " %a", gReg[Rn | (H2Bit ? 8:0)]);
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      case DATA_FORMAT1:
 | 
					      case DATA_FORMAT1:
 | 
				
			||||||
@@ -634,17 +637,17 @@ DisassembleThumbInstruction (
 | 
				
			|||||||
        return;
 | 
					        return;
 | 
				
			||||||
      case DATA_FORMAT8:
 | 
					      case DATA_FORMAT8:
 | 
				
			||||||
        // A6.4.3  <Rd>|<Rn>, <Rm>
 | 
					        // A6.4.3  <Rd>|<Rn>, <Rm>
 | 
				
			||||||
          AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a", gReg[Rd | (H1Bit ? 8 : 0)], gReg[Rn | (H2Bit ? 8 : 0)]);
 | 
					        AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a", gReg[Rd | (H1Bit ? 8:0)], gReg[Rn | (H2Bit ? 8:0)]);
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      case CPS_FORMAT:
 | 
					      case CPS_FORMAT:
 | 
				
			||||||
        // A7.1.24
 | 
					        // A7.1.24
 | 
				
			||||||
          AsciiSPrint (&Buf[Offset], Size - Offset, "%a %a%a%a", IMod ? "ID" : "IE", ((OpCode & BIT2) == 0) ? "" : "a", ((OpCode & BIT1) == 0) ? "" : "i", ((OpCode & BIT0) == 0) ? "" : "f");
 | 
					        AsciiSPrint (&Buf[Offset], Size - Offset, "%a %a%a%a", IMod ? "ID":"IE", ((OpCode & BIT2) == 0) ? "":"a",  ((OpCode & BIT1) == 0) ? "":"i", ((OpCode & BIT0) == 0) ? "":"f");
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      case ENDIAN_FORMAT:
 | 
					      case ENDIAN_FORMAT:
 | 
				
			||||||
        // A7.1.24
 | 
					        // A7.1.24
 | 
				
			||||||
          AsciiSPrint (&Buf[Offset], Size - Offset, " %a", (OpCode & BIT3) == 0 ? "LE" : "BE");
 | 
					        AsciiSPrint (&Buf[Offset], Size - Offset, " %a", (OpCode & BIT3) == 0 ? "LE":"BE");
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      case DATA_CBZ:
 | 
					      case DATA_CBZ:
 | 
				
			||||||
@@ -671,23 +674,23 @@ DisassembleThumbInstruction (
 | 
				
			|||||||
        Mask = (OpCode & 0xf);
 | 
					        Mask = (OpCode & 0xf);
 | 
				
			||||||
        if ((Mask & 0x1) == 0x1) {
 | 
					        if ((Mask & 0x1) == 0x1) {
 | 
				
			||||||
          *ItBlock = 4;
 | 
					          *ItBlock = 4;
 | 
				
			||||||
            Offset  +=  AsciiSPrint (&Buf[Offset], Size - Offset, "%a%a%a", (Mask & BIT3) ? "T" : "E", (Mask & BIT2) ? "T" : "E", (Mask & BIT1) ? "T" : "E");
 | 
					          Offset +=  AsciiSPrint (&Buf[Offset], Size - Offset, "%a%a%a", (Mask & BIT3)?"T":"E", (Mask & BIT2)?"T":"E", (Mask & BIT1)?"T":"E");
 | 
				
			||||||
        } else if ((OpCode & 0x3) == 0x2) {
 | 
					        } else if ((OpCode & 0x3) == 0x2) {
 | 
				
			||||||
          *ItBlock = 3;
 | 
					          *ItBlock = 3;
 | 
				
			||||||
            Offset  +=  AsciiSPrint (&Buf[Offset], Size - Offset, "%a%a", (Mask & BIT3) ? "T" : "E", (Mask & BIT2) ? "T" : "E");
 | 
					          Offset +=  AsciiSPrint (&Buf[Offset], Size - Offset, "%a%a", (Mask & BIT3)?"T":"E", (Mask & BIT2)?"T":"E");
 | 
				
			||||||
        } else if ((OpCode & 0x7) == 0x4) {
 | 
					        } else if ((OpCode & 0x7) == 0x4) {
 | 
				
			||||||
          *ItBlock = 2;
 | 
					          *ItBlock = 2;
 | 
				
			||||||
            Offset  +=  AsciiSPrint (&Buf[Offset], Size - Offset, "%a", (Mask & BIT3) ? "T" : "E");
 | 
					          Offset +=  AsciiSPrint (&Buf[Offset], Size - Offset, "%a", (Mask & BIT3)?"T":"E");
 | 
				
			||||||
        } else if ((OpCode & 0xf) == 0x8) {
 | 
					        } else if ((OpCode & 0xf) == 0x8) {
 | 
				
			||||||
          *ItBlock = 1;
 | 
					          *ItBlock = 1;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
        AsciiSPrint (&Buf[Offset], Size - Offset, " %a", gCondition[(OpCode >> 4) & 0xf]);
 | 
					        AsciiSPrint (&Buf[Offset], Size - Offset, " %a", gCondition[(OpCode >> 4) & 0xf]);
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Thumb2 are 32-bit instructions
 | 
					  // Thumb2 are 32-bit instructions
 | 
				
			||||||
  *OpCodePtrPtr += 1;
 | 
					  *OpCodePtrPtr += 1;
 | 
				
			||||||
  Rt  = (OpCode32 >> 12) & 0xf;
 | 
					  Rt  = (OpCode32 >> 12) & 0xf;
 | 
				
			||||||
@@ -702,7 +705,6 @@ DisassembleThumbInstruction (
 | 
				
			|||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        Offset = AsciiSPrint (Buf, Size, "   %-6a", gOpThumb2[Index].Start);
 | 
					        Offset = AsciiSPrint (Buf, Size, "   %-6a", gOpThumb2[Index].Start);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					 | 
				
			||||||
      switch (gOpThumb2[Index].AddressMode) {
 | 
					      switch (gOpThumb2[Index].AddressMode) {
 | 
				
			||||||
      case B_T3:
 | 
					      case B_T3:
 | 
				
			||||||
        Cond = gCondition[(OpCode32 >> 22) & 0xf];
 | 
					        Cond = gCondition[(OpCode32 >> 22) & 0xf];
 | 
				
			||||||
@@ -710,9 +712,9 @@ DisassembleThumbInstruction (
 | 
				
			|||||||
        Buf[Offset-4] = *Cond;
 | 
					        Buf[Offset-4] = *Cond;
 | 
				
			||||||
        // S:J2:J1:imm6:imm11:0
 | 
					        // S:J2:J1:imm6:imm11:0
 | 
				
			||||||
        Target = ((OpCode32 << 1) & 0xffe) + ((OpCode32 >> 4) & 0x3f000);
 | 
					        Target = ((OpCode32 << 1) & 0xffe) + ((OpCode32 >> 4) & 0x3f000);
 | 
				
			||||||
          Target |= ((OpCode32 & BIT11) == BIT11) ? BIT19 : 0; // J2
 | 
					        Target |= ((OpCode32 & BIT11) == BIT11)? BIT19 : 0;  // J2
 | 
				
			||||||
          Target |= ((OpCode32 & BIT13) == BIT13) ? BIT18 : 0; // J1
 | 
					        Target |= ((OpCode32 & BIT13) == BIT13)? BIT18 : 0;  // J1
 | 
				
			||||||
          Target |= ((OpCode32 & BIT26) == BIT26) ? BIT20 : 0; // S
 | 
					        Target |= ((OpCode32 & BIT26) == BIT26)? BIT20 : 0;  // S
 | 
				
			||||||
        Target = SignExtend32 (Target, BIT20);
 | 
					        Target = SignExtend32 (Target, BIT20);
 | 
				
			||||||
        AsciiSPrint (&Buf[Offset], Size - Offset, " 0x%08x", Pc + 4 + Target);
 | 
					        AsciiSPrint (&Buf[Offset], Size - Offset, " 0x%08x", Pc + 4 + Target);
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
@@ -755,7 +757,7 @@ DisassembleThumbInstruction (
 | 
				
			|||||||
      case STM_FORMAT:
 | 
					      case STM_FORMAT:
 | 
				
			||||||
        // <Rn>{!}, <registers>
 | 
					        // <Rn>{!}, <registers>
 | 
				
			||||||
        WriteBack = (OpCode32 & BIT21) == BIT21;
 | 
					        WriteBack = (OpCode32 & BIT21) == BIT21;
 | 
				
			||||||
          AsciiSPrint (&Buf[Offset], Size - Offset, " %a%a, %a", gReg[(OpCode32 >> 16) & 0xf], WriteBack ? "!" : "", ThumbMRegList (OpCode32 & 0xffff));
 | 
					        AsciiSPrint (&Buf[Offset], Size - Offset, " %a%a, %a", gReg[(OpCode32 >> 16) & 0xf], WriteBack ? "!":"", ThumbMRegList (OpCode32 & 0xffff));
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      case LDM_REG_IMM12_SIGNED:
 | 
					      case LDM_REG_IMM12_SIGNED:
 | 
				
			||||||
@@ -765,7 +767,6 @@ DisassembleThumbInstruction (
 | 
				
			|||||||
          // U == 0 means subtrack, U == 1 means add
 | 
					          // U == 0 means subtrack, U == 1 means add
 | 
				
			||||||
          Target = -Target;
 | 
					          Target = -Target;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
        AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a", gReg[(OpCode32 >> 12) & 0xf], PcAlign4 (Pc) + Target);
 | 
					        AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a", gReg[(OpCode32 >> 12) & 0xf], PcAlign4 (Pc) + Target);
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -777,7 +778,6 @@ DisassembleThumbInstruction (
 | 
				
			|||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
          AsciiSPrint (&Buf[Offset], Size - Offset, ", LSL #%d]", (OpCode32 >> 4) & 3);
 | 
					          AsciiSPrint (&Buf[Offset], Size - Offset, ", LSL #%d]", (OpCode32 >> 4) & 3);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      case LDM_REG_IMM12:
 | 
					      case LDM_REG_IMM12:
 | 
				
			||||||
@@ -788,7 +788,6 @@ DisassembleThumbInstruction (
 | 
				
			|||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
          AsciiSPrint (&Buf[Offset], Size - Offset, ", #0x%x]", OpCode32 & 0xfff);
 | 
					          AsciiSPrint (&Buf[Offset], Size - Offset, ", #0x%x]", OpCode32 & 0xfff);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      case LDM_REG_IMM8:
 | 
					      case LDM_REG_IMM8:
 | 
				
			||||||
@@ -799,14 +798,13 @@ DisassembleThumbInstruction (
 | 
				
			|||||||
        Offset += AsciiSPrint (&Buf[Offset], Size - Offset, " %a, [%a", gReg[Rt], gReg[Rn]);
 | 
					        Offset += AsciiSPrint (&Buf[Offset], Size - Offset, " %a, [%a", gReg[Rt], gReg[Rn]);
 | 
				
			||||||
        if (Pre) {
 | 
					        if (Pre) {
 | 
				
			||||||
          if ((OpCode32 & 0xff) == 0) {
 | 
					          if ((OpCode32 & 0xff) == 0) {
 | 
				
			||||||
              AsciiSPrint (&Buf[Offset], Size - Offset, "]%a", WriteBack ? "!" : "");
 | 
					            AsciiSPrint (&Buf[Offset], Size - Offset, "]%a", WriteBack?"!":"");
 | 
				
			||||||
          } else {
 | 
					          } else {
 | 
				
			||||||
              AsciiSPrint (&Buf[Offset], Size - Offset, ", #%a0x%x]%a", UAdd ? "" : "-", OpCode32 & 0xff, WriteBack ? "!" : "");
 | 
					            AsciiSPrint (&Buf[Offset], Size - Offset, ", #%a0x%x]%a", UAdd?"":"-" , OpCode32 & 0xff, WriteBack?"!":"");
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            AsciiSPrint (&Buf[Offset], Size - Offset, "], #%a0x%x", UAdd ? "" : "-", OpCode32 & 0xff);
 | 
					          AsciiSPrint (&Buf[Offset], Size - Offset, "], #%a0x%x", UAdd?"":"-", OpCode32 & 0xff);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      case LDRD_REG_IMM8_SIGNED:
 | 
					      case LDRD_REG_IMM8_SIGNED:
 | 
				
			||||||
@@ -819,14 +817,13 @@ DisassembleThumbInstruction (
 | 
				
			|||||||
          if ((OpCode32 & 0xff) == 0) {
 | 
					          if ((OpCode32 & 0xff) == 0) {
 | 
				
			||||||
            AsciiSPrint (&Buf[Offset], Size - Offset, "]");
 | 
					            AsciiSPrint (&Buf[Offset], Size - Offset, "]");
 | 
				
			||||||
          } else {
 | 
					          } else {
 | 
				
			||||||
              AsciiSPrint (&Buf[Offset], Size - Offset, ", #%a0x%x]%a", UAdd ? "" : "-", (OpCode32 & 0xff) << 2, WriteBack ? "!" : "");
 | 
					            AsciiSPrint (&Buf[Offset], Size - Offset, ", #%a0x%x]%a", UAdd?"":"-", (OpCode32 & 0xff) << 2, WriteBack?"!":"");
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
          if ((OpCode32 & 0xff) != 0) {
 | 
					          if ((OpCode32 & 0xff) != 0) {
 | 
				
			||||||
              AsciiSPrint (&Buf[Offset], Size - Offset, ", #%a0x%x", UAdd ? "" : "-", (OpCode32 & 0xff) << 2);
 | 
					            AsciiSPrint (&Buf[Offset], Size - Offset, ", #%a0x%x", UAdd?"":"-", (OpCode32 & 0xff) << 2);
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      case LDRD_REG_IMM8:
 | 
					      case LDRD_REG_IMM8:
 | 
				
			||||||
@@ -836,7 +833,6 @@ DisassembleThumbInstruction (
 | 
				
			|||||||
          // U == 0 means subtrack, U == 1 means add
 | 
					          // U == 0 means subtrack, U == 1 means add
 | 
				
			||||||
          Target = -Target;
 | 
					          Target = -Target;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
        AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a, %a", gReg[Rt], gReg[Rt2], Pc + 4 + Target);
 | 
					        AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a, %a", gReg[Rt], gReg[Rt2], Pc + 4 + Target);
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -853,13 +849,13 @@ DisassembleThumbInstruction (
 | 
				
			|||||||
      case SRS_FORMAT:
 | 
					      case SRS_FORMAT:
 | 
				
			||||||
        // SP{!}, #<mode>
 | 
					        // SP{!}, #<mode>
 | 
				
			||||||
        WriteBack = (OpCode32 & BIT21) == BIT21;
 | 
					        WriteBack = (OpCode32 & BIT21) == BIT21;
 | 
				
			||||||
          AsciiSPrint (&Buf[Offset], Size - Offset, " SP%a, #0x%x", WriteBack ? "!" : "", OpCode32 & 0x1f);
 | 
					        AsciiSPrint (&Buf[Offset], Size - Offset, " SP%a, #0x%x", WriteBack?"!":"", OpCode32 & 0x1f);
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      case RFE_FORMAT:
 | 
					      case RFE_FORMAT:
 | 
				
			||||||
        // <Rn>{!}
 | 
					        // <Rn>{!}
 | 
				
			||||||
        WriteBack = (OpCode32 & BIT21) == BIT21;
 | 
					        WriteBack = (OpCode32 & BIT21) == BIT21;
 | 
				
			||||||
          AsciiSPrint (&Buf[Offset], Size - Offset, " %a%a, #0x%x", gReg[Rn], WriteBack ? "!" : "");
 | 
					        AsciiSPrint (&Buf[Offset], Size - Offset, " %a%a, #0x%x", gReg[Rn], WriteBack?"!":"");
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      case ADD_IMM12:
 | 
					      case ADD_IMM12:
 | 
				
			||||||
@@ -867,7 +863,6 @@ DisassembleThumbInstruction (
 | 
				
			|||||||
        if ((OpCode32 & BIT20) == BIT20) {
 | 
					        if ((OpCode32 & BIT20) == BIT20) {
 | 
				
			||||||
          Buf[Offset - 3] = 'S';  // assume %-6a
 | 
					          Buf[Offset - 3] = 'S';  // assume %-6a
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
        Target = (OpCode32 & 0xff) | ((OpCode32 >> 4) & 0x700) | ((OpCode & BIT26) == BIT26 ? BIT11 : 0);
 | 
					        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);
 | 
					        AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a, #0x%x", gReg[Rd], gReg[Rn], Target);
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
@@ -877,7 +872,6 @@ DisassembleThumbInstruction (
 | 
				
			|||||||
        if ((OpCode32 & BIT20) == BIT20) {
 | 
					        if ((OpCode32 & BIT20) == BIT20) {
 | 
				
			||||||
          Buf[Offset - 3] = 'S';  // assume %-6a
 | 
					          Buf[Offset - 3] = 'S';  // assume %-6a
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
        Target = (OpCode32 & 0xff) | ((OpCode32 >> 4) & 0x700) | ((OpCode & BIT26) == BIT26 ? BIT11 : 0);
 | 
					        Target = (OpCode32 & 0xff) | ((OpCode32 >> 4) & 0x700) | ((OpCode & BIT26) == BIT26 ? BIT11 : 0);
 | 
				
			||||||
        AsciiSPrint (&Buf[Offset], Size - Offset, " %a, #0x%x", gReg[Rd], Target);
 | 
					        AsciiSPrint (&Buf[Offset], Size - Offset, " %a, #0x%x", gReg[Rd], Target);
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
@@ -894,13 +888,11 @@ DisassembleThumbInstruction (
 | 
				
			|||||||
        if ((OpCode32 & BIT20) == BIT20) {
 | 
					        if ((OpCode32 & BIT20) == BIT20) {
 | 
				
			||||||
          Buf[Offset - 3] = 'S';  // assume %-6a
 | 
					          Buf[Offset - 3] = 'S';  // assume %-6a
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
        Target = ((OpCode32 >> 6) & 3) | ((OpCode32 >> 10) & 0x1c0);
 | 
					        Target = ((OpCode32 >> 6) & 3) | ((OpCode32 >> 10) & 0x1c0);
 | 
				
			||||||
        Offset += AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a, %a", gReg[Rd], gReg[Rn], gReg[Rm]);
 | 
					        Offset += AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a, %a", gReg[Rd], gReg[Rn], gReg[Rm]);
 | 
				
			||||||
        if (Target != 0) {
 | 
					        if (Target != 0) {
 | 
				
			||||||
          AsciiSPrint (&Buf[Offset], Size - Offset, ", LSL %d", gShiftType[(OpCode >> 5) & 3], Target);
 | 
					          AsciiSPrint (&Buf[Offset], Size - Offset, ", LSL %d", gShiftType[(OpCode >> 5) & 3], Target);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      case ADD_IMM5_2REG:
 | 
					      case ADD_IMM5_2REG:
 | 
				
			||||||
@@ -911,12 +903,12 @@ DisassembleThumbInstruction (
 | 
				
			|||||||
          AsciiSPrint (&Buf[Offset], Size - Offset, ", LSL %d", gShiftType[(OpCode >> 5) & 3], Target);
 | 
					          AsciiSPrint (&Buf[Offset], Size - Offset, ", LSL %d", gShiftType[(OpCode >> 5) & 3], Target);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      case ASR_IMM5:
 | 
					      case ASR_IMM5:
 | 
				
			||||||
        // ARS  <Rd>, <Rm> #<const>} imm3:imm2
 | 
					        // ARS  <Rd>, <Rm> #<const>} imm3:imm2
 | 
				
			||||||
        if ((OpCode32 & BIT20) == BIT20) {
 | 
					        if ((OpCode32 & BIT20) == BIT20) {
 | 
				
			||||||
          Buf[Offset - 3] = 'S';  // assume %-6a
 | 
					          Buf[Offset - 3] = 'S';  // assume %-6a
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
        Target = ((OpCode32 >> 6) & 3) | ((OpCode32 >> 10) & 0x1c0);
 | 
					        Target = ((OpCode32 >> 6) & 3) | ((OpCode32 >> 10) & 0x1c0);
 | 
				
			||||||
        AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a #%d", gReg[Rd], gReg[Rm], Target);
 | 
					        AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a #%d", gReg[Rd], gReg[Rm], Target);
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
@@ -926,7 +918,6 @@ DisassembleThumbInstruction (
 | 
				
			|||||||
        if ((OpCode32 & BIT20) == BIT20) {
 | 
					        if ((OpCode32 & BIT20) == BIT20) {
 | 
				
			||||||
          Buf[Offset - 3] = 'S';  // assume %-6a
 | 
					          Buf[Offset - 3] = 'S';  // assume %-6a
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
        AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a %a", gReg[Rd], gReg[Rn], gReg[Rm]);
 | 
					        AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a %a", gReg[Rd], gReg[Rn], gReg[Rm]);
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -938,7 +929,6 @@ DisassembleThumbInstruction (
 | 
				
			|||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
          Target = PcAlign4 (Pc) + Target;
 | 
					          Target = PcAlign4 (Pc) + Target;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
        AsciiSPrint (&Buf[Offset], Size - Offset, " %a, 0x%08x", gReg[Rd], Target);
 | 
					        AsciiSPrint (&Buf[Offset], Size - Offset, " %a, 0x%08x", gReg[Rd], Target);
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -952,7 +942,7 @@ DisassembleThumbInstruction (
 | 
				
			|||||||
        // BFI <Rd>, <Rn>, #<lsb>, #<width>
 | 
					        // BFI <Rd>, <Rn>, #<lsb>, #<width>
 | 
				
			||||||
        MsBit = OpCode32 & 0x1f;
 | 
					        MsBit = OpCode32 & 0x1f;
 | 
				
			||||||
        LsBit = ((OpCode32 >> 6) & 3) | ((OpCode >> 10) &  0x1c);
 | 
					        LsBit = ((OpCode32 >> 6) & 3) | ((OpCode >> 10) &  0x1c);
 | 
				
			||||||
          if ((Rn == 0xf) & (AsciiStrCmp (gOpThumb2[Index].Start, "BFC") == 0)) {
 | 
					        if ((Rn == 0xf) & (AsciiStrCmp (gOpThumb2[Index].Start, "BFC") == 0)){
 | 
				
			||||||
          // BFC <Rd>, #<lsb>, #<width>
 | 
					          // BFC <Rd>, #<lsb>, #<width>
 | 
				
			||||||
          AsciiSPrint (&Buf[Offset], Size - Offset, " %a, #%d, #%d", gReg[Rd], LsBit, MsBit - LsBit + 1);
 | 
					          AsciiSPrint (&Buf[Offset], Size - Offset, " %a, #%d, #%d", gReg[Rd], LsBit, MsBit - LsBit + 1);
 | 
				
			||||||
        } else if (AsciiStrCmp (gOpThumb2[Index].Start, "BFI") == 0) {
 | 
					        } else if (AsciiStrCmp (gOpThumb2[Index].Start, "BFI") == 0) {
 | 
				
			||||||
@@ -960,7 +950,6 @@ DisassembleThumbInstruction (
 | 
				
			|||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
          AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a, #%d, #%d", gReg[Rd], gReg[Rn], LsBit, MsBit + 1);
 | 
					          AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a, #%d, #%d", gReg[Rd], gReg[Rn], LsBit, MsBit + 1);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      case CPD_THUMB2:
 | 
					      case CPD_THUMB2:
 | 
				
			||||||
@@ -975,7 +964,6 @@ DisassembleThumbInstruction (
 | 
				
			|||||||
        if (Opc2 != 0) {
 | 
					        if (Opc2 != 0) {
 | 
				
			||||||
          AsciiSPrint (&Buf[Offset], Size - Offset, ",#%d,", Opc2);
 | 
					          AsciiSPrint (&Buf[Offset], Size - Offset, ",#%d,", Opc2);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      case MRC_THUMB2:
 | 
					      case MRC_THUMB2:
 | 
				
			||||||
@@ -989,7 +977,6 @@ DisassembleThumbInstruction (
 | 
				
			|||||||
        if (Opc2 != 0) {
 | 
					        if (Opc2 != 0) {
 | 
				
			||||||
          AsciiSPrint (&Buf[Offset], Size - Offset, ",#%d,", Opc2);
 | 
					          AsciiSPrint (&Buf[Offset], Size - Offset, ",#%d,", Opc2);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      case MRRC_THUMB2:
 | 
					      case MRRC_THUMB2:
 | 
				
			||||||
@@ -1019,7 +1006,7 @@ DisassembleThumbInstruction (
 | 
				
			|||||||
      case THUMB2_MSR:
 | 
					      case THUMB2_MSR:
 | 
				
			||||||
        // MRS CPSR_<fields>, <Rd>
 | 
					        // MRS CPSR_<fields>, <Rd>
 | 
				
			||||||
        Target = (OpCode32 >> 10) & 3;
 | 
					        Target = (OpCode32 >> 10) & 3;
 | 
				
			||||||
          AsciiSPrint (&Buf[Offset], Size - Offset, " CPSR_%a%a, %a", (Target & 2) == 0 ? "" : "f", (Target & 1) == 0 ? "" : "s", gReg[Rd]);
 | 
					        AsciiSPrint (&Buf[Offset], Size - Offset, " CPSR_%a%a, %a", (Target & 2) == 0 ? "":"f", (Target & 1) == 0 ? "":"s", gReg[Rd]);
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      case THUMB2_NO_ARGS:
 | 
					      case THUMB2_NO_ARGS:
 | 
				
			||||||
@@ -1032,6 +1019,8 @@ DisassembleThumbInstruction (
 | 
				
			|||||||
  AsciiSPrint (Buf, Size, "0x%08x", OpCode32);
 | 
					  AsciiSPrint (Buf, Size, "0x%08x", OpCode32);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
DisassembleArmInstruction (
 | 
					DisassembleArmInstruction (
 | 
				
			||||||
  IN  UINT32    **OpCodePtr,
 | 
					  IN  UINT32    **OpCodePtr,
 | 
				
			||||||
@@ -1040,6 +1029,7 @@ DisassembleArmInstruction (
 | 
				
			|||||||
  IN  BOOLEAN   Extended
 | 
					  IN  BOOLEAN   Extended
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
  Place a disassembly of **OpCodePtr into buffer, and update OpCodePtr to
 | 
					  Place a disassembly of **OpCodePtr into buffer, and update OpCodePtr to
 | 
				
			||||||
  point to next instruction.
 | 
					  point to next instruction.
 | 
				
			||||||
@@ -1071,3 +1061,4 @@ DisassembleInstruction (
 | 
				
			|||||||
    DisassembleArmInstruction ((UINT32 **)OpCodePtr, Buf, Size, Extended);
 | 
					    DisassembleArmInstruction ((UINT32 **)OpCodePtr, Buf, Size, Extended);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -40,13 +40,13 @@ ArchVectorConfig (
 | 
				
			|||||||
    (VOID *)(((UINTN)mNewStackBase + EL0_STACK_SIZE) & ~0xFUL)
 | 
					    (VOID *)(((UINTN)mNewStackBase + EL0_STACK_SIZE) & ~0xFUL)
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (ArmReadCurrentEL () == AARCH64_EL2) {
 | 
					  if (ArmReadCurrentEL() == AARCH64_EL2) {
 | 
				
			||||||
    HcrReg = ArmReadHcr ();
 | 
					    HcrReg = ArmReadHcr();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Trap General Exceptions. All exceptions that would be routed to EL1 are routed to EL2
 | 
					    // Trap General Exceptions. All exceptions that would be routed to EL1 are routed to EL2
 | 
				
			||||||
    HcrReg |= ARM_HCR_TGE;
 | 
					    HcrReg |= ARM_HCR_TGE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ArmWriteHcr (HcrReg);
 | 
					    ArmWriteHcr(HcrReg);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return RETURN_SUCCESS;
 | 
					  return RETURN_SUCCESS;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,10 +34,11 @@ ArchVectorConfig (
 | 
				
			|||||||
  // if the vector address corresponds to high vectors
 | 
					  // if the vector address corresponds to high vectors
 | 
				
			||||||
  if (VectorBaseAddress == 0xFFFF0000) {
 | 
					  if (VectorBaseAddress == 0xFFFF0000) {
 | 
				
			||||||
    // set SCTLR.V to enable high vectors
 | 
					    // set SCTLR.V to enable high vectors
 | 
				
			||||||
    ArmSetHighVectors ();
 | 
					    ArmSetHighVectors();
 | 
				
			||||||
  } else {
 | 
					  }
 | 
				
			||||||
 | 
					  else {
 | 
				
			||||||
    // Set SCTLR.V to 0 to enable VBAR to be used
 | 
					    // Set SCTLR.V to 0 to enable VBAR to be used
 | 
				
			||||||
    ArmSetLowVectors ();
 | 
					    ArmSetLowVectors();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return RETURN_SUCCESS;
 | 
					  return RETURN_SUCCESS;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,29 +22,28 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
STATIC
 | 
					STATIC
 | 
				
			||||||
RETURN_STATUS
 | 
					RETURN_STATUS
 | 
				
			||||||
CopyExceptionHandlers (
 | 
					CopyExceptionHandlers(
 | 
				
			||||||
  IN  PHYSICAL_ADDRESS        BaseAddress
 | 
					  IN  PHYSICAL_ADDRESS        BaseAddress
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
RegisterExceptionHandler (
 | 
					RegisterExceptionHandler(
 | 
				
			||||||
  IN EFI_EXCEPTION_TYPE            ExceptionType,
 | 
					  IN EFI_EXCEPTION_TYPE            ExceptionType,
 | 
				
			||||||
  IN EFI_CPU_INTERRUPT_HANDLER     InterruptHandler
 | 
					  IN EFI_CPU_INTERRUPT_HANDLER     InterruptHandler
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
ExceptionHandlersStart (
 | 
					ExceptionHandlersStart(
 | 
				
			||||||
  VOID
 | 
					  VOID
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
ExceptionHandlersEnd (
 | 
					ExceptionHandlersEnd(
 | 
				
			||||||
  VOID
 | 
					  VOID
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RETURN_STATUS
 | 
					RETURN_STATUS ArchVectorConfig(
 | 
				
			||||||
ArchVectorConfig (
 | 
					 | 
				
			||||||
  IN  UINTN       VectorBaseAddress
 | 
					  IN  UINTN       VectorBaseAddress
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -61,12 +60,13 @@ extern UINTN                   gDebuggerNoHandlerValue;
 | 
				
			|||||||
// address this at library build time.  Since this affects the build of the
 | 
					// address this at library build time.  Since this affects the build of the
 | 
				
			||||||
// library we cannot represent this in a PCD since PCDs are evaluated on
 | 
					// library we cannot represent this in a PCD since PCDs are evaluated on
 | 
				
			||||||
// a per-module basis.
 | 
					// a per-module basis.
 | 
				
			||||||
#if defined (ARM_RELOCATE_VECTORS)
 | 
					#if defined(ARM_RELOCATE_VECTORS)
 | 
				
			||||||
STATIC CONST BOOLEAN gArmRelocateVectorTable = TRUE;
 | 
					STATIC CONST BOOLEAN gArmRelocateVectorTable = TRUE;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
STATIC CONST BOOLEAN gArmRelocateVectorTable = FALSE;
 | 
					STATIC CONST BOOLEAN gArmRelocateVectorTable = FALSE;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
Initializes all CPU exceptions entries and provides the default exception handlers.
 | 
					Initializes all CPU exceptions entries and provides the default exception handlers.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -85,7 +85,7 @@ with default exception handlers.
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
InitializeCpuExceptionHandlers (
 | 
					InitializeCpuExceptionHandlers(
 | 
				
			||||||
  IN EFI_VECTOR_HANDOFF_INFO       *VectorInfo OPTIONAL
 | 
					  IN EFI_VECTOR_HANDOFF_INFO       *VectorInfo OPTIONAL
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -96,10 +96,12 @@ InitializeCpuExceptionHandlers (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  // if we are requested to copy exception handlers to another location
 | 
					  // if we are requested to copy exception handlers to another location
 | 
				
			||||||
  if (gArmRelocateVectorTable) {
 | 
					  if (gArmRelocateVectorTable) {
 | 
				
			||||||
    VectorBase = PcdGet64 (PcdCpuVectorBaseAddress);
 | 
					
 | 
				
			||||||
    Status     = CopyExceptionHandlers (VectorBase);
 | 
					    VectorBase = PcdGet64(PcdCpuVectorBaseAddress);
 | 
				
			||||||
  } else {
 | 
					    Status = CopyExceptionHandlers(VectorBase);
 | 
				
			||||||
    // 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
 | 
					    // The vector table must be aligned for the architecture.  If this
 | 
				
			||||||
    // assertion fails ensure the appropriate FFS alignment is in effect,
 | 
					    // assertion fails ensure the appropriate FFS alignment is in effect,
 | 
				
			||||||
@@ -108,7 +110,7 @@ InitializeCpuExceptionHandlers (
 | 
				
			|||||||
    // for AArch64 Align=4K is required.  Align=Auto can be used but this
 | 
					    // for AArch64 Align=4K is required.  Align=Auto can be used but this
 | 
				
			||||||
    // is known to cause an issue with populating the reset vector area
 | 
					    // is known to cause an issue with populating the reset vector area
 | 
				
			||||||
    // for encapsulated FVs.
 | 
					    // for encapsulated FVs.
 | 
				
			||||||
    ASSERT (((UINTN)ExceptionHandlersStart & gExceptionVectorAlignmentMask) == 0);
 | 
					    ASSERT(((UINTN)ExceptionHandlersStart & gExceptionVectorAlignmentMask) == 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // We do not copy the Exception Table at PcdGet64(PcdCpuVectorBaseAddress). We just set Vector
 | 
					    // We do not copy the Exception Table at PcdGet64(PcdCpuVectorBaseAddress). We just set Vector
 | 
				
			||||||
    // Base Address to point into CpuDxe code.
 | 
					    // Base Address to point into CpuDxe code.
 | 
				
			||||||
@@ -117,12 +119,12 @@ InitializeCpuExceptionHandlers (
 | 
				
			|||||||
    Status = RETURN_SUCCESS;
 | 
					    Status = RETURN_SUCCESS;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (!RETURN_ERROR (Status)) {
 | 
					  if (!RETURN_ERROR(Status)) {
 | 
				
			||||||
    // call the architecture-specific routine to prepare for the new vector
 | 
					    // call the architecture-specific routine to prepare for the new vector
 | 
				
			||||||
    // configuration to take effect
 | 
					    // configuration to take effect
 | 
				
			||||||
    ArchVectorConfig (VectorBase);
 | 
					    ArchVectorConfig(VectorBase);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ArmWriteVBar (VectorBase);
 | 
					    ArmWriteVBar(VectorBase);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return RETURN_SUCCESS;
 | 
					  return RETURN_SUCCESS;
 | 
				
			||||||
@@ -146,7 +148,7 @@ with default exception handlers.
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
STATIC
 | 
					STATIC
 | 
				
			||||||
RETURN_STATUS
 | 
					RETURN_STATUS
 | 
				
			||||||
CopyExceptionHandlers (
 | 
					CopyExceptionHandlers(
 | 
				
			||||||
  IN  PHYSICAL_ADDRESS        BaseAddress
 | 
					  IN  PHYSICAL_ADDRESS        BaseAddress
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -165,35 +167,37 @@ CopyExceptionHandlers (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  VectorBase = (UINT32 *)(UINTN)BaseAddress;
 | 
					  VectorBase = (UINT32 *)(UINTN)BaseAddress;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (FeaturePcdGet (PcdDebuggerExceptionSupport) == TRUE) {
 | 
					  if (FeaturePcdGet(PcdDebuggerExceptionSupport) == TRUE) {
 | 
				
			||||||
    // Save existing vector table, in case debugger is already hooked in
 | 
					    // Save existing vector table, in case debugger is already hooked in
 | 
				
			||||||
    CopyMem ((VOID *)gDebuggerExceptionHandlers, (VOID *)VectorBase, sizeof (EFI_EXCEPTION_CALLBACK)* (gMaxExceptionNumber+1));
 | 
					    CopyMem((VOID *)gDebuggerExceptionHandlers, (VOID *)VectorBase, sizeof (EFI_EXCEPTION_CALLBACK)* (gMaxExceptionNumber+1));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Copy our assembly code into the page that contains the exception vectors.
 | 
					  // Copy our assembly code into the page that contains the exception vectors.
 | 
				
			||||||
  CopyMem ((VOID *)VectorBase, (VOID *)ExceptionHandlersStart, Length);
 | 
					  CopyMem((VOID *)VectorBase, (VOID *)ExceptionHandlersStart, Length);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  // Initialize the C entry points for interrupts
 | 
					  // Initialize the C entry points for interrupts
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  for (Index = 0; Index <= gMaxExceptionNumber; Index++) {
 | 
					  for (Index = 0; Index <= gMaxExceptionNumber; Index++) {
 | 
				
			||||||
    if (!FeaturePcdGet (PcdDebuggerExceptionSupport) ||
 | 
					    if (!FeaturePcdGet(PcdDebuggerExceptionSupport) ||
 | 
				
			||||||
        (gDebuggerExceptionHandlers[Index] == 0) || (gDebuggerExceptionHandlers[Index] == (VOID *)gDebuggerNoHandlerValue))
 | 
					      (gDebuggerExceptionHandlers[Index] == 0) || (gDebuggerExceptionHandlers[Index] == (VOID *)gDebuggerNoHandlerValue)) {
 | 
				
			||||||
    {
 | 
					
 | 
				
			||||||
      Status = RegisterExceptionHandler (Index, NULL);
 | 
					      Status = RegisterExceptionHandler(Index, NULL);
 | 
				
			||||||
      ASSERT_EFI_ERROR (Status);
 | 
					      ASSERT_EFI_ERROR(Status);
 | 
				
			||||||
    } else {
 | 
					    }
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
      // If the debugger has already hooked put its vector back
 | 
					      // If the debugger has already hooked put its vector back
 | 
				
			||||||
      VectorBase[Index] = (UINT32)(UINTN)gDebuggerExceptionHandlers[Index];
 | 
					      VectorBase[Index] = (UINT32)(UINTN)gDebuggerExceptionHandlers[Index];
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Flush Caches since we updated executable stuff
 | 
					  // Flush Caches since we updated executable stuff
 | 
				
			||||||
  InvalidateInstructionCacheRange ((VOID *)(UINTN)BaseAddress, Length);
 | 
					  InvalidateInstructionCacheRange((VOID *)(UINTN)BaseAddress, Length);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return RETURN_SUCCESS;
 | 
					  return RETURN_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
Initializes all CPU interrupt/exceptions entries and provides the default interrupt/exception handlers.
 | 
					Initializes all CPU interrupt/exceptions entries and provides the default interrupt/exception handlers.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -212,9 +216,9 @@ with default interrupt/exception handlers.
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
InitializeCpuInterruptHandlers (
 | 
					InitializeCpuInterruptHandlers(
 | 
				
			||||||
  IN EFI_VECTOR_HANDOFF_INFO  *VectorInfo OPTIONAL
 | 
					IN EFI_VECTOR_HANDOFF_INFO       *VectorInfo OPTIONAL
 | 
				
			||||||
  )
 | 
					)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  // not needed, this is what the CPU driver is for
 | 
					  // not needed, this is what the CPU driver is for
 | 
				
			||||||
  return EFI_UNSUPPORTED;
 | 
					  return EFI_UNSUPPORTED;
 | 
				
			||||||
@@ -246,7 +250,7 @@ previously installed.
 | 
				
			|||||||
or this function is not supported.
 | 
					or this function is not supported.
 | 
				
			||||||
**/
 | 
					**/
 | 
				
			||||||
RETURN_STATUS
 | 
					RETURN_STATUS
 | 
				
			||||||
RegisterCpuInterruptHandler (
 | 
					RegisterCpuInterruptHandler(
 | 
				
			||||||
  IN EFI_EXCEPTION_TYPE             ExceptionType,
 | 
					  IN EFI_EXCEPTION_TYPE             ExceptionType,
 | 
				
			||||||
  IN EFI_CPU_INTERRUPT_HANDLER      ExceptionHandler
 | 
					  IN EFI_CPU_INTERRUPT_HANDLER      ExceptionHandler
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
@@ -283,17 +287,17 @@ If this parameter is NULL, then the handler will be uninstalled.
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
RegisterExceptionHandler (
 | 
					RegisterExceptionHandler(
 | 
				
			||||||
  IN EFI_EXCEPTION_TYPE            ExceptionType,
 | 
					  IN EFI_EXCEPTION_TYPE            ExceptionType,
 | 
				
			||||||
  IN EFI_CPU_INTERRUPT_HANDLER     InterruptHandler
 | 
					  IN EFI_CPU_INTERRUPT_HANDLER     InterruptHandler
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return RegisterCpuInterruptHandler (ExceptionType, InterruptHandler);
 | 
					  return RegisterCpuInterruptHandler(ExceptionType, InterruptHandler);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
CommonCExceptionHandler (
 | 
					CommonCExceptionHandler(
 | 
				
			||||||
  IN     EFI_EXCEPTION_TYPE           ExceptionType,
 | 
					  IN     EFI_EXCEPTION_TYPE           ExceptionType,
 | 
				
			||||||
  IN OUT EFI_SYSTEM_CONTEXT           SystemContext
 | 
					  IN OUT EFI_SYSTEM_CONTEXT           SystemContext
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
@@ -303,12 +307,13 @@ CommonCExceptionHandler (
 | 
				
			|||||||
      gExceptionHandlers[ExceptionType](ExceptionType, SystemContext);
 | 
					      gExceptionHandlers[ExceptionType](ExceptionType, SystemContext);
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  } else {
 | 
					  }
 | 
				
			||||||
    DEBUG ((DEBUG_ERROR, "Unknown exception type %d\n", ExceptionType));
 | 
					  else {
 | 
				
			||||||
    ASSERT (FALSE);
 | 
					    DEBUG((EFI_D_ERROR, "Unknown exception type %d\n", ExceptionType));
 | 
				
			||||||
 | 
					    ASSERT(FALSE);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  DefaultExceptionHandler (ExceptionType, SystemContext);
 | 
					  DefaultExceptionHandler(ExceptionType, SystemContext);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@@ -342,3 +347,4 @@ InitializeCpuExceptionHandlersEx (
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  return InitializeCpuExceptionHandlers (VectorInfo);
 | 
					  return InitializeCpuExceptionHandlers (VectorInfo);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -71,6 +71,7 @@ ArmGenericTimerGetTimerVal (
 | 
				
			|||||||
  return ArmReadCntpTval ();
 | 
					  return ArmReadCntpTval ();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGenericTimerSetTimerVal (
 | 
					ArmGenericTimerSetTimerVal (
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -71,6 +71,7 @@ ArmGenericTimerGetTimerVal (
 | 
				
			|||||||
  return ArmReadCntvTval ();
 | 
					  return ArmReadCntvTval ();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGenericTimerSetTimerVal (
 | 
					ArmGenericTimerSetTimerVal (
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -38,7 +38,6 @@ ArmGicArchLibInitialize (
 | 
				
			|||||||
      ArmGicV3SetControlSystemRegisterEnable (IccSre | ICC_SRE_EL2_SRE);
 | 
					      ArmGicV3SetControlSystemRegisterEnable (IccSre | ICC_SRE_EL2_SRE);
 | 
				
			||||||
      IccSre = ArmGicV3GetControlSystemRegisterEnable ();
 | 
					      IccSre = ArmGicV3GetControlSystemRegisterEnable ();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (IccSre & ICC_SRE_EL2_SRE) {
 | 
					    if (IccSre & ICC_SRE_EL2_SRE) {
 | 
				
			||||||
      mGicArchRevision = ARM_GIC_ARCH_REVISION_3;
 | 
					      mGicArchRevision = ARM_GIC_ARCH_REVISION_3;
 | 
				
			||||||
      goto Done;
 | 
					      goto Done;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -36,7 +36,6 @@ ArmGicGetSupportedArchRevision (
 | 
				
			|||||||
      ArmGicV3SetControlSystemRegisterEnable (IccSre | ICC_SRE_EL2_SRE);
 | 
					      ArmGicV3SetControlSystemRegisterEnable (IccSre | ICC_SRE_EL2_SRE);
 | 
				
			||||||
      IccSre = ArmGicV3GetControlSystemRegisterEnable ();
 | 
					      IccSre = ArmGicV3GetControlSystemRegisterEnable ();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (IccSre & ICC_SRE_EL2_SRE) {
 | 
					    if (IccSre & ICC_SRE_EL2_SRE) {
 | 
				
			||||||
      return ARM_GIC_ARCH_REVISION_3;
 | 
					      return ARM_GIC_ARCH_REVISION_3;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,7 +26,7 @@ AArch64DataCacheOperation (
 | 
				
			|||||||
  UINTN     SavedInterruptState;
 | 
					  UINTN     SavedInterruptState;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SavedInterruptState = ArmGetInterruptState ();
 | 
					  SavedInterruptState = ArmGetInterruptState ();
 | 
				
			||||||
  ArmDisableInterrupts ();
 | 
					  ArmDisableInterrupts();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  AArch64AllDataCachesOperation (DataCacheOperation);
 | 
					  AArch64AllDataCachesOperation (DataCacheOperation);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,9 +11,7 @@
 | 
				
			|||||||
#ifndef AARCH64_LIB_H_
 | 
					#ifndef AARCH64_LIB_H_
 | 
				
			||||||
#define AARCH64_LIB_H_
 | 
					#define AARCH64_LIB_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef VOID (*AARCH64_CACHE_OPERATION)(
 | 
					typedef VOID (*AARCH64_CACHE_OPERATION)(UINTN);
 | 
				
			||||||
  UINTN
 | 
					 | 
				
			||||||
  );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
AArch64AllDataCachesOperation (
 | 
					AArch64AllDataCachesOperation (
 | 
				
			||||||
@@ -55,3 +53,4 @@ ArmReadIdAA64Mmfr2 (
 | 
				
			|||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // AARCH64_LIB_H_
 | 
					#endif // AARCH64_LIB_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,9 +23,7 @@
 | 
				
			|||||||
#define ID_MMFR0_SHR_IMP_HW_COHERENT   1
 | 
					#define ID_MMFR0_SHR_IMP_HW_COHERENT   1
 | 
				
			||||||
#define ID_MMFR0_SHR_IGNORED         0xf
 | 
					#define ID_MMFR0_SHR_IGNORED         0xf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef VOID (*ARM_V7_CACHE_OPERATION)(
 | 
					typedef VOID (*ARM_V7_CACHE_OPERATION)(UINT32);
 | 
				
			||||||
  UINT32
 | 
					 | 
				
			||||||
  );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
ArmV7AllDataCachesOperation (
 | 
					ArmV7AllDataCachesOperation (
 | 
				
			||||||
@@ -67,3 +65,4 @@ ArmReadIdPfr1 (
 | 
				
			|||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // ARM_V7_LIB_H_
 | 
					#endif // ARM_V7_LIB_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,7 +19,7 @@ ArmSetAuxCrBit (
 | 
				
			|||||||
  IN  UINT32    Bits
 | 
					  IN  UINT32    Bits
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  ArmWriteAuxCr (ArmReadAuxCr () | Bits);
 | 
					  ArmWriteAuxCr(ArmReadAuxCr() | Bits);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
@@ -28,7 +28,7 @@ ArmUnsetAuxCrBit (
 | 
				
			|||||||
  IN  UINT32    Bits
 | 
					  IN  UINT32    Bits
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  ArmWriteAuxCr (ArmReadAuxCr () & ~Bits);
 | 
					  ArmWriteAuxCr(ArmReadAuxCr() & ~Bits);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -47,12 +47,11 @@ ArmMemoryAttributeToPageAttribute (
 | 
				
			|||||||
    ASSERT (0);
 | 
					    ASSERT (0);
 | 
				
			||||||
  case ARM_MEMORY_REGION_ATTRIBUTE_DEVICE:
 | 
					  case ARM_MEMORY_REGION_ATTRIBUTE_DEVICE:
 | 
				
			||||||
  case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_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;
 | 
					      return TT_ATTR_INDX_DEVICE_MEMORY | TT_XN_MASK;
 | 
				
			||||||
      } else {
 | 
					    else
 | 
				
			||||||
      return TT_ATTR_INDX_DEVICE_MEMORY | TT_UXN_MASK | TT_PXN_MASK;
 | 
					      return TT_ATTR_INDX_DEVICE_MEMORY | TT_UXN_MASK | TT_PXN_MASK;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MIN_T0SZ        16
 | 
					#define MIN_T0SZ        16
 | 
				
			||||||
@@ -108,15 +107,12 @@ FreePageTablesRecursive (
 | 
				
			|||||||
  if (Level < 3) {
 | 
					  if (Level < 3) {
 | 
				
			||||||
    for (Index = 0; Index < TT_ENTRY_COUNT; Index++) {
 | 
					    for (Index = 0; Index < TT_ENTRY_COUNT; Index++) {
 | 
				
			||||||
      if ((TranslationTable[Index] & TT_TYPE_MASK) == TT_TYPE_TABLE_ENTRY) {
 | 
					      if ((TranslationTable[Index] & TT_TYPE_MASK) == TT_TYPE_TABLE_ENTRY) {
 | 
				
			||||||
        FreePageTablesRecursive (
 | 
					        FreePageTablesRecursive ((VOID *)(UINTN)(TranslationTable[Index] &
 | 
				
			||||||
          (VOID *)(UINTN)(TranslationTable[Index] &
 | 
					 | 
				
			||||||
                                                 TT_ADDRESS_MASK_BLOCK_ENTRY),
 | 
					                                                 TT_ADDRESS_MASK_BLOCK_ENTRY),
 | 
				
			||||||
          Level + 1
 | 
					                                 Level + 1);
 | 
				
			||||||
          );
 | 
					 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  FreePages (TranslationTable, 1);
 | 
					  FreePages (TranslationTable, 1);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -130,7 +126,6 @@ IsBlockEntry (
 | 
				
			|||||||
  if (Level == 3) {
 | 
					  if (Level == 3) {
 | 
				
			||||||
    return (Entry & TT_TYPE_MASK) == TT_TYPE_BLOCK_ENTRY_LEVEL3;
 | 
					    return (Entry & TT_TYPE_MASK) == TT_TYPE_BLOCK_ENTRY_LEVEL3;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  return (Entry & TT_TYPE_MASK) == TT_TYPE_BLOCK_ENTRY;
 | 
					  return (Entry & TT_TYPE_MASK) == TT_TYPE_BLOCK_ENTRY;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -148,7 +143,6 @@ IsTableEntry (
 | 
				
			|||||||
    //
 | 
					    //
 | 
				
			||||||
    return FALSE;
 | 
					    return FALSE;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  return (Entry & TT_TYPE_MASK) == TT_TYPE_TABLE_ENTRY;
 | 
					  return (Entry & TT_TYPE_MASK) == TT_TYPE_TABLE_ENTRY;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -176,18 +170,10 @@ UpdateRegionMappingRecursive (
 | 
				
			|||||||
  BlockShift = (Level + 1) * BITS_PER_LEVEL + MIN_T0SZ;
 | 
					  BlockShift = (Level + 1) * BITS_PER_LEVEL + MIN_T0SZ;
 | 
				
			||||||
  BlockMask = MAX_UINT64 >> BlockShift;
 | 
					  BlockMask = MAX_UINT64 >> BlockShift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  DEBUG ((
 | 
					  DEBUG ((DEBUG_VERBOSE, "%a(%d): %llx - %llx set %lx clr %lx\n", __FUNCTION__,
 | 
				
			||||||
    DEBUG_VERBOSE,
 | 
					    Level, RegionStart, RegionEnd, AttributeSetMask, AttributeClearMask));
 | 
				
			||||||
    "%a(%d): %llx - %llx set %lx clr %lx\n",
 | 
					 | 
				
			||||||
    __FUNCTION__,
 | 
					 | 
				
			||||||
    Level,
 | 
					 | 
				
			||||||
    RegionStart,
 | 
					 | 
				
			||||||
    RegionEnd,
 | 
					 | 
				
			||||||
    AttributeSetMask,
 | 
					 | 
				
			||||||
    AttributeClearMask
 | 
					 | 
				
			||||||
    ));
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for ( ; RegionStart < RegionEnd; RegionStart = BlockEnd) {
 | 
					  for (; RegionStart < RegionEnd; RegionStart = BlockEnd) {
 | 
				
			||||||
    BlockEnd = MIN (RegionEnd, (RegionStart | BlockMask) + 1);
 | 
					    BlockEnd = MIN (RegionEnd, (RegionStart | BlockMask) + 1);
 | 
				
			||||||
    Entry = &PageTable[(RegionStart >> (64 - BlockShift)) & (TT_ENTRY_COUNT - 1)];
 | 
					    Entry = &PageTable[(RegionStart >> (64 - BlockShift)) & (TT_ENTRY_COUNT - 1)];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -201,9 +187,8 @@ UpdateRegionMappingRecursive (
 | 
				
			|||||||
    // we cannot replace it with a block entry without potentially losing
 | 
					    // we cannot replace it with a block entry without potentially losing
 | 
				
			||||||
    // attribute information, so keep the table entry in that case.
 | 
					    // attribute information, so keep the table entry in that case.
 | 
				
			||||||
    //
 | 
					    //
 | 
				
			||||||
    if ((Level == 0) || (((RegionStart | BlockEnd) & BlockMask) != 0) ||
 | 
					    if (Level == 0 || ((RegionStart | BlockEnd) & BlockMask) != 0 ||
 | 
				
			||||||
        (IsTableEntry (*Entry, Level) && (AttributeClearMask != 0)))
 | 
					        (IsTableEntry (*Entry, Level) && AttributeClearMask != 0)) {
 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      ASSERT (Level < 3);
 | 
					      ASSERT (Level < 3);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (!IsTableEntry (*Entry, Level)) {
 | 
					      if (!IsTableEntry (*Entry, Level)) {
 | 
				
			||||||
@@ -231,14 +216,9 @@ UpdateRegionMappingRecursive (
 | 
				
			|||||||
          // We are splitting an existing block entry, so we have to populate
 | 
					          // We are splitting an existing block entry, so we have to populate
 | 
				
			||||||
          // the new table with the attributes of the block entry it replaces.
 | 
					          // the new table with the attributes of the block entry it replaces.
 | 
				
			||||||
          //
 | 
					          //
 | 
				
			||||||
          Status = UpdateRegionMappingRecursive (
 | 
					          Status = UpdateRegionMappingRecursive (RegionStart & ~BlockMask,
 | 
				
			||||||
                     RegionStart & ~BlockMask,
 | 
					                     (RegionStart | BlockMask) + 1, *Entry & TT_ATTRIBUTES_MASK,
 | 
				
			||||||
                     (RegionStart | BlockMask) + 1,
 | 
					                     0, TranslationTable, Level + 1);
 | 
				
			||||||
                     *Entry & TT_ATTRIBUTES_MASK,
 | 
					 | 
				
			||||||
                     0,
 | 
					 | 
				
			||||||
                     TranslationTable,
 | 
					 | 
				
			||||||
                     Level + 1
 | 
					 | 
				
			||||||
                     );
 | 
					 | 
				
			||||||
          if (EFI_ERROR (Status)) {
 | 
					          if (EFI_ERROR (Status)) {
 | 
				
			||||||
            //
 | 
					            //
 | 
				
			||||||
            // The range we passed to UpdateRegionMappingRecursive () is block
 | 
					            // The range we passed to UpdateRegionMappingRecursive () is block
 | 
				
			||||||
@@ -256,14 +236,9 @@ UpdateRegionMappingRecursive (
 | 
				
			|||||||
      //
 | 
					      //
 | 
				
			||||||
      // Recurse to the next level
 | 
					      // Recurse to the next level
 | 
				
			||||||
      //
 | 
					      //
 | 
				
			||||||
      Status = UpdateRegionMappingRecursive (
 | 
					      Status = UpdateRegionMappingRecursive (RegionStart, BlockEnd,
 | 
				
			||||||
                 RegionStart,
 | 
					                 AttributeSetMask, AttributeClearMask, TranslationTable,
 | 
				
			||||||
                 BlockEnd,
 | 
					                 Level + 1);
 | 
				
			||||||
                 AttributeSetMask,
 | 
					 | 
				
			||||||
                 AttributeClearMask,
 | 
					 | 
				
			||||||
                 TranslationTable,
 | 
					 | 
				
			||||||
                 Level + 1
 | 
					 | 
				
			||||||
                 );
 | 
					 | 
				
			||||||
      if (EFI_ERROR (Status)) {
 | 
					      if (EFI_ERROR (Status)) {
 | 
				
			||||||
        if (!IsTableEntry (*Entry, Level)) {
 | 
					        if (!IsTableEntry (*Entry, Level)) {
 | 
				
			||||||
          //
 | 
					          //
 | 
				
			||||||
@@ -275,18 +250,13 @@ UpdateRegionMappingRecursive (
 | 
				
			|||||||
          //
 | 
					          //
 | 
				
			||||||
          FreePageTablesRecursive (TranslationTable, Level + 1);
 | 
					          FreePageTablesRecursive (TranslationTable, Level + 1);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
        return Status;
 | 
					        return Status;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (!IsTableEntry (*Entry, Level)) {
 | 
					      if (!IsTableEntry (*Entry, Level)) {
 | 
				
			||||||
        EntryValue = (UINTN)TranslationTable | TT_TYPE_TABLE_ENTRY;
 | 
					        EntryValue = (UINTN)TranslationTable | TT_TYPE_TABLE_ENTRY;
 | 
				
			||||||
        ReplaceTableEntry (
 | 
					        ReplaceTableEntry (Entry, EntryValue, RegionStart,
 | 
				
			||||||
          Entry,
 | 
					          IsBlockEntry (*Entry, Level));
 | 
				
			||||||
          EntryValue,
 | 
					 | 
				
			||||||
          RegionStart,
 | 
					 | 
				
			||||||
          IsBlockEntry (*Entry, Level)
 | 
					 | 
				
			||||||
          );
 | 
					 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      EntryValue = (*Entry & AttributeClearMask) | AttributeSetMask;
 | 
					      EntryValue = (*Entry & AttributeClearMask) | AttributeSetMask;
 | 
				
			||||||
@@ -310,7 +280,6 @@ UpdateRegionMappingRecursive (
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  return EFI_SUCCESS;
 | 
					  return EFI_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -331,14 +300,9 @@ UpdateRegionMapping (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  T0SZ = ArmGetTCR () & TCR_T0SZ_MASK;
 | 
					  T0SZ = ArmGetTCR () & TCR_T0SZ_MASK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return UpdateRegionMappingRecursive (
 | 
					  return UpdateRegionMappingRecursive (RegionStart, RegionStart + RegionLength,
 | 
				
			||||||
           RegionStart,
 | 
					           AttributeSetMask, AttributeClearMask, ArmGetTTBR0BaseAddress (),
 | 
				
			||||||
           RegionStart + RegionLength,
 | 
					           GetRootTableLevel (T0SZ));
 | 
				
			||||||
           AttributeSetMask,
 | 
					 | 
				
			||||||
           AttributeClearMask,
 | 
					 | 
				
			||||||
           ArmGetTTBR0BaseAddress (),
 | 
					 | 
				
			||||||
           GetRootTableLevel (T0SZ)
 | 
					 | 
				
			||||||
           );
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
STATIC
 | 
					STATIC
 | 
				
			||||||
@@ -382,9 +346,8 @@ GcdAttributeToPageAttribute (
 | 
				
			|||||||
    break;
 | 
					    break;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (((GcdAttributes & EFI_MEMORY_XP) != 0) ||
 | 
					  if ((GcdAttributes & EFI_MEMORY_XP) != 0 ||
 | 
				
			||||||
      ((GcdAttributes & EFI_MEMORY_CACHETYPE_MASK) == EFI_MEMORY_UC))
 | 
					      (GcdAttributes & EFI_MEMORY_CACHETYPE_MASK) == EFI_MEMORY_UC) {
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    if (ArmReadCurrentEL () == AARCH64_EL2) {
 | 
					    if (ArmReadCurrentEL () == AARCH64_EL2) {
 | 
				
			||||||
      PageAttributes |= TT_XN_MASK;
 | 
					      PageAttributes |= TT_XN_MASK;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
@@ -393,7 +356,7 @@ GcdAttributeToPageAttribute (
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if ((GcdAttributes & EFI_MEMORY_RO) != 0) {
 | 
					  if ((GcdAttributes & EFI_MEMORY_RO) != 0) {
 | 
				
			||||||
    PageAttributes |= TT_AP_NO_RO;
 | 
					    PageAttributes |= TT_AP_RO_RO;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return PageAttributes | TT_AF;
 | 
					  return PageAttributes | TT_AF;
 | 
				
			||||||
@@ -422,12 +385,8 @@ ArmSetMemoryAttributes (
 | 
				
			|||||||
                          TT_PXN_MASK | TT_XN_MASK);
 | 
					                          TT_PXN_MASK | TT_XN_MASK);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return UpdateRegionMapping (
 | 
					  return UpdateRegionMapping (BaseAddress, Length, PageAttributes,
 | 
				
			||||||
           BaseAddress,
 | 
					           PageAttributeMask);
 | 
				
			||||||
           Length,
 | 
					 | 
				
			||||||
           PageAttributes,
 | 
					 | 
				
			||||||
           PageAttributeMask
 | 
					 | 
				
			||||||
           );
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
STATIC
 | 
					STATIC
 | 
				
			||||||
@@ -460,8 +419,7 @@ ArmSetMemoryRegionNoExec (
 | 
				
			|||||||
           BaseAddress,
 | 
					           BaseAddress,
 | 
				
			||||||
           Length,
 | 
					           Length,
 | 
				
			||||||
           Val,
 | 
					           Val,
 | 
				
			||||||
           ~TT_ADDRESS_MASK_BLOCK_ENTRY
 | 
					           ~TT_ADDRESS_MASK_BLOCK_ENTRY);
 | 
				
			||||||
           );
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
@@ -479,8 +437,7 @@ ArmClearMemoryRegionNoExec (
 | 
				
			|||||||
           BaseAddress,
 | 
					           BaseAddress,
 | 
				
			||||||
           Length,
 | 
					           Length,
 | 
				
			||||||
           0,
 | 
					           0,
 | 
				
			||||||
           Mask
 | 
					           Mask);
 | 
				
			||||||
           );
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
@@ -492,9 +449,8 @@ ArmSetMemoryRegionReadOnly (
 | 
				
			|||||||
  return SetMemoryRegionAttribute (
 | 
					  return SetMemoryRegionAttribute (
 | 
				
			||||||
           BaseAddress,
 | 
					           BaseAddress,
 | 
				
			||||||
           Length,
 | 
					           Length,
 | 
				
			||||||
           TT_AP_NO_RO,
 | 
					           TT_AP_RO_RO,
 | 
				
			||||||
           ~TT_ADDRESS_MASK_BLOCK_ENTRY
 | 
					           ~TT_ADDRESS_MASK_BLOCK_ENTRY);
 | 
				
			||||||
           );
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
@@ -506,9 +462,8 @@ ArmClearMemoryRegionReadOnly (
 | 
				
			|||||||
  return SetMemoryRegionAttribute (
 | 
					  return SetMemoryRegionAttribute (
 | 
				
			||||||
           BaseAddress,
 | 
					           BaseAddress,
 | 
				
			||||||
           Length,
 | 
					           Length,
 | 
				
			||||||
           TT_AP_NO_RW,
 | 
					           TT_AP_RW_RW,
 | 
				
			||||||
           ~(TT_ADDRESS_MASK_BLOCK_ENTRY | TT_AP_MASK)
 | 
					           ~(TT_ADDRESS_MASK_BLOCK_ENTRY | TT_AP_MASK));
 | 
				
			||||||
           );
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
@@ -519,7 +474,7 @@ ArmConfigureMmu (
 | 
				
			|||||||
  OUT UINTN                         *TranslationTableSize OPTIONAL
 | 
					  OUT UINTN                         *TranslationTableSize OPTIONAL
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  VOID        *TranslationTable;
 | 
					  VOID*                         TranslationTable;
 | 
				
			||||||
  UINTN                         MaxAddressBits;
 | 
					  UINTN                         MaxAddressBits;
 | 
				
			||||||
  UINT64                        MaxAddress;
 | 
					  UINT64                        MaxAddress;
 | 
				
			||||||
  UINTN                         T0SZ;
 | 
					  UINTN                         T0SZ;
 | 
				
			||||||
@@ -551,7 +506,7 @@ ArmConfigureMmu (
 | 
				
			|||||||
  // Ideally we will be running at EL2, but should support EL1 as well.
 | 
					  // Ideally we will be running at EL2, but should support EL1 as well.
 | 
				
			||||||
  // UEFI should not run at EL3.
 | 
					  // UEFI should not run at EL3.
 | 
				
			||||||
  if (ArmReadCurrentEL () == AARCH64_EL2) {
 | 
					  if (ArmReadCurrentEL () == AARCH64_EL2) {
 | 
				
			||||||
    // Note: Bits 23 and 31 are reserved(RES1) bits in TCR_EL2
 | 
					    //Note: Bits 23 and 31 are reserved(RES1) bits in TCR_EL2
 | 
				
			||||||
    TCR = T0SZ | (1UL << 31) | (1UL << 23) | TCR_TG0_4KB;
 | 
					    TCR = T0SZ | (1UL << 31) | (1UL << 23) | TCR_TG0_4KB;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Set the Physical Address Size using MaxAddress
 | 
					    // Set the Physical Address Size using MaxAddress
 | 
				
			||||||
@@ -568,11 +523,9 @@ ArmConfigureMmu (
 | 
				
			|||||||
    } else if (MaxAddress < SIZE_256TB) {
 | 
					    } else if (MaxAddress < SIZE_256TB) {
 | 
				
			||||||
      TCR |= TCR_PS_256TB;
 | 
					      TCR |= TCR_PS_256TB;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      DEBUG ((
 | 
					      DEBUG ((DEBUG_ERROR,
 | 
				
			||||||
        DEBUG_ERROR,
 | 
					 | 
				
			||||||
        "ArmConfigureMmu: The MaxAddress 0x%lX is not supported by this MMU configuration.\n",
 | 
					        "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
 | 
					      ASSERT (0); // Bigger than 48-bit memory space are not supported
 | 
				
			||||||
      return EFI_UNSUPPORTED;
 | 
					      return EFI_UNSUPPORTED;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -594,11 +547,9 @@ ArmConfigureMmu (
 | 
				
			|||||||
    } else if (MaxAddress < SIZE_256TB) {
 | 
					    } else if (MaxAddress < SIZE_256TB) {
 | 
				
			||||||
      TCR |= TCR_IPS_256TB;
 | 
					      TCR |= TCR_IPS_256TB;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      DEBUG ((
 | 
					      DEBUG ((DEBUG_ERROR,
 | 
				
			||||||
        DEBUG_ERROR,
 | 
					 | 
				
			||||||
        "ArmConfigureMmu: The MaxAddress 0x%lX is not supported by this MMU configuration.\n",
 | 
					        "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
 | 
					      ASSERT (0); // Bigger than 48-bit memory space are not supported
 | 
				
			||||||
      return EFI_UNSUPPORTED;
 | 
					      return EFI_UNSUPPORTED;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -628,7 +579,6 @@ ArmConfigureMmu (
 | 
				
			|||||||
  if (TranslationTable == NULL) {
 | 
					  if (TranslationTable == NULL) {
 | 
				
			||||||
    return EFI_OUT_OF_RESOURCES;
 | 
					    return EFI_OUT_OF_RESOURCES;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  // We set TTBR0 just after allocating the table to retrieve its location from
 | 
					  // We set TTBR0 just after allocating the table to retrieve its location from
 | 
				
			||||||
  // the subsequent functions without needing to pass this value across the
 | 
					  // 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
 | 
					  // Make sure we are not inadvertently hitting in the caches
 | 
				
			||||||
  // when populating the page tables.
 | 
					  // when populating the page tables.
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  InvalidateDataCacheRange (
 | 
					  InvalidateDataCacheRange (TranslationTable,
 | 
				
			||||||
    TranslationTable,
 | 
					    RootTableEntryCount * sizeof (UINT64));
 | 
				
			||||||
    RootTableEntryCount * sizeof (UINT64)
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
  ZeroMem (TranslationTable, RootTableEntryCount * sizeof (UINT64));
 | 
					  ZeroMem (TranslationTable, RootTableEntryCount * sizeof (UINT64));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  while (MemoryTable->Length != 0) {
 | 
					  while (MemoryTable->Length != 0) {
 | 
				
			||||||
@@ -660,7 +608,6 @@ ArmConfigureMmu (
 | 
				
			|||||||
    if (EFI_ERROR (Status)) {
 | 
					    if (EFI_ERROR (Status)) {
 | 
				
			||||||
      goto FreeTranslationTable;
 | 
					      goto FreeTranslationTable;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    MemoryTable++;
 | 
					    MemoryTable++;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -702,10 +649,8 @@ ArmMmuBaseLibConstructor (
 | 
				
			|||||||
  // The ArmReplaceLiveTranslationEntry () helper function may be invoked
 | 
					  // The ArmReplaceLiveTranslationEntry () helper function may be invoked
 | 
				
			||||||
  // with the MMU off so we have to ensure that it gets cleaned to the PoC
 | 
					  // with the MMU off so we have to ensure that it gets cleaned to the PoC
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  WriteBackDataCacheRange (
 | 
					  WriteBackDataCacheRange ((VOID *)(UINTN)ArmReplaceLiveTranslationEntry,
 | 
				
			||||||
    (VOID *)(UINTN)ArmReplaceLiveTranslationEntry,
 | 
					    ArmReplaceLiveTranslationEntrySize);
 | 
				
			||||||
    ArmReplaceLiveTranslationEntrySize
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return RETURN_SUCCESS;
 | 
					  return RETURN_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -37,21 +37,18 @@ ArmMmuPeiLibConstructor (
 | 
				
			|||||||
  // is executing from DRAM, we only need to perform the cache maintenance
 | 
					  // is executing from DRAM, we only need to perform the cache maintenance
 | 
				
			||||||
  // when not executing in place.
 | 
					  // when not executing in place.
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  if (((UINTN)FileInfo.Buffer <= (UINTN)ArmReplaceLiveTranslationEntry) &&
 | 
					  if ((UINTN)FileInfo.Buffer <= (UINTN)ArmReplaceLiveTranslationEntry &&
 | 
				
			||||||
      ((UINTN)FileInfo.Buffer + FileInfo.BufferSize >=
 | 
					      ((UINTN)FileInfo.Buffer + FileInfo.BufferSize >=
 | 
				
			||||||
       (UINTN)ArmReplaceLiveTranslationEntry + ArmReplaceLiveTranslationEntrySize))
 | 
					       (UINTN)ArmReplaceLiveTranslationEntry + ArmReplaceLiveTranslationEntrySize)) {
 | 
				
			||||||
  {
 | 
					    DEBUG ((EFI_D_INFO, "ArmMmuLib: skipping cache maintenance on XIP PEIM\n"));
 | 
				
			||||||
    DEBUG ((DEBUG_INFO, "ArmMmuLib: skipping cache maintenance on XIP PEIM\n"));
 | 
					 | 
				
			||||||
  } else {
 | 
					  } 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
 | 
					    // The ArmReplaceLiveTranslationEntry () helper function may be invoked
 | 
				
			||||||
    // with the MMU off so we have to ensure that it gets cleaned to the PoC
 | 
					    // with the MMU off so we have to ensure that it gets cleaned to the PoC
 | 
				
			||||||
    //
 | 
					    //
 | 
				
			||||||
    WriteBackDataCacheRange (
 | 
					    WriteBackDataCacheRange ((VOID *)(UINTN)ArmReplaceLiveTranslationEntry,
 | 
				
			||||||
      (VOID *)(UINTN)ArmReplaceLiveTranslationEntry,
 | 
					      ArmReplaceLiveTranslationEntrySize);
 | 
				
			||||||
      ArmReplaceLiveTranslationEntrySize
 | 
					 | 
				
			||||||
      );
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return RETURN_SUCCESS;
 | 
					  return RETURN_SUCCESS;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -76,7 +76,6 @@ PreferNonshareableMemory (
 | 
				
			|||||||
    ASSERT (FALSE);
 | 
					    ASSERT (FALSE);
 | 
				
			||||||
    return FALSE;
 | 
					    return FALSE;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  return Val != ID_MMFR0_SHR_IMP_HW_COHERENT;
 | 
					  return Val != ID_MMFR0_SHR_IMP_HW_COHERENT;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -89,7 +88,7 @@ PopulateLevel2PageTable (
 | 
				
			|||||||
  IN ARM_MEMORY_REGION_ATTRIBUTES   Attributes
 | 
					  IN ARM_MEMORY_REGION_ATTRIBUTES   Attributes
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINT32  *PageEntry;
 | 
					  UINT32* PageEntry;
 | 
				
			||||||
  UINT32  Pages;
 | 
					  UINT32  Pages;
 | 
				
			||||||
  UINT32  Index;
 | 
					  UINT32  Index;
 | 
				
			||||||
  UINT32  PageAttributes;
 | 
					  UINT32  PageAttributes;
 | 
				
			||||||
@@ -133,7 +132,7 @@ PopulateLevel2PageTable (
 | 
				
			|||||||
  // Level 2 Translation Table to it
 | 
					  // Level 2 Translation Table to it
 | 
				
			||||||
  if (*SectionEntry != 0) {
 | 
					  if (*SectionEntry != 0) {
 | 
				
			||||||
    // The entry must be a page table. Otherwise it exists an overlapping in the memory map
 | 
					    // The entry must be a page table. Otherwise it exists an overlapping in the memory map
 | 
				
			||||||
    if (TT_DESCRIPTOR_SECTION_TYPE_IS_PAGE_TABLE (*SectionEntry)) {
 | 
					    if (TT_DESCRIPTOR_SECTION_TYPE_IS_PAGE_TABLE(*SectionEntry)) {
 | 
				
			||||||
      TranslationTable = *SectionEntry & TT_DESCRIPTOR_SECTION_PAGETABLE_ADDRESS_MASK;
 | 
					      TranslationTable = *SectionEntry & TT_DESCRIPTOR_SECTION_PAGETABLE_ADDRESS_MASK;
 | 
				
			||||||
    } else if ((*SectionEntry & TT_DESCRIPTOR_SECTION_TYPE_MASK) == TT_DESCRIPTOR_SECTION_TYPE_SECTION) {
 | 
					    } else if ((*SectionEntry & TT_DESCRIPTOR_SECTION_TYPE_MASK) == TT_DESCRIPTOR_SECTION_TYPE_SECTION) {
 | 
				
			||||||
      // Case where a virtual memory map descriptor overlapped a section entry
 | 
					      // Case where a virtual memory map descriptor overlapped a section entry
 | 
				
			||||||
@@ -141,55 +140,49 @@ PopulateLevel2PageTable (
 | 
				
			|||||||
      // Allocate a Level2 Page Table for this Section
 | 
					      // Allocate a Level2 Page Table for this Section
 | 
				
			||||||
      TranslationTable = (UINTN)AllocateAlignedPages (
 | 
					      TranslationTable = (UINTN)AllocateAlignedPages (
 | 
				
			||||||
                                  EFI_SIZE_TO_PAGES (TRANSLATION_TABLE_PAGE_SIZE),
 | 
					                                  EFI_SIZE_TO_PAGES (TRANSLATION_TABLE_PAGE_SIZE),
 | 
				
			||||||
                                  TRANSLATION_TABLE_PAGE_ALIGNMENT
 | 
					                                  TRANSLATION_TABLE_PAGE_ALIGNMENT);
 | 
				
			||||||
                                  );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
      // Translate the Section Descriptor into Page Descriptor
 | 
					      // Translate the Section Descriptor into Page Descriptor
 | 
				
			||||||
      SectionDescriptor = TT_DESCRIPTOR_PAGE_TYPE_PAGE | ConvertSectionAttributesToPageAttributes (*SectionEntry, FALSE);
 | 
					      SectionDescriptor = TT_DESCRIPTOR_PAGE_TYPE_PAGE | ConvertSectionAttributesToPageAttributes (*SectionEntry, FALSE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      BaseSectionAddress = TT_DESCRIPTOR_SECTION_BASE_ADDRESS (*SectionEntry);
 | 
					      BaseSectionAddress = TT_DESCRIPTOR_SECTION_BASE_ADDRESS(*SectionEntry);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      //
 | 
					      //
 | 
				
			||||||
      // Make sure we are not inadvertently hitting in the caches
 | 
					      // Make sure we are not inadvertently hitting in the caches
 | 
				
			||||||
      // when populating the page tables
 | 
					      // when populating the page tables
 | 
				
			||||||
      //
 | 
					      //
 | 
				
			||||||
      InvalidateDataCacheRange (
 | 
					      InvalidateDataCacheRange ((VOID *)TranslationTable,
 | 
				
			||||||
        (VOID *)TranslationTable,
 | 
					        TRANSLATION_TABLE_PAGE_SIZE);
 | 
				
			||||||
        TRANSLATION_TABLE_PAGE_SIZE
 | 
					 | 
				
			||||||
        );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
      // Populate the new Level2 Page Table for the section
 | 
					      // Populate the new Level2 Page Table for the section
 | 
				
			||||||
      PageEntry = (UINT32 *)TranslationTable;
 | 
					      PageEntry = (UINT32*)TranslationTable;
 | 
				
			||||||
      for (Index = 0; Index < TRANSLATION_TABLE_PAGE_COUNT; Index++) {
 | 
					      for (Index = 0; Index < TRANSLATION_TABLE_PAGE_COUNT; Index++) {
 | 
				
			||||||
        PageEntry[Index] = TT_DESCRIPTOR_PAGE_BASE_ADDRESS (BaseSectionAddress + (Index << 12)) | SectionDescriptor;
 | 
					        PageEntry[Index] = TT_DESCRIPTOR_PAGE_BASE_ADDRESS(BaseSectionAddress + (Index << 12)) | SectionDescriptor;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      // Overwrite the section entry to point to the new Level2 Translation Table
 | 
					      // Overwrite the section entry to point to the new Level2 Translation Table
 | 
				
			||||||
      *SectionEntry = (TranslationTable & TT_DESCRIPTOR_SECTION_PAGETABLE_ADDRESS_MASK) |
 | 
					      *SectionEntry = (TranslationTable & TT_DESCRIPTOR_SECTION_PAGETABLE_ADDRESS_MASK) |
 | 
				
			||||||
                      (IS_ARM_MEMORY_REGION_ATTRIBUTES_SECURE (Attributes) ? (1 << 3) : 0) |
 | 
					          (IS_ARM_MEMORY_REGION_ATTRIBUTES_SECURE(Attributes) ? (1 << 3) : 0) |
 | 
				
			||||||
          TT_DESCRIPTOR_SECTION_TYPE_PAGE_TABLE;
 | 
					          TT_DESCRIPTOR_SECTION_TYPE_PAGE_TABLE;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      // We do not support the other section type (16MB Section)
 | 
					      // We do not support the other section type (16MB Section)
 | 
				
			||||||
      ASSERT (0);
 | 
					      ASSERT(0);
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    TranslationTable = (UINTN)AllocateAlignedPages (
 | 
					    TranslationTable = (UINTN)AllocateAlignedPages (
 | 
				
			||||||
                                EFI_SIZE_TO_PAGES (TRANSLATION_TABLE_PAGE_SIZE),
 | 
					                                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
 | 
					    // Make sure we are not inadvertently hitting in the caches
 | 
				
			||||||
    // when populating the page tables
 | 
					    // when populating the page tables
 | 
				
			||||||
    //
 | 
					    //
 | 
				
			||||||
    InvalidateDataCacheRange (
 | 
					    InvalidateDataCacheRange ((VOID *)TranslationTable,
 | 
				
			||||||
      (VOID *)TranslationTable,
 | 
					      TRANSLATION_TABLE_PAGE_SIZE);
 | 
				
			||||||
      TRANSLATION_TABLE_PAGE_SIZE
 | 
					 | 
				
			||||||
      );
 | 
					 | 
				
			||||||
    ZeroMem ((VOID *)TranslationTable, TRANSLATION_TABLE_PAGE_SIZE);
 | 
					    ZeroMem ((VOID *)TranslationTable, TRANSLATION_TABLE_PAGE_SIZE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    *SectionEntry = (TranslationTable & TT_DESCRIPTOR_SECTION_PAGETABLE_ADDRESS_MASK) |
 | 
					    *SectionEntry = (TranslationTable & TT_DESCRIPTOR_SECTION_PAGETABLE_ADDRESS_MASK) |
 | 
				
			||||||
                    (IS_ARM_MEMORY_REGION_ATTRIBUTES_SECURE (Attributes) ? (1 << 3) : 0) |
 | 
					        (IS_ARM_MEMORY_REGION_ATTRIBUTES_SECURE(Attributes) ? (1 << 3) : 0) |
 | 
				
			||||||
        TT_DESCRIPTOR_SECTION_TYPE_PAGE_TABLE;
 | 
					        TT_DESCRIPTOR_SECTION_TYPE_PAGE_TABLE;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -200,7 +193,7 @@ PopulateLevel2PageTable (
 | 
				
			|||||||
  ASSERT (FirstPageOffset + Pages <= TRANSLATION_TABLE_PAGE_COUNT);
 | 
					  ASSERT (FirstPageOffset + Pages <= TRANSLATION_TABLE_PAGE_COUNT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for (Index = 0; Index < Pages; Index++) {
 | 
					  for (Index = 0; Index < Pages; Index++) {
 | 
				
			||||||
    *PageEntry++  =  TT_DESCRIPTOR_PAGE_BASE_ADDRESS (PhysicalBase) | PageAttributes;
 | 
					    *PageEntry++     =  TT_DESCRIPTOR_PAGE_BASE_ADDRESS(PhysicalBase) | PageAttributes;
 | 
				
			||||||
    PhysicalBase += TT_DESCRIPTOR_PAGE_SIZE;
 | 
					    PhysicalBase += TT_DESCRIPTOR_PAGE_SIZE;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -209,10 +202,8 @@ PopulateLevel2PageTable (
 | 
				
			|||||||
  // [speculatively] since the previous invalidate are evicted again.
 | 
					  // [speculatively] since the previous invalidate are evicted again.
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  ArmDataMemoryBarrier ();
 | 
					  ArmDataMemoryBarrier ();
 | 
				
			||||||
  InvalidateDataCacheRange (
 | 
					  InvalidateDataCacheRange ((UINT32 *)TranslationTable + FirstPageOffset,
 | 
				
			||||||
    (UINT32 *)TranslationTable + FirstPageOffset,
 | 
					    RemainLength / TT_DESCRIPTOR_PAGE_SIZE * sizeof (*PageEntry));
 | 
				
			||||||
    RemainLength / TT_DESCRIPTOR_PAGE_SIZE * sizeof (*PageEntry)
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
STATIC
 | 
					STATIC
 | 
				
			||||||
@@ -228,50 +219,50 @@ FillTranslationTable (
 | 
				
			|||||||
  UINT64  RemainLength;
 | 
					  UINT64  RemainLength;
 | 
				
			||||||
  UINT32  PageMapLength;
 | 
					  UINT32  PageMapLength;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ASSERT (MemoryRegion->Length > 0);
 | 
					  ASSERT(MemoryRegion->Length > 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (MemoryRegion->PhysicalBase >= SIZE_4GB) {
 | 
					  if (MemoryRegion->PhysicalBase >= SIZE_4GB) {
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  PhysicalBase = (UINT32)MemoryRegion->PhysicalBase;
 | 
					  PhysicalBase = (UINT32)MemoryRegion->PhysicalBase;
 | 
				
			||||||
  RemainLength = MIN (MemoryRegion->Length, SIZE_4GB - PhysicalBase);
 | 
					  RemainLength = MIN(MemoryRegion->Length, SIZE_4GB - PhysicalBase);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  switch (MemoryRegion->Attributes) {
 | 
					  switch (MemoryRegion->Attributes) {
 | 
				
			||||||
    case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK:
 | 
					    case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK:
 | 
				
			||||||
      Attributes = TT_DESCRIPTOR_SECTION_WRITE_BACK (0);
 | 
					      Attributes = TT_DESCRIPTOR_SECTION_WRITE_BACK(0);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK_NONSHAREABLE:
 | 
					    case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK_NONSHAREABLE:
 | 
				
			||||||
      Attributes  = TT_DESCRIPTOR_SECTION_WRITE_BACK (0);
 | 
					      Attributes = TT_DESCRIPTOR_SECTION_WRITE_BACK(0);
 | 
				
			||||||
      Attributes &= ~TT_DESCRIPTOR_SECTION_S_SHARED;
 | 
					      Attributes &= ~TT_DESCRIPTOR_SECTION_S_SHARED;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_THROUGH:
 | 
					    case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_THROUGH:
 | 
				
			||||||
      Attributes = TT_DESCRIPTOR_SECTION_WRITE_THROUGH (0);
 | 
					      Attributes = TT_DESCRIPTOR_SECTION_WRITE_THROUGH(0);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case ARM_MEMORY_REGION_ATTRIBUTE_DEVICE:
 | 
					    case ARM_MEMORY_REGION_ATTRIBUTE_DEVICE:
 | 
				
			||||||
      Attributes = TT_DESCRIPTOR_SECTION_DEVICE (0);
 | 
					      Attributes = TT_DESCRIPTOR_SECTION_DEVICE(0);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED:
 | 
					    case ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED:
 | 
				
			||||||
      Attributes = TT_DESCRIPTOR_SECTION_UNCACHED (0);
 | 
					      Attributes = TT_DESCRIPTOR_SECTION_UNCACHED(0);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_BACK:
 | 
					    case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_BACK:
 | 
				
			||||||
      Attributes = TT_DESCRIPTOR_SECTION_WRITE_BACK (1);
 | 
					      Attributes = TT_DESCRIPTOR_SECTION_WRITE_BACK(1);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_BACK_NONSHAREABLE:
 | 
					    case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_BACK_NONSHAREABLE:
 | 
				
			||||||
      Attributes  = TT_DESCRIPTOR_SECTION_WRITE_BACK (1);
 | 
					      Attributes = TT_DESCRIPTOR_SECTION_WRITE_BACK(1);
 | 
				
			||||||
      Attributes &= ~TT_DESCRIPTOR_SECTION_S_SHARED;
 | 
					      Attributes &= ~TT_DESCRIPTOR_SECTION_S_SHARED;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_THROUGH:
 | 
					    case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_THROUGH:
 | 
				
			||||||
      Attributes = TT_DESCRIPTOR_SECTION_WRITE_THROUGH (1);
 | 
					      Attributes = TT_DESCRIPTOR_SECTION_WRITE_THROUGH(1);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_DEVICE:
 | 
					    case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_DEVICE:
 | 
				
			||||||
      Attributes = TT_DESCRIPTOR_SECTION_DEVICE (1);
 | 
					      Attributes = TT_DESCRIPTOR_SECTION_DEVICE(1);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_UNCACHED_UNBUFFERED:
 | 
					    case ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_UNCACHED_UNBUFFERED:
 | 
				
			||||||
      Attributes = TT_DESCRIPTOR_SECTION_UNCACHED (1);
 | 
					      Attributes = TT_DESCRIPTOR_SECTION_UNCACHED(1);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
      Attributes = TT_DESCRIPTOR_SECTION_UNCACHED (0);
 | 
					      Attributes = TT_DESCRIPTOR_SECTION_UNCACHED(0);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -280,15 +271,14 @@ FillTranslationTable (
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Get the first section entry for this mapping
 | 
					  // Get the first section entry for this mapping
 | 
				
			||||||
  SectionEntry = TRANSLATION_TABLE_ENTRY_FOR_VIRTUAL_ADDRESS (TranslationTable, MemoryRegion->VirtualBase);
 | 
					  SectionEntry    = TRANSLATION_TABLE_ENTRY_FOR_VIRTUAL_ADDRESS(TranslationTable, MemoryRegion->VirtualBase);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  while (RemainLength != 0) {
 | 
					  while (RemainLength != 0) {
 | 
				
			||||||
    if ((PhysicalBase % TT_DESCRIPTOR_SECTION_SIZE == 0) &&
 | 
					    if (PhysicalBase % TT_DESCRIPTOR_SECTION_SIZE == 0 &&
 | 
				
			||||||
        (RemainLength >= TT_DESCRIPTOR_SECTION_SIZE))
 | 
					        RemainLength >= TT_DESCRIPTOR_SECTION_SIZE) {
 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      // Case: Physical address aligned on the Section Size (1MB) && the length
 | 
					      // Case: Physical address aligned on the Section Size (1MB) && the length
 | 
				
			||||||
      // is greater than the Section Size
 | 
					      // is greater than the Section Size
 | 
				
			||||||
      *SectionEntry = TT_DESCRIPTOR_SECTION_BASE_ADDRESS (PhysicalBase) | Attributes;
 | 
					      *SectionEntry = TT_DESCRIPTOR_SECTION_BASE_ADDRESS(PhysicalBase) | Attributes;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      //
 | 
					      //
 | 
				
			||||||
      // Issue a DMB to ensure that the page table entry update made it to
 | 
					      // Issue a DMB to ensure that the page table entry update made it to
 | 
				
			||||||
@@ -301,21 +291,14 @@ FillTranslationTable (
 | 
				
			|||||||
      PhysicalBase += TT_DESCRIPTOR_SECTION_SIZE;
 | 
					      PhysicalBase += TT_DESCRIPTOR_SECTION_SIZE;
 | 
				
			||||||
      RemainLength -= TT_DESCRIPTOR_SECTION_SIZE;
 | 
					      RemainLength -= TT_DESCRIPTOR_SECTION_SIZE;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      PageMapLength = MIN (
 | 
					      PageMapLength = MIN ((UINT32)RemainLength, TT_DESCRIPTOR_SECTION_SIZE -
 | 
				
			||||||
                        (UINT32)RemainLength,
 | 
					                                         (PhysicalBase % TT_DESCRIPTOR_SECTION_SIZE));
 | 
				
			||||||
                        TT_DESCRIPTOR_SECTION_SIZE -
 | 
					 | 
				
			||||||
                        (PhysicalBase % TT_DESCRIPTOR_SECTION_SIZE)
 | 
					 | 
				
			||||||
                        );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
      // Case: Physical address aligned on the Section Size (1MB) && the length
 | 
					      // Case: Physical address aligned on the Section Size (1MB) && the length
 | 
				
			||||||
      //       does not fill a section
 | 
					      //       does not fill a section
 | 
				
			||||||
      // Case: Physical address NOT aligned on the Section Size (1MB)
 | 
					      // Case: Physical address NOT aligned on the Section Size (1MB)
 | 
				
			||||||
      PopulateLevel2PageTable (
 | 
					      PopulateLevel2PageTable (SectionEntry, PhysicalBase, PageMapLength,
 | 
				
			||||||
        SectionEntry,
 | 
					        MemoryRegion->Attributes);
 | 
				
			||||||
        PhysicalBase,
 | 
					 | 
				
			||||||
        PageMapLength,
 | 
					 | 
				
			||||||
        MemoryRegion->Attributes
 | 
					 | 
				
			||||||
        );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
      //
 | 
					      //
 | 
				
			||||||
      // Issue a DMB to ensure that the page table entry update made it to
 | 
					      // Issue a DMB to ensure that the page table entry update made it to
 | 
				
			||||||
@@ -349,8 +332,7 @@ ArmConfigureMmu (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  TranslationTable = AllocateAlignedPages (
 | 
					  TranslationTable = AllocateAlignedPages (
 | 
				
			||||||
                       EFI_SIZE_TO_PAGES (TRANSLATION_TABLE_SECTION_SIZE),
 | 
					                       EFI_SIZE_TO_PAGES (TRANSLATION_TABLE_SECTION_SIZE),
 | 
				
			||||||
                       TRANSLATION_TABLE_SECTION_ALIGNMENT
 | 
					                       TRANSLATION_TABLE_SECTION_ALIGNMENT);
 | 
				
			||||||
                       );
 | 
					 | 
				
			||||||
  if (TranslationTable == NULL) {
 | 
					  if (TranslationTable == NULL) {
 | 
				
			||||||
    return RETURN_OUT_OF_RESOURCES;
 | 
					    return RETURN_OUT_OF_RESOURCES;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -407,27 +389,25 @@ ArmConfigureMmu (
 | 
				
			|||||||
  //
 | 
					  //
 | 
				
			||||||
  ArmSetTTBCR (0);
 | 
					  ArmSetTTBCR (0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ArmSetDomainAccessControl (
 | 
					  ArmSetDomainAccessControl (DOMAIN_ACCESS_CONTROL_NONE(15) |
 | 
				
			||||||
    DOMAIN_ACCESS_CONTROL_NONE (15) |
 | 
					                             DOMAIN_ACCESS_CONTROL_NONE(14) |
 | 
				
			||||||
    DOMAIN_ACCESS_CONTROL_NONE (14) |
 | 
					                             DOMAIN_ACCESS_CONTROL_NONE(13) |
 | 
				
			||||||
    DOMAIN_ACCESS_CONTROL_NONE (13) |
 | 
					                             DOMAIN_ACCESS_CONTROL_NONE(12) |
 | 
				
			||||||
    DOMAIN_ACCESS_CONTROL_NONE (12) |
 | 
					                             DOMAIN_ACCESS_CONTROL_NONE(11) |
 | 
				
			||||||
    DOMAIN_ACCESS_CONTROL_NONE (11) |
 | 
					                             DOMAIN_ACCESS_CONTROL_NONE(10) |
 | 
				
			||||||
    DOMAIN_ACCESS_CONTROL_NONE (10) |
 | 
					                             DOMAIN_ACCESS_CONTROL_NONE( 9) |
 | 
				
			||||||
    DOMAIN_ACCESS_CONTROL_NONE (9) |
 | 
					                             DOMAIN_ACCESS_CONTROL_NONE( 8) |
 | 
				
			||||||
    DOMAIN_ACCESS_CONTROL_NONE (8) |
 | 
					                             DOMAIN_ACCESS_CONTROL_NONE( 7) |
 | 
				
			||||||
    DOMAIN_ACCESS_CONTROL_NONE (7) |
 | 
					                             DOMAIN_ACCESS_CONTROL_NONE( 6) |
 | 
				
			||||||
    DOMAIN_ACCESS_CONTROL_NONE (6) |
 | 
					                             DOMAIN_ACCESS_CONTROL_NONE( 5) |
 | 
				
			||||||
    DOMAIN_ACCESS_CONTROL_NONE (5) |
 | 
					                             DOMAIN_ACCESS_CONTROL_NONE( 4) |
 | 
				
			||||||
    DOMAIN_ACCESS_CONTROL_NONE (4) |
 | 
					                             DOMAIN_ACCESS_CONTROL_NONE( 3) |
 | 
				
			||||||
    DOMAIN_ACCESS_CONTROL_NONE (3) |
 | 
					                             DOMAIN_ACCESS_CONTROL_NONE( 2) |
 | 
				
			||||||
    DOMAIN_ACCESS_CONTROL_NONE (2) |
 | 
					                             DOMAIN_ACCESS_CONTROL_NONE( 1) |
 | 
				
			||||||
    DOMAIN_ACCESS_CONTROL_NONE (1) |
 | 
					                             DOMAIN_ACCESS_CONTROL_CLIENT(0));
 | 
				
			||||||
    DOMAIN_ACCESS_CONTROL_CLIENT (0)
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ArmEnableInstructionCache ();
 | 
					  ArmEnableInstructionCache();
 | 
				
			||||||
  ArmEnableDataCache ();
 | 
					  ArmEnableDataCache();
 | 
				
			||||||
  ArmEnableMmu ();
 | 
					  ArmEnableMmu();
 | 
				
			||||||
  return RETURN_SUCCESS;
 | 
					  return RETURN_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -48,7 +48,7 @@ ConvertSectionToPages (
 | 
				
			|||||||
  FirstLevelTable = (ARM_FIRST_LEVEL_DESCRIPTOR *)ArmGetTTBR0BaseAddress ();
 | 
					  FirstLevelTable = (ARM_FIRST_LEVEL_DESCRIPTOR *)ArmGetTTBR0BaseAddress ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Calculate index into first level translation table for start of modification
 | 
					  // Calculate index into first level translation table for start of modification
 | 
				
			||||||
  FirstLevelIdx = TT_DESCRIPTOR_SECTION_BASE_ADDRESS (BaseAddress) >> TT_DESCRIPTOR_SECTION_BASE_SHIFT;
 | 
					  FirstLevelIdx = TT_DESCRIPTOR_SECTION_BASE_ADDRESS(BaseAddress) >> TT_DESCRIPTOR_SECTION_BASE_SHIFT;
 | 
				
			||||||
  ASSERT (FirstLevelIdx < TRANSLATION_TABLE_SECTION_COUNT);
 | 
					  ASSERT (FirstLevelIdx < TRANSLATION_TABLE_SECTION_COUNT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Get section attributes and convert to page attributes
 | 
					  // Get section attributes and convert to page attributes
 | 
				
			||||||
@@ -63,7 +63,7 @@ ConvertSectionToPages (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  // Write the page table entries out
 | 
					  // Write the page table entries out
 | 
				
			||||||
  for (Index = 0; Index < TRANSLATION_TABLE_PAGE_COUNT; Index++) {
 | 
					  for (Index = 0; Index < TRANSLATION_TABLE_PAGE_COUNT; Index++) {
 | 
				
			||||||
    PageTable[Index] = TT_DESCRIPTOR_PAGE_BASE_ADDRESS (BaseAddress + (Index << 12)) | PageDescriptor;
 | 
					    PageTable[Index] = TT_DESCRIPTOR_PAGE_BASE_ADDRESS(BaseAddress + (Index << 12)) | PageDescriptor;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Formulate page table entry, Domain=0, NS=0
 | 
					  // Formulate page table entry, Domain=0, NS=0
 | 
				
			||||||
@@ -156,19 +156,19 @@ UpdatePageEntries (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  // Iterate for the number of 4KB pages to change
 | 
					  // Iterate for the number of 4KB pages to change
 | 
				
			||||||
  Offset = 0;
 | 
					  Offset = 0;
 | 
				
			||||||
  for (p = 0; p < NumPageEntries; p++) {
 | 
					  for(p = 0; p < NumPageEntries; p++) {
 | 
				
			||||||
    // Calculate index into first level translation table for page table value
 | 
					    // Calculate index into first level translation table for page table value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    FirstLevelIdx = TT_DESCRIPTOR_SECTION_BASE_ADDRESS (BaseAddress + Offset) >> TT_DESCRIPTOR_SECTION_BASE_SHIFT;
 | 
					    FirstLevelIdx = TT_DESCRIPTOR_SECTION_BASE_ADDRESS(BaseAddress + Offset) >> TT_DESCRIPTOR_SECTION_BASE_SHIFT;
 | 
				
			||||||
    ASSERT (FirstLevelIdx < TRANSLATION_TABLE_SECTION_COUNT);
 | 
					    ASSERT (FirstLevelIdx < TRANSLATION_TABLE_SECTION_COUNT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Read the descriptor from the first level page table
 | 
					    // Read the descriptor from the first level page table
 | 
				
			||||||
    Descriptor = FirstLevelTable[FirstLevelIdx];
 | 
					    Descriptor = FirstLevelTable[FirstLevelIdx];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Does this descriptor need to be converted from section entry to 4K pages?
 | 
					    // Does this descriptor need to be converted from section entry to 4K pages?
 | 
				
			||||||
    if (!TT_DESCRIPTOR_SECTION_TYPE_IS_PAGE_TABLE (Descriptor)) {
 | 
					    if (!TT_DESCRIPTOR_SECTION_TYPE_IS_PAGE_TABLE(Descriptor)) {
 | 
				
			||||||
      Status = ConvertSectionToPages (FirstLevelIdx << TT_DESCRIPTOR_SECTION_BASE_SHIFT);
 | 
					      Status = ConvertSectionToPages (FirstLevelIdx << TT_DESCRIPTOR_SECTION_BASE_SHIFT);
 | 
				
			||||||
      if (EFI_ERROR (Status)) {
 | 
					      if (EFI_ERROR(Status)) {
 | 
				
			||||||
        // Exit for loop
 | 
					        // Exit for loop
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -181,7 +181,7 @@ UpdatePageEntries (
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Obtain page table base address
 | 
					    // Obtain page table base address
 | 
				
			||||||
    PageTable = (ARM_PAGE_TABLE_ENTRY *)TT_DESCRIPTOR_PAGE_BASE_ADDRESS (Descriptor);
 | 
					    PageTable = (ARM_PAGE_TABLE_ENTRY *)TT_DESCRIPTOR_PAGE_BASE_ADDRESS(Descriptor);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Calculate index into the page table
 | 
					    // Calculate index into the page table
 | 
				
			||||||
    PageTableIndex = ((BaseAddress + Offset) & TT_DESCRIPTOR_PAGE_INDEX_MASK) >> TT_DESCRIPTOR_PAGE_BASE_SHIFT;
 | 
					    PageTableIndex = ((BaseAddress + Offset) & TT_DESCRIPTOR_PAGE_INDEX_MASK) >> TT_DESCRIPTOR_PAGE_BASE_SHIFT;
 | 
				
			||||||
@@ -206,6 +206,7 @@ UpdatePageEntries (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    Status = EFI_SUCCESS;
 | 
					    Status = EFI_SUCCESS;
 | 
				
			||||||
    Offset += TT_DESCRIPTOR_PAGE_SIZE;
 | 
					    Offset += TT_DESCRIPTOR_PAGE_SIZE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  } // End first level translation table loop
 | 
					  } // End first level translation table loop
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return Status;
 | 
					  return Status;
 | 
				
			||||||
@@ -285,25 +286,24 @@ UpdateSectionEntries (
 | 
				
			|||||||
  FirstLevelTable = (ARM_FIRST_LEVEL_DESCRIPTOR *)ArmGetTTBR0BaseAddress ();
 | 
					  FirstLevelTable = (ARM_FIRST_LEVEL_DESCRIPTOR *)ArmGetTTBR0BaseAddress ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // calculate index into first level translation table for start of modification
 | 
					  // calculate index into first level translation table for start of modification
 | 
				
			||||||
  FirstLevelIdx = TT_DESCRIPTOR_SECTION_BASE_ADDRESS (BaseAddress) >> TT_DESCRIPTOR_SECTION_BASE_SHIFT;
 | 
					  FirstLevelIdx = TT_DESCRIPTOR_SECTION_BASE_ADDRESS(BaseAddress) >> TT_DESCRIPTOR_SECTION_BASE_SHIFT;
 | 
				
			||||||
  ASSERT (FirstLevelIdx < TRANSLATION_TABLE_SECTION_COUNT);
 | 
					  ASSERT (FirstLevelIdx < TRANSLATION_TABLE_SECTION_COUNT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // calculate number of 1MB first level entries this applies to
 | 
					  // calculate number of 1MB first level entries this applies to
 | 
				
			||||||
  NumSections = (UINT32)(Length / TT_DESCRIPTOR_SECTION_SIZE);
 | 
					  NumSections = (UINT32)(Length / TT_DESCRIPTOR_SECTION_SIZE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // iterate through each descriptor
 | 
					  // iterate through each descriptor
 | 
				
			||||||
  for (i = 0; i < NumSections; i++) {
 | 
					  for(i=0; i<NumSections; i++) {
 | 
				
			||||||
    CurrentDescriptor = FirstLevelTable[FirstLevelIdx + i];
 | 
					    CurrentDescriptor = FirstLevelTable[FirstLevelIdx + i];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // has this descriptor already been converted to pages?
 | 
					    // has this descriptor already been converted to pages?
 | 
				
			||||||
    if (TT_DESCRIPTOR_SECTION_TYPE_IS_PAGE_TABLE (CurrentDescriptor)) {
 | 
					    if (TT_DESCRIPTOR_SECTION_TYPE_IS_PAGE_TABLE(CurrentDescriptor)) {
 | 
				
			||||||
      // forward this 1MB range to page table function instead
 | 
					      // forward this 1MB range to page table function instead
 | 
				
			||||||
      Status = UpdatePageEntries (
 | 
					      Status = UpdatePageEntries (
 | 
				
			||||||
                 (FirstLevelIdx + i) << TT_DESCRIPTOR_SECTION_BASE_SHIFT,
 | 
					                 (FirstLevelIdx + i) << TT_DESCRIPTOR_SECTION_BASE_SHIFT,
 | 
				
			||||||
                 TT_DESCRIPTOR_SECTION_SIZE,
 | 
					                 TT_DESCRIPTOR_SECTION_SIZE,
 | 
				
			||||||
                 Attributes,
 | 
					                 Attributes,
 | 
				
			||||||
                 NULL
 | 
					                 NULL);
 | 
				
			||||||
                 );
 | 
					 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      // still a section entry
 | 
					      // still a section entry
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -355,22 +355,19 @@ ArmSetMemoryAttributes (
 | 
				
			|||||||
  FlushTlbs = FALSE;
 | 
					  FlushTlbs = FALSE;
 | 
				
			||||||
  while (Length > 0) {
 | 
					  while (Length > 0) {
 | 
				
			||||||
    if ((BaseAddress % TT_DESCRIPTOR_SECTION_SIZE == 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;
 | 
					      ChunkLength = Length - Length % TT_DESCRIPTOR_SECTION_SIZE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      DEBUG ((
 | 
					      DEBUG ((DEBUG_PAGE,
 | 
				
			||||||
        DEBUG_PAGE,
 | 
					 | 
				
			||||||
        "SetMemoryAttributes(): MMU section 0x%lx length 0x%lx to %lx\n",
 | 
					        "SetMemoryAttributes(): MMU section 0x%lx length 0x%lx to %lx\n",
 | 
				
			||||||
        BaseAddress,
 | 
					        BaseAddress, ChunkLength, Attributes));
 | 
				
			||||||
        ChunkLength,
 | 
					 | 
				
			||||||
        Attributes
 | 
					 | 
				
			||||||
        ));
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
      Status = UpdateSectionEntries (BaseAddress, ChunkLength, Attributes);
 | 
					      Status = UpdateSectionEntries (BaseAddress, ChunkLength, Attributes);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      FlushTlbs = TRUE;
 | 
					      FlushTlbs = TRUE;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      //
 | 
					      //
 | 
				
			||||||
      // Process page by page until the next section boundary, but only if
 | 
					      // 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.
 | 
					      // we have more than a section's worth of area to deal with after that.
 | 
				
			||||||
@@ -381,20 +378,12 @@ ArmSetMemoryAttributes (
 | 
				
			|||||||
        ChunkLength = Length;
 | 
					        ChunkLength = Length;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      DEBUG ((
 | 
					      DEBUG ((DEBUG_PAGE,
 | 
				
			||||||
        DEBUG_PAGE,
 | 
					 | 
				
			||||||
        "SetMemoryAttributes(): MMU page 0x%lx length 0x%lx to %lx\n",
 | 
					        "SetMemoryAttributes(): MMU page 0x%lx length 0x%lx to %lx\n",
 | 
				
			||||||
        BaseAddress,
 | 
					        BaseAddress, ChunkLength, Attributes));
 | 
				
			||||||
        ChunkLength,
 | 
					 | 
				
			||||||
        Attributes
 | 
					 | 
				
			||||||
        ));
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
      Status = UpdatePageEntries (
 | 
					      Status = UpdatePageEntries (BaseAddress, ChunkLength, Attributes,
 | 
				
			||||||
                 BaseAddress,
 | 
					                 &FlushTlbs);
 | 
				
			||||||
                 ChunkLength,
 | 
					 | 
				
			||||||
                 Attributes,
 | 
					 | 
				
			||||||
                 &FlushTlbs
 | 
					 | 
				
			||||||
                 );
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (EFI_ERROR (Status)) {
 | 
					    if (EFI_ERROR (Status)) {
 | 
				
			||||||
@@ -408,7 +397,6 @@ ArmSetMemoryAttributes (
 | 
				
			|||||||
  if (FlushTlbs) {
 | 
					  if (FlushTlbs) {
 | 
				
			||||||
    ArmInvalidateTlb ();
 | 
					    ArmInvalidateTlb ();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  return Status;
 | 
					  return Status;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,7 +34,7 @@ MtlWaitUntilChannelFree (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  @retval UINT32*      Pointer to the payload.
 | 
					  @retval UINT32*      Pointer to the payload.
 | 
				
			||||||
**/
 | 
					**/
 | 
				
			||||||
UINT32 *
 | 
					UINT32*
 | 
				
			||||||
MtlGetChannelPayload (
 | 
					MtlGetChannelPayload (
 | 
				
			||||||
  IN  MTL_CHANNEL  *Channel
 | 
					  IN  MTL_CHANNEL  *Channel
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -65,7 +65,7 @@ LibResetSystem (
 | 
				
			|||||||
  ArmCallSmc (&ArmSmcArgs);
 | 
					  ArmCallSmc (&ArmSmcArgs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // We should never be here
 | 
					  // 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 ();
 | 
					  CpuDeadLoop ();
 | 
				
			||||||
  return EFI_UNSUPPORTED;
 | 
					  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]
 | 
					[Sources.AARCH64]
 | 
				
			||||||
  AArch64/ArmSmc.S
 | 
					  AArch64/ArmSmc.S
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Sources]
 | 
					 | 
				
			||||||
  ArmSmc.c
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[Packages]
 | 
					[Packages]
 | 
				
			||||||
  MdePkg/MdePkg.dec
 | 
					  MdePkg/MdePkg.dec
 | 
				
			||||||
  ArmPkg/ArmPkg.dec
 | 
					  ArmPkg/ArmPkg.dec
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,4 @@
 | 
				
			|||||||
//
 | 
					//
 | 
				
			||||||
//  Copyright (c) 2021, NUVIA Inc. All rights reserved.
 | 
					 | 
				
			||||||
//  Copyright (c) 2016, Linaro Limited. All rights reserved.
 | 
					//  Copyright (c) 2016, Linaro Limited. All rights reserved.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
//  SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
					//  SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
				
			||||||
@@ -8,7 +7,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <Base.h>
 | 
					#include <Base.h>
 | 
				
			||||||
#include <Library/ArmSmcLib.h>
 | 
					#include <Library/ArmSmcLib.h>
 | 
				
			||||||
#include <IndustryStandard/ArmStdSmc.h>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
ArmCallSmc (
 | 
					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
 | 
					  VOID
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					  ARM_SMC_ARGS ArmSmcArgs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Send a PSCI 0.2 SYSTEM_RESET command
 | 
					  // 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
 | 
					  VOID
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					  ARM_SMC_ARGS ArmSmcArgs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Send a PSCI 0.2 SYSTEM_OFF command
 | 
					  // 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
 | 
					 * Helpers to convert between float32 and aeabi_float_t, and float64 and
 | 
				
			||||||
 * aeabi_double_t used by the AEABI functions below.
 | 
					 * aeabi_double_t used by the AEABI functions below.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static aeabi_float_t
 | 
					static aeabi_float_t f32_to_f(float32_t val)
 | 
				
			||||||
f32_to_f (
 | 
					 | 
				
			||||||
  float32_t  val
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return val.v;
 | 
					  return val.v;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static float32_t
 | 
					static float32_t f32_from_f(aeabi_float_t val)
 | 
				
			||||||
f32_from_f (
 | 
					 | 
				
			||||||
  aeabi_float_t  val
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  float32_t res;
 | 
					  float32_t res;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -45,18 +39,12 @@ f32_from_f (
 | 
				
			|||||||
  return res;
 | 
					  return res;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static aeabi_double_t
 | 
					static aeabi_double_t f64_to_d(float64_t val)
 | 
				
			||||||
f64_to_d (
 | 
					 | 
				
			||||||
  float64_t  val
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return val.v;
 | 
					  return val.v;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static float64_t
 | 
					static float64_t f64_from_d(aeabi_double_t val)
 | 
				
			||||||
f64_from_d (
 | 
					 | 
				
			||||||
  aeabi_double_t  val
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  float64_t res;
 | 
					  float64_t res;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -76,346 +64,220 @@ f64_from_d (
 | 
				
			|||||||
 * Table 2, Standard aeabi_double_t precision floating-point arithmetic helper
 | 
					 * Table 2, Standard aeabi_double_t precision floating-point arithmetic helper
 | 
				
			||||||
 * functions
 | 
					 * functions
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
aeabi_double_t
 | 
					
 | 
				
			||||||
__aeabi_dadd (
 | 
					aeabi_double_t __aeabi_dadd(aeabi_double_t a, aeabi_double_t b)
 | 
				
			||||||
  aeabi_double_t  a,
 | 
					 | 
				
			||||||
  aeabi_double_t  b
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f64_to_d (f64_add (f64_from_d (a), f64_from_d (b)));
 | 
					  return f64_to_d(f64_add(f64_from_d(a), f64_from_d(b)));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
aeabi_double_t
 | 
					aeabi_double_t __aeabi_ddiv(aeabi_double_t a, aeabi_double_t b)
 | 
				
			||||||
__aeabi_ddiv (
 | 
					 | 
				
			||||||
  aeabi_double_t  a,
 | 
					 | 
				
			||||||
  aeabi_double_t  b
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f64_to_d (f64_div (f64_from_d (a), f64_from_d (b)));
 | 
					  return f64_to_d(f64_div(f64_from_d(a), f64_from_d(b)));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
aeabi_double_t
 | 
					aeabi_double_t __aeabi_dmul(aeabi_double_t a, aeabi_double_t b)
 | 
				
			||||||
__aeabi_dmul (
 | 
					 | 
				
			||||||
  aeabi_double_t  a,
 | 
					 | 
				
			||||||
  aeabi_double_t  b
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f64_to_d (f64_mul (f64_from_d (a), f64_from_d (b)));
 | 
					  return f64_to_d(f64_mul(f64_from_d(a), f64_from_d(b)));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
aeabi_double_t
 | 
					
 | 
				
			||||||
__aeabi_drsub (
 | 
					aeabi_double_t __aeabi_drsub(aeabi_double_t a, aeabi_double_t b)
 | 
				
			||||||
  aeabi_double_t  a,
 | 
					 | 
				
			||||||
  aeabi_double_t  b
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f64_to_d (f64_sub (f64_from_d (b), f64_from_d (a)));
 | 
					  return f64_to_d(f64_sub(f64_from_d(b), f64_from_d(a)));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
aeabi_double_t
 | 
					aeabi_double_t __aeabi_dsub(aeabi_double_t a, aeabi_double_t b)
 | 
				
			||||||
__aeabi_dsub (
 | 
					 | 
				
			||||||
  aeabi_double_t  a,
 | 
					 | 
				
			||||||
  aeabi_double_t  b
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f64_to_d (f64_sub (f64_from_d (a), f64_from_d (b)));
 | 
					  return f64_to_d(f64_sub(f64_from_d(a), f64_from_d(b)));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Table 3, double precision floating-point comparison helper functions
 | 
					 * Table 3, double precision floating-point comparison helper functions
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
int
 | 
					
 | 
				
			||||||
__aeabi_dcmpeq (
 | 
					int __aeabi_dcmpeq(aeabi_double_t a, aeabi_double_t b)
 | 
				
			||||||
  aeabi_double_t  a,
 | 
					 | 
				
			||||||
  aeabi_double_t  b
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f64_eq (f64_from_d (a), f64_from_d (b));
 | 
					  return f64_eq(f64_from_d(a), f64_from_d(b));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int
 | 
					int __aeabi_dcmplt(aeabi_double_t a, aeabi_double_t b)
 | 
				
			||||||
__aeabi_dcmplt (
 | 
					 | 
				
			||||||
  aeabi_double_t  a,
 | 
					 | 
				
			||||||
  aeabi_double_t  b
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f64_lt (f64_from_d (a), f64_from_d (b));
 | 
					  return f64_lt(f64_from_d(a), f64_from_d(b));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int
 | 
					int __aeabi_dcmple(aeabi_double_t a, aeabi_double_t b)
 | 
				
			||||||
__aeabi_dcmple (
 | 
					 | 
				
			||||||
  aeabi_double_t  a,
 | 
					 | 
				
			||||||
  aeabi_double_t  b
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f64_le (f64_from_d (a), f64_from_d (b));
 | 
					  return f64_le(f64_from_d(a), f64_from_d(b));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int
 | 
					int __aeabi_dcmpge(aeabi_double_t a, aeabi_double_t b)
 | 
				
			||||||
__aeabi_dcmpge (
 | 
					 | 
				
			||||||
  aeabi_double_t  a,
 | 
					 | 
				
			||||||
  aeabi_double_t  b
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f64_le (f64_from_d (b), f64_from_d (a));
 | 
					  return f64_le(f64_from_d(b), f64_from_d(a));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int
 | 
					int __aeabi_dcmpgt(aeabi_double_t a, aeabi_double_t b)
 | 
				
			||||||
__aeabi_dcmpgt (
 | 
					 | 
				
			||||||
  aeabi_double_t  a,
 | 
					 | 
				
			||||||
  aeabi_double_t  b
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f64_lt (f64_from_d (b), f64_from_d (a));
 | 
					  return f64_lt(f64_from_d(b), f64_from_d(a));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Table 4, Standard single precision floating-point arithmetic helper
 | 
					 * Table 4, Standard single precision floating-point arithmetic helper
 | 
				
			||||||
 * functions
 | 
					 * functions
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
aeabi_float_t
 | 
					
 | 
				
			||||||
__aeabi_fadd (
 | 
					aeabi_float_t __aeabi_fadd(aeabi_float_t a, aeabi_float_t b)
 | 
				
			||||||
  aeabi_float_t  a,
 | 
					 | 
				
			||||||
  aeabi_float_t  b
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f32_to_f (f32_add (f32_from_f (a), f32_from_f (b)));
 | 
					  return f32_to_f(f32_add(f32_from_f(a), f32_from_f(b)));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
aeabi_float_t
 | 
					aeabi_float_t __aeabi_fdiv(aeabi_float_t a, aeabi_float_t b)
 | 
				
			||||||
__aeabi_fdiv (
 | 
					 | 
				
			||||||
  aeabi_float_t  a,
 | 
					 | 
				
			||||||
  aeabi_float_t  b
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f32_to_f (f32_div (f32_from_f (a), f32_from_f (b)));
 | 
					  return f32_to_f(f32_div(f32_from_f(a), f32_from_f(b)));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
aeabi_float_t
 | 
					aeabi_float_t __aeabi_fmul(aeabi_float_t a, aeabi_float_t b)
 | 
				
			||||||
__aeabi_fmul (
 | 
					 | 
				
			||||||
  aeabi_float_t  a,
 | 
					 | 
				
			||||||
  aeabi_float_t  b
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f32_to_f (f32_mul (f32_from_f (a), f32_from_f (b)));
 | 
					  return f32_to_f(f32_mul(f32_from_f(a), f32_from_f(b)));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
aeabi_float_t
 | 
					aeabi_float_t __aeabi_frsub(aeabi_float_t a, aeabi_float_t b)
 | 
				
			||||||
__aeabi_frsub (
 | 
					 | 
				
			||||||
  aeabi_float_t  a,
 | 
					 | 
				
			||||||
  aeabi_float_t  b
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f32_to_f (f32_sub (f32_from_f (b), f32_from_f (a)));
 | 
					  return f32_to_f(f32_sub(f32_from_f(b), f32_from_f(a)));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
aeabi_float_t
 | 
					aeabi_float_t __aeabi_fsub(aeabi_float_t a, aeabi_float_t b)
 | 
				
			||||||
__aeabi_fsub (
 | 
					 | 
				
			||||||
  aeabi_float_t  a,
 | 
					 | 
				
			||||||
  aeabi_float_t  b
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f32_to_f (f32_sub (f32_from_f (a), f32_from_f (b)));
 | 
					  return f32_to_f(f32_sub(f32_from_f(a), f32_from_f(b)));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Table 5, Standard single precision floating-point comparison helper
 | 
					 * Table 5, Standard single precision floating-point comparison helper
 | 
				
			||||||
 * functions
 | 
					 * functions
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
int
 | 
					
 | 
				
			||||||
__aeabi_fcmpeq (
 | 
					int __aeabi_fcmpeq(aeabi_float_t a, aeabi_float_t b)
 | 
				
			||||||
  aeabi_float_t  a,
 | 
					 | 
				
			||||||
  aeabi_float_t  b
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f32_eq (f32_from_f (a), f32_from_f (b));
 | 
					  return f32_eq(f32_from_f(a), f32_from_f(b));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int
 | 
					int __aeabi_fcmplt(aeabi_float_t a, aeabi_float_t b)
 | 
				
			||||||
__aeabi_fcmplt (
 | 
					 | 
				
			||||||
  aeabi_float_t  a,
 | 
					 | 
				
			||||||
  aeabi_float_t  b
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f32_lt (f32_from_f (a), f32_from_f (b));
 | 
					  return f32_lt(f32_from_f(a), f32_from_f(b));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int
 | 
					int __aeabi_fcmple(aeabi_float_t a, aeabi_float_t b)
 | 
				
			||||||
__aeabi_fcmple (
 | 
					 | 
				
			||||||
  aeabi_float_t  a,
 | 
					 | 
				
			||||||
  aeabi_float_t  b
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f32_le (f32_from_f (a), f32_from_f (b));
 | 
					  return f32_le(f32_from_f(a), f32_from_f(b));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int
 | 
					int __aeabi_fcmpge(aeabi_float_t a, aeabi_float_t b)
 | 
				
			||||||
__aeabi_fcmpge (
 | 
					 | 
				
			||||||
  aeabi_float_t  a,
 | 
					 | 
				
			||||||
  aeabi_float_t  b
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f32_le (f32_from_f (b), f32_from_f (a));
 | 
					  return f32_le(f32_from_f(b), f32_from_f(a));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int
 | 
					int __aeabi_fcmpgt(aeabi_float_t a, aeabi_float_t b)
 | 
				
			||||||
__aeabi_fcmpgt (
 | 
					 | 
				
			||||||
  aeabi_float_t  a,
 | 
					 | 
				
			||||||
  aeabi_float_t  b
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f32_lt (f32_from_f (b), f32_from_f (a));
 | 
					  return f32_lt(f32_from_f(b), f32_from_f(a));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Table 6, Standard floating-point to integer conversions
 | 
					 * Table 6, Standard floating-point to integer conversions
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
int
 | 
					
 | 
				
			||||||
__aeabi_d2iz (
 | 
					int __aeabi_d2iz(aeabi_double_t a)
 | 
				
			||||||
  aeabi_double_t  a
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f64_to_i32_r_minMag (f64_from_d (a), false);
 | 
					  return f64_to_i32_r_minMag(f64_from_d(a), false);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unsigned
 | 
					unsigned __aeabi_d2uiz(aeabi_double_t a)
 | 
				
			||||||
__aeabi_d2uiz (
 | 
					 | 
				
			||||||
  aeabi_double_t  a
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f64_to_ui32_r_minMag (f64_from_d (a), false);
 | 
					  return f64_to_ui32_r_minMag(f64_from_d(a), false);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
long long
 | 
					long long __aeabi_d2lz(aeabi_double_t a)
 | 
				
			||||||
__aeabi_d2lz (
 | 
					 | 
				
			||||||
  aeabi_double_t  a
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f64_to_i64_r_minMag (f64_from_d (a), false);
 | 
					  return f64_to_i64_r_minMag(f64_from_d(a), false);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unsigned long long
 | 
					unsigned long long __aeabi_d2ulz(aeabi_double_t a)
 | 
				
			||||||
__aeabi_d2ulz (
 | 
					 | 
				
			||||||
  aeabi_double_t  a
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f64_to_ui64_r_minMag (f64_from_d (a), false);
 | 
					  return f64_to_ui64_r_minMag(f64_from_d(a), false);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int
 | 
					int __aeabi_f2iz(aeabi_float_t a)
 | 
				
			||||||
__aeabi_f2iz (
 | 
					 | 
				
			||||||
  aeabi_float_t  a
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f32_to_i32_r_minMag (f32_from_f (a), false);
 | 
					  return f32_to_i32_r_minMag(f32_from_f(a), false);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unsigned
 | 
					unsigned __aeabi_f2uiz(aeabi_float_t a)
 | 
				
			||||||
__aeabi_f2uiz (
 | 
					 | 
				
			||||||
  aeabi_float_t  a
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f32_to_ui32_r_minMag (f32_from_f (a), false);
 | 
					  return f32_to_ui32_r_minMag(f32_from_f(a), false);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
long long
 | 
					long long __aeabi_f2lz(aeabi_float_t a)
 | 
				
			||||||
__aeabi_f2lz (
 | 
					 | 
				
			||||||
  aeabi_float_t  a
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f32_to_i64_r_minMag (f32_from_f (a), false);
 | 
					  return f32_to_i64_r_minMag(f32_from_f(a), false);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unsigned long long
 | 
					unsigned long long __aeabi_f2ulz(aeabi_float_t a)
 | 
				
			||||||
__aeabi_f2ulz (
 | 
					 | 
				
			||||||
  aeabi_float_t  a
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f32_to_ui64_r_minMag (f32_from_f (a), false);
 | 
					  return f32_to_ui64_r_minMag(f32_from_f(a), false);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Table 7, Standard conversions between floating types
 | 
					 * Table 7, Standard conversions between floating types
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
aeabi_float_t
 | 
					
 | 
				
			||||||
__aeabi_d2f (
 | 
					aeabi_float_t __aeabi_d2f(aeabi_double_t a)
 | 
				
			||||||
  aeabi_double_t  a
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f32_to_f (f64_to_f32 (f64_from_d (a)));
 | 
					  return f32_to_f(f64_to_f32(f64_from_d(a)));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
aeabi_double_t
 | 
					aeabi_double_t __aeabi_f2d(aeabi_float_t a)
 | 
				
			||||||
__aeabi_f2d (
 | 
					 | 
				
			||||||
  aeabi_float_t  a
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f64_to_d (f32_to_f64 (f32_from_f (a)));
 | 
					  return f64_to_d(f32_to_f64(f32_from_f(a)));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Table 8, Standard integer to floating-point conversions
 | 
					 * Table 8, Standard integer to floating-point conversions
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
aeabi_double_t
 | 
					
 | 
				
			||||||
__aeabi_i2d (
 | 
					aeabi_double_t __aeabi_i2d(int a)
 | 
				
			||||||
  int  a
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f64_to_d (i32_to_f64 (a));
 | 
					  return f64_to_d(i32_to_f64(a));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
aeabi_double_t
 | 
					aeabi_double_t __aeabi_ui2d(unsigned a)
 | 
				
			||||||
__aeabi_ui2d (
 | 
					 | 
				
			||||||
  unsigned  a
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f64_to_d (ui32_to_f64 (a));
 | 
					  return f64_to_d(ui32_to_f64(a));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
aeabi_double_t
 | 
					aeabi_double_t __aeabi_l2d(long long a)
 | 
				
			||||||
__aeabi_l2d (
 | 
					 | 
				
			||||||
  long long  a
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f64_to_d (i64_to_f64 (a));
 | 
					  return f64_to_d(i64_to_f64(a));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
aeabi_double_t
 | 
					aeabi_double_t __aeabi_ul2d(unsigned long long a)
 | 
				
			||||||
__aeabi_ul2d (
 | 
					 | 
				
			||||||
  unsigned long long  a
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f64_to_d (ui64_to_f64 (a));
 | 
					  return f64_to_d(ui64_to_f64(a));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
aeabi_float_t
 | 
					aeabi_float_t __aeabi_i2f(int a)
 | 
				
			||||||
__aeabi_i2f (
 | 
					 | 
				
			||||||
  int  a
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f32_to_f (i32_to_f32 (a));
 | 
					  return f32_to_f(i32_to_f32(a));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
aeabi_float_t
 | 
					aeabi_float_t __aeabi_ui2f(unsigned a)
 | 
				
			||||||
__aeabi_ui2f (
 | 
					 | 
				
			||||||
  unsigned  a
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f32_to_f (ui32_to_f32 (a));
 | 
					  return f32_to_f(ui32_to_f32(a));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
aeabi_float_t
 | 
					aeabi_float_t __aeabi_l2f(long long a)
 | 
				
			||||||
__aeabi_l2f (
 | 
					 | 
				
			||||||
  long long  a
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f32_to_f (i64_to_f32 (a));
 | 
					  return f32_to_f(i64_to_f32(a));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
aeabi_float_t
 | 
					aeabi_float_t __aeabi_ul2f(unsigned long long a)
 | 
				
			||||||
__aeabi_ul2f (
 | 
					 | 
				
			||||||
  unsigned long long  a
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return f32_to_f (ui64_to_f32 (a));
 | 
					  return f32_to_f(ui64_to_f32(a));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,33 +1,22 @@
 | 
				
			|||||||
// ------------------------------------------------------------------------------
 | 
					//------------------------------------------------------------------------------
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// Copyright (c) 2019, Pete Batard. All rights reserved.
 | 
					// Copyright (c) 2019, Pete Batard. All rights reserved.
 | 
				
			||||||
// Copyright (c) 2021, Arm Limited. All rights reserved.<BR>
 | 
					// Copyright (c) 2021, Arm Limited. All rights reserved.<BR>
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
					// SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// ------------------------------------------------------------------------------
 | 
					//------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined (_M_ARM64)
 | 
					#if defined(_M_ARM64)
 | 
				
			||||||
typedef unsigned __int64  size_t;
 | 
					typedef unsigned __int64  size_t;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
typedef unsigned __int32  size_t;
 | 
					typedef unsigned __int32  size_t;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int
 | 
					int memcmp(void *, void *, size_t);
 | 
				
			||||||
memcmp (
 | 
					 | 
				
			||||||
  void *,
 | 
					 | 
				
			||||||
  void *,
 | 
					 | 
				
			||||||
  size_t
 | 
					 | 
				
			||||||
  );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#pragma intrinsic(memcmp)
 | 
					#pragma intrinsic(memcmp)
 | 
				
			||||||
#pragma function(memcmp)
 | 
					#pragma function(memcmp)
 | 
				
			||||||
int
 | 
					int memcmp(const void *s1, const void *s2, size_t n)
 | 
				
			||||||
memcmp (
 | 
					 | 
				
			||||||
  const void  *s1,
 | 
					 | 
				
			||||||
  const void  *s2,
 | 
					 | 
				
			||||||
  size_t      n
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  unsigned char const *t1;
 | 
					  unsigned char const *t1;
 | 
				
			||||||
  unsigned char const *t2;
 | 
					  unsigned char const *t2;
 | 
				
			||||||
@@ -36,10 +25,8 @@ memcmp (
 | 
				
			|||||||
  t2 = s2;
 | 
					  t2 = s2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  while (n-- != 0) {
 | 
					  while (n-- != 0) {
 | 
				
			||||||
    if (*t1 != *t2) {
 | 
					    if (*t1 != *t2)
 | 
				
			||||||
      return (int)*t1 - (int)*t2;
 | 
					      return (int)*t1 - (int)*t2;
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    t1++;
 | 
					    t1++;
 | 
				
			||||||
    t2++;
 | 
					    t2++;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,20 +1,15 @@
 | 
				
			|||||||
// ------------------------------------------------------------------------------
 | 
					//------------------------------------------------------------------------------
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
 | 
					// Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
 | 
				
			||||||
// Copyright (c) 2021, Arm Limited. All rights reserved.<BR>
 | 
					// Copyright (c) 2021, Arm Limited. All rights reserved.<BR>
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
					// SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// ------------------------------------------------------------------------------
 | 
					//------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef __SIZE_TYPE__ size_t;
 | 
					typedef __SIZE_TYPE__ size_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void __memcpy(void *dest, const void *src, size_t n)
 | 
				
			||||||
__memcpy (
 | 
					 | 
				
			||||||
  void        *dest,
 | 
					 | 
				
			||||||
  const void  *src,
 | 
					 | 
				
			||||||
  size_t      n
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  unsigned char *d;
 | 
					  unsigned char *d;
 | 
				
			||||||
  unsigned char const *s;
 | 
					  unsigned char const *s;
 | 
				
			||||||
@@ -27,41 +22,21 @@ __memcpy (
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void *
 | 
					void *memcpy(void *dest, const void *src, size_t n)
 | 
				
			||||||
memcpy (
 | 
					 | 
				
			||||||
  void        *dest,
 | 
					 | 
				
			||||||
  const void  *src,
 | 
					 | 
				
			||||||
  size_t      n
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  __memcpy (dest, src, n);
 | 
					  __memcpy(dest, src, n);
 | 
				
			||||||
  return dest;
 | 
					  return dest;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __arm__
 | 
					#ifdef __arm__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
__attribute__ ((__alias__ ("__memcpy")))
 | 
					__attribute__((__alias__("__memcpy")))
 | 
				
			||||||
void
 | 
					void __aeabi_memcpy(void *dest, const void *src, size_t n);
 | 
				
			||||||
__aeabi_memcpy (
 | 
					 | 
				
			||||||
  void        *dest,
 | 
					 | 
				
			||||||
  const void  *src,
 | 
					 | 
				
			||||||
  size_t      n
 | 
					 | 
				
			||||||
  );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
__attribute__ ((__alias__ ("__memcpy")))
 | 
					__attribute__((__alias__("__memcpy")))
 | 
				
			||||||
void
 | 
					void __aeabi_memcpy4(void *dest, const void *src, size_t n);
 | 
				
			||||||
__aeabi_memcpy4 (
 | 
					 | 
				
			||||||
  void        *dest,
 | 
					 | 
				
			||||||
  const void  *src,
 | 
					 | 
				
			||||||
  size_t      n
 | 
					 | 
				
			||||||
  );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
__attribute__ ((__alias__ ("__memcpy")))
 | 
					__attribute__((__alias__("__memcpy")))
 | 
				
			||||||
void
 | 
					void __aeabi_memcpy8(void *dest, const void *src, size_t n);
 | 
				
			||||||
__aeabi_memcpy8 (
 | 
					 | 
				
			||||||
  void        *dest,
 | 
					 | 
				
			||||||
  const void  *src,
 | 
					 | 
				
			||||||
  size_t      n
 | 
					 | 
				
			||||||
  );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,33 +1,22 @@
 | 
				
			|||||||
// ------------------------------------------------------------------------------
 | 
					//------------------------------------------------------------------------------
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// Copyright (c) 2017, Pete Batard. All rights reserved.<BR>
 | 
					// Copyright (c) 2017, Pete Batard. All rights reserved.<BR>
 | 
				
			||||||
// Copyright (c) 2021, Arm Limited. All rights reserved.<BR>
 | 
					// Copyright (c) 2021, Arm Limited. All rights reserved.<BR>
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
					// SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// ------------------------------------------------------------------------------
 | 
					//------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined (_M_ARM64)
 | 
					#if defined(_M_ARM64)
 | 
				
			||||||
typedef unsigned __int64  size_t;
 | 
					typedef unsigned __int64  size_t;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
typedef unsigned __int32  size_t;
 | 
					typedef unsigned __int32  size_t;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void *
 | 
					void* memcpy(void *, const void *, size_t);
 | 
				
			||||||
memcpy (
 | 
					 | 
				
			||||||
  void *,
 | 
					 | 
				
			||||||
  const void *,
 | 
					 | 
				
			||||||
  size_t
 | 
					 | 
				
			||||||
  );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#pragma intrinsic(memcpy)
 | 
					#pragma intrinsic(memcpy)
 | 
				
			||||||
#pragma function(memcpy)
 | 
					#pragma function(memcpy)
 | 
				
			||||||
void *
 | 
					void* memcpy(void *dest, const void *src, size_t n)
 | 
				
			||||||
memcpy (
 | 
					 | 
				
			||||||
  void        *dest,
 | 
					 | 
				
			||||||
  const void  *src,
 | 
					 | 
				
			||||||
  size_t      n
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  unsigned char *d;
 | 
					  unsigned char *d;
 | 
				
			||||||
  unsigned char const *s;
 | 
					  unsigned char const *s;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,33 +1,22 @@
 | 
				
			|||||||
// ------------------------------------------------------------------------------
 | 
					//------------------------------------------------------------------------------
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// Copyright (c) 2019, Pete Batard. All rights reserved.
 | 
					// Copyright (c) 2019, Pete Batard. All rights reserved.
 | 
				
			||||||
// Copyright (c) 2021, Arm Limited. All rights reserved.<BR>
 | 
					// Copyright (c) 2021, Arm Limited. All rights reserved.<BR>
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
					// SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// ------------------------------------------------------------------------------
 | 
					//------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined (_M_ARM64)
 | 
					#if defined(_M_ARM64)
 | 
				
			||||||
typedef unsigned __int64  size_t;
 | 
					typedef unsigned __int64  size_t;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
typedef unsigned __int32  size_t;
 | 
					typedef unsigned __int32  size_t;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void *
 | 
					void* memmove(void *, const void *, size_t);
 | 
				
			||||||
memmove (
 | 
					 | 
				
			||||||
  void *,
 | 
					 | 
				
			||||||
  const void *,
 | 
					 | 
				
			||||||
  size_t
 | 
					 | 
				
			||||||
  );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#pragma intrinsic(memmove)
 | 
					#pragma intrinsic(memmove)
 | 
				
			||||||
#pragma function(memmove)
 | 
					#pragma function(memmove)
 | 
				
			||||||
void *
 | 
					void* memmove(void *dest, const void *src, size_t n)
 | 
				
			||||||
memmove (
 | 
					 | 
				
			||||||
  void        *dest,
 | 
					 | 
				
			||||||
  const void  *src,
 | 
					 | 
				
			||||||
  size_t      n
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  unsigned char *d;
 | 
					  unsigned char *d;
 | 
				
			||||||
  unsigned char const *s;
 | 
					  unsigned char const *s;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,21 +1,16 @@
 | 
				
			|||||||
// ------------------------------------------------------------------------------
 | 
					//------------------------------------------------------------------------------
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
 | 
					// Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
 | 
				
			||||||
// Copyright (c) 2021, Arm Limited. All rights reserved.<BR>
 | 
					// Copyright (c) 2021, Arm Limited. All rights reserved.<BR>
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
					// SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// ------------------------------------------------------------------------------
 | 
					//------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef __SIZE_TYPE__ size_t;
 | 
					typedef __SIZE_TYPE__ size_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static __attribute__ ((__used__))
 | 
					static __attribute__((__used__))
 | 
				
			||||||
void *
 | 
					void *__memset(void *s, int c, size_t n)
 | 
				
			||||||
__memset (
 | 
					 | 
				
			||||||
  void    *s,
 | 
					 | 
				
			||||||
  int     c,
 | 
					 | 
				
			||||||
  size_t  n
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  unsigned char *d;
 | 
					  unsigned char *d;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -34,63 +29,31 @@ __memset (
 | 
				
			|||||||
// object was pulled into the link due to the definitions below. So make
 | 
					// object was pulled into the link due to the definitions below. So make
 | 
				
			||||||
// our memset() 'weak' to let the other implementation take precedence.
 | 
					// our memset() 'weak' to let the other implementation take precedence.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
__attribute__ ((__weak__, __alias__ ("__memset")))
 | 
					__attribute__((__weak__, __alias__("__memset")))
 | 
				
			||||||
void *
 | 
					void *memset(void *dest, int c, size_t n);
 | 
				
			||||||
memset (
 | 
					 | 
				
			||||||
  void    *dest,
 | 
					 | 
				
			||||||
  int     c,
 | 
					 | 
				
			||||||
  size_t  n
 | 
					 | 
				
			||||||
  );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __arm__
 | 
					#ifdef __arm__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void __aeabi_memset(void *dest, size_t n, int c)
 | 
				
			||||||
__aeabi_memset (
 | 
					 | 
				
			||||||
  void    *dest,
 | 
					 | 
				
			||||||
  size_t  n,
 | 
					 | 
				
			||||||
  int     c
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  __memset (dest, c, n);
 | 
					  __memset(dest, c, n);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
__attribute__ ((__alias__ ("__aeabi_memset")))
 | 
					__attribute__((__alias__("__aeabi_memset")))
 | 
				
			||||||
void
 | 
					void __aeabi_memset4(void *dest, size_t n, int c);
 | 
				
			||||||
__aeabi_memset4 (
 | 
					 | 
				
			||||||
  void    *dest,
 | 
					 | 
				
			||||||
  size_t  n,
 | 
					 | 
				
			||||||
  int     c
 | 
					 | 
				
			||||||
  );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
__attribute__ ((__alias__ ("__aeabi_memset")))
 | 
					__attribute__((__alias__("__aeabi_memset")))
 | 
				
			||||||
void
 | 
					void __aeabi_memset8(void *dest, size_t n, int c);
 | 
				
			||||||
__aeabi_memset8 (
 | 
					 | 
				
			||||||
  void    *dest,
 | 
					 | 
				
			||||||
  size_t  n,
 | 
					 | 
				
			||||||
  int     c
 | 
					 | 
				
			||||||
  );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void __aeabi_memclr(void *dest, size_t n)
 | 
				
			||||||
__aeabi_memclr (
 | 
					 | 
				
			||||||
  void    *dest,
 | 
					 | 
				
			||||||
  size_t  n
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  __memset (dest, 0, n);
 | 
					  __memset(dest, 0, n);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
__attribute__ ((__alias__ ("__aeabi_memclr")))
 | 
					__attribute__((__alias__("__aeabi_memclr")))
 | 
				
			||||||
void
 | 
					void __aeabi_memclr4(void *dest, size_t n);
 | 
				
			||||||
__aeabi_memclr4 (
 | 
					 | 
				
			||||||
  void    *dest,
 | 
					 | 
				
			||||||
  size_t  n
 | 
					 | 
				
			||||||
  );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
__attribute__ ((__alias__ ("__aeabi_memclr")))
 | 
					__attribute__((__alias__("__aeabi_memclr")))
 | 
				
			||||||
void
 | 
					void __aeabi_memclr8(void *dest, size_t n);
 | 
				
			||||||
__aeabi_memclr8 (
 | 
					 | 
				
			||||||
  void    *dest,
 | 
					 | 
				
			||||||
  size_t  n
 | 
					 | 
				
			||||||
  );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 
 | 
				
			|||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user