audk/MdeModulePkg/Universal/CapsuleRuntimeDxe
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
..
Arm MdeModulePkg/CapsuleRuntimeDxe: clean the capsule payload to DRAM 2018-06-15 18:17:44 +02:00
X64 MdeModulePkg: Error Level is not used correctly 2017-04-12 08:56:12 +08:00
CapsuleReset.c MdeModulePkg/CapsuleRuntimeDxe: clean the capsule payload to DRAM 2018-06-15 18:17:44 +02:00
CapsuleRuntimeDxe.inf MdeModulePkg/CapsuleRuntimeDxe: clean the capsule payload to DRAM 2018-06-15 18:17:44 +02:00
CapsuleRuntimeDxe.uni MdeModulePkg: Convert all .uni files to utf-8 2015-12-15 04:56:23 +00:00
CapsuleRuntimeDxeExtra.uni MdeModulePkg: Convert all .uni files to utf-8 2015-12-15 04:56:23 +00:00
CapsuleService.c MdeModulePkg/CapsuleRuntimeDxe: clean the capsule payload to DRAM 2018-06-15 18:17:44 +02:00
CapsuleService.h MdeModulePkg/CapsuleRuntimeDxe: clean the capsule payload to DRAM 2018-06-15 18:17:44 +02:00
SaveLongModeContext.c Add capsule > 4GB support. When capsule data is put above 4GB, IA32 PEI transfers to long mode to get capsule data. 2011-09-02 11:34:35 +00:00