[edk2-devel] [PATCH 6/6] OvmfPkg/ResetSystemLib: introduce the DxeResetSystemLib instance

Philippe Mathieu-Daudé philmd at redhat.com
Fri Apr 17 16:23:14 UTC 2020


On 4/17/20 5:37 PM, Laszlo Ersek wrote:
> The BaseResetSystemLib instance is not suitable for OS runtime, because
> its ResetShutdown() implementation calls PciRead16 (OVMF_HOSTBRIDGE_DID).
> On q35, this boils down to a memory-mapped config space access -- but we
> never ask the OS to map MMCONFIG for runtime.
> 
> There are at least three alternatives to approach this:
> 
> (1) Investigate "MdePkg/Library/DxeRuntimePciExpressLib", which offers
>      some kind of runtime mapping for MMCONFIG.
> 
> (2) Consume PciCf8Lib directly, rather than PciLib, in ResetSystemLib.
>      Then we'll read OVMF_HOSTBRIDGE_DID from the config space with IO port
>      accesses on q35 too, not just on i440fx. IO ports don't depend on page
>      tables.
> 
> (3) In the lib constructor, cache "mAcpiPmBaseAddress" based on
>      "PcdOvmfHostBridgePciDevId" (which is set by PlatformPei). Then the
>      host bridge type will be known at runtime without PCI config space
>      accesses.
> 
> This patch follows approach (3), in order to mirror AcpiTimerLib.

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

> 
> Notes:
> 
> * This patch is best viewed with "git show --find-copies-harder -C43".
> 
> * PCDs are not usable in the DXE_CORE, as the PCD PPI is gone, and the PCD
>    protocol is not available yet. (The DXE_CORE does consume ResetSystemLib
>    in practice, when OVMF is built with -D SOURCE_DEBUG_ENABLE.)
> 
> * The bug is not easy to trigger in common setups, because e.g. the Linux
>    guest cannot easily be convinced to use the EFI runtime service for
>    poweroff. One way to trigger the bug is to (a) patch OVMF as follows:
> 
>> diff --git a/OvmfPkg/Library/ResetSystemLib/ResetSystemLib.c b/OvmfPkg/Library/ResetSystemLib/ResetSystemLib.c
>> index fe51f53d1df2..1edc4349ad20 100644
>> --- a/OvmfPkg/Library/ResetSystemLib/ResetSystemLib.c
>> +++ b/OvmfPkg/Library/ResetSystemLib/ResetSystemLib.c
>> @@ -28,6 +28,7 @@ ResetCold (
>>     VOID
>>     )
>>   {
>> +  ResetShutdown ();
>>     IoWrite8 (0xCF9, BIT2 | BIT1); // 1st choice: PIIX3 RCR, RCPU|SRST
>>     MicroSecondDelay (50);
> 
>    (b) boot a Linux guest with "reboot=efi" on q35, and (c) reboot the
>    guest with the "reboot" command. Then the guest kernel will log:
> 
>> reboot: Restarting system
>> reboot: machine restart
>> ------------[ cut here ]------------
>> [Firmware Bug]: Page fault caused by firmware at PA: 0xb0000002
>> WARNING: CPU: 0 PID: 1362 at arch/x86/platform/efi/quirks.c:738
>> efi_recover_from_page_fault+0x2a/0xc8
>> Modules linked in: ip_set nfnetlink sunrpc vfat fat intel_rapl_msr
>> intel_rapl_common kvm_intel kvm irqbypass crct10dif_pclmul crc32_pclmul
>> bochs_drm drm_vram_helper ttm ghash_clmulni_intel drm_kms_helper
>> iTCO_wdt iTCO_vendor
>> CPU: 0 PID: 1362 Comm: reboot Not tainted 5.3.6-200.fc30.x86_64 #1
>> Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 0.0.0
>> 02/06/2015
>> RIP: 0010:efi_recover_from_page_fault+0x2a/0xc8
>> Code: 0f 1f 44 00 00 8b 15 35 c2 c1 01 85 d2 74 09 48 81 ff ff 0f 00 00
>> 77 01 c3 53 48 89 fe 48 c7 c7 58 ba 12 aa 50 e8 74 f0 00 00 <0f> 0b 83
>> 3d 0d c2 c1 01 0a 0f 84 8f 00 00 00 48 8b 05 70 c8 4a 01
>> RSP: 0018:ffffaf3a402539d8 EFLAGS: 00010286
>> RAX: 0000000000000000 RBX: ffff8a3c33711f40 RCX: 00000000000003b2
>> RDX: 0000000000000001 RSI: 0000000000000096 RDI: 0000000000000246
>> RBP: ffffaf3a40253a88 R08: 0000000000000000 R09: 00000000000003b2
>> R10: 0000000000000001 R11: ffffffffa9ee3800 R12: 00000000b0000002
>> R13: 0000000000000000 R14: 000000000000000b R15: 0000000000000001
>> FS:  00007fbca9cf8940(0000) GS:ffff8a3c3ae00000(0000)
>> knlGS:0000000000000000
>> CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
>> CR2: fffffffeff8a67a1 CR3: 0000000072868006 CR4: 00000000001606f0
>> Call Trace:
>>   no_context+0x15b/0x380
>>   ? do_user_addr_fault+0x12e/0x440
>>   do_page_fault+0x31/0x110
>>   async_page_fault+0x3e/0x50
>> RIP: 0010:0xfffffffeff8a67a1
>> Code: Bad RIP value.
>> RSP: 0018:ffffaf3a40253b30 EFLAGS: 00010046
>> RAX: 00000000b0000002 RBX: 0000000000000000 RCX: 00000000b0000002
>> RDX: 00000000b0000000 RSI: 0000000000000000 RDI: fffffffeff8a80f0
>> RBP: ffffaf3a40253b60 R08: fffffffeff8aadb8 R09: 0000000000000000
>> R10: ffffffffaa5762c0 R11: ffffffffa9ee3800 R12: 0000000000000000
>> R13: 0000000000000000 R14: 0000000000000046 R15: 0000000000000000
>>   ? efi_call+0x58/0x90
>>   ? virt_efi_reset_system+0x8d/0x100
>>   ? efi_reboot+0x85/0xb8
>>   ? native_machine_emergency_restart+0x9f/0x250
>>   ? native_apic_msr_read+0x16/0x20
>>   ? disconnect_bsp_APIC+0x8c/0xd0
>>   ? __do_sys_reboot+0x1d2/0x210
>>   ? __fput+0x168/0x250
>>   ? do_writev+0x6b/0x110
>>   ? do_syscall_64+0x5f/0x1a0
>>   ? entry_SYSCALL_64_after_hwframe+0x44/0xa9
>> ---[ end trace d5bee708166d198b ]---
>> efi: efi_reset_system() buggy! Reboot through BIOS
> 
> Cc: Anthony Perard <anthony.perard at citrix.com>
> Cc: Ard Biesheuvel <ard.biesheuvel at arm.com>
> Cc: Jordan Justen <jordan.l.justen at intel.com>
> Cc: Julien Grall <julien at xen.org>
> Cc: Philippe Mathieu-Daudé <philmd at redhat.com>
> Cc: Rebecca Cran <rebecca at bsdio.com>
> Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=2675
> Signed-off-by: Laszlo Ersek <lersek at redhat.com>
> ---
>   OvmfPkg/OvmfPkgIa32.dsc                                                          |  6 +++
>   OvmfPkg/OvmfPkgIa32X64.dsc                                                       |  6 +++
>   OvmfPkg/OvmfPkgX64.dsc                                                           |  6 +++
>   OvmfPkg/OvmfXen.dsc                                                              |  4 ++
>   OvmfPkg/Library/ResetSystemLib/BaseResetSystemLib.inf                            |  2 +-
>   OvmfPkg/Library/ResetSystemLib/{BaseResetSystemLib.inf => DxeResetSystemLib.inf} | 21 +++++----
>   OvmfPkg/Library/ResetSystemLib/{BaseResetShutdown.c => DxeResetShutdown.c}       | 49 ++++++++++++--------
>   7 files changed, 66 insertions(+), 28 deletions(-)
> 
> diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc
> index cd0ed34e0e5a..d5e90c001370 100644
> --- a/OvmfPkg/OvmfPkgIa32.dsc
> +++ b/OvmfPkg/OvmfPkgIa32.dsc
> @@ -314,6 +314,7 @@ [LibraryClasses.common.DXE_CORE]
>   [LibraryClasses.common.DXE_RUNTIME_DRIVER]
>     PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
>     TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf
> +  ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf
>     HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
>     DxeCoreEntryPoint|MdePkg/Library/DxeCoreEntryPoint/DxeCoreEntryPoint.inf
>     MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
> @@ -331,6 +332,7 @@ [LibraryClasses.common.DXE_RUNTIME_DRIVER]
>   [LibraryClasses.common.UEFI_DRIVER]
>     PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
>     TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf
> +  ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf
>     HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
>     DxeCoreEntryPoint|MdePkg/Library/DxeCoreEntryPoint/DxeCoreEntryPoint.inf
>     MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
> @@ -346,6 +348,7 @@ [LibraryClasses.common.UEFI_DRIVER]
>   [LibraryClasses.common.DXE_DRIVER]
>     PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
>     TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf
> +  ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf
>     HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
>     MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
>     ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf
> @@ -383,6 +386,7 @@ [LibraryClasses.common.DXE_DRIVER]
>   [LibraryClasses.common.UEFI_APPLICATION]
>     PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
>     TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf
> +  ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf
>     HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
>     MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
>     ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf
> @@ -396,6 +400,7 @@ [LibraryClasses.common.UEFI_APPLICATION]
>   [LibraryClasses.common.DXE_SMM_DRIVER]
>     PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
>     TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf
> +  ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf
>     MemoryAllocationLib|MdePkg/Library/SmmMemoryAllocationLib/SmmMemoryAllocationLib.inf
>     ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf
>     HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
> @@ -417,6 +422,7 @@ [LibraryClasses.common.DXE_SMM_DRIVER]
>   [LibraryClasses.common.SMM_CORE]
>     PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
>     TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf
> +  ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf
>     SmmCorePlatformHookLib|MdeModulePkg/Library/SmmCorePlatformHookLibNull/SmmCorePlatformHookLibNull.inf
>     MemoryAllocationLib|MdeModulePkg/Library/PiSmmCoreMemoryAllocationLib/PiSmmCoreMemoryAllocationLib.inf
>     ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf
> diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc
> index 3c377c6e858e..066f49aeaee0 100644
> --- a/OvmfPkg/OvmfPkgIa32X64.dsc
> +++ b/OvmfPkg/OvmfPkgIa32X64.dsc
> @@ -318,6 +318,7 @@ [LibraryClasses.common.DXE_CORE]
>   [LibraryClasses.common.DXE_RUNTIME_DRIVER]
>     PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
>     TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf
> +  ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf
>     HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
>     DxeCoreEntryPoint|MdePkg/Library/DxeCoreEntryPoint/DxeCoreEntryPoint.inf
>     MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
> @@ -335,6 +336,7 @@ [LibraryClasses.common.DXE_RUNTIME_DRIVER]
>   [LibraryClasses.common.UEFI_DRIVER]
>     PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
>     TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf
> +  ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf
>     HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
>     DxeCoreEntryPoint|MdePkg/Library/DxeCoreEntryPoint/DxeCoreEntryPoint.inf
>     MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
> @@ -350,6 +352,7 @@ [LibraryClasses.common.UEFI_DRIVER]
>   [LibraryClasses.common.DXE_DRIVER]
>     PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
>     TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf
> +  ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf
>     HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
>     MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
>     ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf
> @@ -387,6 +390,7 @@ [LibraryClasses.common.DXE_DRIVER]
>   [LibraryClasses.common.UEFI_APPLICATION]
>     PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
>     TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf
> +  ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf
>     HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
>     MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
>     ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf
> @@ -400,6 +404,7 @@ [LibraryClasses.common.UEFI_APPLICATION]
>   [LibraryClasses.common.DXE_SMM_DRIVER]
>     PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
>     TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf
> +  ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf
>     MemoryAllocationLib|MdePkg/Library/SmmMemoryAllocationLib/SmmMemoryAllocationLib.inf
>     ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf
>     HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
> @@ -421,6 +426,7 @@ [LibraryClasses.common.DXE_SMM_DRIVER]
>   [LibraryClasses.common.SMM_CORE]
>     PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
>     TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf
> +  ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf
>     SmmCorePlatformHookLib|MdeModulePkg/Library/SmmCorePlatformHookLibNull/SmmCorePlatformHookLibNull.inf
>     MemoryAllocationLib|MdeModulePkg/Library/PiSmmCoreMemoryAllocationLib/PiSmmCoreMemoryAllocationLib.inf
>     ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf
> diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc
> index 701a7ccea987..ac510522a9ff 100644
> --- a/OvmfPkg/OvmfPkgX64.dsc
> +++ b/OvmfPkg/OvmfPkgX64.dsc
> @@ -318,6 +318,7 @@ [LibraryClasses.common.DXE_CORE]
>   [LibraryClasses.common.DXE_RUNTIME_DRIVER]
>     PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
>     TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf
> +  ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf
>     HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
>     DxeCoreEntryPoint|MdePkg/Library/DxeCoreEntryPoint/DxeCoreEntryPoint.inf
>     MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
> @@ -335,6 +336,7 @@ [LibraryClasses.common.DXE_RUNTIME_DRIVER]
>   [LibraryClasses.common.UEFI_DRIVER]
>     PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
>     TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf
> +  ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf
>     HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
>     DxeCoreEntryPoint|MdePkg/Library/DxeCoreEntryPoint/DxeCoreEntryPoint.inf
>     MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
> @@ -350,6 +352,7 @@ [LibraryClasses.common.UEFI_DRIVER]
>   [LibraryClasses.common.DXE_DRIVER]
>     PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
>     TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf
> +  ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf
>     HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
>     MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
>     ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf
> @@ -387,6 +390,7 @@ [LibraryClasses.common.DXE_DRIVER]
>   [LibraryClasses.common.UEFI_APPLICATION]
>     PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
>     TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf
> +  ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf
>     HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
>     MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
>     ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf
> @@ -400,6 +404,7 @@ [LibraryClasses.common.UEFI_APPLICATION]
>   [LibraryClasses.common.DXE_SMM_DRIVER]
>     PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
>     TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf
> +  ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf
>     MemoryAllocationLib|MdePkg/Library/SmmMemoryAllocationLib/SmmMemoryAllocationLib.inf
>     ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf
>     HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
> @@ -421,6 +426,7 @@ [LibraryClasses.common.DXE_SMM_DRIVER]
>   [LibraryClasses.common.SMM_CORE]
>     PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
>     TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf
> +  ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf
>     SmmCorePlatformHookLib|MdeModulePkg/Library/SmmCorePlatformHookLibNull/SmmCorePlatformHookLibNull.inf
>     MemoryAllocationLib|MdeModulePkg/Library/PiSmmCoreMemoryAllocationLib/PiSmmCoreMemoryAllocationLib.inf
>     ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf
> diff --git a/OvmfPkg/OvmfXen.dsc b/OvmfPkg/OvmfXen.dsc
> index 86b24d1716b9..f6214bd3465a 100644
> --- a/OvmfPkg/OvmfXen.dsc
> +++ b/OvmfPkg/OvmfXen.dsc
> @@ -288,6 +288,7 @@ [LibraryClasses.common.DXE_CORE]
>   
>   [LibraryClasses.common.DXE_RUNTIME_DRIVER]
>     PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
> +  ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf
>     HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
>     DxeCoreEntryPoint|MdePkg/Library/DxeCoreEntryPoint/DxeCoreEntryPoint.inf
>     MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
> @@ -304,6 +305,7 @@ [LibraryClasses.common.DXE_RUNTIME_DRIVER]
>   
>   [LibraryClasses.common.UEFI_DRIVER]
>     PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
> +  ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf
>     HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
>     DxeCoreEntryPoint|MdePkg/Library/DxeCoreEntryPoint/DxeCoreEntryPoint.inf
>     MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
> @@ -318,6 +320,7 @@ [LibraryClasses.common.UEFI_DRIVER]
>   
>   [LibraryClasses.common.DXE_DRIVER]
>     PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
> +  ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf
>     HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
>     MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
>     ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf
> @@ -341,6 +344,7 @@ [LibraryClasses.common.DXE_DRIVER]
>   
>   [LibraryClasses.common.UEFI_APPLICATION]
>     PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
> +  ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf
>     HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
>     MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
>     ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf
> diff --git a/OvmfPkg/Library/ResetSystemLib/BaseResetSystemLib.inf b/OvmfPkg/Library/ResetSystemLib/BaseResetSystemLib.inf
> index 0772780b2dc2..35d317f1e0b3 100644
> --- a/OvmfPkg/Library/ResetSystemLib/BaseResetSystemLib.inf
> +++ b/OvmfPkg/Library/ResetSystemLib/BaseResetSystemLib.inf
> @@ -12,7 +12,7 @@ [Defines]
>     FILE_GUID                      = 66564872-21d4-4d2a-a68b-1e844f980820
>     MODULE_TYPE                    = BASE
>     VERSION_STRING                 = 1.0
> -  LIBRARY_CLASS                  = ResetSystemLib
> +  LIBRARY_CLASS                  = ResetSystemLib|SEC PEI_CORE PEIM DXE_CORE
>   
>   #
>   # The following information is for reference only and not required by the build
> diff --git a/OvmfPkg/Library/ResetSystemLib/BaseResetSystemLib.inf b/OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf
> similarity index 43%
> copy from OvmfPkg/Library/ResetSystemLib/BaseResetSystemLib.inf
> copy to OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf
> index 0772780b2dc2..a9b4ce90000a 100644
> --- a/OvmfPkg/Library/ResetSystemLib/BaseResetSystemLib.inf
> +++ b/OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf
> @@ -1,18 +1,20 @@
>   ## @file
> -#  Base library instance for ResetSystem library class for OVMF
> +#  DXE library instance for ResetSystem library class for OVMF
>   #
> +#  Copyright (C) 2020, Red Hat, Inc.
>   #  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
>   #  SPDX-License-Identifier: BSD-2-Clause-Patent
>   #
>   ##
>   
>   [Defines]
> -  INF_VERSION                    = 0x00010005
> -  BASE_NAME                      = BaseResetSystemLib
> -  FILE_GUID                      = 66564872-21d4-4d2a-a68b-1e844f980820
> -  MODULE_TYPE                    = BASE
> +  INF_VERSION                    = 1.29
> +  BASE_NAME                      = DxeResetSystemLib
> +  FILE_GUID                      = bc7835ea-4094-41fe-b770-bad9e6c479b2
> +  MODULE_TYPE                    = DXE_DRIVER
>     VERSION_STRING                 = 1.0
> -  LIBRARY_CLASS                  = ResetSystemLib
> +  LIBRARY_CLASS                  = ResetSystemLib|DXE_DRIVER DXE_RUNTIME_DRIVER SMM_CORE DXE_SMM_DRIVER UEFI_DRIVER UEFI_APPLICATION
> +  CONSTRUCTOR                    = DxeResetInit
>   
>   #
>   # The following information is for reference only and not required by the build
> @@ -22,7 +24,7 @@ [Defines]
>   #
>   
>   [Sources]
> -  BaseResetShutdown.c
> +  DxeResetShutdown.c
>     ResetSystemLib.c
>   
>   [Packages]
> @@ -34,5 +36,8 @@ [LibraryClasses]
>     BaseLib
>     DebugLib
>     IoLib
> -  PciLib
> +  PcdLib
>     TimerLib
> +
> +[Pcd]
> +  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfHostBridgePciDevId ## CONSUMES
> diff --git a/OvmfPkg/Library/ResetSystemLib/BaseResetShutdown.c b/OvmfPkg/Library/ResetSystemLib/DxeResetShutdown.c
> similarity index 57%
> copy from OvmfPkg/Library/ResetSystemLib/BaseResetShutdown.c
> copy to OvmfPkg/Library/ResetSystemLib/DxeResetShutdown.c
> index 21c80e43230c..5a75c32df361 100644
> --- a/OvmfPkg/Library/ResetSystemLib/BaseResetShutdown.c
> +++ b/OvmfPkg/Library/ResetSystemLib/DxeResetShutdown.c
> @@ -1,5 +1,5 @@
>   /** @file
> -  Base Reset System Library Shutdown API implementation for OVMF.
> +  DXE Reset System Library Shutdown API implementation for OVMF.
>   
>     Copyright (C) 2020, Red Hat, Inc.
>     Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
> @@ -11,41 +11,52 @@
>   #include <Library/BaseLib.h>        // CpuDeadLoop()
>   #include <Library/DebugLib.h>       // ASSERT()
>   #include <Library/IoLib.h>          // IoOr16()
> -#include <Library/PciLib.h>         // PciRead16()
> +#include <Library/PcdLib.h>         // PcdGet16()
>   #include <Library/ResetSystemLib.h> // ResetShutdown()
> -#include <OvmfPlatforms.h>          // OVMF_HOSTBRIDGE_DID
> +#include <OvmfPlatforms.h>          // PIIX4_PMBA_VALUE
>   
> -/**
> -  Calling this function causes the system to enter a power state equivalent
> -  to the ACPI G2/S5 or G3 states.
> +STATIC UINT16 mAcpiPmBaseAddress;
>   
> -  System shutdown should not return, if it returns, it means the system does
> -  not support shut down reset.
> -**/
> -VOID
> +EFI_STATUS
>   EFIAPI
> -ResetShutdown (
> -  VOID
> +DxeResetInit (
> +  IN EFI_HANDLE       ImageHandle,
> +  IN EFI_SYSTEM_TABLE *SystemTable
>     )
>   {
> -  UINT16 AcpiPmBaseAddress;
>     UINT16 HostBridgeDevId;
>   
> -  AcpiPmBaseAddress = 0;
> -  HostBridgeDevId = PciRead16 (OVMF_HOSTBRIDGE_DID);
> +  HostBridgeDevId = PcdGet16 (PcdOvmfHostBridgePciDevId);
>     switch (HostBridgeDevId) {
>     case INTEL_82441_DEVICE_ID:
> -    AcpiPmBaseAddress = PIIX4_PMBA_VALUE;
> +    mAcpiPmBaseAddress = PIIX4_PMBA_VALUE;
>       break;
>     case INTEL_Q35_MCH_DEVICE_ID:
> -    AcpiPmBaseAddress = ICH9_PMBASE_VALUE;
> +    mAcpiPmBaseAddress = ICH9_PMBASE_VALUE;
>       break;
>     default:
>       ASSERT (FALSE);
>       CpuDeadLoop ();
> +    return EFI_UNSUPPORTED;
>     }
>   
> -  IoBitFieldWrite16 (AcpiPmBaseAddress + 4, 10, 13, 0);
> -  IoOr16 (AcpiPmBaseAddress + 4, BIT13);
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  Calling this function causes the system to enter a power state equivalent
> +  to the ACPI G2/S5 or G3 states.
> +
> +  System shutdown should not return, if it returns, it means the system does
> +  not support shut down reset.
> +**/
> +VOID
> +EFIAPI
> +ResetShutdown (
> +  VOID
> +  )
> +{
> +  IoBitFieldWrite16 (mAcpiPmBaseAddress + 4, 10, 13, 0);
> +  IoOr16 (mAcpiPmBaseAddress + 4, BIT13);
>     CpuDeadLoop ();
>   }
> 


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#57531): https://edk2.groups.io/g/devel/message/57531
Mute This Topic: https://groups.io/mt/73085509/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-





More information about the edk2-devel-archive mailing list