Date   

Re: [PATCH v3 4/4] MdeModulePkg/SetupBrowserDxe: ASSERT GetBufferForValue(&Value)

Dandan Bi
 

Reviewed-by: Dandan Bi <dandan.bi@intel.com>

Thanks,
Dandan

-----Original Message-----
From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of
Zhang, Shenglei
Sent: Friday, November 1, 2019 2:14 PM
To: devel@edk2.groups.io
Cc: Wang, Jian J <jian.j.wang@intel.com>; Wu, Hao A <hao.a.wu@intel.com>
Subject: [edk2-devel] [PATCH v3 4/4] MdeModulePkg/SetupBrowserDxe:
ASSERT GetBufferForValue(&Value)

Before called by GetBufferForValue(), Value has already been called function
IsTypeInBuffer to make sure the value must be buffer type.
So GetBufferForValue can not return NULL.
This commit adds ASSERT to assume (GetBufferForValue (&Value) is not
NULL.

Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Hao A Wu <hao.a.wu@intel.com>
Signed-off-by: Shenglei Zhang <shenglei.zhang@intel.com>
---

v3: Add ASSERT instead of using error handling.

MdeModulePkg/Universal/SetupBrowserDxe/Expression.c | 3 +++
1 file changed, 3 insertions(+)

diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Expression.c
b/MdeModulePkg/Universal/SetupBrowserDxe/Expression.c
index 7f4929c2fcd9..138912e00823 100644
--- a/MdeModulePkg/Universal/SetupBrowserDxe/Expression.c
+++ b/MdeModulePkg/Universal/SetupBrowserDxe/Expression.c
@@ -1281,7 +1281,10 @@ IfrToUint (
Result->Type = EFI_IFR_TYPE_UNDEFINED;
return EFI_SUCCESS;
}
+
+ ASSERT ((GetBufferForValue (&Value) != NULL);
Result->Value.u64 = *(UINT64*) GetBufferForValue (&Value);
+
if (Value.Type == EFI_IFR_TYPE_BUFFER) {
FreePool (Value.Buffer);
}
--
2.18.0.windows.1



Re: [Patch v3 16/22] ShellPkg: Add YAML file for CI builds

Gao, Zhichao
 

Acked-by: Zhichao Gao <zhichao.gao@intel.com>

-----Original Message-----
From: Kinney, Michael D
Sent: Wednesday, October 30, 2019 3:55 AM
To: devel@edk2.groups.io
Cc: Ni, Ray <ray.ni@intel.com>; Gao, Zhichao <zhichao.gao@intel.com>
Subject: [Patch v3 16/22] ShellPkg: Add YAML file for CI builds

https://bugzilla.tianocore.org/show_bug.cgi?id=2315

Add YAML file to the package directory with the configuration of the checks
to perform during a CI build.

Cc: Ray Ni <ray.ni@intel.com>
Cc: Zhichao Gao <zhichao.gao@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
---
ShellPkg/ShellPkg.ci.yaml | 55
+++++++++++++++++++++++++++++++++++++++
1 file changed, 55 insertions(+)
create mode 100644 ShellPkg/ShellPkg.ci.yaml

diff --git a/ShellPkg/ShellPkg.ci.yaml b/ShellPkg/ShellPkg.ci.yaml new file
mode 100644 index 0000000000..5bf7330c1a
--- /dev/null
+++ b/ShellPkg/ShellPkg.ci.yaml
@@ -0,0 +1,55 @@
+##
+# CI configuration for ShellPkg
+#
+# Copyright (c) Microsoft Corporation
+# SPDX-License-Identifier: BSD-2-Clause-Patent ## {
+ "CompilerPlugin": {
+ "DscPath": "ShellPkg.dsc"
+ },
+ "CharEncodingCheck": {
+ "IgnoreFiles": []
+ },
+ "DependencyCheck": {
+ "AcceptableDependencies": [
+ "MdePkg/MdePkg.dec",
+ "MdeModulePkg/MdeModulePkg.dec",
+ "ShellPkg/ShellPkg.dec",
+ "NetworkPkg/NetworkPkg.dec"
+ ],
+ # For host based unit tests
+ "AcceptableDependencies-HOST_APPLICATION":[],
+ # For UEFI shell based apps
+ "AcceptableDependencies-UEFI_APPLICATION":[],
+ "IgnoreInf": []
+ },
+ "DscCompleteCheck": {
+ "DscPath": "ShellPkg.dsc",
+ "IgnoreInf": [
+ "ShellPkg/Application/ShellCTestApp/ShellCTestApp.inf",
+ "ShellPkg/Application/ShellExecTestApp/SA.inf",
+ "ShellPkg/Application/ShellSortTestApp/ShellSortTestApp.inf"
+ ]
+ },
+ "GuidCheck": {
+ "IgnoreGuidName": [],
+ "IgnoreGuidValue": [],
+ "IgnoreFoldersAndFiles": [],
+ "IgnoreDuplicates": [
+ "Shell=gUefiShellFileGuid", # by design
+ ]
+ },
+ "LibraryClassCheck": {
+ "IgnoreHeaderFile": []
+ },
+
+ ## options defined ci/Plugin/SpellCheck
+ "SpellCheck": {
+ "AuditOnly": True, # Fails test but run in AuditOnly mode to collect
log
+ "IgnoreFiles": [], # use gitignore syntax to ignore errors in matching
files
+ "ExtendWords": [], # words to extend to the dictionary for this
package
+ "IgnoreStandardPaths": [], # Standard Plugin defined paths that should
be ignore
+ "AdditionalIncludePaths": [] # Additional paths to spell check (wildcards
supported)
+ }
+}
--
2.21.0.windows.1


Re: [PATCH 2/2] UefiCpuPkg/MpInitLib: Remove global variable X2ApicEnable

Dong, Eric
 

Reviewed-by: Eric Dong <eric.dong@intel.com>

-----Original Message-----
From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of Ni, Ray
Sent: Wednesday, October 30, 2019 5:53 PM
To: devel@edk2.groups.io
Cc: Dong, Eric <eric.dong@intel.com>; Laszlo Ersek <lersek@redhat.com>
Subject: [edk2-devel] [PATCH 2/2] UefiCpuPkg/MpInitLib: Remove global variable X2ApicEnable

MpInitLib sets X2ApicEnable in two places.
1. CollectProcessorCount()
This function is called when MpInitLibInitialize() hasn't been
called before.
It sets X2ApicEnable and later in the same function it configures
all CPUs to operate in X2 APIC mode.
2. MpInitLibInitialize()
The X2ApicEnable setting happens when this function is called in
second time. But after that setting, no code consumes that flag.

With the above analysis and with the purpose of simplifying the code, the X2ApicEnable in #1 is changed to local variable and the #2 can be changed to remove the setting of X2ApicEnable.

Signed-off-by: Ray Ni <ray.ni@intel.com>
Cc: Eric Dong <eric.dong@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
---
UefiCpuPkg/Library/MpInitLib/MpLib.c | 14 ++++++-------- UefiCpuPkg/Library/MpInitLib/MpLib.h | 1 -
2 files changed, 6 insertions(+), 9 deletions(-)

diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpInitLib/MpLib.c
index 8f62a8d965..49be5d5385 100644
--- a/UefiCpuPkg/Library/MpInitLib/MpLib.c
+++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c
@@ -459,12 +459,12 @@ CollectProcessorCount ( {
UINTN Index;
CPU_INFO_IN_HOB *CpuInfoInHob;
+ BOOLEAN X2Apic;

//
// Send 1st broadcast IPI to APs to wakeup APs
//
- CpuMpData->InitFlag = ApInitConfig;
- CpuMpData->X2ApicEnable = FALSE;
+ CpuMpData->InitFlag = ApInitConfig;
WakeUpAP (CpuMpData, TRUE, 0, NULL, NULL, TRUE);
CpuMpData->InitFlag = ApInitDone;
ASSERT (CpuMpData->CpuCount <= PcdGet32 (PcdCpuMaxLogicalProcessorNumber));
@@ -481,22 +481,23 @@ CollectProcessorCount (
// 1. Number of CPU is greater than 255; or
// 2. There are any logical processors reporting an Initial APIC ID of 255 or greater.
//
+ X2Apic = FALSE;
if (CpuMpData->CpuCount > 255) {
//
// If there are more than 255 processor found, force to enable X2APIC
//
- CpuMpData->X2ApicEnable = TRUE;
+ X2Apic = TRUE;
} else {
CpuInfoInHob = (CPU_INFO_IN_HOB *) (UINTN) CpuMpData->CpuInfoInHob;
for (Index = 0; Index < CpuMpData->CpuCount; Index++) {
if (CpuInfoInHob[Index].InitialApicId >= 0xFF) {
- CpuMpData->X2ApicEnable = TRUE;
+ X2Apic = TRUE;
break;
}
}
}

- if (CpuMpData->X2ApicEnable) {
+ if (X2Apic) {
DEBUG ((DEBUG_INFO, "Force x2APIC mode!\n"));
//
// Wakeup all APs to enable x2APIC mode @@ -1780,9 +1781,6 @@ MpInitLibInitialize (
CpuInfoInHob = (CPU_INFO_IN_HOB *) (UINTN) CpuMpData->CpuInfoInHob;
for (Index = 0; Index < CpuMpData->CpuCount; Index++) {
InitializeSpinLock(&CpuMpData->CpuData[Index].ApLock);
- if (CpuInfoInHob[Index].InitialApicId >= 255 || Index > 254) {
- CpuMpData->X2ApicEnable = TRUE;
- }
CpuMpData->CpuData[Index].CpuHealthy = (CpuInfoInHob[Index].Health == 0)? TRUE:FALSE;
CpuMpData->CpuData[Index].ApFunction = 0;
CopyMem (&CpuMpData->CpuData[Index].VolatileRegisters, &VolatileRegisters, sizeof (CPU_VOLATILE_REGISTERS)); diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.h b/UefiCpuPkg/Library/MpInitLib/MpLib.h
index 107872b367..8fa07b12c5 100644
--- a/UefiCpuPkg/Library/MpInitLib/MpLib.h
+++ b/UefiCpuPkg/Library/MpInitLib/MpLib.h
@@ -227,7 +227,6 @@ struct _CPU_MP_DATA {
UINTN **FailedCpuList;

AP_INIT_STATE InitFlag;
- BOOLEAN X2ApicEnable;
BOOLEAN SwitchBspFlag;
UINTN NewBspNumber;
CPU_EXCHANGE_ROLE_INFO BSPInfo;
--
2.21.0.windows.1


Re: [PATCH 1/2] UefiCpuPkg/MpInitLib: Set X2ApicEnable flag from BSP

Dong, Eric
 

Reviewed-by: Eric Dong <eric.dong@intel.com>

-----Original Message-----
From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of Ni, Ray
Sent: Wednesday, October 30, 2019 5:53 PM
To: devel@edk2.groups.io
Cc: Dong, Eric <eric.dong@intel.com>; Laszlo Ersek <lersek@redhat.com>
Subject: [edk2-devel] [PATCH 1/2] UefiCpuPkg/MpInitLib: Set X2ApicEnable flag from BSP

Today's logic sets X2ApicEnable flag in each AP's initialization path when InitFlag == ApInitConfig.
Since all CPUs update the same global data, a spin-lock is used to avoid modifications from multiple CPUs happen at the same time.
The spin-lock causes two problems:
1. Potential performance downgrade.
2. Undefined behavior when improper timer lib is used.
For example we saw certain platforms used AcpiTimerLib from
PcAtChipsetPkg and that library depends on retrieving PeiServices
from idtr. But in fact AP's (idtr - 4) doesn't point to
PeiServices.

The patch simplifies the code to let BSP set the X2ApicEnable flag so the spin-lock acquisition from AP is not needed any more.

Signed-off-by: Ray Ni <ray.ni@intel.com>
Cc: Eric Dong <eric.dong@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
---
UefiCpuPkg/Library/MpInitLib/MpLib.c | 25 ++++++++++++++++---------
1 file changed, 16 insertions(+), 9 deletions(-)

diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpInitLib/MpLib.c
index 622b70ca3c..8f62a8d965 100644
--- a/UefiCpuPkg/Library/MpInitLib/MpLib.c
+++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c
@@ -458,6 +458,7 @@ CollectProcessorCount (
)
{
UINTN Index;
+ CPU_INFO_IN_HOB *CpuInfoInHob;

//
// Send 1st broadcast IPI to APs to wakeup APs @@ -474,12 +475,27 @@ CollectProcessorCount (
CpuPause ();
}

+
+ //
+ // Enable x2APIC mode if
+ // 1. Number of CPU is greater than 255; or // 2. There are any
+ logical processors reporting an Initial APIC ID of 255 or greater.
+ //
if (CpuMpData->CpuCount > 255) {
//
// If there are more than 255 processor found, force to enable X2APIC
//
CpuMpData->X2ApicEnable = TRUE;
+ } else {
+ CpuInfoInHob = (CPU_INFO_IN_HOB *) (UINTN) CpuMpData->CpuInfoInHob;
+ for (Index = 0; Index < CpuMpData->CpuCount; Index++) {
+ if (CpuInfoInHob[Index].InitialApicId >= 0xFF) {
+ CpuMpData->X2ApicEnable = TRUE;
+ break;
+ }
+ }
}
+
if (CpuMpData->X2ApicEnable) {
DEBUG ((DEBUG_INFO, "Force x2APIC mode!\n"));
//
@@ -541,15 +557,6 @@ InitializeApData (

CpuMpData->CpuData[ProcessorNumber].Waiting = FALSE;
CpuMpData->CpuData[ProcessorNumber].CpuHealthy = (BistData == 0) ? TRUE : FALSE;
- if (CpuInfoInHob[ProcessorNumber].InitialApicId >= 0xFF) {
- //
- // Set x2APIC mode if there are any logical processor reporting
- // an Initial APIC ID of 255 or greater.
- //
- AcquireSpinLock(&CpuMpData->MpLock);
- CpuMpData->X2ApicEnable = TRUE;
- ReleaseSpinLock(&CpuMpData->MpLock);
- }

InitializeSpinLock(&CpuMpData->CpuData[ProcessorNumber].ApLock);
SetApState (&CpuMpData->CpuData[ProcessorNumber], CpuStateIdle);
--
2.21.0.windows.1


Re: [PATCH v4] CryptoPkg: Upgrade OpenSSL to 1.1.1d

Wang, Jian J
 

Laszlo,

Thank you for the tests. I also tried secure boot (linux, windows) on both OVMF and
Intel platform. All work well.

Regards,
Jian

-----Original Message-----
From: Laszlo Ersek <lersek@redhat.com>
Sent: Tuesday, November 05, 2019 1:45 AM
To: devel@edk2.groups.io; Zhang, Shenglei <shenglei.zhang@intel.com>
Cc: Wang, Jian J <jian.j.wang@intel.com>; Lu, XiaoyuX <xiaoyux.lu@intel.com>;
Gao, Liming <liming.gao@intel.com>
Subject: Re: [edk2-devel] [PATCH v4] CryptoPkg: Upgrade OpenSSL to 1.1.1d

On 11/04/19 17:04, Laszlo Ersek wrote:
On 11/01/19 07:55, Zhang, Shenglei wrote:
Update openssl from 1.1.1b to 1.1.1d.
Something needs to be noticed is that, there is a bug existing in the
released 1_1_1d version(894da2fb7ed5d314ee5c2fc9fd2d9b8b74111596),
which causes build failure. So we switch the code base to a usable
version, which is 2 commits later than the stable tag.
Now we use the version c3656cc594daac8167721dde7220f0e59ae146fc.
This log is to fix the build failure.
https://bugzilla.tianocore.org/show_bug.cgi?id=2226

Besides, the absense of "DSO_NONE" in dso_conf.h causes build failure
in OvmfPkg. So update process_files.pl to generate information from
"crypto/include/internal/dso_conf.h.in".

shm.h and utsname.h are added to avoid GCC build failure.

Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Xiaoyu Lu <xiaoyux.lu@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Signed-off-by: Shenglei Zhang <shenglei.zhang@intel.com>
---
v2: Revert the changes in OpensslLib.inf and OpensslLibCrypto.inf.
The removed header files could be auto-generated by process_files.pl now.

v3: Add display information for dso_conf.h.

v4: Add shm.h and utsname.h to avoid GCC build failure.

CryptoPkg/Library/Include/internal/dso_conf.h | 16 ++++++++++++++++
CryptoPkg/Library/Include/sys/shm.h | 9 +++++++++
CryptoPkg/Library/Include/sys/utsname.h | 10 ++++++++++
CryptoPkg/Library/OpensslLib/openssl | 2 +-
CryptoPkg/Library/OpensslLib/process_files.pl | 15 ++++++++++++++-
5 files changed, 50 insertions(+), 2 deletions(-)
create mode 100644 CryptoPkg/Library/Include/sys/shm.h
create mode 100644 CryptoPkg/Library/Include/sys/utsname.h

diff --git a/CryptoPkg/Library/Include/internal/dso_conf.h
b/CryptoPkg/Library/Include/internal/dso_conf.h
index e69de29bb2d1..43c891588bc2 100644
--- a/CryptoPkg/Library/Include/internal/dso_conf.h
+++ b/CryptoPkg/Library/Include/internal/dso_conf.h
@@ -0,0 +1,16 @@
+/* WARNING: do not edit! */
+/* Generated from crypto/include/internal/dso_conf.h.in */
+/*
+ * Copyright 2016-2019 The OpenSSL Project Authors. All Rights Reserved.
+ *
+ * Licensed under the OpenSSL license (the "License"). You may not use
+ * this file except in compliance with the License. You can obtain a copy
+ * in the file LICENSE in the source distribution or at
+ * https://www.openssl.org/source/license.html
+ */
+
+#ifndef HEADER_DSO_CONF_H
+# define HEADER_DSO_CONF_H
+# define DSO_NONE
+# define DSO_EXTENSION ".so"
+#endif
diff --git a/CryptoPkg/Library/Include/sys/shm.h
b/CryptoPkg/Library/Include/sys/shm.h
new file mode 100644
index 000000000000..dc0b8e81c8b0
--- /dev/null
+++ b/CryptoPkg/Library/Include/sys/shm.h
@@ -0,0 +1,9 @@
+/** @file
+ Include file to support building the third-party cryptographic library.
+
+Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <CrtLibSupport.h>
diff --git a/CryptoPkg/Library/Include/sys/utsname.h
b/CryptoPkg/Library/Include/sys/utsname.h
new file mode 100644
index 000000000000..75955b0a4eb6
--- /dev/null
+++ b/CryptoPkg/Library/Include/sys/utsname.h
@@ -0,0 +1,10 @@
+/** @file
+ Include file to support building the third-party cryptographic library.
+
+Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <CrtLibSupport.h>
+
(1) The trailing empty line should be removed.

diff --git a/CryptoPkg/Library/OpensslLib/openssl
b/CryptoPkg/Library/OpensslLib/openssl
index 50eaac9f3337..c3656cc594da 160000
--- a/CryptoPkg/Library/OpensslLib/openssl
+++ b/CryptoPkg/Library/OpensslLib/openssl
@@ -1 +1 @@
-Subproject commit 50eaac9f3337667259de725451f201e784599687
+Subproject commit c3656cc594daac8167721dde7220f0e59ae146fc
diff --git a/CryptoPkg/Library/OpensslLib/process_files.pl
b/CryptoPkg/Library/OpensslLib/process_files.pl
index 4fe54cd808a5..dd93bd84da22 100755
--- a/CryptoPkg/Library/OpensslLib/process_files.pl
+++ b/CryptoPkg/Library/OpensslLib/process_files.pl
@@ -106,6 +106,14 @@ BEGIN {
) == 0 ||
die "Failed to generate opensslconf.h!\n";

+ # Generate dso_conf.h per config data
+ system(
+ "perl -I. -Mconfigdata util/dofile.pl " .
+ "crypto/include/internal/dso_conf.h.in " .
+ "> include/internal/dso_conf.h"
+ ) == 0 ||
+ die "Failed to generate dso_conf.h!\n";
+
chdir($basedir) ||
die "Cannot change to base directory \"" . $basedir . "\"";

@@ -249,12 +257,17 @@ rename( $new_inf_file, $inf_file ) ||
print "Done!";

#
-# Copy opensslconf.h generated from OpenSSL Configuration
+# Copy opensslconf.h and dso_conf.h generated from OpenSSL
Configuration
#
print "\n--> Duplicating opensslconf.h into Include/openssl ... ";
copy($OPENSSL_PATH . "/include/openssl/opensslconf.h",
$OPENSSL_PATH . "/../../Include/openssl/") ||
die "Cannot copy opensslconf.h!";
+print "Done!";
+print "\n--> Duplicating dso_conf.h into Include/internal ... ";
+copy($OPENSSL_PATH . "/include/internal/dso_conf.h",
+ $OPENSSL_PATH . "/../../Include/internal/") ||
+ die "Cannot copy dso_conf.h!";
print "Done!\n";

print "\nProcessing Files Done!\n";
(2) The comment block at the top of the script has not been extended:

# This script runs the OpenSSL Configure script, then processes the
# resulting file list into our local OpensslLib[Crypto].inf and also
# takes a copy of opensslconf.h.

It only refers to "opensslconf.h". For consistency, we should update
that comment block too, with "dso_conf.h".

With (1) and (2) fixed:

Reviewed-by: Laszlo Ersek <lersek@redhat.com>

I'll follow up with test results soon.
* Simple tests for Secure Boot:

- booting a VM with SB already enabled -> continues booting, and reports
SB enabled

- delete PK in UiApp manually + reboot; check from VM

- re-enroll using EnrollDefaultKeys.efi + reboot; check from VM

- with SB enabled, check rejection using an unsigned UEFI ISO -->
"DxeImageVerificationLib: Image is not signed and SHA256 hash of image
is not found in DB/DBX."

So this looks good.

* HTTPS boot:

- reused two of my earlier server certificates: DNS domain name in
subject Common Name, IP address in subject Alternative Name, and DNS
domain name resolves to IPv4 address (cert#1) vs. IPv6 address (cert#2)

- ran four HTTPS Boot tests in total: { DHCP presents URL with IP
address, DHCP presents URL with DNS domain name } x { IPv4, IPv6 }.

All worked fine.

Tested-by: Laszlo Ersek <lersek@redhat.com>

Thanks!
Laszlo


Re: [edk2-platforms] [PATCH 3/5] BoardModulePkg: Added Pcds Sio Driver

Kubacki, Michael A
 

Please fix style formatting, especially in this function:

/**
Gets the number of devices in Table of SIO Controllers mDeviceInfo

@retval Number of enabled devices in Table of SIO Controllers.
**/
UINTN
EFIAPI
GetDeviceCount(
VOID
){
UINTN Count;
Count = ARRAY_SIZE(mDeviceInfo) - 1; // -1 to account for for the end device info
return Count;
}

This patch contains a change in SimicsOpenBoardPkg, as I suggested in the reply to the cover
letter, I believe that is better in a separate patch.

Thanks,
Michael

-----Original Message-----
From: Agyeman, Prince <prince.agyeman@intel.com>
Sent: Friday, November 1, 2019 12:51 PM
To: devel@edk2.groups.io
Cc: Kubacki, Michael A <michael.a.kubacki@intel.com>; Chiu, Chasel
<chasel.chiu@intel.com>; Desimone, Nathaniel L
<nathaniel.l.desimone@intel.com>
Subject: [edk2-platforms] [PATCH 3/5] BoardModulePkg: Added Pcds Sio
Driver

Included PCDs to the Sio dxe driver,
to allow the enable/disable of Ps2 keyboard/mouse,
UART1 and UART2 com ports.

Renamed the Sio driver's base name

Cc: Michael Kubacki <michael.a.kubacki@intel.com>
Cc: Chasel Chiu <chasel.chiu@intel.com>
Cc: Nate DeSimone <nathaniel.l.desimone@intel.com>

Signed-off-by: Prince Agyeman <prince.agyeman@intel.com>
---
.../LegacySioDxe/LegacySioDxe.inf | 15 +++-
.../BoardModulePkg/LegacySioDxe/SioChip.c | 69 +++++++++++++++++--
.../BoardModulePkg/LegacySioDxe/SioChip.h | 10 +++
.../BoardModulePkg/LegacySioDxe/SioDriver.c | 42 ++++++++++-
.../BoardX58Ich10/OpenBoardPkgPcd.dsc | 6 ++
5 files changed, 133 insertions(+), 9 deletions(-)

diff --git a/Platform/Intel/BoardModulePkg/LegacySioDxe/LegacySioDxe.inf
b/Platform/Intel/BoardModulePkg/LegacySioDxe/LegacySioDxe.inf
index d606ba43dc..4ab01a6098 100644
--- a/Platform/Intel/BoardModulePkg/LegacySioDxe/LegacySioDxe.inf
+++ b/Platform/Intel/BoardModulePkg/LegacySioDxe/LegacySioDxe.inf
@@ -10,7 +10,7 @@

[Defines]
INF_VERSION = 0x00010017
- BASE_NAME = HitachiH8s2113Dxe
+ BASE_NAME = LegacySioDxe
FILE_GUID = 7807E404-8281-4FF1-8457-0B54BABE263F
VERSION_STRING = 1.0
MODULE_TYPE = UEFI_DRIVER
@@ -34,6 +34,7 @@
[Packages]
MdePkg/MdePkg.dec
MdeModulePkg/MdeModulePkg.dec
+ BoardModulePkg/BoardModulePkg.dec

[Sources]
SioChip.c
@@ -44,6 +45,18 @@
SioDriver.h
ComponentName.c

+[Pcd]
+ gBoardModulePkgTokenSpaceGuid.PcdPs2KbMsEnable
+ gBoardModulePkgTokenSpaceGuid.PcdUart1Enable
+ gBoardModulePkgTokenSpaceGuid.PcdUart1IrqMask
+ gBoardModulePkgTokenSpaceGuid.PcdUart1IoPort
+ gBoardModulePkgTokenSpaceGuid.PcdUart1Length
+ gBoardModulePkgTokenSpaceGuid.PcdUart2Enable
+ gBoardModulePkgTokenSpaceGuid.PcdUart2IrqMask
+ gBoardModulePkgTokenSpaceGuid.PcdUart2IoPort
+ gBoardModulePkgTokenSpaceGuid.PcdUart2Length
+ gBoardModulePkgTokenSpaceGuid.PcdSuperIoPciIsaBridgeDevice
+
[Protocols]
gEfiPciIoProtocolGuid ## CONSUMES
gEfiDevicePathProtocolGuid ## PRODUCES
diff --git a/Platform/Intel/BoardModulePkg/LegacySioDxe/SioChip.c
b/Platform/Intel/BoardModulePkg/LegacySioDxe/SioChip.c
index 81efe3c38b..09403a7354 100644
--- a/Platform/Intel/BoardModulePkg/LegacySioDxe/SioChip.c
+++ b/Platform/Intel/BoardModulePkg/LegacySioDxe/SioChip.c
@@ -19,12 +19,31 @@
ACPI_SIO_RESOURCES_IO_IRQ mCom1Resources = {
{
{ ACPI_FIXED_LOCATION_IO_PORT_DESCRIPTOR },
- 0x3f8,
- 8
+ FixedPcdGet16 (PcdUart1IoPort),
+ FixedPcdGet8 (PcdUart1Length)
+ },
+ {
+ { ACPI_IRQ_NOFLAG_DESCRIPTOR },
+ FixedPcdGet16 (PcdUart1IrqMask)
+ },
+ {
+ ACPI_END_TAG_DESCRIPTOR,
+ 0
+ }
+};
+
+//
+// COM 2 UART Controller
+//
+ACPI_SIO_RESOURCES_IO_IRQ mCom2Resources = {
+ {
+ { ACPI_FIXED_LOCATION_IO_PORT_DESCRIPTOR },
+ FixedPcdGet16 (PcdUart2IoPort),
+ FixedPcdGet8 (PcdUart2Length)
},
{
{ ACPI_IRQ_NOFLAG_DESCRIPTOR },
- BIT4 // IRQ4
+ FixedPcdGet16 (PcdUart2IrqMask),
},
{
ACPI_END_TAG_DESCRIPTOR,
@@ -70,10 +89,12 @@ ACPI_SIO_RESOURCES_IO_IRQ mMouseResources
= {
}
};

+
//
// Table of SIO Controllers
//
DEVICE_INFO mDeviceInfo[] = {
+#if FixedPcdGet8 (PcdUart1Enable) == DEVICE_ENABLED
{
{
EISA_PNP_ID(0x501),
@@ -84,6 +105,20 @@ DEVICE_INFO mDeviceInfo[] = {
{ (ACPI_SMALL_RESOURCE_HEADER *) &mCom1Resources },
{ (ACPI_SMALL_RESOURCE_HEADER *) &mCom1Resources }
}, // COM 1 UART Controller
+#endif
+#if FixedPcdGet8 (PcdUart2Enable) == DEVICE_ENABLED
+ {
+ {
+ EISA_PNP_ID(0x501),
+ 0
+ },
+ 0,
+ RESOURCE_IO | RESOURCE_IRQ,
+ { (ACPI_SMALL_RESOURCE_HEADER *) &mCom2Resources },
+ { (ACPI_SMALL_RESOURCE_HEADER *) &mCom2Resources }
+ }, // COM 2 UART Controller
+#endif
+#if FixedPcdGet8 (PcdPs2KbMsEnable) == DEVICE_ENABLED
{
{
EISA_PNP_ID(0x303),
@@ -103,10 +138,28 @@ DEVICE_INFO mDeviceInfo[] = {
0, // Cannot change resource
{ (ACPI_SMALL_RESOURCE_HEADER *) &mMouseResources },
{ (ACPI_SMALL_RESOURCE_HEADER *) &mMouseResources }
- } // PS/2 Mouse Controller
+ }, // PS/2 Mouse Controller
+#endif
+ DEVICE_INFO_END
};


+
+/**
+ Gets the number of devices in Table of SIO Controllers mDeviceInfo
+
+ @retval Number of enabled devices in Table of SIO Controllers.
+**/
+UINTN
+EFIAPI
+GetDeviceCount(
+ VOID
+){
+ UINTN Count;
+ Count = ARRAY_SIZE(mDeviceInfo) - 1; // -1 to account for for the end
device info
+ return Count;
+}
+
/**
Return the supported devices.

@@ -128,7 +181,7 @@ DeviceGetList (
//
// Allocate enough memory for simplicity
//
- DeviceCount = sizeof (mDeviceInfo) / sizeof (mDeviceInfo[0]);
+ DeviceCount = GetDeviceCount();
LocalDevices = AllocatePool (sizeof (EFI_SIO_ACPI_DEVICE_ID) *
DeviceCount);
ASSERT (LocalDevices != NULL);
if (LocalDevices == NULL) {
@@ -157,7 +210,6 @@ SioInit (
VOID
)
{
-
return EFI_SUCCESS;
}

@@ -175,8 +227,11 @@ DeviceSearch (
)
{
UINTN Index;
+ UINTN DeviceCount;
+
+ DeviceCount = GetDeviceCount();

- for (Index = 0; Index < sizeof (mDeviceInfo) / sizeof (mDeviceInfo[0]);
Index++) {
+ for (Index = 0; Index < DeviceCount; Index++) {
if (CompareMem (Device, &mDeviceInfo[Index].Device, sizeof (*Device))
== 0) {
return &mDeviceInfo[Index];
}
diff --git a/Platform/Intel/BoardModulePkg/LegacySioDxe/SioChip.h
b/Platform/Intel/BoardModulePkg/LegacySioDxe/SioChip.h
index 9322365923..8bd53ccdd6 100644
--- a/Platform/Intel/BoardModulePkg/LegacySioDxe/SioChip.h
+++ b/Platform/Intel/BoardModulePkg/LegacySioDxe/SioChip.h
@@ -24,6 +24,9 @@ UINT8
#define RESOURCE_DMA BIT2
#define RESOURCE_MEM BIT3

+#define DEVICE_ENABLED 0x01
+#define DEVICE_INFO_END { { 0xFFFFFFFF, 0xFFFFFFFF } }
+
#pragma pack(1)

typedef struct {
@@ -46,6 +49,13 @@ typedef struct {
ACPI_RESOURCE_HEADER_PTR PossibleResources;
} DEVICE_INFO;

+typedef struct {
+ UINT8 Segment;
+ UINT8 Bus;
+ UINT8 Device;
+ UINT8 Funtion;
+} SIO_PCI_ISA_BRIDGE_DEVICE_INFO;
+
/**
Return the supported devices.

diff --git a/Platform/Intel/BoardModulePkg/LegacySioDxe/SioDriver.c
b/Platform/Intel/BoardModulePkg/LegacySioDxe/SioDriver.c
index 408c6ff301..5ab9109ad9 100644
--- a/Platform/Intel/BoardModulePkg/LegacySioDxe/SioDriver.c
+++ b/Platform/Intel/BoardModulePkg/LegacySioDxe/SioDriver.c
@@ -8,7 +8,6 @@

#include "SioDriver.h"

-
//
// This driver is for ACPI(PNP0A03,0)/PCI(0x1f,0) // @@ -106,6 +105,27 @@
SioDriverEntryPoint ( }


+/**
+ Compares a PCI to ISA bridge device segment, bus, device and function
+to the
+ PcdSuperIoPciIsaBridgeDevice values.
+
+ @param[in] CurrentDevice The device to be compared with the
PcdSuperIoPciIsaBridgeDevice information
+ @retval TRUE This device matches PcdSuperIoPciIsaBridgeDevice
values
+ @retval FALSE This device does not match the
PcdSuperIoPciIsaBridgeDevice values
+**/
+BOOLEAN
+EFIAPI
+SioDeviceEnabled (
+ IN SIO_PCI_ISA_BRIDGE_DEVICE_INFO *CurrentDevice ){
+ SIO_PCI_ISA_BRIDGE_DEVICE_INFO *Device = \
+ (SIO_PCI_ISA_BRIDGE_DEVICE_INFO *) FixedPcdGetPtr
(PcdSuperIoPciIsaBridgeDevice);
+ if(CompareMem (Device, CurrentDevice, sizeof
(SIO_PCI_ISA_BRIDGE_DEVICE_INFO)) == 0) {
+ return TRUE;
+ }
+ return FALSE;
+}
+
/**
Test to see if this driver supports Controller Handle.

@@ -138,6 +158,7 @@ SioDriverSupported (
UINTN BusNumber;
UINTN DeviceNumber;
UINTN FunctionNumber;
+ SIO_PCI_ISA_BRIDGE_DEVICE_INFO SioDevice;

//
// If RemainingDevicePath is not NULL, it should verify that the first device
@@ -250,6 +271,25 @@ SioDriverSupported (
Status = EFI_UNSUPPORTED;
}
}
+
+ if(!EFI_ERROR (Status)) {
+ Status = PciIo->GetLocation (
+ PciIo,
+ &SegmentNumber,
+ &BusNumber,
+ &DeviceNumber,
+ &FunctionNumber
+ );
+ if(!EFI_ERROR (Status)) {
+ SioDevice.Segment = (UINT8) SegmentNumber;
+ SioDevice.Bus = (UINT8) BusNumber;
+ SioDevice.Device = (UINT8) DeviceNumber;
+ SioDevice.Funtion = (UINT8) FunctionNumber;
+ if(!SioDeviceEnabled (&SioDevice)) {
+ Status = EFI_UNSUPPORTED;
+ }
+ }
+ }
}
}

diff --git
a/Platform/Intel/SimicsOpenBoardPkg/BoardX58Ich10/OpenBoardPkgPcd.ds
c
b/Platform/Intel/SimicsOpenBoardPkg/BoardX58Ich10/OpenBoardPkgPcd.ds
c
index 0298e4b12d..b85991b772 100644
---
a/Platform/Intel/SimicsOpenBoardPkg/BoardX58Ich10/OpenBoardPkgPcd.ds
c
+++
b/Platform/Intel/SimicsOpenBoardPkg/BoardX58Ich10/OpenBoardPkgPcd.ds
+++ c
@@ -196,6 +196,12 @@
gMinPlatformPkgTokenSpaceGuid.PcdMaxCpuThreadCount|4
gMinPlatformPkgTokenSpaceGuid.PcdPcIoApicAddressBase|0xFEC01000

+ ######################################
+ # Board Configuration
+ ######################################
+ gBoardModulePkgTokenSpaceGuid.PcdPs2KbMsEnable|1
+
+
gBoardModulePkgTokenSpaceGuid.PcdSuperIoPciIsaBridgeDevice|{0x00,0x0
0,
+ 0x1F,0x00}
+
[PcdsFixedAtBuild.X64]
######################################
# Edk2 Configuration
--
2.19.1.windows.1


Re: [edk2-platforms] [PATCH 0/5] Enable Ps2 keyboard

Kubacki, Michael A
 

Hi Prince,

There's some high-level changes I suggest to the patch series:
1. This patch series mixes changes across packages in single patches
which should be avoided.

2. Some of the patches include unrelated changes that would make git
revert difficult.
2.a. Example: In patch #1, one change is to add
gBoardModulePkgTokenSpaceGuid. This is a pre-requisite for
adding the PCDs to BoardModulePkg.dec but still an isolated
change. If someone were to add more commits in the future
that rely upon gBoardModulePkgTokenSpaceGuid and then wanted
to revert the PS/2 keyboard change it would be difficult due to
the coupling.
2.b. Example: In patch #3, a change is made that affects all
driver consumers in BoardModulePkg/LegacySioDxe but the commit
includes changes for enabling the driver in SimicsOpenBoardPkg.
The change to enable PS/2 keyboard/mouse in SimicsOpenBoardPkg
could not easily be reverted without affecting the overall driver.

3. The order of changes leaves some earlier commits incomplete.
3.a. For example, patch #1 exposes a PCD interface in BoardModulePkg
that is effectively not used until later patches so using the
PCDs at that point in the commit log would be misleading.

As far as I can tell, there's a high-level order to do the following:
1. Define gBoardModulePkgTokenSpaceGuid in BoardModulePkg.dec
2. Remove the LegacySioDxe driver from SimicsOpenBoardPkg
3. Add the LegacySioDxe driver to BoardModulePkg
4. Add new PCDs to BoardModulePkg for usage with LegacySioDxe
5. Update relevant boards in KabylakeOpenBoardPkg to use the LegacySioDxe
driver and PCDs from BoardModulePkg, remove the now redundant PCD
gKabylakeOpenBoardPkgTokenSpaceGuid.PcdPs2KbMsEnable in
KabylakeOpenBoardPkg/OpenBoardPkg.dec, configure the relevant PCDs
in BoardModulePkg in the board DSC files to properly use the
LegacySioDxe driver.
6. Add the Ps2KbcLib changes in KabylakeOpenBoardPkg as currently done
in V1 patches #4 and #5.
7. Do the same as #5 for SimicsOpenBoardPkg.
8. Explicitly set gBoardModulePkgTokenSpaceGuid.PcdPs2KbMsEnable
in WhiskeylakeOpenBoardPkg/WhiskeylakeURvp.

Thanks,
Michael

-----Original Message-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of
Agyeman, Prince
Sent: Friday, November 1, 2019 12:51 PM
To: devel@edk2.groups.io
Subject: [edk2-devel] [edk2-platforms] [PATCH 0/5] Enable Ps2 keyboard

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2228

This patch series enables BIOS Ps2 keyboard in GalagoPro3


What was done:
Patch 0001 adds PCDs to BoardModulePkg that will enable/disable, describe
Super I/O , Ps2 keyboard/mouse, uart1 and uart2 com ports

Patch 0002 moves the generic Super I/O driver from SimicsOpenBoardPkg to
BoardModulePkg in order for it to be shared. This driver publishes the
gEfiSioProtocolGuid consumed by edk2's
MdeModulePkg/Bus/Isa/Ps2KeyboardDxe
driver to enable Ps2 keyboard functions in BIOS

Patch 0003 adds PCDs defined in patch 0001 to enable/disable devices in the
Super I/O driver added in patch 0002

Patch 0004 adds a Null Ps2 Library that adds Ps2 keyboard device path to
ConIn and ConInDev

Patch 0005 enables Ps2 keyboard in BIOS by setting Ps2 keyboard related
PCDs Prince Agyeman (5):
Platform/Intel: Add gBoardModulePkgTokenSpaceGuid
Platform/Intel: Move Sio Dxe Driver
BoardModulePkg: Added Pcds Sio Driver
KabylakeOpenBoardPkg: Add Ps2 keyboard Null Library
KabylakeOpenBoardPkg: Add Ps2 Keyboard Support

.../Intel/BoardModulePkg/BoardModulePkg.dec | 25 +++
.../Intel/BoardModulePkg/BoardModulePkg.dsc | 1 +
.../LegacySioDxe/ComponentName.c | 0
.../LegacySioDxe/ComponentName.h | 0
.../LegacySioDxe/LegacySioDxe.inf | 18 +-
.../LegacySioDxe/Register.h | 0
.../LegacySioDxe/SioChip.c | 71 +++++-
.../LegacySioDxe/SioChip.h | 18 +-
.../LegacySioDxe/SioDriver.c | 42 +++-
.../LegacySioDxe/SioDriver.h | 1 -
.../LegacySioDxe/SioService.c | 0
.../LegacySioDxe/SioService.h | 0
.../BoardAcpiLib/DxeBoardAcpiTableLib.inf | 3 +-
.../DxeMultiBoardAcpiSupportLib.inf | 3 +-
.../GalagoPro3/Library/Ps2KbcLib/Ps2KbcLib.c | 202 ++++++++++++++++++
.../GalagoPro3/Library/Ps2KbcLib/Ps2KbcLib.h | 65 ++++++
.../Library/Ps2KbcLib/Ps2KbcLib.inf | 39 ++++
.../GalagoPro3/OpenBoardPkg.dsc | 7 +
.../GalagoPro3/OpenBoardPkg.fdf | 2 +
.../GalagoPro3/OpenBoardPkgPcd.dsc | 6 +
.../BoardAcpiLib/DxeBoardAcpiTableLib.inf | 3 +-
.../DxeMultiBoardAcpiSupportLib.inf | 3 +-
.../KabylakeRvp3/OpenBoardPkgPcd.dsc | 5 +
.../KabylakeOpenBoardPkg/OpenBoardPkg.dec | 2 -
.../BoardX58Ich10/OpenBoardPkg.dsc | 2 +-
.../BoardX58Ich10/OpenBoardPkg.fdf | 2 +-
.../BoardX58Ich10/OpenBoardPkgPcd.dsc | 6 +
.../WhiskeylakeOpenBoardPkg/OpenBoardPkg.dec | 1 -
.../WhiskeylakeURvp/OpenBoardPkgPcd.dsc | 5 +
29 files changed, 499 insertions(+), 33 deletions(-) rename
Platform/Intel/{SimicsOpenBoardPkg =>
BoardModulePkg}/LegacySioDxe/ComponentName.c (100%) rename
Platform/Intel/{SimicsOpenBoardPkg =>
BoardModulePkg}/LegacySioDxe/ComponentName.h (100%) rename
Platform/Intel/{SimicsOpenBoardPkg =>
BoardModulePkg}/LegacySioDxe/LegacySioDxe.inf (63%) rename
Platform/Intel/{SimicsOpenBoardPkg =>
BoardModulePkg}/LegacySioDxe/Register.h (100%) rename
Platform/Intel/{SimicsOpenBoardPkg =>
BoardModulePkg}/LegacySioDxe/SioChip.c (75%) rename
Platform/Intel/{SimicsOpenBoardPkg =>
BoardModulePkg}/LegacySioDxe/SioChip.h (90%) rename
Platform/Intel/{SimicsOpenBoardPkg =>
BoardModulePkg}/LegacySioDxe/SioDriver.c (88%) rename
Platform/Intel/{SimicsOpenBoardPkg =>
BoardModulePkg}/LegacySioDxe/SioDriver.h (95%) rename
Platform/Intel/{SimicsOpenBoardPkg =>
BoardModulePkg}/LegacySioDxe/SioService.c (100%) rename
Platform/Intel/{SimicsOpenBoardPkg =>
BoardModulePkg}/LegacySioDxe/SioService.h (100%) create mode 100644
Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/Library/Ps2KbcLib/Ps2K
bcLib.c
create mode 100644
Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/Library/Ps2KbcLib/Ps2K
bcLib.h
create mode 100644
Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/Library/Ps2KbcLib/Ps2K
bcLib.inf

--
2.19.1.windows.1



Re: [PATCH] Support skipping automatic BM enumeration

Ashish Singhal
 

I sent 2 patches that day for 2 separate changes. I have resent those just now.

-----Original Message-----
From: Laszlo Ersek <lersek@redhat.com>
Sent: Friday, November 1, 2019 4:58 PM
To: Ashish Singhal <ashishsingha@nvidia.com>; devel@edk2.groups.io; jian.j.wang@intel.com; hao.a.wu@intel.com; Ray Ni <ray.ni@intel.com>; Zhichao Gao <zhichao.gao@intel.com>
Subject: Re: [edk2-devel] [PATCH] Support skipping automatic BM enumeration

On 11/01/19 23:05, Ashish Singhal wrote:
Please refer to https://edk2.groups.io/g/devel/message/49627 for the patch.
Thanks! The subject line is:

[PATCH] MdeModulePkg/UefiBootManagerLib: Support skipping BM enumeration

This looks like a <groups.io> glitch to me -- a failure to reflect your message to *some* subscribers. It's not just me that hasn't received the patch, but at least a mailing list daemon too (which is subscribed to the list in order to create a "secondary archive"):

https://www.redhat.com/archives/edk2-devel-archive/2019-October/author.html

The patch is not listed under your name.


On the other hand, the patch is there in the (also subscribed) <mail-archive.com> collection, with apparently correct threading even:

http://mid.mail-archive.com/8a8ecae581eeffd193157096f09da53a3ab3a7ab.1572406843.git.ashishsingha@nvidia.com

So... I'm not sure.

Ray, Zhichao, did you get a copy of the patch? If not, then I think we should ask Ashish to please repost.

Thanks
Laszlo

-----Original Message-----
From: Laszlo Ersek <lersek@redhat.com>
Sent: Friday, November 1, 2019 3:42 PM
To: Ashish Singhal <ashishsingha@nvidia.com>; devel@edk2.groups.io;
jian.j.wang@intel.com; hao.a.wu@intel.com; Ray Ni <ray.ni@intel.com>;
Zhichao Gao <zhichao.gao@intel.com>
Subject: Re: [edk2-devel] [PATCH] Support skipping automatic BM
enumeration

On 10/31/19 13:42, Ashish Singhal wrote:
Hello Laszlo,

This is the cover letter. The patch was also submitted.
Can you please state the groups.io permalink for the posted patch, and/or the Message-Id header for the posted patch?

Please let me know if you are unable to find it and I'll resubmit it.
I can't see the patch email in my list folder.

Thanks
Laszlo

----------------------------------------------------------------------
------------- This email message is for the sole use of the intended
recipient(s) and may contain confidential information. Any
unauthorized review, use, disclosure or distribution is prohibited.
If you are not the intended recipient, please contact the sender by
reply email and destroy all copies of the original message.
----------------------------------------------------------------------
-------------


[PATCH] MdeModulePkg/UefiBootManagerLib: Support skipping BM enumeration

Ashish Singhal
 

Allow support for skipping auto enumeration of a BlockIO or
SimpleFileSystem or LoadFile protocol based on a new protocol
installed on the same handle. EdkiiSkipBmAutoEnumerate protocol
has been added for that purpose.

Signed-off-by: Ashish Singhal <ashishsingha@nvidia.com>
---
.../Include/Protocol/SkipBmAutoEnumerate.h | 25 ++++++++++++++
MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c | 40 +++++++++++++++++++++-
.../Library/UefiBootManagerLib/InternalBm.h | 1 +
.../UefiBootManagerLib/UefiBootManagerLib.inf | 1 +
MdeModulePkg/MdeModulePkg.dec | 3 ++
5 files changed, 69 insertions(+), 1 deletion(-)
create mode 100644 MdeModulePkg/Include/Protocol/SkipBmAutoEnumerate.h

diff --git a/MdeModulePkg/Include/Protocol/SkipBmAutoEnumerate.h b/MdeModulePkg/Include/Protocol/SkipBmAutoEnumerate.h
new file mode 100644
index 0000000..7efca7a
--- /dev/null
+++ b/MdeModulePkg/Include/Protocol/SkipBmAutoEnumerate.h
@@ -0,0 +1,25 @@
+/** @file
+ Skip Boot Manager Auto Enumerate protocol header file.
+
+ This is used to skip auto boot manager enumeration. This protocol can
+ be installed on any handle having BlockIo or SimpleFileSystem or LoadFile
+ protocol and UEFI boot manager would skip its enumeration.
+
+Copyright (c) 2019, NVIDIA Corporation. All rights reserved.
+
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef _SKIP_BM_AUTO_ENUMERATE_PROTOCOL_H_
+#define _SKIP_BM_AUTO_ENUMERATE_PROTOCOL_H_
+
+///
+/// Global ID for the EDKII SKIP BM AUTO ENUMERATE Protocol.
+///
+#define EDKII_SKIP_BM_AUTO_ENUMERATE_PROTOCOL_GUID \
+ { 0x2733f321, 0x5a7e, 0x4178, { 0x86, 0xcc, 0x21, 0x65, 0xd2, 0x0c, 0xec, 0x1e }}
+
+extern EFI_GUID gEdkiiSkipBmAutoEnumerateProtocolGuid;
+
+#endif
diff --git a/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c b/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
index 760d764..7b5f176 100644
--- a/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
+++ b/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
@@ -2080,6 +2080,7 @@ BmEnumerateBootOptions (
UINTN HandleCount;
EFI_HANDLE *Handles;
EFI_BLOCK_IO_PROTOCOL *BlkIo;
+ VOID *SkipBmAutoEnumerate;
UINTN Removable;
UINTN Index;
CHAR16 *Description;
@@ -2111,6 +2112,18 @@ BmEnumerateBootOptions (
continue;
}

+ Status = gBS->HandleProtocol (
+ Handles[Index],
+ &gEdkiiSkipBmAutoEnumerateProtocolGuid,
+ (VOID **) &SkipBmAutoEnumerate
+ );
+ if (!EFI_ERROR (Status)) {
+ //
+ // Skip if the file system handle supports a SkipBmAutoEnumerate protocol
+ //
+ continue;
+ }
+
//
// Skip the logical partitions
//
@@ -2169,12 +2182,25 @@ BmEnumerateBootOptions (
&gEfiBlockIoProtocolGuid,
(VOID **) &BlkIo
);
- if (!EFI_ERROR (Status)) {
+ if (!EFI_ERROR (Status)) {
//
// Skip if the file system handle supports a BlkIo protocol, which we've handled in above
//
continue;
}
+
+ Status = gBS->HandleProtocol (
+ Handles[Index],
+ &gEdkiiSkipBmAutoEnumerateProtocolGuid,
+ (VOID **) &SkipBmAutoEnumerate
+ );
+ if (!EFI_ERROR (Status)) {
+ //
+ // Skip if the file system handle supports a SkipBmAutoEnumerate protocol
+ //
+ continue;
+ }
+
Description = BmGetBootDescription (Handles[Index]);
BootOptions = ReallocatePool (
sizeof (EFI_BOOT_MANAGER_LOAD_OPTION) * (*BootOptionCount),
@@ -2212,6 +2238,18 @@ BmEnumerateBootOptions (
&Handles
);
for (Index = 0; Index < HandleCount; Index++) {
+ Status = gBS->HandleProtocol (
+ Handles[Index],
+ &gEdkiiSkipBmAutoEnumerateProtocolGuid,
+ (VOID **) &SkipBmAutoEnumerate
+ );
+ if (!EFI_ERROR (Status)) {
+ //
+ // Skip if the file system handle supports a SkipBmAutoEnumerate protocol
+ //
+ continue;
+ }
+
//
// Ignore BootManagerMenu. its boot option will be created by EfiBootManagerGetBootManagerMenu().
//
diff --git a/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h b/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h
index 027eb25..f95e58f 100644
--- a/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h
+++ b/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h
@@ -41,6 +41,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Protocol/VariableLock.h>
#include <Protocol/RamDisk.h>
#include <Protocol/DeferredImageLoad.h>
+#include <Protocol/SkipBmAutoEnumerate.h>

#include <Guid/MemoryTypeInformation.h>
#include <Guid/FileInfo.h>
diff --git a/MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf b/MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
index ed6b467..40c668c 100644
--- a/MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
+++ b/MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
@@ -107,6 +107,7 @@
gEfiFormBrowser2ProtocolGuid ## SOMETIMES_CONSUMES
gEfiRamDiskProtocolGuid ## SOMETIMES_CONSUMES
gEfiDeferredImageLoadProtocolGuid ## SOMETIMES_CONSUMES
+ gEdkiiSkipBmAutoEnumerateProtocolGuid ## SOMETIMES_CONSUMES

[Pcd]
gEfiMdeModulePkgTokenSpaceGuid.PcdResetOnMemoryTypeInformationChange ## SOMETIMES_CONSUMES
diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec
index d6bac97..64ef22a 100644
--- a/MdeModulePkg/MdeModulePkg.dec
+++ b/MdeModulePkg/MdeModulePkg.dec
@@ -604,6 +604,9 @@
## Include/Protocol/PeCoffImageEmulator.h
gEdkiiPeCoffImageEmulatorProtocolGuid = { 0x96f46153, 0x97a7, 0x4793, { 0xac, 0xc1, 0xfa, 0x19, 0xbf, 0x78, 0xea, 0x97 } }

+ ## Include/Protocol/SkipBmAutoEnumerate.h
+ gEdkiiSkipBmAutoEnumerateProtocolGuid = { 0x2733f321, 0x5a7e, 0x4178, { 0x86, 0xcc, 0x21, 0x65, 0xd2, 0x0c, 0xec, 0x1e } }
+
#
# [Error.gEfiMdeModulePkgTokenSpaceGuid]
# 0x80000001 | Invalid value provided.
--
2.7.4


[PATCH] EmbeddedPkg/DtPlatformDxe: Add DT/ACPI Default Flexibility

Ashish Singhal
 

Add a PCD to govern whether to use DT or ACPI in case the
variable governing this is not found or is not valid.

Signed-off-by: Ashish Singhal <ashishsingha@nvidia.com>
---
EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformDxe.c | 16 ++++++++++------
EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformDxe.inf | 3 +++
EmbeddedPkg/EmbeddedPkg.dec | 5 +++++
3 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformDxe.c b/EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformDxe.c
index 907d46a..e35ca33 100644
--- a/EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformDxe.c
+++ b/EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformDxe.c
@@ -124,18 +124,22 @@ DtPlatformDxeEntryPoint (
Status = gRT->GetVariable(DT_ACPI_VARIABLE_NAME, &gDtPlatformFormSetGuid,
NULL, &BufferSize, &DtAcpiPref);
if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_WARN, "%a: no DT/ACPI preference found, defaulting to DT\n",
- __FUNCTION__));
- DtAcpiPref.Pref = DT_ACPI_SELECT_DT;
+ DEBUG ((DEBUG_WARN, "%a: no DT/ACPI preference found, defaulting to %s\n",
+ __FUNCTION__, PcdGetBool (PcdDefaultDtPref) ? L"DT" : L"ACPI"));
+ DtAcpiPref.Pref = PcdGetBool (PcdDefaultDtPref) ?
+ DT_ACPI_SELECT_DT :
+ DT_ACPI_SELECT_ACPI;
}
}

if (!EFI_ERROR (Status) &&
DtAcpiPref.Pref != DT_ACPI_SELECT_ACPI &&
DtAcpiPref.Pref != DT_ACPI_SELECT_DT) {
- DEBUG ((DEBUG_WARN, "%a: invalid value for %s, defaulting to DT\n",
- __FUNCTION__, DT_ACPI_VARIABLE_NAME));
- DtAcpiPref.Pref = DT_ACPI_SELECT_DT;
+ DEBUG ((DEBUG_WARN, "%a: invalid value for %s, defaulting to %s\n",
+ __FUNCTION__, DT_ACPI_VARIABLE_NAME, PcdGetBool (PcdDefaultDtPref) ? L"DT" : L"ACPI"));
+ DtAcpiPref.Pref = PcdGetBool (PcdDefaultDtPref) ?
+ DT_ACPI_SELECT_DT :
+ DT_ACPI_SELECT_ACPI;
Status = EFI_INVALID_PARAMETER; // trigger setvar below
}

diff --git a/EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformDxe.inf b/EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformDxe.inf
index b68f154..450ea29 100644
--- a/EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformDxe.inf
+++ b/EmbeddedPkg/Drivers/DtPlatformDxe/DtPlatformDxe.inf
@@ -46,6 +46,9 @@
gEdkiiPlatformHasAcpiGuid
gFdtTableGuid

+[Pcd]
+ gEmbeddedTokenSpaceGuid.PcdDefaultDtPref
+
[Depex]
gEfiVariableArchProtocolGuid AND
gEfiVariableWriteArchProtocolGuid
diff --git a/EmbeddedPkg/EmbeddedPkg.dec b/EmbeddedPkg/EmbeddedPkg.dec
index bbaadc5..8812a6d 100644
--- a/EmbeddedPkg/EmbeddedPkg.dec
+++ b/EmbeddedPkg/EmbeddedPkg.dec
@@ -185,3 +185,8 @@
# truncation on overflow to specify negative offsets.
#
gEmbeddedTokenSpaceGuid.PcdDmaDeviceOffset|0x0|UINT64|0x0000058
+
+ #
+ # Selection between DT and ACPI as a default
+ #
+ gEmbeddedTokenSpaceGuid.PcdDefaultDtPref|TRUE|BOOLEAN|0x0000059
--
2.7.4


Re: [PATCH v4] CryptoPkg: Upgrade OpenSSL to 1.1.1d

Laszlo Ersek
 

On 11/04/19 17:04, Laszlo Ersek wrote:
On 11/01/19 07:55, Zhang, Shenglei wrote:
Update openssl from 1.1.1b to 1.1.1d.
Something needs to be noticed is that, there is a bug existing in the
released 1_1_1d version(894da2fb7ed5d314ee5c2fc9fd2d9b8b74111596),
which causes build failure. So we switch the code base to a usable
version, which is 2 commits later than the stable tag.
Now we use the version c3656cc594daac8167721dde7220f0e59ae146fc.
This log is to fix the build failure.
https://bugzilla.tianocore.org/show_bug.cgi?id=2226

Besides, the absense of "DSO_NONE" in dso_conf.h causes build failure
in OvmfPkg. So update process_files.pl to generate information from
"crypto/include/internal/dso_conf.h.in".

shm.h and utsname.h are added to avoid GCC build failure.

Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Xiaoyu Lu <xiaoyux.lu@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Signed-off-by: Shenglei Zhang <shenglei.zhang@intel.com>
---
v2: Revert the changes in OpensslLib.inf and OpensslLibCrypto.inf.
The removed header files could be auto-generated by process_files.pl now.

v3: Add display information for dso_conf.h.

v4: Add shm.h and utsname.h to avoid GCC build failure.

CryptoPkg/Library/Include/internal/dso_conf.h | 16 ++++++++++++++++
CryptoPkg/Library/Include/sys/shm.h | 9 +++++++++
CryptoPkg/Library/Include/sys/utsname.h | 10 ++++++++++
CryptoPkg/Library/OpensslLib/openssl | 2 +-
CryptoPkg/Library/OpensslLib/process_files.pl | 15 ++++++++++++++-
5 files changed, 50 insertions(+), 2 deletions(-)
create mode 100644 CryptoPkg/Library/Include/sys/shm.h
create mode 100644 CryptoPkg/Library/Include/sys/utsname.h

diff --git a/CryptoPkg/Library/Include/internal/dso_conf.h b/CryptoPkg/Library/Include/internal/dso_conf.h
index e69de29bb2d1..43c891588bc2 100644
--- a/CryptoPkg/Library/Include/internal/dso_conf.h
+++ b/CryptoPkg/Library/Include/internal/dso_conf.h
@@ -0,0 +1,16 @@
+/* WARNING: do not edit! */
+/* Generated from crypto/include/internal/dso_conf.h.in */
+/*
+ * Copyright 2016-2019 The OpenSSL Project Authors. All Rights Reserved.
+ *
+ * Licensed under the OpenSSL license (the "License"). You may not use
+ * this file except in compliance with the License. You can obtain a copy
+ * in the file LICENSE in the source distribution or at
+ * https://www.openssl.org/source/license.html
+ */
+
+#ifndef HEADER_DSO_CONF_H
+# define HEADER_DSO_CONF_H
+# define DSO_NONE
+# define DSO_EXTENSION ".so"
+#endif
diff --git a/CryptoPkg/Library/Include/sys/shm.h b/CryptoPkg/Library/Include/sys/shm.h
new file mode 100644
index 000000000000..dc0b8e81c8b0
--- /dev/null
+++ b/CryptoPkg/Library/Include/sys/shm.h
@@ -0,0 +1,9 @@
+/** @file
+ Include file to support building the third-party cryptographic library.
+
+Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <CrtLibSupport.h>
diff --git a/CryptoPkg/Library/Include/sys/utsname.h b/CryptoPkg/Library/Include/sys/utsname.h
new file mode 100644
index 000000000000..75955b0a4eb6
--- /dev/null
+++ b/CryptoPkg/Library/Include/sys/utsname.h
@@ -0,0 +1,10 @@
+/** @file
+ Include file to support building the third-party cryptographic library.
+
+Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <CrtLibSupport.h>
+
(1) The trailing empty line should be removed.

diff --git a/CryptoPkg/Library/OpensslLib/openssl b/CryptoPkg/Library/OpensslLib/openssl
index 50eaac9f3337..c3656cc594da 160000
--- a/CryptoPkg/Library/OpensslLib/openssl
+++ b/CryptoPkg/Library/OpensslLib/openssl
@@ -1 +1 @@
-Subproject commit 50eaac9f3337667259de725451f201e784599687
+Subproject commit c3656cc594daac8167721dde7220f0e59ae146fc
diff --git a/CryptoPkg/Library/OpensslLib/process_files.pl b/CryptoPkg/Library/OpensslLib/process_files.pl
index 4fe54cd808a5..dd93bd84da22 100755
--- a/CryptoPkg/Library/OpensslLib/process_files.pl
+++ b/CryptoPkg/Library/OpensslLib/process_files.pl
@@ -106,6 +106,14 @@ BEGIN {
) == 0 ||
die "Failed to generate opensslconf.h!\n";

+ # Generate dso_conf.h per config data
+ system(
+ "perl -I. -Mconfigdata util/dofile.pl " .
+ "crypto/include/internal/dso_conf.h.in " .
+ "> include/internal/dso_conf.h"
+ ) == 0 ||
+ die "Failed to generate dso_conf.h!\n";
+
chdir($basedir) ||
die "Cannot change to base directory \"" . $basedir . "\"";

@@ -249,12 +257,17 @@ rename( $new_inf_file, $inf_file ) ||
print "Done!";

#
-# Copy opensslconf.h generated from OpenSSL Configuration
+# Copy opensslconf.h and dso_conf.h generated from OpenSSL Configuration
#
print "\n--> Duplicating opensslconf.h into Include/openssl ... ";
copy($OPENSSL_PATH . "/include/openssl/opensslconf.h",
$OPENSSL_PATH . "/../../Include/openssl/") ||
die "Cannot copy opensslconf.h!";
+print "Done!";
+print "\n--> Duplicating dso_conf.h into Include/internal ... ";
+copy($OPENSSL_PATH . "/include/internal/dso_conf.h",
+ $OPENSSL_PATH . "/../../Include/internal/") ||
+ die "Cannot copy dso_conf.h!";
print "Done!\n";

print "\nProcessing Files Done!\n";
(2) The comment block at the top of the script has not been extended:

# This script runs the OpenSSL Configure script, then processes the
# resulting file list into our local OpensslLib[Crypto].inf and also
# takes a copy of opensslconf.h.

It only refers to "opensslconf.h". For consistency, we should update
that comment block too, with "dso_conf.h".

With (1) and (2) fixed:

Reviewed-by: Laszlo Ersek <lersek@redhat.com>

I'll follow up with test results soon.
* Simple tests for Secure Boot:

- booting a VM with SB already enabled -> continues booting, and reports
SB enabled

- delete PK in UiApp manually + reboot; check from VM

- re-enroll using EnrollDefaultKeys.efi + reboot; check from VM

- with SB enabled, check rejection using an unsigned UEFI ISO -->
"DxeImageVerificationLib: Image is not signed and SHA256 hash of image
is not found in DB/DBX."

So this looks good.

* HTTPS boot:

- reused two of my earlier server certificates: DNS domain name in
subject Common Name, IP address in subject Alternative Name, and DNS
domain name resolves to IPv4 address (cert#1) vs. IPv6 address (cert#2)

- ran four HTTPS Boot tests in total: { DHCP presents URL with IP
address, DHCP presents URL with DNS domain name } x { IPv4, IPv6 }.

All worked fine.

Tested-by: Laszlo Ersek <lersek@redhat.com>

Thanks!
Laszlo


Re: [edk2-platforms] [PATCH 4/5] KabylakeOpenBoardPkg: Add Ps2 keyboard Null Library

Agyeman, Prince
 

Hi Chasel,

I will fix the descriptions and typos as suggested in my v2 patch series.

Thanks for the feedback!

Prince

-----Original Message-----
From: Chiu, Chasel <chasel.chiu@intel.com>
Sent: Monday, November 4, 2019 1:04 AM
To: Agyeman, Prince <prince.agyeman@intel.com>; devel@edk2.groups.io
Cc: Kubacki, Michael A <michael.a.kubacki@intel.com>; Desimone, Nathaniel L <nathaniel.l.desimone@intel.com>
Subject: RE: [edk2-platforms] [PATCH 4/5] KabylakeOpenBoardPkg: Add Ps2 keyboard Null Library


Hi Prince,

I added 3 questions below inline, please help to check them. Thanks!


-----Original Message-----
From: Agyeman, Prince <prince.agyeman@intel.com>
Sent: Saturday, November 2, 2019 3:51 AM
To: devel@edk2.groups.io
Cc: Kubacki, Michael A <michael.a.kubacki@intel.com>; Chiu, Chasel
<chasel.chiu@intel.com>; Desimone, Nathaniel L
<nathaniel.l.desimone@intel.com>
Subject: [edk2-platforms] [PATCH 4/5] KabylakeOpenBoardPkg: Add Ps2
keyboard Null Library

Added GalagoPro3 board ps2 keyboard library that adds ps2 device path
to ConIn and ConInDev Uefi variables

Cc: Michael Kubacki <michael.a.kubacki@intel.com>
Cc: Chasel Chiu <chasel.chiu@intel.com>
Cc: Nate DeSimone <nathaniel.l.desimone@intel.com>

Signed-off-by: Prince Agyeman <prince.agyeman@intel.com>
---
.../GalagoPro3/Library/Ps2KbcLib/Ps2KbcLib.c | 202
++++++++++++++++++ .../GalagoPro3/Library/Ps2KbcLib/Ps2KbcLib.h |
65 ++++++
.../Library/Ps2KbcLib/Ps2KbcLib.inf | 39 ++++
3 files changed, 306 insertions(+)
create mode 100644
Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/Library/Ps2KbcLib/Ps2Kb
cLib.c
create mode 100644
Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/Library/Ps2KbcLib/Ps2Kb
cLib.h
create mode 100644
Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/Library/Ps2KbcLib/Ps2Kb
cLib.inf

diff --git
a/Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/Library/Ps2KbcLib/Ps2
K
bcLib.c
b/Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/Library/Ps2KbcLib/Ps2
KbcLib.c
new file mode 100644
index 0000000000..ac1563d3cd
--- /dev/null
+++
b/Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/Library/Ps2KbcLib/P
+++ s2KbcLib.c
@@ -0,0 +1,202 @@
+/** @file
+ Main file for NULL named library for Ps2 keyboard controller librarr.
I think this is not really a NULL library right? It actually does a lot real functionality.
Also the typo "librarr"


+
+ Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include "Ps2KbcLib.h"
+
+GLOBAL_REMOVE_IF_UNREFERENCED PLATFORM_KEYBOARD_DEVICE_PATH
+gKeyboardDevicePath = {
+ gPciRootBridge,
+ {
+ {
+ HARDWARE_DEVICE_PATH,
+ HW_PCI_DP,
+ {
+ (UINT8) (sizeof (PCI_DEVICE_PATH)),
+ (UINT8) ((sizeof (PCI_DEVICE_PATH)) >> 8)
+ }
+ },
+ 0, // Function, patched in EnumPs2Keyboard
+ 0 // Device, patched in EnumPs2Keyboard
+ },
+ {
+ {
+ ACPI_DEVICE_PATH,
+ ACPI_DP,
+ {
+ (UINT8) (sizeof (ACPI_HID_DEVICE_PATH)),
+ (UINT8) ((sizeof (ACPI_HID_DEVICE_PATH)) >> 8)
+ }
+ },
+ EISA_PNP_ID(0x0303),
+ 0
+ },
+ gEndEntire
+};
+
+/**
+ Check if PS2 keyboard is conntected, by sending ECHO command.
+ @retval TRUE if connected FALSE otherwise
+**/
+BOOLEAN
+DetectPs2Keyboard (
+ VOID
+ )
+{
+ UINT32 TimeOut;
+ UINT32 RegEmptied;
+ UINT8 Data;
+ UINT32 SumTimeOut;
+ BOOLEAN FoundPs2Kbc;
+
+ TimeOut = 0;
+ RegEmptied = 0;
+ FoundPs2Kbc = FALSE;
+
+ //
+ // Wait for input buffer empty
+ //
+ for (TimeOut = 0; TimeOut < PS2_KEYBOARD_TIMEOUT; TimeOut += 30) {
+ if ((IoRead8 (KEYBOARD_8042_STATUS_REGISTER) & 0x02) == 0) {
+ FoundPs2Kbc = TRUE;
+ break;
+ }
+ MicroSecondDelay (30);
+ }
+
+ if (FoundPs2Kbc == FALSE) {
+ return FALSE;
+ }
+
+ //
+ // Send echo command
+ //
+ IoWrite8 (KEYBOARD_8042_DATA_REGISTER,
KBC_INPBUF_VIA60_KBECHO);
+
+ //
+ // Init variables
+ //
+ FoundPs2Kbc = FALSE;
+ TimeOut = 0;
+ SumTimeOut = 0;
+ Data = 0;
+
+ //
+ // Read from 8042 (multiple times if needed) // until the expected
+ value appears // use SumTimeOut to control the iteration // while
+ (1) {
+ //
+ // Perform a read
+ //
+ for (TimeOut = 0; TimeOut < PS2_KEYBOARD_TIMEOUT; TimeOut += 30)
{
+ if (IoRead8 (KEYBOARD_8042_STATUS_REGISTER) & 0x01) {
+ Data = IoRead8 (KEYBOARD_8042_DATA_REGISTER);
+ break;
+ }
+ MicroSecondDelay (30);
+ }
+
+ SumTimeOut += TimeOut;
+
+ if (Data == KBC_INPBUF_VIA60_KBECHO) {
+ FoundPs2Kbc = TRUE;
+ break;
+ }
+
+ if (SumTimeOut >= PS2_KEYBOARD_WAITFORVALUE_TIMEOUT) {
+ break;
+ }
+ }
+ return FoundPs2Kbc;
+}
+
+/**
+ Check if PS2 keyboard is conntected. If the result of first time is
+ error, it will retry again.
+ @retval TRUE if connected FALSE otherwise
+**/
+BOOLEAN
+IsPs2KeyboardConnected (
+ VOID
+ )
+{
+ BOOLEAN Result;
+ Result = DetectPs2Keyboard ();
+
+ if (Result == FALSE) {
+ //
+ // If there is no ps2 keyboard detected for the 1st time, retry again.
+ //
+ Result = DetectPs2Keyboard ();
+ }
+ return Result;
+}
+
+
+/**
+ Updates the ConIn variable with Ps2 Keyboard device path,
+ if it doesn't already exists in ConIn and ConInDev **/ VOID
+AddPs2Keyboard (
+ VOID
+ )
+{
+ SIO_PCI_ISA_BRIDGE_DEVICE_INFO *SioIsaInfo;
+
+ DEBUG ((DEBUG_INFO, "[AddPs2Keyboard]\n"));
+
+ SioIsaInfo = (SIO_PCI_ISA_BRIDGE_DEVICE_INFO*) FixedPcdGetPtr
+ (PcdSuperIoPciIsaBridgeDevice);
+
+ //
+ // patch IsaBridge device and and function //
+ gKeyboardDevicePath.IsaBridge.Device = SioIsaInfo->Device;
+ gKeyboardDevicePath.IsaBridge.Function = SioIsaInfo->Funtion;
+
+ //
+ // Append Ps2 Keyboard into "ConIn"
+ //
+ EfiBootManagerUpdateConsoleVariable (ConIn,
(EFI_DEVICE_PATH_PROTOCOL
+ *) &gKeyboardDevicePath, NULL);
+
+ //
+ // Append Ps2 Keyboard into "ConInDev"
+ //
+ EfiBootManagerUpdateConsoleVariable (ConInDev,
+(EFI_DEVICE_PATH_PROTOCOL *) &gKeyboardDevicePath, NULL); }
+
+
+/**
+ Constructor for the Ps2 keyboard controller library.
+
+ @param ImageHandle the image handle of the process
+ @param SystemTable the EFI System Table pointer
+
+ @retval EFI_SUCCESS the shell command handlers were
installed sucessfully
+ @retval EFI_UNSUPPORTED the shell level required was not found.
+**/
+EFI_STATUS
+EFIAPI
+Ps2KbcLibConstructor (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+{
+ UINT8 Ps2KbMsEnable;
+
+ Ps2KbMsEnable = PcdGet8 (PcdPs2KbMsEnable);
+
+ if (Ps2KbMsEnable == 0x1
+ && IsPs2KeyboardConnected())
+ {
+ // add ps2 device path to ConIn and ConInDev
+ AddPs2Keyboard ();
+ }
+
+ return EFI_SUCCESS;
+}
diff --git
a/Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/Library/Ps2KbcLib/Ps2
K
bcLib.h
b/Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/Library/Ps2KbcLib/Ps2
KbcLib.h
new file mode 100644
index 0000000000..60bba122d6
--- /dev/null
+++
b/Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/Library/Ps2KbcLib/P
+++ s2KbcLib.h
@@ -0,0 +1,65 @@
+/** @file
+ Header file for NULL named library for Ps2 keyboard controller library.
Same question here, is this really NULL library instance?



+
+ Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef _PS2_KBC_LIB_H
+#define _PS2_KBC_LIB_H
+
+#include <Uefi.h>
+#include <Library/UefiLib.h>
+#include <Library/DevicePathLib.h>
+#include <Library/DebugLib.h>
+#include <Library/IoLib.h>
+#include <Library/TimerLib.h>
+#include <Library/UefiBootManagerLib.h>
+
+//
+// Below is the platform console device path // typedef struct {
+ ACPI_HID_DEVICE_PATH PciRootBridge;
+ PCI_DEVICE_PATH IsaBridge;
+ ACPI_HID_DEVICE_PATH Keyboard;
+ EFI_DEVICE_PATH_PROTOCOL End;
+} PLATFORM_KEYBOARD_DEVICE_PATH;
+
+typedef struct {
+ UINT8 Segment;
+ UINT8 Bus;
+ UINT8 Device;
+ UINT8 Funtion;
+} SIO_PCI_ISA_BRIDGE_DEVICE_INFO;
+
+#define gPciRootBridge \
+ { \
+ { \
+ ACPI_DEVICE_PATH, \
+ ACPI_DP, \
+ { \
+ (UINT8) (sizeof (ACPI_HID_DEVICE_PATH)), \
+ (UINT8) ((sizeof (ACPI_HID_DEVICE_PATH)) >> 8) \
+ }, \
+ }, \
+ EISA_PNP_ID (0x0A03), \
+ 0 \
+ }
+
+#define gEndEntire \
+ { \
+ END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, {
+END_DEVICE_PATH_LENGTH, 0 } \
+ }
+
+#define KBC_INPBUF_VIA60_KBECHO 0xEE
+#define KEYBOARD_8042_DATA_REGISTER 0x60
+#define KEYBOARD_8042_STATUS_REGISTER 0x64
+
+#define PS2_KEYBOARD_TIMEOUT 65536 // 0.07s
+#define PS2_KEYBOARD_WAITFORVALUE_TIMEOUT 1000000 // 1s
+#define PS2_KEYBOARD_KBEN 0xF4
+#define PS2_KEYBOARD_CMDECHO_ACK 0xFA
+
+#endif
diff --git
a/Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/Library/Ps2KbcLib/Ps2
K
bcLib.inf
b/Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/Library/Ps2KbcLib/Ps2
KbcLib.inf
new file mode 100644
index 0000000000..7ab1b628e3
--- /dev/null
+++
b/Platform/Intel/KabylakeOpenBoardPkg/GalagoPro3/Library/Ps2KbcLib/P
+++ s2KbcLib.inf
@@ -0,0 +1,39 @@
+## @file
+# Component information file for PEI GalagoPro3 Board Init Pre-Mem
+Library # # Copyright (c) 2019, Intel Corporation. All rights
This library is for PS2 initialization, not "Board Init Pre-Mem".


+reserved.<BR> # # SPDX-License-Identifier: BSD-2-Clause-Patent # ##
+[Defines]
+ INF_VERSION = 0x00010006
+ BASE_NAME = Ps2KbcLib
+ FILE_GUID =
E94EA52E-E84C-42E7-B863-EA1327EFA265
+ MODULE_TYPE = UEFI_DRIVER
+ VERSION_STRING = 1.2
+ LIBRARY_CLASS = NULL|UEFI_DRIVER
+ CONSTRUCTOR = Ps2KbcLibConstructor
+
+[Packages]
+ MdePkg/MdePkg.dec
+ MdeModulePkg/MdeModulePkg.dec
+ KabylakeOpenBoardPkg/OpenBoardPkg.dec
+ BoardModulePkg/BoardModulePkg.dec
+
+[Sources]
+ Ps2KbcLib.c
+ Ps2KbcLib.h
+
+[LibraryClasses]
+ DevicePathLib
+ DebugLib
+ IoLib
+ UefiDriverEntryPoint
+ UefiBootManagerLib
+ UefiLib
+ TimerLib
+
+[Pcd]
+ gBoardModulePkgTokenSpaceGuid.PcdPs2KbMsEnable
+ gBoardModulePkgTokenSpaceGuid.PcdSuperIoPciIsaBridgeDevice
--
2.19.1.windows.1


Re: [edk2-platforms][PATCH 1/1] Platform/RPi: Prevent buffer over-read when the command line is empty

Philippe Mathieu-Daudé
 

On 11/4/19 5:06 PM, Pete Batard wrote:
From: Andrei Warkentin <andrey.warkentin@gmail.com>
It is possible for the command line to be empty
(Cmd->TagHead.TagValueSize = 0), in which case the code should not
attempt to read the value at CommandLine[-1].
Oops...

Reviewed-by: Philippe Mathieu-Daude <philmd@redhat.com>

Signed-off-by: Pete Batard <pete@akeo.ie>
---
Platform/RaspberryPi/Drivers/RpiFirmwareDxe/RpiFirmwareDxe.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/Platform/RaspberryPi/Drivers/RpiFirmwareDxe/RpiFirmwareDxe.c b/Platform/RaspberryPi/Drivers/RpiFirmwareDxe/RpiFirmwareDxe.c
index 5a9d4c3f1787..9b4aa068857c 100644
--- a/Platform/RaspberryPi/Drivers/RpiFirmwareDxe/RpiFirmwareDxe.c
+++ b/Platform/RaspberryPi/Drivers/RpiFirmwareDxe/RpiFirmwareDxe.c
@@ -927,7 +927,8 @@ RpiFirmwareGetCommmandLine (
CopyMem (CommandLine, Cmd->CommandLine, Cmd->TagHead.TagValueSize);
- if (CommandLine[Cmd->TagHead.TagValueSize - 1] != '\0') {
+ if (Cmd->TagHead.TagValueSize == 0 ||
+ CommandLine[Cmd->TagHead.TagValueSize - 1] != '\0') {
//
// Add a NUL terminator if required.
//


[edk2-platforms][PATCH 1/1] Platform/RPi: Prevent buffer over-read when the command line is empty

Pete Batard
 

From: Andrei Warkentin <andrey.warkentin@gmail.com>

It is possible for the command line to be empty
(Cmd->TagHead.TagValueSize = 0), in which case the code should not
attempt to read the value at CommandLine[-1].

Signed-off-by: Pete Batard <pete@akeo.ie>
---
Platform/RaspberryPi/Drivers/RpiFirmwareDxe/RpiFirmwareDxe.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/Platform/RaspberryPi/Drivers/RpiFirmwareDxe/RpiFirmwareDxe.c b/Platform/RaspberryPi/Drivers/RpiFirmwareDxe/RpiFirmwareDxe.c
index 5a9d4c3f1787..9b4aa068857c 100644
--- a/Platform/RaspberryPi/Drivers/RpiFirmwareDxe/RpiFirmwareDxe.c
+++ b/Platform/RaspberryPi/Drivers/RpiFirmwareDxe/RpiFirmwareDxe.c
@@ -927,7 +927,8 @@ RpiFirmwareGetCommmandLine (

CopyMem (CommandLine, Cmd->CommandLine, Cmd->TagHead.TagValueSize);

- if (CommandLine[Cmd->TagHead.TagValueSize - 1] != '\0') {
+ if (Cmd->TagHead.TagValueSize == 0 ||
+ CommandLine[Cmd->TagHead.TagValueSize - 1] != '\0') {
//
// Add a NUL terminator if required.
//
--
2.21.0.windows.1


Re: [PATCH v4] CryptoPkg: Upgrade OpenSSL to 1.1.1d

Laszlo Ersek
 

On 11/01/19 07:55, Zhang, Shenglei wrote:
Update openssl from 1.1.1b to 1.1.1d.
Something needs to be noticed is that, there is a bug existing in the
released 1_1_1d version(894da2fb7ed5d314ee5c2fc9fd2d9b8b74111596),
which causes build failure. So we switch the code base to a usable
version, which is 2 commits later than the stable tag.
Now we use the version c3656cc594daac8167721dde7220f0e59ae146fc.
This log is to fix the build failure.
https://bugzilla.tianocore.org/show_bug.cgi?id=2226

Besides, the absense of "DSO_NONE" in dso_conf.h causes build failure
in OvmfPkg. So update process_files.pl to generate information from
"crypto/include/internal/dso_conf.h.in".

shm.h and utsname.h are added to avoid GCC build failure.

Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Xiaoyu Lu <xiaoyux.lu@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Signed-off-by: Shenglei Zhang <shenglei.zhang@intel.com>
---
v2: Revert the changes in OpensslLib.inf and OpensslLibCrypto.inf.
The removed header files could be auto-generated by process_files.pl now.

v3: Add display information for dso_conf.h.

v4: Add shm.h and utsname.h to avoid GCC build failure.

CryptoPkg/Library/Include/internal/dso_conf.h | 16 ++++++++++++++++
CryptoPkg/Library/Include/sys/shm.h | 9 +++++++++
CryptoPkg/Library/Include/sys/utsname.h | 10 ++++++++++
CryptoPkg/Library/OpensslLib/openssl | 2 +-
CryptoPkg/Library/OpensslLib/process_files.pl | 15 ++++++++++++++-
5 files changed, 50 insertions(+), 2 deletions(-)
create mode 100644 CryptoPkg/Library/Include/sys/shm.h
create mode 100644 CryptoPkg/Library/Include/sys/utsname.h

diff --git a/CryptoPkg/Library/Include/internal/dso_conf.h b/CryptoPkg/Library/Include/internal/dso_conf.h
index e69de29bb2d1..43c891588bc2 100644
--- a/CryptoPkg/Library/Include/internal/dso_conf.h
+++ b/CryptoPkg/Library/Include/internal/dso_conf.h
@@ -0,0 +1,16 @@
+/* WARNING: do not edit! */
+/* Generated from crypto/include/internal/dso_conf.h.in */
+/*
+ * Copyright 2016-2019 The OpenSSL Project Authors. All Rights Reserved.
+ *
+ * Licensed under the OpenSSL license (the "License"). You may not use
+ * this file except in compliance with the License. You can obtain a copy
+ * in the file LICENSE in the source distribution or at
+ * https://www.openssl.org/source/license.html
+ */
+
+#ifndef HEADER_DSO_CONF_H
+# define HEADER_DSO_CONF_H
+# define DSO_NONE
+# define DSO_EXTENSION ".so"
+#endif
diff --git a/CryptoPkg/Library/Include/sys/shm.h b/CryptoPkg/Library/Include/sys/shm.h
new file mode 100644
index 000000000000..dc0b8e81c8b0
--- /dev/null
+++ b/CryptoPkg/Library/Include/sys/shm.h
@@ -0,0 +1,9 @@
+/** @file
+ Include file to support building the third-party cryptographic library.
+
+Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <CrtLibSupport.h>
diff --git a/CryptoPkg/Library/Include/sys/utsname.h b/CryptoPkg/Library/Include/sys/utsname.h
new file mode 100644
index 000000000000..75955b0a4eb6
--- /dev/null
+++ b/CryptoPkg/Library/Include/sys/utsname.h
@@ -0,0 +1,10 @@
+/** @file
+ Include file to support building the third-party cryptographic library.
+
+Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <CrtLibSupport.h>
+
(1) The trailing empty line should be removed.

diff --git a/CryptoPkg/Library/OpensslLib/openssl b/CryptoPkg/Library/OpensslLib/openssl
index 50eaac9f3337..c3656cc594da 160000
--- a/CryptoPkg/Library/OpensslLib/openssl
+++ b/CryptoPkg/Library/OpensslLib/openssl
@@ -1 +1 @@
-Subproject commit 50eaac9f3337667259de725451f201e784599687
+Subproject commit c3656cc594daac8167721dde7220f0e59ae146fc
diff --git a/CryptoPkg/Library/OpensslLib/process_files.pl b/CryptoPkg/Library/OpensslLib/process_files.pl
index 4fe54cd808a5..dd93bd84da22 100755
--- a/CryptoPkg/Library/OpensslLib/process_files.pl
+++ b/CryptoPkg/Library/OpensslLib/process_files.pl
@@ -106,6 +106,14 @@ BEGIN {
) == 0 ||
die "Failed to generate opensslconf.h!\n";

+ # Generate dso_conf.h per config data
+ system(
+ "perl -I. -Mconfigdata util/dofile.pl " .
+ "crypto/include/internal/dso_conf.h.in " .
+ "> include/internal/dso_conf.h"
+ ) == 0 ||
+ die "Failed to generate dso_conf.h!\n";
+
chdir($basedir) ||
die "Cannot change to base directory \"" . $basedir . "\"";

@@ -249,12 +257,17 @@ rename( $new_inf_file, $inf_file ) ||
print "Done!";

#
-# Copy opensslconf.h generated from OpenSSL Configuration
+# Copy opensslconf.h and dso_conf.h generated from OpenSSL Configuration
#
print "\n--> Duplicating opensslconf.h into Include/openssl ... ";
copy($OPENSSL_PATH . "/include/openssl/opensslconf.h",
$OPENSSL_PATH . "/../../Include/openssl/") ||
die "Cannot copy opensslconf.h!";
+print "Done!";
+print "\n--> Duplicating dso_conf.h into Include/internal ... ";
+copy($OPENSSL_PATH . "/include/internal/dso_conf.h",
+ $OPENSSL_PATH . "/../../Include/internal/") ||
+ die "Cannot copy dso_conf.h!";
print "Done!\n";

print "\nProcessing Files Done!\n";
(2) The comment block at the top of the script has not been extended:

# This script runs the OpenSSL Configure script, then processes the
# resulting file list into our local OpensslLib[Crypto].inf and also
# takes a copy of opensslconf.h.

It only refers to "opensslconf.h". For consistency, we should update
that comment block too, with "dso_conf.h".

With (1) and (2) fixed:

Reviewed-by: Laszlo Ersek <lersek@redhat.com>

I'll follow up with test results soon.

Thanks
Laszlo


Re: [Patch v3 02/22] .gitignore: Ignore python compiled files, extdeps, and vscode

Philippe Mathieu-Daudé
 

On 10/31/19 10:02 AM, Laszlo Ersek wrote:
On 10/31/19 05:43, Kinney, Michael D wrote:
Leif,

Thanks. I agree. I will split it out.
I would further suggest alphabetical sorting for the .gitignore lines.
Reviewed-by: Philippe Mathieu-Daude <philmd@redhat.com>

-----Original Message-----
From: Leif Lindholm <leif.lindholm@linaro.org>
Sent: Tuesday, October 29, 2019 7:30 PM
To: Kinney, Michael D <michael.d.kinney@intel.com>
Cc: devel@edk2.groups.io; Sean Brogan
<sean.brogan@microsoft.com>; Andrew Fish
<afish@apple.com>; Laszlo Ersek <lersek@redhat.com>
Subject: Re: [Patch v3 02/22] .gitignore: Ignore python
compiled files, extdeps, and vscode

On Tue, Oct 29, 2019 at 12:54:57PM -0700, Michael D
Kinney wrote:
From: Sean Brogan <sean.brogan@microsoft.com>

https://bugzilla.tianocore.org/show_bug.cgi?id=2315

Update .gitignore to ignore .pyc files and __pycache__
directories.
Python based plugins can be added to any package or
platform, so these
files and directories may be present outside of
BaseTools.

Ignore _extdep directories that are generated by the
pytool external
dependency feature.

Ignore .vscode directories generated by the VS Code
editor.

Cc: Andrew Fish <afish@apple.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Leif Lindholm <leif.lindholm@linaro.org>
Signed-off-by: Kinney <michael.d.kinney@intel.com>
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>

(This one could be merged independently of rest of set,
it's useful on its own.)

---
.gitignore | 5 +++++
1 file changed, 5 insertions(+)

diff --git a/.gitignore b/.gitignore
index 97f22c348c..71679478ac 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,8 @@
Build/
tags/
.DS_Store
+*.pyc
+__pycache__/
+*_extdep/
+
+.vscode/
--
2.21.0.windows.1


Re: [edk2-non-osi][PATCH 1/1] Platforms/RPi: Fix logo black level

Leif Lindholm
 

On Mon, Nov 04, 2019 at 01:12:02PM +0000, Pete Batard wrote:
The existing logo bmp had its black level set to 7 instead of 0, which
produces a poor image quality on some LCDs. This patch fixes that.

Signed-off-by: Pete Batard <pete@akeo.ie>
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
Pushed as f72f81ebddb4.

---
Platform/RaspberryPi/Drivers/LogoDxe/Logo.bmp | Bin 185398 -> 185398 bytes
1 file changed, 0 insertions(+), 0 deletions(-)

diff --git a/Platform/RaspberryPi/Drivers/LogoDxe/Logo.bmp b/Platform/RaspberryPi/Drivers/LogoDxe/Logo.bmp
index 674356fe0b1b12c60ef485d27cb4a659eafe3485..8b407c0b132b8094d1eba326d3e05d314d48b0d2 100644
GIT binary patch
literal 185398


[edk2-non-osi][PATCH 1/1] Platforms/RPi: Fix logo black level

Pete Batard
 

The existing logo bmp had its black level set to 7 instead of 0, which
produces a poor image quality on some LCDs. This patch fixes that.

Signed-off-by: Pete Batard <pete@akeo.ie>
---
Platform/RaspberryPi/Drivers/LogoDxe/Logo.bmp | Bin 185398 -> 185398 bytes
1 file changed, 0 insertions(+), 0 deletions(-)

diff --git a/Platform/RaspberryPi/Drivers/LogoDxe/Logo.bmp b/Platform/RaspberryPi/Drivers/LogoDxe/Logo.bmp
index 674356fe0b1b12c60ef485d27cb4a659eafe3485..8b407c0b132b8094d1eba326d3e05d314d48b0d2 100644
GIT binary patch
literal 185398
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

literal 185398
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
Ll>0Db8uR}EsF|n^

--
2.21.0.windows.1


Re: [PATCH v1 1/1] BaseTools: Build ASL files before C files

PierreGondois
 

Hello Bob,


>> How do you compile 'SsdtSerialPortTemplate.asl' with the '-tc' to the .HEX file? , based on the build_rule.txt, I think the .asl output file is a .aml file.

[Pierre]
Our platform has the following flag:
[BuildOptions]
  *_*_*_ASL_FLAGS          = -tc

This flag is used in the build_rule.txt as shown below:
[Acpi-Source-Language-File]
    ...

    <Command.XXX>
        ...
        "$(ASL)" $(ASL_FLAGS) $(ASL_OUTFLAGS)${dst} $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.iiii

Regards,
Pierre


[PATCH V2 8/8] ShellPkg/SmbiosView: SMBIOS 3.3.0 Update "Intel persistent memory"

Gao, Zhichao
 

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2305

Memory Device (Type 17):
– SMBIOSCR00179: update the string for Intel persistent memory

Cc: Ray Ni <ray.ni@intel.com>
Cc: Sai Chaganty <rangasai.v.chaganty@intel.com>
Signed-off-by: Zhichao Gao <zhichao.gao@intel.com>
---
.../Library/UefiShellDebug1CommandsLib/SmbiosView/QueryTable.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/QueryTable.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/QueryTable.c
index b15de97248..7e37028d72 100644
--- a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/QueryTable.c
+++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/QueryTable.c
@@ -2639,7 +2639,7 @@ TABLE_ITEM MemoryDeviceMemoryTechnologyTable[] = {
},
{
0x07,
- L" Intel persistent memory"
+ L" Intel Optane DC Persistent Memory"
}
};

--
2.21.0.windows.1