edk2/ArmPkg/Library/ArmMonitorLib/Arm/ArmMonitorLib.S

50 lines
1.0 KiB
ArmAsm

//
// Copyright (c) 2024, Google Llc. All rights reserved.
//
// SPDX-License-Identifier: BSD-2-Clause-Patent
//
//
#include <AsmMacroIoLib.h>
/** Monitor call.
An HyperVisor Call (HVC) or System Monitor Call (SMC) will be issued
depending on the default conduit. PcdMonitorConduitHvc determines the type
of the call: if true, do an HVC.
@param [in,out] Args Arguments for the HVC/SMC.
**/
ASM_FUNC(ArmMonitorCall)
push {r4-r7}
// Preserve R0 for later use
mov ip, r0
// Load the SMCCC arguments values into the appropriate registers
ldm r0, {r0-r7}
#if !defined(_PCD_VALUE_PcdMonitorConduitHvc)
#error
#elif _PCD_VALUE_PcdMonitorConduitHvc == 0
.arch_extension sec
smc #0
#elif _PCD_VALUE_PcdMonitorConduitHvc == 1
.arch_extension virt
hvc #0
#else
#error
#endif
// A SMCCC SMC32/HVC32 call can return up to 8 values.
stm ip, {r0-r7}
// Clear return values from registers
mov r0, #0
mov r1, #0
mov r2, #0
mov r3, #0
pop {r4-r7}
bx lr