1*f80ad8b4SAndroid Build Coastguard Worker /* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */ 2*f80ad8b4SAndroid Build Coastguard Worker /* 3*f80ad8b4SAndroid Build Coastguard Worker * Userspace interface for AMD SEV and SNP guest driver. 4*f80ad8b4SAndroid Build Coastguard Worker * 5*f80ad8b4SAndroid Build Coastguard Worker * Copyright (C) 2021 Advanced Micro Devices, Inc. 6*f80ad8b4SAndroid Build Coastguard Worker * 7*f80ad8b4SAndroid Build Coastguard Worker * Author: Brijesh Singh <[email protected]> 8*f80ad8b4SAndroid Build Coastguard Worker * 9*f80ad8b4SAndroid Build Coastguard Worker * SEV API specification is available at: https://developer.amd.com/sev/ 10*f80ad8b4SAndroid Build Coastguard Worker */ 11*f80ad8b4SAndroid Build Coastguard Worker 12*f80ad8b4SAndroid Build Coastguard Worker #ifndef __UAPI_LINUX_SEV_GUEST_H_ 13*f80ad8b4SAndroid Build Coastguard Worker #define __UAPI_LINUX_SEV_GUEST_H_ 14*f80ad8b4SAndroid Build Coastguard Worker 15*f80ad8b4SAndroid Build Coastguard Worker #include <linux/types.h> 16*f80ad8b4SAndroid Build Coastguard Worker 17*f80ad8b4SAndroid Build Coastguard Worker #define SNP_REPORT_USER_DATA_SIZE 64 18*f80ad8b4SAndroid Build Coastguard Worker 19*f80ad8b4SAndroid Build Coastguard Worker struct snp_report_req { 20*f80ad8b4SAndroid Build Coastguard Worker /* user data that should be included in the report */ 21*f80ad8b4SAndroid Build Coastguard Worker __u8 user_data[SNP_REPORT_USER_DATA_SIZE]; 22*f80ad8b4SAndroid Build Coastguard Worker 23*f80ad8b4SAndroid Build Coastguard Worker /* The vmpl level to be included in the report */ 24*f80ad8b4SAndroid Build Coastguard Worker __u32 vmpl; 25*f80ad8b4SAndroid Build Coastguard Worker 26*f80ad8b4SAndroid Build Coastguard Worker /* Must be zero filled */ 27*f80ad8b4SAndroid Build Coastguard Worker __u8 rsvd[28]; 28*f80ad8b4SAndroid Build Coastguard Worker }; 29*f80ad8b4SAndroid Build Coastguard Worker 30*f80ad8b4SAndroid Build Coastguard Worker struct snp_report_resp { 31*f80ad8b4SAndroid Build Coastguard Worker /* response data, see SEV-SNP spec for the format */ 32*f80ad8b4SAndroid Build Coastguard Worker __u8 data[4000]; 33*f80ad8b4SAndroid Build Coastguard Worker }; 34*f80ad8b4SAndroid Build Coastguard Worker 35*f80ad8b4SAndroid Build Coastguard Worker struct snp_derived_key_req { 36*f80ad8b4SAndroid Build Coastguard Worker __u32 root_key_select; 37*f80ad8b4SAndroid Build Coastguard Worker __u32 rsvd; 38*f80ad8b4SAndroid Build Coastguard Worker __u64 guest_field_select; 39*f80ad8b4SAndroid Build Coastguard Worker __u32 vmpl; 40*f80ad8b4SAndroid Build Coastguard Worker __u32 guest_svn; 41*f80ad8b4SAndroid Build Coastguard Worker __u64 tcb_version; 42*f80ad8b4SAndroid Build Coastguard Worker }; 43*f80ad8b4SAndroid Build Coastguard Worker 44*f80ad8b4SAndroid Build Coastguard Worker struct snp_derived_key_resp { 45*f80ad8b4SAndroid Build Coastguard Worker /* response data, see SEV-SNP spec for the format */ 46*f80ad8b4SAndroid Build Coastguard Worker __u8 data[64]; 47*f80ad8b4SAndroid Build Coastguard Worker }; 48*f80ad8b4SAndroid Build Coastguard Worker 49*f80ad8b4SAndroid Build Coastguard Worker struct snp_guest_request_ioctl { 50*f80ad8b4SAndroid Build Coastguard Worker /* message version number (must be non-zero) */ 51*f80ad8b4SAndroid Build Coastguard Worker __u8 msg_version; 52*f80ad8b4SAndroid Build Coastguard Worker 53*f80ad8b4SAndroid Build Coastguard Worker /* Request and response structure address */ 54*f80ad8b4SAndroid Build Coastguard Worker __u64 req_data; 55*f80ad8b4SAndroid Build Coastguard Worker __u64 resp_data; 56*f80ad8b4SAndroid Build Coastguard Worker 57*f80ad8b4SAndroid Build Coastguard Worker /* bits[63:32]: VMM error code, bits[31:0] firmware error code (see psp-sev.h) */ 58*f80ad8b4SAndroid Build Coastguard Worker union { 59*f80ad8b4SAndroid Build Coastguard Worker __u64 exitinfo2; 60*f80ad8b4SAndroid Build Coastguard Worker struct { 61*f80ad8b4SAndroid Build Coastguard Worker __u32 fw_error; 62*f80ad8b4SAndroid Build Coastguard Worker __u32 vmm_error; 63*f80ad8b4SAndroid Build Coastguard Worker }; 64*f80ad8b4SAndroid Build Coastguard Worker }; 65*f80ad8b4SAndroid Build Coastguard Worker }; 66*f80ad8b4SAndroid Build Coastguard Worker 67*f80ad8b4SAndroid Build Coastguard Worker struct snp_ext_report_req { 68*f80ad8b4SAndroid Build Coastguard Worker struct snp_report_req data; 69*f80ad8b4SAndroid Build Coastguard Worker 70*f80ad8b4SAndroid Build Coastguard Worker /* where to copy the certificate blob */ 71*f80ad8b4SAndroid Build Coastguard Worker __u64 certs_address; 72*f80ad8b4SAndroid Build Coastguard Worker 73*f80ad8b4SAndroid Build Coastguard Worker /* length of the certificate blob */ 74*f80ad8b4SAndroid Build Coastguard Worker __u32 certs_len; 75*f80ad8b4SAndroid Build Coastguard Worker }; 76*f80ad8b4SAndroid Build Coastguard Worker 77*f80ad8b4SAndroid Build Coastguard Worker #define SNP_GUEST_REQ_IOC_TYPE 'S' 78*f80ad8b4SAndroid Build Coastguard Worker 79*f80ad8b4SAndroid Build Coastguard Worker /* Get SNP attestation report */ 80*f80ad8b4SAndroid Build Coastguard Worker #define SNP_GET_REPORT _IOWR(SNP_GUEST_REQ_IOC_TYPE, 0x0, struct snp_guest_request_ioctl) 81*f80ad8b4SAndroid Build Coastguard Worker 82*f80ad8b4SAndroid Build Coastguard Worker /* Get a derived key from the root */ 83*f80ad8b4SAndroid Build Coastguard Worker #define SNP_GET_DERIVED_KEY _IOWR(SNP_GUEST_REQ_IOC_TYPE, 0x1, struct snp_guest_request_ioctl) 84*f80ad8b4SAndroid Build Coastguard Worker 85*f80ad8b4SAndroid Build Coastguard Worker /* Get SNP extended report as defined in the GHCB specification version 2. */ 86*f80ad8b4SAndroid Build Coastguard Worker #define SNP_GET_EXT_REPORT _IOWR(SNP_GUEST_REQ_IOC_TYPE, 0x2, struct snp_guest_request_ioctl) 87*f80ad8b4SAndroid Build Coastguard Worker 88*f80ad8b4SAndroid Build Coastguard Worker /* Guest message request EXIT_INFO_2 constants */ 89*f80ad8b4SAndroid Build Coastguard Worker #define SNP_GUEST_FW_ERR_MASK GENMASK_ULL(31, 0) 90*f80ad8b4SAndroid Build Coastguard Worker #define SNP_GUEST_VMM_ERR_SHIFT 32 91*f80ad8b4SAndroid Build Coastguard Worker #define SNP_GUEST_VMM_ERR(x) (((u64)x) << SNP_GUEST_VMM_ERR_SHIFT) 92*f80ad8b4SAndroid Build Coastguard Worker #define SNP_GUEST_FW_ERR(x) ((x) & SNP_GUEST_FW_ERR_MASK) 93*f80ad8b4SAndroid Build Coastguard Worker #define SNP_GUEST_ERR(vmm_err, fw_err) (SNP_GUEST_VMM_ERR(vmm_err) | \ 94*f80ad8b4SAndroid Build Coastguard Worker SNP_GUEST_FW_ERR(fw_err)) 95*f80ad8b4SAndroid Build Coastguard Worker 96*f80ad8b4SAndroid Build Coastguard Worker #define SNP_GUEST_VMM_ERR_INVALID_LEN 1 97*f80ad8b4SAndroid Build Coastguard Worker #define SNP_GUEST_VMM_ERR_BUSY 2 98*f80ad8b4SAndroid Build Coastguard Worker 99*f80ad8b4SAndroid Build Coastguard Worker #endif /* __UAPI_LINUX_SEV_GUEST_H_ */ 100