text: /*
   * (C) Copyright 2016 Intel Corporation
   *
   * Authors:
   *
   * Jarkko Sakkinen <jarkko.sakkinen@intel.com>
   * Suresh Siddha <suresh.b.siddha@intel.com>
   * Serge Ayoun <serge.ayoun@intel.com>
   * Shay Katz-zamir <shay.katz-zamir@intel.com>
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public License
   * as published by the Free Software Foundation; version 2
   * of the License.
   */
  
  #ifndef _UAPI_ASM_X86_SGX_H
  #define _UAPI_ASM_X86_SGX_H
  
  #include <linux/types.h>
  #include <linux/ioctl.h>
  
  #define SGX_MAGIC 0xA4
  
  #define SGX_IOC_ENCLAVE_CREATE \
  	_IOW(SGX_MAGIC, 0x00, struct sgx_enclave_create)
  #define SGX_IOC_ENCLAVE_ADD_PAGE \
  	_IOW(SGX_MAGIC, 0x01, struct sgx_enclave_add_page)
  #define SGX_IOC_ENCLAVE_INIT \
  	_IOW(SGX_MAGIC, 0x02, struct sgx_enclave_init)
  
  /* SGX leaf instruction return values */
  #define SGX_SUCCESS			0
  #define SGX_INVALID_SIG_STRUCT		1
  #define SGX_INVALID_ATTRIBUTE		2
  #define SGX_BLKSTATE			3
  #define SGX_INVALID_MEASUREMENT		4
  #define SGX_NOTBLOCKABLE		5
  #define SGX_PG_INVLD			6
  #define SGX_LOCKFAIL			7
  #define SGX_INVALID_SIGNATURE		8
  #define SGX_MAC_COMPARE_FAIL		9
  #define SGX_PAGE_NOT_BLOCKED		10
  #define SGX_NOT_TRACKED			11
  #define SGX_VA_SLOT_OCCUPIED		12
  #define SGX_CHILD_PRESENT		13
  #define SGX_ENCLAVE_ACT			14
  #define SGX_ENTRYEPOCH_LOCKED		15
  #define SGX_INVALID_LICENSE		16
  #define SGX_PREV_TRK_INCMPL		17
  #define SGX_PG_IS_SECS			18
  #define SGX_INVALID_CPUSVN		32
  #define SGX_INVALID_ISVSVN		64
  #define SGX_UNMASKED_EVENT		128
  #define SGX_INVALID_KEYNAME		256
  
  /* IOCTL return values */
  #define SGX_POWER_LOST_ENCLAVE		0x40000000
  #define SGX_LE_ROLLBACK			0x40000001
  
  struct sgx_enclave_create  {
  	__u64	src;
  } __attribute__((packed));
  
  struct sgx_enclave_add_page {
  	__u64	addr;
  	__u64	src;
  	__u64	secinfo;
  	__u16	mrmask;
  } __attribute__((packed));
  
  struct sgx_enclave_init {
  	__u64	addr;
  	__u64	sigstruct;
  	__u64	einittoken;
  } __attribute__((packed));
  
  enum isgx_secinfo_flags {
      SGX_SECINFO_R       = 0x01,
      SGX_SECINFO_W       = 0x02,
      SGX_SECINFO_X       = 0x04,
  };
  
  enum isgx_secinfo_pt {
      SGX_SECINFO_SECS    = 0x000ULL,
      SGX_SECINFO_TCS     = 0x100ULL,
      SGX_SECINFO_REG     = 0x200ULL,
  };
  
  struct isgx_secinfo {
      uint64_t flags;
      uint64_t reserved[7];
  } __attribute__((aligned(128)));
  
  #endif /* _UAPI_ASM_X86_SGX_H */
  