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