1/* 2 * Copyright 2020, Data61, CSIRO (ABN 41 687 119 230) 3 * Copyright 2015, 2016 Hesham Almatary <heshamelmatary@gmail.com> 4 * 5 * SPDX-License-Identifier: BSD-2-Clause 6 */ 7 8#pragma once 9 10#include <sel4/types.h> 11#include <sel4/syscalls.h> 12 13extern __thread seL4_IPCBuffer *__sel4_ipc_buffer; 14__thread __attribute__((weak)) seL4_IPCBuffer *__sel4_ipc_buffer; 15 16#ifdef CONFIG_KERNEL_INVOCATION_REPORT_ERROR_IPC 17extern __thread char __sel4_print_error; 18 19LIBSEL4_INLINE_FUNC char *seL4_GetDebugError(void) 20{ 21 return (char *)(__sel4_ipc_buffer->msg + DEBUG_MESSAGE_START); 22} 23 24LIBSEL4_INLINE_FUNC void seL4_SetPrintError(char print_error) 25{ 26 __sel4_print_error = print_error; 27 return; 28} 29 30LIBSEL4_INLINE_FUNC char seL4_CanPrintError(void) 31{ 32 return __sel4_print_error; 33} 34#endif 35 36LIBSEL4_INLINE_FUNC void seL4_SetIPCBuffer(seL4_IPCBuffer *ipc_buffer) 37{ 38 __sel4_ipc_buffer = ipc_buffer; 39 return; 40} 41 42LIBSEL4_INLINE_FUNC seL4_IPCBuffer *seL4_GetIPCBuffer(void) 43{ 44 return __sel4_ipc_buffer; 45} 46 47LIBSEL4_INLINE_FUNC seL4_Word seL4_GetMR(int i) 48{ 49 return seL4_GetIPCBuffer()->msg[i]; 50} 51 52LIBSEL4_INLINE_FUNC void seL4_SetMR(int i, seL4_Word mr) 53{ 54 seL4_GetIPCBuffer()->msg[i] = mr; 55} 56 57LIBSEL4_INLINE_FUNC seL4_Word seL4_GetUserData(void) 58{ 59 return seL4_GetIPCBuffer()->userData; 60} 61 62LIBSEL4_INLINE_FUNC void seL4_SetUserData(seL4_Word data) 63{ 64 seL4_GetIPCBuffer()->userData = data; 65} 66 67LIBSEL4_INLINE_FUNC seL4_Word seL4_GetBadge(int i) 68{ 69 return seL4_GetIPCBuffer()->caps_or_badges[i]; 70} 71 72LIBSEL4_INLINE_FUNC seL4_CPtr seL4_GetCap(int i) 73{ 74 return (seL4_CPtr)seL4_GetIPCBuffer()->caps_or_badges[i]; 75} 76 77LIBSEL4_INLINE_FUNC void seL4_SetCap(int i, seL4_CPtr cptr) 78{ 79 seL4_GetIPCBuffer()->caps_or_badges[i] = (seL4_Word)cptr; 80} 81 82LIBSEL4_INLINE_FUNC void seL4_GetCapReceivePath(seL4_CPtr *receiveCNode, seL4_CPtr *receiveIndex, 83 seL4_Word *receiveDepth) 84{ 85 seL4_IPCBuffer *ipcbuffer = seL4_GetIPCBuffer(); 86 if (receiveCNode != (void *)0) { 87 *receiveCNode = ipcbuffer->receiveCNode; 88 } 89 90 if (receiveIndex != (void *)0) { 91 *receiveIndex = ipcbuffer->receiveIndex; 92 } 93 94 if (receiveDepth != (void *)0) { 95 *receiveDepth = ipcbuffer->receiveDepth; 96 } 97} 98 99LIBSEL4_INLINE_FUNC void seL4_SetCapReceivePath(seL4_CPtr receiveCNode, seL4_CPtr receiveIndex, seL4_Word receiveDepth) 100{ 101 seL4_IPCBuffer *ipcbuffer = seL4_GetIPCBuffer(); 102 ipcbuffer->receiveCNode = receiveCNode; 103 ipcbuffer->receiveIndex = receiveIndex; 104 ipcbuffer->receiveDepth = receiveDepth; 105} 106 107