<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:等线;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:"\@等线";
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        text-align:justify;
        text-justify:inter-ideograph;
        font-size:10.5pt;
        font-family:等线;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"纯文本 字符";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:10.5pt;
        font-family:"Calibri",sans-serif;}
span.a
        {mso-style-name:"纯文本 字符";
        mso-style-priority:99;
        mso-style-link:纯文本;
        font-family:"Calibri",sans-serif;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:等线;}
/* Page Definitions */
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="ZH-CN" link="#0563C1" vlink="#954F72" style="text-justify-trim:punctuation">
<div class="WordSection1">
<p class="MsoPlainText"><span lang="EN-US">Hello:</span></p>
<p class="MsoPlainText"><span lang="EN-US" style="color:black">Does this MpServicesTest app have been merged into master branch?<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US" style="color:black">I could not find it in current GitHub code base.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">Thanks<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">-----</span><span style="font-family:等线">邮件原件</span><span lang="EN-US">-----<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-family:等线">发件人</span><span lang="EN-US">:
<a href="mailto:devel@edk2.groups.io"><span style="color:windowtext;text-decoration:none">devel@edk2.groups.io</span></a> <<a href="mailto:devel@edk2.groups.io"><span style="color:windowtext;text-decoration:none">devel@edk2.groups.io</span></a>>
</span><span style="font-family:等线">代表</span><span lang="EN-US"> Rebecca Cran<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-family:等线">发送时间</span><span lang="EN-US">: 2022</span><span style="font-family:等线;color:#C00000">年</span><span lang="EN-US" style="color:#C00000">9</span><span style="font-family:等线;color:#C00000">月</span><span lang="EN-US" style="color:#C00000">7</span><span style="font-family:等线;color:#C00000">日</span><span lang="EN-US" style="color:#C00000">
 12:03</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-family:等线">收件人</span><span lang="EN-US">:
<a href="mailto:devel@edk2.groups.io"><span style="color:windowtext;text-decoration:none">devel@edk2.groups.io</span></a>;
<a href="mailto:ardb@kernel.org"><span style="color:windowtext;text-decoration:none">ardb@kernel.org</span></a>;
<a href="mailto:quic_llindhol@quicinc.com"><span style="color:windowtext;text-decoration:none">quic_llindhol@quicinc.com</span></a>; Sami Mujawar <<a href="mailto:sami.mujawar@arm.com"><span style="color:windowtext;text-decoration:none">sami.mujawar@arm.com</span></a>>;
 Jian J Wang <<a href="mailto:jian.j.wang@intel.com"><span style="color:windowtext;text-decoration:none">jian.j.wang@intel.com</span></a>>; Liming Gao <<a href="mailto:gaoliming@byosoft.com.cn"><span style="color:windowtext;text-decoration:none">gaoliming@byosoft.com.cn</span></a>><o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-family:等线">抄送</span><span lang="EN-US">: Rebecca Cran <<a href="mailto:rebecca@quicinc.com"><span style="color:windowtext;text-decoration:none">rebecca@quicinc.com</span></a>><o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-family:等线">主题</span><span lang="EN-US">: [edk2-devel] [PATCH v2 2/2] MdeModulePkg: Add new
<span style="background:yellow;mso-highlight:yellow">Application/MpServicesTest</span> application<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">The MpServicesTest application exercises the EFI_MP_SERVICES_PROTOCOL.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">usage:<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">  MpServicesTest -A [-O]<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">  MpServicesTest -T <Timeout><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">  MpServicesTest -S <Processor #><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">  MpServicesTest -P<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">  MpServicesTest -U <Processor #><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">  MpServicesTest -W<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">  MpServicesTest -E <Processor #><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">  MpServicesTest -D <Processor #><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">  MpServicesTest -h<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">Parameter:<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">  -A:  Run all APs.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">  -O:  Run APs sequentially (use with -A).<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">  -T:  Specify timeout in milliseconds. Default is to wait forever.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">  -S:  Specify the single AP to run.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">  -P:  Print processor information.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">  -U:  Set the specified AP to the Unhealthy status (use with -E/-D).<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">  -W:  Run WhoAmI and print index of BSP.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">  -E:  Enable the specified AP.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">  -D:  Disable the specified AP.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">  -h:  Print this help page.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">Signed-off-by: Rebecca Cran <<a href="mailto:rebecca@quicinc.com"><span style="color:windowtext;text-decoration:none">rebecca@quicinc.com</span></a>><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">Reviewed-by: Ard Biesheuvel <<a href="mailto:ardb@kernel.org"><span style="color:windowtext;text-decoration:none">ardb@kernel.org</span></a>><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">---<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">MdeModulePkg/MdeModulePkg.dsc                              |   2 +<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><span style="background:yellow;mso-highlight:yellow">MdeModulePkg/Application/MpServicesTest</span>/MpServicesTest.inf |  40 ++<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">MdeModulePkg/Application/MpServicesTest/Options.h          |  39 ++<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">MdeModulePkg/Application/MpServicesTest/MpServicesTest.c   | 555 ++++++++++++++++++++<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">MdeModulePkg/Application/MpServicesTest/Options.c          | 215 ++++++++<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">5 files changed, 851 insertions(+)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">diff --git a/MdeModulePkg/MdeModulePkg.dsc b/MdeModulePkg/MdeModulePkg.dsc index 45a8ec84ad69..295ff4ddfcd8 100644<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">--- a/MdeModulePkg/MdeModulePkg.dsc<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+++ b/MdeModulePkg/MdeModulePkg.dsc<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">@@ -166,6 +166,7 @@ [LibraryClasses.common.UEFI_APPLICATION]<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">   MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">   DebugLib|MdePkg/Library/UefiDebugLibStdErr/UefiDebugLibStdErr.inf<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">   FileHandleLib|MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  ShellLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"> [LibraryClasses.common.MM_STANDALONE]<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">   HobLib|MdeModulePkg/Library/BaseHobLibNull/BaseHobLibNull.inf<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">@@ -445,6 +446,7 @@ [Components]<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">   MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfoLib.inf<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"> [Components.IA32, Components.X64, Components.AARCH64]<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  MdeModulePkg/Application/MpServicesTest/MpServicesTest.inf<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">   MdeModulePkg/Universal/EbcDxe/EbcDxe.inf<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">   MdeModulePkg/Universal/EbcDxe/EbcDebugger.inf<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">   MdeModulePkg/Universal/EbcDxe/EbcDebuggerConfig.inf<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">diff --git a/MdeModulePkg/Application/MpServicesTest/MpServicesTest.inf b/MdeModulePkg/Application/MpServicesTest/MpServicesTest.inf<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">new file mode 100644<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">index 000000000000..07ee4afec845<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">--- /dev/null<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+++ b/MdeModulePkg/Application/MpServicesTest/MpServicesTest.inf<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">@@ -0,0 +1,40 @@<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+## @file<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+#  UEFI Application to exercise EFI_MP_SERVICES_PROTOCOL.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+#<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+#  Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+reserved.<BR> # #  SPDX-License-Identifier: BSD-2-Clause-Patent # ##<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+[Defines]<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  INF_VERSION                    = 1.29<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  BASE_NAME                      = MpServicesTest<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  FILE_GUID                      = 43e9defa-7209-4b0d-b136-cc4ca02cb469<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  MODULE_TYPE                    = UEFI_APPLICATION<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  VERSION_STRING                 = 0.1<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  ENTRY_POINT                    = UefiMain<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+#<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+# The following information is for reference only and not required by the build tools.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+#<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+#  VALID_ARCHITECTURES           = IA32 X64 AARCH64<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+#<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+[Sources]<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  MpServicesTest.c<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Options.c<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Options.h<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+[Packages]<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  MdePkg/MdePkg.dec<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+[LibraryClasses]<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  BaseLib<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  ShellLib<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  UefiApplicationEntryPoint<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  UefiLib<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+[Protocols]<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  gEfiMpServiceProtocolGuid    ## CONSUMES<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">diff --git a/MdeModulePkg/Application/MpServicesTest/Options.h b/MdeModulePkg/Application/MpServicesTest/Options.h<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">new file mode 100644<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">index 000000000000..cb28230ab095<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">--- /dev/null<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+++ b/MdeModulePkg/Application/MpServicesTest/Options.h<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">@@ -0,0 +1,39 @@<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+/** @file<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Options handling code.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+reserved.<BR><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  SPDX-License-Identifier: BSD-2-Clause-Patent **/<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+#ifndef MPSERVICESTEST_OPTIONS_H_<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+#define MPSERVICESTEST_OPTIONS_H_<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+#define INFINITE_TIMEOUT  0<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+typedef struct {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  UINTN      Timeout;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  UINTN      ProcessorIndex;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  BOOLEAN    RunAllAPs;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  BOOLEAN    RunSingleAP;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  BOOLEAN    DisableProcessor;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  BOOLEAN    EnableProcessor;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  BOOLEAN    SetProcessorHealthy;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  BOOLEAN    SetProcessorUnhealthy;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  BOOLEAN    PrintProcessorInformation;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  BOOLEAN    PrintBspProcessorIndex;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  BOOLEAN    RunAPsSequentially;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+} MP_SERVICES_TEST_OPTIONS;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+/**<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Parses any arguments provided on the command line.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @param Options  The arguments structure.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @return EFI_SUCCESS on success, or an error code.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+**/<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+EFI_STATUS<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+ParseArguments (<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  MP_SERVICES_TEST_OPTIONS  *Options<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  );<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+#endif /* MPSERVICESTEST_OPTIONS_H_ */<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">diff --git a/MdeModulePkg/Application/MpServicesTest/MpServicesTest.c b/MdeModulePkg/Application/MpServicesTest/MpServicesTest.c<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">new file mode 100644<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">index 000000000000..1cea8f52f25d<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">--- /dev/null<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+++ b/MdeModulePkg/Application/MpServicesTest/MpServicesTest.c<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">@@ -0,0 +1,555 @@<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+/** @file<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  UEFI Application to exercise EFI_MP_SERVICES_PROTOCOL.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+reserved.<BR><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  SPDX-License-Identifier: BSD-2-Clause-Patent **/<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+#include <Uefi.h><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+#include <Library/BaseMemoryLib.h><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+#include <Library/DebugLib.h><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+#include <Library/MemoryAllocationLib.h> #include <Library/PrintLib.h>
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+#include <Library/UefiBootServicesTableLib.h><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+#include <Library/UefiLib.h><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+#include <Pi/PiMultiPhase.h><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+#include <Protocol/MpService.h><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+#include "Options.h"<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+#define APFUNC_BUFFER_LEN  256<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+typedef struct {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  EFI_MP_SERVICES_PROTOCOL    *Mp;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  CHAR16                      **Buffer;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+} APFUNC_ARG;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+/** The procedure to run with the MP Services interface.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @param Arg The procedure argument.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+**/<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+STATIC<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+VOID<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+EFIAPI<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+ApFunction (<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  IN OUT VOID  *Arg<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  )<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+{<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  APFUNC_ARG  *Param;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  UINTN       ProcessorId;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  if (Arg != NULL) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    Param = Arg;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    Param->Mp->WhoAmI (Param->Mp, &ProcessorId);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    UnicodeSPrint (Param->Buffer[ProcessorId], APFUNC_BUFFER_LEN,
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+L"Hello from CPU %ld\n", ProcessorId);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+/**<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Fetches the number of processors and which processor is the BSP.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @param Mp  MP Services Protocol.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @param NumProcessors Number of processors.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @param BspIndex      The index of the BSP.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+**/<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+STATIC<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+EFI_STATUS<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+GetProcessorInformation (<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  IN  EFI_MP_SERVICES_PROTOCOL  *Mp,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  OUT UINTN                     *NumProcessors,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  OUT UINTN                     *BspIndex<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  )<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+{<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  EFI_STATUS  Status;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  UINTN       NumEnabledProcessors;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Status = Mp->GetNumberOfProcessors (Mp, NumProcessors,
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+ &NumEnabledProcessors);  if (EFI_ERROR (Status)) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    return Status;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Status = Mp->WhoAmI (Mp, BspIndex);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  if (EFI_ERROR (Status)) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    return Status;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  return EFI_SUCCESS;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+/** Displays information returned from MP Services Protocol.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @param Mp       The MP Services Protocol<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @param BspIndex On return, contains the index of the BSP.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @return The number of CPUs in the system.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+**/<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+STATIC<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+UINTN<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+PrintProcessorInformation (<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  IN   EFI_MP_SERVICES_PROTOCOL  *Mp,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  OUT  UINTN                     *BspIndex<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  )<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+{<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  EFI_STATUS                 Status;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  EFI_PROCESSOR_INFORMATION  CpuInfo;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  UINTN                      Index;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  UINTN                      NumCpu;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  UINTN                      NumEnabledCpu;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Status = Mp->GetNumberOfProcessors (Mp, &NumCpu, &NumEnabledCpu);  if
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+ (EFI_ERROR (Status)) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    Print (L"GetNumberOfProcessors failed: %r\n", Status);  } else {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    Print (L"Number of CPUs: %ld, Enabled: %d\n", NumCpu,
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+ NumEnabledCpu);  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  for (Index = 0; Index < NumCpu; Index++) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    Status = Mp->GetProcessorInfo (Mp, CPU_V2_EXTENDED_TOPOLOGY | Index, &CpuInfo);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    if (EFI_ERROR (Status)) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      Print (L"GetProcessorInfo for Processor %d failed: %r\n", Index, Status);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    } else {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      Print (<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+        L"Processor %d:\n"<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+        L"\tID: %016lx\n"<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+        L"\tStatus: %s | ",<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+        Index,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+        CpuInfo.ProcessorId,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+        (CpuInfo.StatusFlag & PROCESSOR_AS_BSP_BIT) ? L"BSP" : L"AP"<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+        );<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      if ((CpuInfo.StatusFlag & PROCESSOR_AS_BSP_BIT) && (BspIndex != NULL)) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+        *BspIndex = Index;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      Print (L"%s | ", (CpuInfo.StatusFlag & PROCESSOR_ENABLED_BIT) ? L"Enabled" : L"Disabled");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      Print (L"%s\n", (CpuInfo.StatusFlag &<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+ PROCESSOR_HEALTH_STATUS_BIT) ? L"Healthy" : L"Faulted");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      Print (<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+        L"\tLocation: Package %d, Core %d, Thread %d\n"<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+        L"\tExtended Information: Package %d, Module %d, Tile %d, Die %d, Core %d, Thread %d\n\n",<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+        CpuInfo.Location.Package,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+        CpuInfo.Location.Core,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+        CpuInfo.Location.Thread,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+        CpuInfo.ExtendedInformation.Location2.Package,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+        CpuInfo.ExtendedInformation.Location2.Module,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+        CpuInfo.ExtendedInformation.Location2.Tile,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+        CpuInfo.ExtendedInformation.Location2.Die,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+        CpuInfo.ExtendedInformation.Location2.Core,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+        CpuInfo.ExtendedInformation.Location2.Thread<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+        );<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  return NumCpu;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+/** Allocates memory in ApArg for the single AP specified.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @param ApArg          Pointer to the AP argument structure.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @param Mp             The MP Services Protocol.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @param ProcessorIndex The index of the AP.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @retval EFI_SUCCESS          Memory was successfully allocated.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+**/<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+STATIC<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+EFI_STATUS<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+AllocateApFuncBufferSingleAP (<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  IN APFUNC_ARG                *ApArg,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  IN EFI_MP_SERVICES_PROTOCOL  *Mp,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  IN UINTN                     ProcessorIndex<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  )<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+{<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  ApArg->Mp = Mp;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  ApArg->Buffer = AllocateZeroPool ((ProcessorIndex + 1) * sizeof (VOID
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+ *));  if (ApArg->Buffer == NULL) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    Print (L"Failed to allocate buffer for AP buffer\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    return EFI_OUT_OF_RESOURCES;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  ApArg->Buffer[ProcessorIndex] = AllocateZeroPool (APFUNC_BUFFER_LEN);
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+ if (ApArg->Buffer[ProcessorIndex] == NULL) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    Print (L"Failed to allocate buffer for AP buffer\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    FreePool (ApArg->Buffer);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    return EFI_OUT_OF_RESOURCES;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  return EFI_SUCCESS;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+/** Allocates memory in ApArg for all APs.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @param ApArg   Pointer to the AP argument structure.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @param Mp      The MP Services Protocol.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @param NumCpus The number of CPUs.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @retval EFI_SUCCESS          Memory was successfully allocated.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+**/<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+STATIC<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+EFI_STATUS<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+AllocateApFuncBufferAllAPs (<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  IN APFUNC_ARG                *ApArg,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  IN EFI_MP_SERVICES_PROTOCOL  *Mp,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  IN UINTN                     NumCpus<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  )<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+{<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  INT32  Index;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  ApArg->Mp = Mp;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  ApArg->Buffer = AllocateZeroPool (NumCpus * sizeof (VOID *));  if
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+ (ApArg->Buffer == NULL) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    Print (L"Failed to allocate buffer for AP message\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    return EFI_OUT_OF_RESOURCES;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  for (Index = 0; Index < NumCpus; Index++) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    ApArg->Buffer[Index] = AllocateZeroPool (APFUNC_BUFFER_LEN);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    if (ApArg->Buffer[Index] == NULL) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      Print (L"Failed to allocate buffer for AP message\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      for (--Index; Index >= 0; Index++) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+        FreePool (ApArg->Buffer[Index]);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      FreePool (ApArg->Buffer);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      return EFI_OUT_OF_RESOURCES;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  return EFI_SUCCESS;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+/** Frees memory in ApArg for all APs.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @param ApArg   Pointer to the AP argument structure.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @param NumCpus The number of CPUs.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+**/<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+STATIC<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+VOID<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+FreeApFuncBuffer (<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  APFUNC_ARG  *ApArg,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  UINTN       NumCpus<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  )<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+{<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  UINTN  Index;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  for (Index = 0; Index < NumCpus; Index++) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    if (ApArg->Buffer[Index] != NULL) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      FreePool (ApArg->Buffer[Index]);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  FreePool (ApArg->Buffer);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+/** Runs a specified AP.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @param Mp             The MP Services Protocol.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @param ProcessorIndex The processor index.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @param Timeout        Timeout in milliseconds.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @return EFI_SUCCESS on success, or an error code.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+**/<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+STATIC<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+EFI_STATUS<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+StartupThisAP (<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  IN EFI_MP_SERVICES_PROTOCOL  *Mp,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  IN UINTN                     ProcessorIndex,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  IN UINTN                     Timeout<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  )<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+{<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  EFI_STATUS  Status;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  APFUNC_ARG  ApArg;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Status = AllocateApFuncBufferSingleAP (&ApArg, Mp, ProcessorIndex);
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+ if (EFI_ERROR (Status)) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    return Status;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Status = AllocateApFuncBufferSingleAP (&ApArg, Mp, ProcessorIndex);
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+ if (EFI_ERROR (Status)) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    return Status;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Print (<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    L"StartupThisAP on Processor %d with %d%s timeout...",<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    ProcessorIndex,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    Timeout,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    (Timeout == INFINITE_TIMEOUT) ? L" (infinite)" : L"ms"<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    );<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Status = Mp->StartupThisAP (<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                 Mp,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                 ApFunction,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                 ProcessorIndex,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                 NULL,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                 Timeout * 1000,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                 &ApArg,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                 NULL<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                 );<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  if (EFI_ERROR (Status)) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    Print (L"failed: %r\n", Status);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    return Status;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  } else {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    Print (L"done.\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    Print (ApArg.Buffer[ProcessorIndex]);  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  FreeApFuncBuffer (&ApArg, ProcessorIndex + 1);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  return EFI_SUCCESS;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+/** Runs all APs.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @param Mp                 The MP Services Protocol.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @param NumCpus            The number of CPUs in the system.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @param Timeout            Timeout in milliseconds.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @param RunAPsSequentially Run APs sequentially (FALSE: run<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+ simultaneously)<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @return EFI_SUCCESS on success, or an error code.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+**/<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+STATIC<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+EFI_STATUS<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+StartupAllAPs (<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  IN EFI_MP_SERVICES_PROTOCOL  *Mp,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  IN UINTN                     NumCpus,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  IN UINTN                     Timeout,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  IN BOOLEAN                   RunAPsSequentially<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  )<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+{<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  EFI_STATUS  Status;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  UINTN       Index;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  APFUNC_ARG  ApArg;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Status = AllocateApFuncBufferAllAPs (&ApArg, Mp, NumCpus);  if
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+ (EFI_ERROR (Status)) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    return Status;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Print (<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    L"Running with SingleThread TRUE, %d%s timeout...",<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    Timeout,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    (Timeout == INFINITE_TIMEOUT) ? L" (infinite)" : L"ms"<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    );<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Status = Mp->StartupAllAPs (<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                 Mp,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                 ApFunction,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                 RunAPsSequentially,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                 NULL,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                 Timeout * 1000,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                 &ApArg,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                 NULL<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                 );<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  if (EFI_ERROR (Status)) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    Print (L"failed: %r\n", Status);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    return Status;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  } else {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    Print (L"done.\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    for (Index = 0; Index < NumCpus; Index++) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      Print (ApArg.Buffer[Index]);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  FreeApFuncBuffer (&ApArg, NumCpus);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  return EFI_SUCCESS;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+/**<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Enables the specified AP.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @param Mp               The MP Services Protocol.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @param ProcessorIndex   The processor to enable.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @param ProcessorHealthy The health status of the processor.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @return EFI_SUCCESS on success, or an error code.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+**/<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+STATIC<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+EFI_STATUS<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+EnableAP (<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  IN EFI_MP_SERVICES_PROTOCOL  *Mp,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  UINTN                        ProcessorIndex,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  BOOLEAN                      ProcessorHealthy<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  )<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+{<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  EFI_STATUS  Status;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  UINT32      HealthFlag;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  if (ProcessorHealthy) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    Print (L"Enabling Processor %d with HealthFlag healthy...", ProcessorIndex);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    HealthFlag = PROCESSOR_HEALTH_STATUS_BIT;  } else {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    Print (L"Enabling Processor %d with HealthFlag faulted...", ProcessorIndex);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    HealthFlag = 0;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Status = Mp->EnableDisableAP (Mp, ProcessorIndex, TRUE, &HealthFlag);
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+ if (EFI_ERROR (Status)) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    Print (L"failed: %r\n", Status);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    return Status;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  } else {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    Print (L"done.\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  return Status;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+/**<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Disables the specified AP.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @param Mp               The MP Services Protocol.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @param ProcessorIndex   The processor to disable.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @param ProcessorHealthy The health status of the processor.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @return EFI_SUCCESS on success, or an error code.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+**/<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+STATIC<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+EFI_STATUS<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+DisableAP (<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  IN EFI_MP_SERVICES_PROTOCOL  *Mp,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  UINTN                        ProcessorIndex,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  BOOLEAN                      ProcessorHealthy<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  )<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+{<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  EFI_STATUS  Status;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  UINT32      HealthFlag;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  if (ProcessorHealthy) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    Print (L"Disabling Processor %d with HealthFlag healthy...", ProcessorIndex);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    HealthFlag = PROCESSOR_HEALTH_STATUS_BIT;  } else {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    Print (L"Disabling Processor %d with HealthFlag faulted...", ProcessorIndex);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    HealthFlag = 0;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Status = Mp->EnableDisableAP (Mp, ProcessorIndex, FALSE,
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+ &HealthFlag);  if (EFI_ERROR (Status)) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    Print (L"failed: %r\n", Status);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    return Status;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  } else {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    Print (L"done.\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  return Status;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+/**<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  The user Entry Point for Application. The user code starts with this
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+function<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  as the real entry point for the application.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @param[in] ImageHandle    The firmware allocated handle for the EFI image.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @param[in] SystemTable    A pointer to the EFI System Table.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @retval EFI_SUCCESS       The entry point is executed successfully.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @retval other             Some error occurs when executing this entry point.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+**/<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+EFI_STATUS<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+EFIAPI<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+UefiMain (<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  IN EFI_HANDLE        ImageHandle,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  IN EFI_SYSTEM_TABLE  *SystemTable<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  )<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+{<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  EFI_STATUS                Status;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  EFI_MP_SERVICES_PROTOCOL  *Mp;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  UINTN                     BspIndex;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  UINTN                     CpuIndex;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  UINTN                     NumCpus;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  BOOLEAN                   ProcessorHealthy;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  MP_SERVICES_TEST_OPTIONS  Options;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  BspIndex = 0;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Status = gBS->LocateProtocol (<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                  &gEfiMpServiceProtocolGuid,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                  NULL,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                  (VOID **)&Mp<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                  );<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  if (EFI_ERROR (Status)) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    Print (L"Failed to locate EFI_MP_SERVICES_PROTOCOL (%r). Not installed on platform?\n", Status);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    return EFI_NOT_FOUND;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Status = ParseArguments (&Options);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  if (EFI_ERROR (Status)) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    return EFI_INVALID_PARAMETER;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Status = GetProcessorInformation (Mp, &NumCpus, &BspIndex);  if
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+ (EFI_ERROR (Status)) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    Print (L"Error: Failed to fetch processor information.\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    return Status;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  if (Options.PrintBspProcessorIndex) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    Status = Mp->WhoAmI (Mp, &CpuIndex);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    if (EFI_ERROR (Status)) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      Print (L"WhoAmI failed: %r\n", Status);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      return Status;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    } else {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      Print (L"BSP: %016lx\n", CpuIndex);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  if (Options.PrintProcessorInformation) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    NumCpus = PrintProcessorInformation (Mp, &BspIndex);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    if (NumCpus < 2) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      Print (L"Error: Uniprocessor system found.\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      return EFI_INVALID_PARAMETER;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  if (Options.RunSingleAP) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    Status = StartupThisAP (<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+               Mp,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+               Options.ProcessorIndex,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+               Options.Timeout<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+               );<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    if (EFI_ERROR (Status)) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      return Status;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  if (Options.RunAllAPs) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    Status = StartupAllAPs (Mp, NumCpus, Options.Timeout, Options.RunAPsSequentially);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    if (EFI_ERROR (Status)) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      return Status;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  if (Options.EnableProcessor) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    ProcessorHealthy = TRUE;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    if (Options.SetProcessorUnhealthy) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      ProcessorHealthy = FALSE;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    Status = EnableAP (Mp, Options.ProcessorIndex, ProcessorHealthy);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    if (EFI_ERROR (Status)) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      return Status;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  if (Options.DisableProcessor) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    ProcessorHealthy = TRUE;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    if (Options.SetProcessorUnhealthy) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      ProcessorHealthy = FALSE;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    Status = DisableAP (Mp, Options.ProcessorIndex, ProcessorHealthy);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    if (EFI_ERROR (Status)) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      return Status;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  return EFI_SUCCESS;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">diff --git a/MdeModulePkg/Application/MpServicesTest/Options.c b/MdeModulePkg/Application/MpServicesTest/Options.c<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">new file mode 100644<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">index 000000000000..2ea2c94b7c74<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">--- /dev/null<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+++ b/MdeModulePkg/Application/MpServicesTest/Options.c<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">@@ -0,0 +1,215 @@<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+/** @file<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Options handling code.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved.<BR><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Copyright (c) 2010-2019  Finnbarr P. Murphy.   All rights reserved.<BR><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  SPDX-License-Identifier: BSD-2-Clause-Patent **/<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+#include <Uefi.h><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+#include <Library/BaseMemoryLib.h><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+#include <Protocol/ShellParameters.h><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+#include <Library/BaseLib.h><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+#include <Library/UefiLib.h><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+#include <Library/UefiBootServicesTableLib.h><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+#include "Options.h"<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+STATIC UINTN   Argc;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+STATIC CHAR16  **Argv;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+/**<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  This function provides argc and argv.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @return Status<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+**/<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+EFI_STATUS<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+GetArg (<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  VOID<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  )<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+{<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  EFI_STATUS                     Status;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  EFI_SHELL_PARAMETERS_PROTOCOL  *ShellParameters;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Status = gBS->HandleProtocol (<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                  gImageHandle,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                  &gEfiShellParametersProtocolGuid,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                  (VOID **)&ShellParameters<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+                  );<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  if (EFI_ERROR (Status)) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    return Status;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Argc = ShellParameters->Argc;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Argv = ShellParameters->Argv;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  return EFI_SUCCESS;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+/**<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Checks if the character is a decimal digit.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @param Char The character to check.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @return TRUE if the character is a decimal digit.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+**/<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+BOOLEAN<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+IsUnicodeDecimalDigit (<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  CHAR16  Char<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  )<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+{<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  return ((BOOLEAN)(Char >= L'0' && Char <= L'9')); }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+/**<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Converts the string to an integer.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @param String The input string.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @param Value  The converted number.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @return EFI_SUCCESS on success, or an error code.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+**/<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+EFI_STATUS<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+UnicodeStringToInteger (<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  CHAR16  *String,<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  UINTN   *Value<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  )<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+{<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  UINTN  Result;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Result = 0;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  if ((String == NULL) || (StrSize (String) == 0) || (Value == NULL)) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    return (EFI_INVALID_PARAMETER);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  while (IsUnicodeDecimalDigit (*String)) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    if (!(Result <= (DivU64x32 ((((UINT64) ~0) - (*String - L'0')), 10)))) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      return (EFI_DEVICE_ERROR);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    Result = MultU64x32 (Result, 10) + (*String - L'0');<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    String++;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  *Value = Result;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  return (EFI_SUCCESS);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+/**<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Print app usage.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+**/<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+STATIC<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+VOID<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+PrintUsage (<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  VOID<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  )<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+{<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Print (L"MpServicesTest:  usage\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Print (L"  MpServicesTest -A [-O]\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Print (L"  MpServicesTest -T <Timeout>\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Print (L"  MpServicesTest -S <Processor #>\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Print (L"  MpServicesTest -P\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Print (L"  MpServicesTest -U\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Print (L"  MpServicesTest -W\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Print (L"  MpServicesTest -E <Processor #>\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Print (L"  MpServicesTest -D <Processor #>\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Print (L"  MpServicesTest -h\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Print (L"Parameter:\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Print (L"  -A:  Run all APs.\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Print (L"  -O:  Run APs sequentially (use with -A).\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Print (L"  -T:  Specify timeout in milliseconds. Default is to wait
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+forever.\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Print (L"  -S:  Specify the single AP to run.\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Print (L"  -P:  Print processor information.\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Print (L"  -U:  Set the specified AP to the Unhealthy status (use
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+with -E/-D).\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Print (L"  -W:  Run WhoAmI and print index of BSP.\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Print (L"  -E:  Enable the specified AP.\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Print (L"  -D:  Disable the specified AP.\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Print (L"  -h:  Print this help page.\n"); }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+/**<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Parses any arguments provided on the command line.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @param Options  The arguments structure.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  @return EFI_SUCCESS on success, or an error code.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+**/<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+EFI_STATUS<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+ParseArguments (<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  MP_SERVICES_TEST_OPTIONS  *Options<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  )<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+{<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  EFI_STATUS    Status;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  INT32         ArgIndex;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  CONST CHAR16  *Argument;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  BOOLEAN       NeedsValue;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  UINTN         *Value;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  Status = GetArg ();<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  if (EFI_ERROR (Status)) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    Print (L"Please use the UEFI Shell to run this application!\n", Status);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    return Status;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  if (Argc == 1) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    PrintUsage ();<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  ZeroMem (Options, sizeof (MP_SERVICES_TEST_OPTIONS));<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  for (ArgIndex = 1; ArgIndex < Argc; ArgIndex++) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    Argument   = Argv[ArgIndex];<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    NeedsValue = FALSE;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    if (StrCmp (Argument, L"-A") == 0) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      Options->RunAllAPs = TRUE;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    } else if (StrCmp (Argument, L"-O") == 0) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      Options->RunAPsSequentially = TRUE;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    } else if (StrCmp (Argument, L"-T") == 0) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      NeedsValue = TRUE;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      Value      = &Options->Timeout;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    } else if (StrCmp (Argument, L"-S") == 0) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      Options->RunSingleAP = TRUE;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      NeedsValue           = TRUE;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      Value                = &Options->ProcessorIndex;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    } else if (StrCmp (Argument, L"-P") == 0) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      Options->PrintProcessorInformation = TRUE;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    } else if (StrCmp (Argument, L"-U") == 0) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      Options->SetProcessorUnhealthy = TRUE;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    } else if (StrCmp (Argument, L"-W") == 0) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      Options->PrintBspProcessorIndex = TRUE;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    } else if (StrCmp (Argument, L"-E") == 0) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      Options->EnableProcessor = TRUE;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      NeedsValue               = TRUE;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      Value                    = &Options->ProcessorIndex;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    } else if (StrCmp (Argument, L"-D") == 0) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      Options->DisableProcessor = TRUE;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      NeedsValue                = TRUE;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      Value                     = &Options->ProcessorIndex;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    } else {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      PrintUsage ();<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      ZeroMem (Options, sizeof (MP_SERVICES_TEST_OPTIONS));<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      return EFI_SUCCESS;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    if (NeedsValue) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      if ((ArgIndex + 1) < Argc) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+        Status = UnicodeStringToInteger (Argv[ArgIndex + 1], Value);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+        if (EFI_ERROR (Status)) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+          Print (L"Error: option value must be a positive integer.\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+          PrintUsage ();<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+          return EFI_INVALID_PARAMETER;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+        }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+        ArgIndex++;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      } else {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+        PrintUsage ();<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+        return EFI_INVALID_PARAMETER;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+      }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+    }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+  return EFI_SUCCESS;<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">+}<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">--<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US">2.30.2<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-US"><o:p> </o:p></span></p>
</div>
<p></p>
<br>
<br>
<div style="font-size:10pt; line-height:10pt; font-family: '宋体';color:#595959;">保密声明:</div>
<div style="font-size:10pt; line-height:10pt; font-family: '宋体';color:#595959;">本邮件含有保密或专有信息,仅供指定收件人使用。严禁对本邮件或其内容做任何未经授权的查阅、使用、复制或转发。</div>
<div style="font-size:10pt; line-height:10pt; font-family: 'Times New Roman';color:#595959;">
<i>CONFIDENTIAL NOTE: </i></div>
<div style="font-size:10pt; line-height:10pt; font-family: 'Times New Roman';color:#595959;">
<i>This email contains confidential or legally privileged information and is for the sole use of its intended recipient. Any unauthorized review, use, copying or forwarding of this email or the content of this email is strictly prohibited.</i></div>
</body>
</html>


 <div width="1" style="color:white;clear:both">_._,_._,_</div> <hr>   Groups.io Links:<p>   You receive all messages sent to this group.    <p> <a target="_blank" href="https://edk2.groups.io/g/devel/message/97762">View/Reply Online (#97762)</a> |    |  <a target="_blank" href="https://groups.io/mt/95899739/1813853">Mute This Topic</a>  | <a href="https://edk2.groups.io/g/devel/post">New Topic</a><br>    <a href="https://edk2.groups.io/g/devel/editsub/1813853">Your Subscription</a> | <a href="mailto:devel+owner@edk2.groups.io">Contact Group Owner</a> |  <a href="https://edk2.groups.io/g/devel/unsub">Unsubscribe</a>  [edk2-devel-archive@redhat.com]<br> <div width="1" style="color:white;clear:both">_._,_._,_</div>