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