/* * This file is provided under a dual BSD/GPLv2 license. When using or * redistributing this file, you may do so under either license. * * GPL LICENSE SUMMARY * * Copyright(c) 2016-2017 Intel Corporation. * * This program is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * Contact Information: * Jarkko Sakkinen * Intel Finland Oy - BIC 0357606-4 - Westendinkatu 7, 02160 Espoo * * BSD LICENSE * * Copyright(c) 2016-2017 Intel Corporation. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of Intel Corporation nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Authors: * * Jarkko Sakkinen */ #include #ifndef _ASM_X86_SGX_ARCH_H #define _ASM_X86_SGX_ARCH_H #define SGX_SSA_GPRS_SIZE 182 #define SGX_SSA_MISC_EXINFO_SIZE 16 enum sgx_misc { SGX_MISC_EXINFO = 0x01, }; #define SGX_MISC_RESERVED_MASK 0xFFFFFFFFFFFFFFFEL enum sgx_attribute { SGX_ATTR_DEBUG = 0x02, SGX_ATTR_MODE64BIT = 0x04, SGX_ATTR_PROVISIONKEY = 0x10, SGX_ATTR_EINITTOKENKEY = 0x20, }; #define SGX_ATTR_RESERVED_MASK 0xFFFFFFFFFFFFFFC9L #define SGX_SECS_RESERVED1_SIZE 24 #define SGX_SECS_RESERVED2_SIZE 32 #define SGX_SECS_RESERVED3_SIZE 96 #define SGX_SECS_RESERVED4_SIZE 3836 struct sgx_secs { uint64_t size; uint64_t base; uint32_t ssaframesize; uint32_t miscselect; uint8_t reserved1[SGX_SECS_RESERVED1_SIZE]; uint64_t attributes; uint64_t xfrm; uint32_t mrenclave[8]; uint8_t reserved2[SGX_SECS_RESERVED2_SIZE]; uint32_t mrsigner[8]; uint8_t reserved3[SGX_SECS_RESERVED3_SIZE]; uint16_t isvvprodid; uint16_t isvsvn; uint8_t reserved4[SGX_SECS_RESERVED4_SIZE]; }; enum sgx_tcs_flags { SGX_TCS_DBGOPTIN = 0x01, /* cleared on EADD */ }; #define SGX_TCS_RESERVED_MASK 0xFFFFFFFFFFFFFFFEL struct sgx_tcs { uint64_t state; uint64_t flags; uint64_t ossa; uint32_t cssa; uint32_t nssa; uint64_t oentry; uint64_t aep; uint64_t ofsbase; uint64_t ogsbase; uint32_t fslimit; uint32_t gslimit; uint64_t reserved[503]; }; struct sgx_pageinfo { uint64_t linaddr; uint64_t srcpge; union { uint64_t secinfo; uint64_t pcmd; }; uint64_t secs; } __attribute__((aligned(32))); #define SGX_SECINFO_PERMISSION_MASK 0x0000000000000007L #define SGX_SECINFO_PAGE_TYPE_MASK 0x000000000000FF00L #define SGX_SECINFO_RESERVED_MASK 0xFFFFFFFFFFFF00F8L enum sgx_page_type { SGX_PAGE_TYPE_SECS = 0x00, SGX_PAGE_TYPE_TCS = 0x01, SGX_PAGE_TYPE_REG = 0x02, SGX_PAGE_TYPE_VA = 0x03, }; enum sgx_secinfo_flags { SGX_SECINFO_R = 0x01, SGX_SECINFO_W = 0x02, SGX_SECINFO_X = 0x04, SGX_SECINFO_SECS = (SGX_PAGE_TYPE_SECS << 8), SGX_SECINFO_TCS = (SGX_PAGE_TYPE_TCS << 8), SGX_SECINFO_REG = (SGX_PAGE_TYPE_REG << 8), }; struct sgx_secinfo { uint64_t flags; uint64_t reserved[7]; } __attribute__((aligned(64))); struct sgx_pcmd { struct sgx_secinfo secinfo; uint64_t enclave_id; uint8_t reserved[40]; uint8_t mac[16]; }; #define SGX_MODULUS_SIZE 384 struct sgx_sigstruct_header { uint64_t header1[2]; uint32_t vendor; uint32_t date; uint64_t header2[2]; uint32_t swdefined; uint8_t reserved1[84]; }; struct sgx_sigstruct_body { uint32_t miscselect; uint32_t miscmask; uint8_t reserved2[20]; uint64_t attributes; uint64_t xfrm; uint8_t attributemask[16]; uint8_t mrenclave[32]; uint8_t reserved3[32]; uint16_t isvprodid; uint16_t isvsvn; } __attribute__((__packed__)); struct sgx_sigstruct { struct sgx_sigstruct_header header; uint8_t modulus[SGX_MODULUS_SIZE]; uint32_t exponent; uint8_t signature[SGX_MODULUS_SIZE]; struct sgx_sigstruct_body body; uint8_t reserved4[12]; uint8_t q1[SGX_MODULUS_SIZE]; uint8_t q2[SGX_MODULUS_SIZE]; }; struct sgx_sigstruct_payload { struct sgx_sigstruct_header header; struct sgx_sigstruct_body body; }; struct sgx_einittoken_payload { uint32_t valid; uint32_t reserved1[11]; uint64_t attributes; uint64_t xfrm; uint8_t mrenclave[32]; uint8_t reserved2[32]; uint8_t mrsigner[32]; uint8_t reserved3[32]; }; struct sgx_einittoken { struct sgx_einittoken_payload payload; uint8_t cpusvnle[16]; uint16_t isvprodidle; uint16_t isvsvnle; uint8_t reserved2[24]; uint32_t maskedmiscselectle; uint64_t maskedattributesle; uint64_t maskedxfrmle; uint8_t keyid[32]; uint8_t mac[16]; }; struct sgx_report { uint8_t cpusvn[16]; uint32_t miscselect; uint8_t reserved1[28]; uint64_t attributes; uint64_t xfrm; uint8_t mrenclave[32]; uint8_t reserved2[32]; uint8_t mrsigner[32]; uint8_t reserved3[96]; uint16_t isvprodid; uint16_t isvsvn; uint8_t reserved4[60]; uint8_t reportdata[64]; uint8_t keyid[32]; uint8_t mac[16]; }; struct sgx_targetinfo { uint8_t mrenclave[32]; uint64_t attributes; uint64_t xfrm; uint8_t reserved1[4]; uint32_t miscselect; uint8_t reserved2[456]; }; struct sgx_keyrequest { uint16_t keyname; uint16_t keypolicy; uint16_t isvsvn; uint16_t reserved1; uint8_t cpusvn[16]; uint64_t attributemask; uint64_t xfrmmask; uint8_t keyid[32]; uint32_t miscmask; uint8_t reserved2[436]; }; #endif /* _ASM_X86_SGX_ARCH_H */