1/** 2 * Copyright(c) 2011 Trusted Logic. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in 12 * the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name Trusted Logic nor the names of its 15 * contributors may be used to endorse or promote products derived 16 * from this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31#ifndef __SCHANNEL6_PROTOCOL_H__ 32#define __SCHANNEL6_PROTOCOL_H__ 33 34#include "s_type.h" 35 36/** 37 * Time representation. 38 */ 39typedef uint64_t SCTIME; 40 41#define SCTIME_IMMEDIATE ((uint64_t) 0x0000000000000000ULL) 42#define SCTIME_INFINITE ((uint64_t) 0xFFFFFFFFFFFFFFFFULL) 43 44/* 45 * Message types 46 */ 47#define SCX_CREATE_DEVICE_CONTEXT 0x02 48#define SCX_DESTROY_DEVICE_CONTEXT 0xFD 49#define SCX_REGISTER_SHARED_MEMORY 0xF7 50#define SCX_RELEASE_SHARED_MEMORY 0xF9 51#define SCX_OPEN_CLIENT_SESSION 0xF0 52#define SCX_CLOSE_CLIENT_SESSION 0xF2 53#define SCX_INVOKE_CLIENT_COMMAND 0xF5 54#define SCX_CANCEL_CLIENT_OPERATION 0xF4 55#define SCX_MANAGEMENT 0xFE 56 57/* 58 * Shared mem flags 59 */ 60#define SCX_SHARED_MEM_FLAG_INPUT 1 61#define SCX_SHARED_MEM_FLAG_OUTPUT 2 62#define SCX_SHARED_MEM_FLAG_INOUT 3 63 64/* 65 * Parameter types 66 */ 67#define SCX_PARAM_TYPE_NONE 0x0 68#define SCX_PARAM_TYPE_VALUE_INPUT 0x1 69#define SCX_PARAM_TYPE_VALUE_OUTPUT 0x2 70#define SCX_PARAM_TYPE_VALUE_INOUT 0x3 71#define SCX_PARAM_TYPE_MEMREF_TEMP_INPUT 0x5 72#define SCX_PARAM_TYPE_MEMREF_TEMP_OUTPUT 0x6 73#define SCX_PARAM_TYPE_MEMREF_TEMP_INOUT 0x7 74#define SCX_PARAM_TYPE_MEMREF_INPUT 0xD 75#define SCX_PARAM_TYPE_MEMREF_OUTPUT 0xE 76#define SCX_PARAM_TYPE_MEMREF_INOUT 0xF 77 78#define SCX_PARAM_TYPE_INPUT_FLAG 0x1 79#define SCX_PARAM_TYPE_OUTPUT_FLAG 0x2 80#define SCX_PARAM_TYPE_MEMREF_FLAG 0x4 81#define SCX_PARAM_TYPE_REGISTERED_MEMREF_FLAG 0x8 82 83#define SCX_PARAM_TYPE_IS_TMPREF(nParamType) (((nParamType) & (SCX_PARAM_TYPE_MEMREF_FLAG | SCX_PARAM_TYPE_REGISTERED_MEMREF_FLAG)) == SCX_PARAM_TYPE_MEMREF_FLAG) 84 85#define SCX_MAKE_PARAM_TYPES(t0, t1, t2, t3) ((t0) | ((t1) << 4) | ((t2) << 8) | ((t3) << 12)) 86#define SCX_GET_PARAM_TYPE(t, i) (((t) >> (4*i)) & 0xF) 87 88/* 89 * return origins 90 */ 91#define SCX_ORIGIN_COMMS 2 92#define SCX_ORIGIN_TEE 3 93#define SCX_ORIGIN_TRUSTED_APP 4 94 95/* 96 * Login types 97 */ 98#include "schannel6_logins.h" 99 100/* 101 * Limits and sizes 102 */ 103 104/* Maximum number of L1 descriptors covered by a registered shared memory block. 105 Must be kept in synch with TF_MAX_COARSE_PAGES in tf_protocol.h 106 in the Linux kernel driver. */ 107#define SCHANNEL6_MAX_DESCRIPTORS_PER_REGISTERED_SHARED_MEM 128 108 109/** 110 * Command parameters. 111 */ 112typedef struct 113{ 114 uint32_t a; 115 uint32_t b; 116}SCHANNEL6_COMMAND_PARAM_VALUE; 117 118typedef struct 119{ 120 uint32_t nDescriptor; 121 uint32_t nSize; 122 uint32_t nOffset; /* Socket: 4 weak bits of the address (for alignement checks) */ 123 124}SCHANNEL6_COMMAND_PARAM_TEMP_MEMREF; 125 126typedef struct 127{ 128 S_HANDLE hBlock; 129 uint32_t nSize; 130 uint32_t nOffset; 131 132}SCHANNEL6_COMMAND_PARAM_MEMREF; 133 134typedef union 135{ 136 SCHANNEL6_COMMAND_PARAM_VALUE sValue; 137 SCHANNEL6_COMMAND_PARAM_TEMP_MEMREF sTempMemref; 138 SCHANNEL6_COMMAND_PARAM_MEMREF sMemref; 139 140} SCHANNEL6_COMMAND_PARAM; 141 142typedef struct 143{ 144 uint32_t a; 145 uint32_t b; 146} SCHANNEL6_ANSWER_PARAM_VALUE; 147 148typedef struct 149{ 150 uint32_t _ignored; 151 uint32_t nSize; 152} SCHANNEL6_ANSWER_PARAM_SIZE; 153 154typedef union 155{ 156 SCHANNEL6_ANSWER_PARAM_SIZE sSize; 157 SCHANNEL6_ANSWER_PARAM_VALUE sValue; 158} SCHANNEL6_ANSWER_PARAM; 159 160/** 161 * Command messages. 162 */ 163 typedef struct 164{ 165 uint8_t nMessageSize; 166 uint8_t nMessageType; 167 uint16_t nMessageInfo; 168 uint32_t nOperationID; /* an opaque Normal World identifier for the operation */ 169}SCHANNEL6_COMMAND_HEADER; 170 171typedef struct 172{ 173 uint8_t nMessageSize; 174 uint8_t nMessageType; 175 uint16_t nMessageInfo_RFU; 176 uint32_t nOperationID; /* an opaque Normal World identifier for the operation */ 177 uint32_t nDeviceContextID; /* an opaque Normal World identifier for the device context */ 178}SCHANNEL6_CREATE_DEVICE_CONTEXT_COMMAND; 179 180typedef struct 181{ 182 uint8_t nMessageSize; 183 uint8_t nMessageType; 184 uint16_t nParamTypes; 185 uint32_t nOperationID; /* an opaque Normal World identifier for the operation */ 186 S_HANDLE hDeviceContext; 187 S_HANDLE hClientSession; 188 uint64_t sTimeout; 189 uint32_t nCancellationID; 190 uint32_t nClientCommandIdentifier; 191 SCHANNEL6_COMMAND_PARAM sParams[4]; 192}SCHANNEL6_INVOKE_CLIENT_COMMAND_COMMAND; 193 194typedef struct 195{ 196 uint8_t nMessageSize; 197 uint8_t nMessageType; 198 uint16_t nParamTypes; 199 uint32_t nOperationID; /* an opaque Normal World identifier for the operation */ 200 S_HANDLE hDeviceContext; 201 uint32_t nCancellationID; 202 SCTIME sTimeout; 203 S_UUID sDestinationUUID; 204 SCHANNEL6_COMMAND_PARAM sParams[4]; 205 uint32_t nLoginType; 206 uint8_t sLoginData[20]; /* Size depends on the login type. */ 207 208}SCHANNEL6_OPEN_CLIENT_SESSION_COMMAND; 209 210typedef struct 211{ 212 uint8_t nMessageSize; 213 uint8_t nMessageType; 214 uint16_t nMemoryFlags; 215 uint32_t nOperationID; /* an opaque Normal World identifier for the operation */ 216 S_HANDLE hDeviceContext; 217 uint32_t nBlockID; 218 uint32_t nSharedMemSize; 219 uint32_t nSharedMemStartOffset; 220 uint32_t nSharedMemDescriptors[SCHANNEL6_MAX_DESCRIPTORS_PER_REGISTERED_SHARED_MEM]; 221 222}SCHANNEL6_REGISTER_SHARED_MEMORY_COMMAND; 223 224typedef struct 225{ 226 uint8_t nMessageSize; 227 uint8_t nMessageType; 228 uint16_t nMessageInfo_RFU; 229 uint32_t nOperationID; /* an opaque Normal World identifier for the operation */ 230 S_HANDLE hDeviceContext; 231 S_HANDLE hBlock; 232 233}SCHANNEL6_RELEASE_SHARED_MEMORY_COMMAND; 234 235typedef struct 236{ 237 uint8_t nMessageSize; 238 uint8_t nMessageType; 239 uint16_t nMessageInfo_RFU; 240 uint32_t nOperationID; /* an opaque Normal World identifier for the operation */ 241 S_HANDLE hDeviceContext; 242 S_HANDLE hClientSession; 243 uint32_t nCancellationID; 244 245}SCHANNEL6_CANCEL_CLIENT_OPERATION_COMMAND; 246 247typedef struct 248{ 249 uint8_t nMessageSize; 250 uint8_t nMessageType; 251 uint16_t nMessageInfo_RFU; 252 uint32_t nOperationID; /* an opaque Normal World identifier for the operation */ 253 S_HANDLE hDeviceContext; 254 S_HANDLE hClientSession; 255 256}SCHANNEL6_CLOSE_CLIENT_SESSION_COMMAND; 257 258typedef struct 259{ 260 uint8_t nMessageSize; 261 uint8_t nMessageType; 262 uint16_t nMessageInfo_RFU; 263 uint32_t nOperationID; /* an opaque Normal World identifier for the operation */ 264 S_HANDLE hDeviceContext; 265 266}SCHANNEL6_DESTROY_DEVICE_CONTEXT_COMMAND; 267 268#define SCHANNEL6_MANAGEMENT_COMMAND_HIBERNATE 1 269#define SCHANNEL6_MANAGEMENT_COMMAND_SHUTDOWN 2 270#define SCHANNEL6_MANAGEMENT_COMMAND_PREPARE_FOR_CORE_OFF 3 271#define SCHANNEL6_MANAGEMENT_COMMAND_RESUME_FROM_CORE_OFF 4 272 273typedef struct 274{ 275 uint8_t nMessageSize; 276 uint8_t nMessageType; 277 uint16_t nCommand; 278 uint32_t nOperationID; /* an opaque Normal World identifier for the operation */ 279 uint32_t nW3BSize; 280 uint32_t nW3BStartOffset; 281#ifdef SCHANNEL_TRUSTZONE 282 uint32_t nSharedMemDescriptors[128]; 283#endif 284}SCHANNEL6_MANAGEMENT_COMMAND; 285 286typedef union 287{ 288 SCHANNEL6_COMMAND_HEADER sHeader; 289 SCHANNEL6_CREATE_DEVICE_CONTEXT_COMMAND sCreateDeviceContext; 290 SCHANNEL6_DESTROY_DEVICE_CONTEXT_COMMAND sDestroyDeviceContext; 291 SCHANNEL6_OPEN_CLIENT_SESSION_COMMAND sOpenClientSession; 292 SCHANNEL6_CLOSE_CLIENT_SESSION_COMMAND sCloseClientSession; 293 SCHANNEL6_REGISTER_SHARED_MEMORY_COMMAND sRegisterSharedMemory; 294 SCHANNEL6_RELEASE_SHARED_MEMORY_COMMAND sReleaseSharedMemory; 295 SCHANNEL6_INVOKE_CLIENT_COMMAND_COMMAND sInvokeClientCommand; 296 SCHANNEL6_CANCEL_CLIENT_OPERATION_COMMAND sCancelClientOperation; 297 SCHANNEL6_MANAGEMENT_COMMAND sManagement; 298 299}SCHANNEL6_COMMAND; 300 301/** 302 * Answer messages. 303 */ 304typedef struct 305{ 306 uint8_t nMessageSize; 307 uint8_t nMessageType; 308 uint16_t nMessageInfo; 309 uint32_t nOperationID; 310 uint32_t nErrorCode; 311}SCHANNEL6_ANSWER_HEADER; 312 313typedef struct 314{ 315 uint8_t nMessageSize; 316 uint8_t nMessageType; 317 uint16_t nMessageInfo_RFU; 318 uint32_t nOperationID; 319 uint32_t nErrorCode; 320 S_HANDLE hDeviceContext; 321}SCHANNEL6_CREATE_DEVICE_CONTEXT_ANSWER; 322 323typedef struct 324{ 325 uint8_t nMessageSize; 326 uint8_t nMessageType; 327 uint8_t nReturnOrigin; 328 uint8_t __nReserved; 329 uint32_t nOperationID; 330 uint32_t nErrorCode; 331 SCHANNEL6_ANSWER_PARAM sAnswers[4]; 332 333}SCHANNEL6_INVOKE_CLIENT_COMMAND_ANSWER; 334 335typedef struct 336{ 337 uint8_t nMessageSize; 338 uint8_t nMessageType; 339 uint8_t nReturnOrigin; 340 uint8_t __nReserved; 341 uint32_t nOperationID; 342 uint32_t nErrorCode; 343 S_HANDLE hClientSession; 344 SCHANNEL6_ANSWER_PARAM sAnswers[4]; 345}SCHANNEL6_OPEN_CLIENT_SESSION_ANSWER; 346 347typedef struct 348{ 349 uint8_t nMessageSize; 350 uint8_t nMessageType; 351 uint16_t nMessageInfo_RFU; 352 uint32_t nOperationID; 353 uint32_t nErrorCode; 354}SCHANNEL6_CLOSE_CLIENT_SESSION_ANSWER; 355 356typedef struct 357{ 358 uint8_t nMessageSize; 359 uint8_t nMessageType; 360 uint16_t nMessageInfo_RFU; 361 uint32_t nOperationID; 362 uint32_t nErrorCode; 363 S_HANDLE hBlock; 364 365}SCHANNEL6_REGISTER_SHARED_MEMORY_ANSWER; 366 367typedef struct 368{ 369 uint8_t nMessageSize; 370 uint8_t nMessageType; 371 uint16_t nMessageInfo_RFU; 372 uint32_t nOperationID; 373 uint32_t nErrorCode; 374 uint32_t nBlockID; 375 376}SCHANNEL6_RELEASE_SHARED_MEMORY_ANSWER; 377 378typedef struct 379{ 380 uint8_t nMessageSize; 381 uint8_t nMessageType; 382 uint16_t nMessageInfo_RFU; 383 uint32_t nOperationID; 384 uint32_t nErrorCode; 385 uint32_t nDeviceContextID; 386 387}SCHANNEL6_DESTROY_DEVICE_CONTEXT_ANSWER; 388 389typedef struct 390{ 391 uint8_t nMessageSize; 392 uint8_t nMessageType; 393 uint16_t nMessageInfo_RFU; 394 uint32_t nOperationID; 395 uint32_t nErrorCode; 396 397}SCHANNEL6_CANCEL_CLIENT_OPERATION_ANSWER; 398 399typedef struct 400{ 401 uint8_t nMessageSize; 402 uint8_t nMessageType; 403 uint16_t nMessageInfo_RFU; 404 uint32_t nOperationID; 405 uint32_t nErrorCode; 406 407}SCHANNEL6_MANAGEMENT_ANSWER; 408 409typedef union 410{ 411 SCHANNEL6_ANSWER_HEADER sHeader; 412 SCHANNEL6_CREATE_DEVICE_CONTEXT_ANSWER sCreateDeviceContext; 413 SCHANNEL6_OPEN_CLIENT_SESSION_ANSWER sOpenClientSession; 414 SCHANNEL6_REGISTER_SHARED_MEMORY_ANSWER sRegisterSharedMemory; 415 SCHANNEL6_RELEASE_SHARED_MEMORY_ANSWER sReleaseSharedMemory; 416 SCHANNEL6_INVOKE_CLIENT_COMMAND_ANSWER sInvokeClientCommand; 417 SCHANNEL6_DESTROY_DEVICE_CONTEXT_ANSWER sDestroyDeviceContext; 418 SCHANNEL6_CANCEL_CLIENT_OPERATION_ANSWER sCancelClientOperation; 419 SCHANNEL6_CLOSE_CLIENT_SESSION_ANSWER sCloseClientSession; 420 SCHANNEL6_MANAGEMENT_ANSWER sManagement; 421 422}SCHANNEL6_ANSWER; 423 424 425#endif /* __SCHANNEL6_PROTOCOL_H__ */ 426