<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>