zx_smc_call
名称
smc_call —— 从用户空间进行安全监控器调用(SMC)
概要
#include <zircon/syscalls.h>
#include <zircon/syscalls/smc.h>
typedef struct zx_smc_parameters {
uint32_t func_id;
uint64_t arg1;
uint64_t arg2;
uint64_t arg3;
uint64_t arg4;
uint64_t arg5;
uint64_t arg6;
uint16_t client_id;
uint16_t secure_os_id;
} zx_smc_parameters_t;
typedef struct zx_smc_result {
uint64_t arg0;
uint64_t arg1;
uint64_t arg2;
uint64_t arg3;
} zx_smc_result_t;
zx_status_t zx_smc_call(zx_handle_t handle,
const zx_smc_parameters_t* parameters,
zx_smc_result_t* out_smc_result);
描述
smc_call() 的功能是从用户空间进行安全监视器调用(SMC)。 它使用zx_smc_parameters_t类型的输入参数和zx_smc_result_t类型的输出参数去支持ARM的SMC调用约定。 输入参数handle必须是具有足够权限的资源对象才能执行该调用。
从smc_call的角度看,大多数参数都是不透明的(opaque),因为它们依赖于func_id。 func_id通知安全监视器要调用的服务和函数。 client_id是一个可选字段,用于安全软件跟踪和索引调用的客户OS。 secure_os_id也是可选字段,用于在S-EL1上有多个安全操作系统时使用,以便于调用者可以指定预期的安全OS。
更多信息请参见ARM的SMC调用约定文档。
权限
TODO(ZX-2399)
返回值
如果handle句柄具有足够的权限,smc_call() 成功则返回ZX_OK,并通过out_smc_result返回smc调用的返回值。如果调用失败,则返回下列错误码之一。
错误码
ZX_ERR_BAD_HANDLE:handle是无效句柄。
ZX_ERR_WRONG_TYPE:handle不是资源类型句柄。
ZX_ERR_ACCESS_DENIED:handle没有足够的权限。
ZX_ERR_NOT_SUPPORTED:此系统上不支持smc_call。
ZX_ERR_INVALID_ARGS:parameters或out_smc_result是空指针。