audk/MdeModulePkg
Ard Biesheuvel e077a93dc6 MdeModulePkg/CapsuleRuntimeDxe: clean the capsule payload to DRAM
When capsule updates are staged for processing after a warm reboot,
they are copied into memory with the MMU and caches enabled. When
the capsule PEI gets around to coalescing the capsule, the MMU and
caches may still be disabled, and so on architectures where uncached
accesses are incoherent with the caches (such as ARM and AARCH64),
we need to ensure that the data passed into UpdateCapsule() is
written back to main memory before performing the warm reboot.

Unfortunately, on ARM, the only type of cache maintenance instructions
that are suitable for this purpose operate on virtual addresses only,
and given that the UpdateCapsule() prototype includes the physical
address of a linked list of scatter/gather data structures that are
mapped at an address that is unknown to the firmware (and may not even
be mapped at all when UpdateCapsule() is invoked), we can only perform
this cache maintenance at boot time. Fortunately, both Windows and Linux
only invoke UpdateCapsule() before calling ExitBootServices(), so this
is not a problem in practice.

In the future, we may propose adding a secure firmware service that
permits performing the cache maintenance at OS runtime, in which case
this code may be enhanced to call that service if available. For now,
we just fail any UpdateCapsule() calls performed at OS runtime on ARM.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Reviewed-by: Star Zeng <star.zeng@intel.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
2018-06-15 18:17:44 +02:00
..
Application MdeModulePkg BootManagerMenuApp: Update usage info for BootLogo protocol 2018-06-05 14:23:48 +08:00
Bus MdeModulePkg/IncompPciDeviceSupport: Use correct descriptor length 2018-06-14 16:38:15 +08:00
Core MdeModulePkg: Remove X86 ASM and S files 2018-06-07 15:26:27 +08:00
Include MdeModulePkg: Add AtaAtapiPolicy protocol definition 2018-06-08 17:46:45 +08:00
Library MdeModulePkg/Library/BaseSerialPortLib16550: Ensure FIFO Polled Mode 2018-06-11 10:40:20 +08:00
Logo MdeModulePkg/Logo.idf: Remove incorrect comments. 2018-02-28 15:30:23 +08:00
Universal MdeModulePkg/CapsuleRuntimeDxe: clean the capsule payload to DRAM 2018-06-15 18:17:44 +02:00
MdeModulePkg.dec MdeModulePkg: Add AtaAtapiPolicy protocol definition 2018-06-08 17:46:45 +08:00
MdeModulePkg.dsc MdeModulePkg: Make sure ResetSystemRuntimeDxe uses ResetSystemLibNull 2018-06-05 13:49:18 +08:00
MdeModulePkg.uni MdeModulePkg/Variable/RuntimeDxe: introduce PcdMaxVolatileVariableSize 2018-03-30 21:17:07 +02:00
MdeModulePkgExtra.uni MdeModulePkg: Convert all .uni files to utf-8 2015-12-15 04:56:23 +00:00