1/* 2 * Copyright 2018, Data61 3 * Commonwealth Scientific and Industrial Research Organisation (CSIRO) 4 * ABN 41 687 119 230. 5 * 6 * This software may be distributed and modified according to the terms of 7 * the GNU General Public License version 2. Note that NO WARRANTY is provided. 8 * See "LICENSE_GPLv2.txt" for details. 9 * 10 * @TAG(DATA61_GPL) 11 */ 12 13/* 14 * 15 * Copyright 2016, 2017 Hesham Almatary, Data61/CSIRO <hesham.almatary@data61.csiro.au> 16 * Copyright 2015, 2016 Hesham Almatary <heshamelmatary@gmail.com> 17 */ 18 19#ifndef __LIBSEL4_ARCH_FUNCTIONS_H 20#define __LIBSEL4_ARCH_FUNCTIONS_H 21 22#include <sel4/types.h> 23 24static inline seL4_IPCBuffer* 25seL4_GetIPCBuffer(void) 26{ 27 seL4_Word reg; 28 asm ("mv %0, tp" : "=r"(reg)); 29 return (seL4_IPCBuffer*)reg; 30} 31 32 33LIBSEL4_INLINE_FUNC seL4_Word 34seL4_GetMR(int i) 35{ 36 return seL4_GetIPCBuffer()->msg[i]; 37} 38 39LIBSEL4_INLINE_FUNC void 40seL4_SetMR(int i, seL4_Word mr) 41{ 42 seL4_GetIPCBuffer()->msg[i] = mr; 43} 44 45static inline seL4_Word 46seL4_GetUserData(void) 47{ 48 return seL4_GetIPCBuffer()->userData; 49} 50 51static inline void 52seL4_SetUserData(seL4_Word data) 53{ 54 seL4_GetIPCBuffer()->userData = data; 55} 56 57static inline seL4_Word 58seL4_GetBadge(int i) 59{ 60 return seL4_GetIPCBuffer()->caps_or_badges[i]; 61} 62 63static inline seL4_CPtr 64seL4_GetCap(int i) 65{ 66 return (seL4_CPtr)seL4_GetIPCBuffer()->caps_or_badges[i]; 67} 68 69static inline void 70seL4_SetCap(int i, seL4_CPtr cptr) 71{ 72 seL4_GetIPCBuffer()->caps_or_badges[i] = (seL4_Word)cptr; 73} 74 75static inline void 76seL4_GetCapReceivePath(seL4_CPtr* receiveCNode, seL4_CPtr* receiveIndex, seL4_Word* receiveDepth) 77{ 78 seL4_IPCBuffer* ipcbuffer = seL4_GetIPCBuffer(); 79 if (receiveCNode != (void*)0) { 80 *receiveCNode = ipcbuffer->receiveCNode; 81 } 82 83 if (receiveIndex != (void*)0) { 84 *receiveIndex = ipcbuffer->receiveIndex; 85 } 86 87 if (receiveDepth != (void*)0) { 88 *receiveDepth = ipcbuffer->receiveDepth; 89 } 90} 91 92static inline void 93seL4_SetCapReceivePath(seL4_CPtr receiveCNode, seL4_CPtr receiveIndex, seL4_Word receiveDepth) 94{ 95 seL4_IPCBuffer* ipcbuffer = seL4_GetIPCBuffer(); 96 ipcbuffer->receiveCNode = receiveCNode; 97 ipcbuffer->receiveIndex = receiveIndex; 98 ipcbuffer->receiveDepth = receiveDepth; 99} 100#endif 101