1/*
2 * Copyright 2017, 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 BSD 2-Clause license. Note that NO WARRANTY is provided.
8 * See "LICENSE_BSD2.txt" for details.
9 *
10 * @TAG(DATA61_BSD)
11 */
12
13#ifndef __LIBSEL4_ARCH_FUNCTIONS_H
14#define __LIBSEL4_ARCH_FUNCTIONS_H
15
16#include <autoconf.h>
17#include <sel4/types.h>
18#include <sel4/sel4_arch/functions.h>
19
20LIBSEL4_INLINE_FUNC seL4_Word
21seL4_GetMR(int i)
22{
23    return seL4_GetIPCBuffer()->msg[i];
24}
25
26LIBSEL4_INLINE_FUNC void
27seL4_SetMR(int i, seL4_Word mr)
28{
29    seL4_GetIPCBuffer()->msg[i] = mr;
30}
31
32LIBSEL4_INLINE_FUNC seL4_Word
33seL4_GetUserData(void)
34{
35    return seL4_GetIPCBuffer()->userData;
36}
37
38LIBSEL4_INLINE_FUNC void
39seL4_SetUserData(seL4_Word data)
40{
41    seL4_GetIPCBuffer()->userData = data;
42}
43
44LIBSEL4_INLINE_FUNC seL4_Word
45seL4_GetBadge(int i)
46{
47    return seL4_GetIPCBuffer()->caps_or_badges[i];
48}
49
50LIBSEL4_INLINE_FUNC seL4_CPtr
51seL4_GetCap(int i)
52{
53    return (seL4_CPtr)seL4_GetIPCBuffer()->caps_or_badges[i];
54}
55
56LIBSEL4_INLINE_FUNC void
57seL4_SetCap(int i, seL4_CPtr cptr)
58{
59    seL4_GetIPCBuffer()->caps_or_badges[i] = (seL4_Word)cptr;
60}
61
62LIBSEL4_INLINE_FUNC void
63seL4_GetCapReceivePath(seL4_CPtr* receiveCNode, seL4_CPtr* receiveIndex, seL4_Word* receiveDepth)
64{
65    seL4_IPCBuffer* ipcbuffer = seL4_GetIPCBuffer();
66    if (receiveCNode != (void*)0) {
67        *receiveCNode = ipcbuffer->receiveCNode;
68    }
69
70    if (receiveIndex != (void*)0) {
71        *receiveIndex = ipcbuffer->receiveIndex;
72    }
73
74    if (receiveDepth != (void*)0) {
75        *receiveDepth = ipcbuffer->receiveDepth;
76    }
77}
78
79LIBSEL4_INLINE_FUNC void
80seL4_SetCapReceivePath(seL4_CPtr receiveCNode, seL4_CPtr receiveIndex, seL4_Word receiveDepth)
81{
82    seL4_IPCBuffer* ipcbuffer = seL4_GetIPCBuffer();
83    ipcbuffer->receiveCNode = receiveCNode;
84    ipcbuffer->receiveIndex = receiveIndex;
85    ipcbuffer->receiveDepth = receiveDepth;
86}
87
88#endif
89