cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

arm-smccc.h (5770B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * Copyright (c) 2015, Linaro Limited
      4 */
      5#ifndef __LINUX_ARM_SMCCC_H
      6#define __LINUX_ARM_SMCCC_H
      7
      8#include <linux/const.h>
      9
     10/*
     11 * This file provides common defines for ARM SMC Calling Convention as
     12 * specified in
     13 * https://developer.arm.com/docs/den0028/latest
     14 *
     15 * This code is up-to-date with version DEN 0028 C
     16 */
     17
     18#define ARM_SMCCC_STD_CALL	        _AC(0,U)
     19#define ARM_SMCCC_FAST_CALL	        _AC(1,U)
     20#define ARM_SMCCC_TYPE_SHIFT		31
     21
     22#define ARM_SMCCC_SMC_32		0
     23#define ARM_SMCCC_SMC_64		1
     24#define ARM_SMCCC_CALL_CONV_SHIFT	30
     25
     26#define ARM_SMCCC_OWNER_MASK		0x3F
     27#define ARM_SMCCC_OWNER_SHIFT		24
     28
     29#define ARM_SMCCC_FUNC_MASK		0xFFFF
     30
     31#define ARM_SMCCC_IS_FAST_CALL(smc_val)	\
     32	((smc_val) & (ARM_SMCCC_FAST_CALL << ARM_SMCCC_TYPE_SHIFT))
     33#define ARM_SMCCC_IS_64(smc_val) \
     34	((smc_val) & (ARM_SMCCC_SMC_64 << ARM_SMCCC_CALL_CONV_SHIFT))
     35#define ARM_SMCCC_FUNC_NUM(smc_val)	((smc_val) & ARM_SMCCC_FUNC_MASK)
     36#define ARM_SMCCC_OWNER_NUM(smc_val) \
     37	(((smc_val) >> ARM_SMCCC_OWNER_SHIFT) & ARM_SMCCC_OWNER_MASK)
     38
     39#define ARM_SMCCC_CALL_VAL(type, calling_convention, owner, func_num) \
     40	(((type) << ARM_SMCCC_TYPE_SHIFT) | \
     41	((calling_convention) << ARM_SMCCC_CALL_CONV_SHIFT) | \
     42	(((owner) & ARM_SMCCC_OWNER_MASK) << ARM_SMCCC_OWNER_SHIFT) | \
     43	((func_num) & ARM_SMCCC_FUNC_MASK))
     44
     45#define ARM_SMCCC_OWNER_ARCH		0
     46#define ARM_SMCCC_OWNER_CPU		1
     47#define ARM_SMCCC_OWNER_SIP		2
     48#define ARM_SMCCC_OWNER_OEM		3
     49#define ARM_SMCCC_OWNER_STANDARD	4
     50#define ARM_SMCCC_OWNER_STANDARD_HYP	5
     51#define ARM_SMCCC_OWNER_VENDOR_HYP	6
     52#define ARM_SMCCC_OWNER_TRUSTED_APP	48
     53#define ARM_SMCCC_OWNER_TRUSTED_APP_END	49
     54#define ARM_SMCCC_OWNER_TRUSTED_OS	50
     55#define ARM_SMCCC_OWNER_TRUSTED_OS_END	63
     56
     57#define ARM_SMCCC_FUNC_QUERY_CALL_UID  0xff01
     58
     59#define ARM_SMCCC_QUIRK_NONE		0
     60#define ARM_SMCCC_QUIRK_QCOM_A6		1 /* Save/restore register a6 */
     61
     62#define ARM_SMCCC_VERSION_1_0		0x10000
     63#define ARM_SMCCC_VERSION_1_1		0x10001
     64#define ARM_SMCCC_VERSION_1_2		0x10002
     65#define ARM_SMCCC_VERSION_1_3		0x10003
     66
     67#define ARM_SMCCC_1_3_SVE_HINT		0x10000
     68
     69#define ARM_SMCCC_VERSION_FUNC_ID					\
     70	ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,				\
     71			   ARM_SMCCC_SMC_32,				\
     72			   0, 0)
     73
     74#define ARM_SMCCC_ARCH_FEATURES_FUNC_ID					\
     75	ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,				\
     76			   ARM_SMCCC_SMC_32,				\
     77			   0, 1)
     78
     79#define ARM_SMCCC_ARCH_SOC_ID						\
     80	ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,				\
     81			   ARM_SMCCC_SMC_32,				\
     82			   0, 2)
     83
     84#define ARM_SMCCC_ARCH_WORKAROUND_1					\
     85	ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,				\
     86			   ARM_SMCCC_SMC_32,				\
     87			   0, 0x8000)
     88
     89#define ARM_SMCCC_ARCH_WORKAROUND_2					\
     90	ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,				\
     91			   ARM_SMCCC_SMC_32,				\
     92			   0, 0x7fff)
     93
     94#define ARM_SMCCC_ARCH_WORKAROUND_3					\
     95	ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,				\
     96			   ARM_SMCCC_SMC_32,				\
     97			   0, 0x3fff)
     98
     99#define ARM_SMCCC_VENDOR_HYP_CALL_UID_FUNC_ID				\
    100	ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,				\
    101			   ARM_SMCCC_SMC_32,				\
    102			   ARM_SMCCC_OWNER_VENDOR_HYP,			\
    103			   ARM_SMCCC_FUNC_QUERY_CALL_UID)
    104
    105/* KVM UID value: 28b46fb6-2ec5-11e9-a9ca-4b564d003a74 */
    106#define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_0	0xb66fb428U
    107#define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_1	0xe911c52eU
    108#define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_2	0x564bcaa9U
    109#define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_3	0x743a004dU
    110
    111/* KVM "vendor specific" services */
    112#define ARM_SMCCC_KVM_FUNC_FEATURES		0
    113#define ARM_SMCCC_KVM_FUNC_PTP			1
    114#define ARM_SMCCC_KVM_FUNC_FEATURES_2		127
    115#define ARM_SMCCC_KVM_NUM_FUNCS			128
    116
    117#define ARM_SMCCC_VENDOR_HYP_KVM_FEATURES_FUNC_ID			\
    118	ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,				\
    119			   ARM_SMCCC_SMC_32,				\
    120			   ARM_SMCCC_OWNER_VENDOR_HYP,			\
    121			   ARM_SMCCC_KVM_FUNC_FEATURES)
    122
    123#define SMCCC_ARCH_WORKAROUND_RET_UNAFFECTED	1
    124
    125/*
    126 * ptp_kvm is a feature used for time sync between vm and host.
    127 * ptp_kvm module in guest kernel will get service from host using
    128 * this hypercall ID.
    129 */
    130#define ARM_SMCCC_VENDOR_HYP_KVM_PTP_FUNC_ID				\
    131	ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,				\
    132			   ARM_SMCCC_SMC_32,				\
    133			   ARM_SMCCC_OWNER_VENDOR_HYP,			\
    134			   ARM_SMCCC_KVM_FUNC_PTP)
    135
    136/* ptp_kvm counter type ID */
    137#define KVM_PTP_VIRT_COUNTER			0
    138#define KVM_PTP_PHYS_COUNTER			1
    139
    140/* Paravirtualised time calls (defined by ARM DEN0057A) */
    141#define ARM_SMCCC_HV_PV_TIME_FEATURES				\
    142	ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,			\
    143			   ARM_SMCCC_SMC_64,			\
    144			   ARM_SMCCC_OWNER_STANDARD_HYP,	\
    145			   0x20)
    146
    147#define ARM_SMCCC_HV_PV_TIME_ST					\
    148	ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,			\
    149			   ARM_SMCCC_SMC_64,			\
    150			   ARM_SMCCC_OWNER_STANDARD_HYP,	\
    151			   0x21)
    152
    153/* TRNG entropy source calls (defined by ARM DEN0098) */
    154#define ARM_SMCCC_TRNG_VERSION					\
    155	ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,			\
    156			   ARM_SMCCC_SMC_32,			\
    157			   ARM_SMCCC_OWNER_STANDARD,		\
    158			   0x50)
    159
    160#define ARM_SMCCC_TRNG_FEATURES					\
    161	ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,			\
    162			   ARM_SMCCC_SMC_32,			\
    163			   ARM_SMCCC_OWNER_STANDARD,		\
    164			   0x51)
    165
    166#define ARM_SMCCC_TRNG_GET_UUID					\
    167	ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,			\
    168			   ARM_SMCCC_SMC_32,			\
    169			   ARM_SMCCC_OWNER_STANDARD,		\
    170			   0x52)
    171
    172#define ARM_SMCCC_TRNG_RND32					\
    173	ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,			\
    174			   ARM_SMCCC_SMC_32,			\
    175			   ARM_SMCCC_OWNER_STANDARD,		\
    176			   0x53)
    177
    178#define ARM_SMCCC_TRNG_RND64					\
    179	ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,			\
    180			   ARM_SMCCC_SMC_64,			\
    181			   ARM_SMCCC_OWNER_STANDARD,		\
    182			   0x53)
    183
    184/*
    185 * Return codes defined in ARM DEN 0070A
    186 * ARM DEN 0070A is now merged/consolidated into ARM DEN 0028 C
    187 */
    188#define SMCCC_RET_SUCCESS			0
    189#define SMCCC_RET_NOT_SUPPORTED			-1
    190#define SMCCC_RET_NOT_REQUIRED			-2
    191#define SMCCC_RET_INVALID_PARAMETER		-3
    192
    193#endif /*__LINUX_ARM_SMCCC_H*/