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

sgx.h (5991B)


      1/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
      2/*
      3 * Copyright(c) 2016-20 Intel Corporation.
      4 */
      5#ifndef _UAPI_ASM_X86_SGX_H
      6#define _UAPI_ASM_X86_SGX_H
      7
      8#include <linux/types.h>
      9#include <linux/ioctl.h>
     10
     11/**
     12 * enum sgx_page_flags - page control flags
     13 * %SGX_PAGE_MEASURE:	Measure the page contents with a sequence of
     14 *			ENCLS[EEXTEND] operations.
     15 */
     16enum sgx_page_flags {
     17	SGX_PAGE_MEASURE	= 0x01,
     18};
     19
     20#define SGX_MAGIC 0xA4
     21
     22#define SGX_IOC_ENCLAVE_CREATE \
     23	_IOW(SGX_MAGIC, 0x00, struct sgx_enclave_create)
     24#define SGX_IOC_ENCLAVE_ADD_PAGES \
     25	_IOWR(SGX_MAGIC, 0x01, struct sgx_enclave_add_pages)
     26#define SGX_IOC_ENCLAVE_INIT \
     27	_IOW(SGX_MAGIC, 0x02, struct sgx_enclave_init)
     28#define SGX_IOC_ENCLAVE_PROVISION \
     29	_IOW(SGX_MAGIC, 0x03, struct sgx_enclave_provision)
     30#define SGX_IOC_VEPC_REMOVE_ALL \
     31	_IO(SGX_MAGIC, 0x04)
     32
     33/**
     34 * struct sgx_enclave_create - parameter structure for the
     35 *                             %SGX_IOC_ENCLAVE_CREATE ioctl
     36 * @src:	address for the SECS page data
     37 */
     38struct sgx_enclave_create  {
     39	__u64	src;
     40};
     41
     42/**
     43 * struct sgx_enclave_add_pages - parameter structure for the
     44 *                                %SGX_IOC_ENCLAVE_ADD_PAGE ioctl
     45 * @src:	start address for the page data
     46 * @offset:	starting page offset
     47 * @length:	length of the data (multiple of the page size)
     48 * @secinfo:	address for the SECINFO data
     49 * @flags:	page control flags
     50 * @count:	number of bytes added (multiple of the page size)
     51 */
     52struct sgx_enclave_add_pages {
     53	__u64 src;
     54	__u64 offset;
     55	__u64 length;
     56	__u64 secinfo;
     57	__u64 flags;
     58	__u64 count;
     59};
     60
     61/**
     62 * struct sgx_enclave_init - parameter structure for the
     63 *                           %SGX_IOC_ENCLAVE_INIT ioctl
     64 * @sigstruct:	address for the SIGSTRUCT data
     65 */
     66struct sgx_enclave_init {
     67	__u64 sigstruct;
     68};
     69
     70/**
     71 * struct sgx_enclave_provision - parameter structure for the
     72 *				  %SGX_IOC_ENCLAVE_PROVISION ioctl
     73 * @fd:		file handle of /dev/sgx_provision
     74 */
     75struct sgx_enclave_provision {
     76	__u64 fd;
     77};
     78
     79struct sgx_enclave_run;
     80
     81/**
     82 * typedef sgx_enclave_user_handler_t - Exit handler function accepted by
     83 *					__vdso_sgx_enter_enclave()
     84 * @run:	The run instance given by the caller
     85 *
     86 * The register parameters contain the snapshot of their values at enclave
     87 * exit. An invalid ENCLU function number will cause -EINVAL to be returned
     88 * to the caller.
     89 *
     90 * Return:
     91 * - <= 0:	The given value is returned back to the caller.
     92 * - > 0:	ENCLU function to invoke, either EENTER or ERESUME.
     93 */
     94typedef int (*sgx_enclave_user_handler_t)(long rdi, long rsi, long rdx,
     95					  long rsp, long r8, long r9,
     96					  struct sgx_enclave_run *run);
     97
     98/**
     99 * struct sgx_enclave_run - the execution context of __vdso_sgx_enter_enclave()
    100 * @tcs:			TCS used to enter the enclave
    101 * @function:			The last seen ENCLU function (EENTER, ERESUME or EEXIT)
    102 * @exception_vector:		The interrupt vector of the exception
    103 * @exception_error_code:	The exception error code pulled out of the stack
    104 * @exception_addr:		The address that triggered the exception
    105 * @user_handler:		User provided callback run on exception
    106 * @user_data:			Data passed to the user handler
    107 * @reserved			Reserved for future extensions
    108 *
    109 * If @user_handler is provided, the handler will be invoked on all return paths
    110 * of the normal flow.  The user handler may transfer control, e.g. via a
    111 * longjmp() call or a C++ exception, without returning to
    112 * __vdso_sgx_enter_enclave().
    113 */
    114struct sgx_enclave_run {
    115	__u64 tcs;
    116	__u32 function;
    117	__u16 exception_vector;
    118	__u16 exception_error_code;
    119	__u64 exception_addr;
    120	__u64 user_handler;
    121	__u64 user_data;
    122	__u8  reserved[216];
    123};
    124
    125/**
    126 * typedef vdso_sgx_enter_enclave_t - Prototype for __vdso_sgx_enter_enclave(),
    127 *				      a vDSO function to enter an SGX enclave.
    128 * @rdi:	Pass-through value for RDI
    129 * @rsi:	Pass-through value for RSI
    130 * @rdx:	Pass-through value for RDX
    131 * @function:	ENCLU function, must be EENTER or ERESUME
    132 * @r8:		Pass-through value for R8
    133 * @r9:		Pass-through value for R9
    134 * @run:	struct sgx_enclave_run, must be non-NULL
    135 *
    136 * NOTE: __vdso_sgx_enter_enclave() does not ensure full compliance with the
    137 * x86-64 ABI, e.g. doesn't handle XSAVE state.  Except for non-volatile
    138 * general purpose registers, EFLAGS.DF, and RSP alignment, preserving/setting
    139 * state in accordance with the x86-64 ABI is the responsibility of the enclave
    140 * and its runtime, i.e. __vdso_sgx_enter_enclave() cannot be called from C
    141 * code without careful consideration by both the enclave and its runtime.
    142 *
    143 * All general purpose registers except RAX, RBX and RCX are passed as-is to the
    144 * enclave.  RAX, RBX and RCX are consumed by EENTER and ERESUME and are loaded
    145 * with @function, asynchronous exit pointer, and @run.tcs respectively.
    146 *
    147 * RBP and the stack are used to anchor __vdso_sgx_enter_enclave() to the
    148 * pre-enclave state, e.g. to retrieve @run.exception and @run.user_handler
    149 * after an enclave exit.  All other registers are available for use by the
    150 * enclave and its runtime, e.g. an enclave can push additional data onto the
    151 * stack (and modify RSP) to pass information to the optional user handler (see
    152 * below).
    153 *
    154 * Most exceptions reported on ENCLU, including those that occur within the
    155 * enclave, are fixed up and reported synchronously instead of being delivered
    156 * via a standard signal. Debug Exceptions (#DB) and Breakpoints (#BP) are
    157 * never fixed up and are always delivered via standard signals. On synchronously
    158 * reported exceptions, -EFAULT is returned and details about the exception are
    159 * recorded in @run.exception, the optional sgx_enclave_exception struct.
    160 *
    161 * Return:
    162 * - 0:		ENCLU function was successfully executed.
    163 * - -EINVAL:	Invalid ENCL number (neither EENTER nor ERESUME).
    164 */
    165typedef int (*vdso_sgx_enter_enclave_t)(unsigned long rdi, unsigned long rsi,
    166					unsigned long rdx, unsigned int function,
    167					unsigned long r8,  unsigned long r9,
    168					struct sgx_enclave_run *run);
    169
    170#endif /* _UAPI_ASM_X86_SGX_H */