blob: 7340fab7b4181c9191a8f5212062de8d81018e6c [file] [log] [blame] [edit]
/*
* Copyright 2017, Data61, CSIRO (ABN 41 687 119 230)
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
/* This file provides backwards compatible API wrappers for seemlessly switching between the MCS kernel
and non-MCS kernel without too many #ifdefs and without confusing cscope and other analysis tools.
Of course, if any of the new functionality of the MCS kernel is leveraged, the switch won't be
seemless.
*/
#include <autoconf.h>
#include <sel4utils/gen_config.h>
#include <sel4/sel4.h>
#include <sel4utils/sel4_zf_logif.h>
#ifdef CONFIG_KERNEL_MCS
#define CONFIG_TIMER_TICK_MS CONFIG_BOOT_THREAD_TIME_SLICE
#else
#define CONFIG_BOOT_THREAD_TIME_SLICE CONFIG_TIMER_TICK_MS
#endif
static inline seL4_MessageInfo_t api_wait(seL4_CPtr ep, seL4_Word *badge)
{
#ifdef CONFIG_KERNEL_MCS
return seL4_Wait(ep, badge);
#else
return seL4_Recv(ep, badge);
#endif
}
static inline seL4_MessageInfo_t api_recv(seL4_CPtr ep, seL4_Word *badge, UNUSED seL4_CPtr reply)
{
#ifdef CONFIG_KERNEL_MCS
return seL4_Recv(ep, badge, reply);
#else
return seL4_Recv(ep, badge);
#endif
}
static inline seL4_MessageInfo_t api_nbrecv(seL4_CPtr ep, seL4_Word *badge, UNUSED seL4_CPtr reply)
{
#ifdef CONFIG_KERNEL_MCS
return seL4_NBRecv(ep, badge, reply);
#else
return seL4_NBRecv(ep, badge);
#endif
}
static inline void api_reply(UNUSED seL4_CPtr reply, seL4_MessageInfo_t msg)
{
#ifdef CONFIG_KERNEL_MCS
seL4_Send(reply, msg);
#else
seL4_Reply(msg);
#endif
}
static inline seL4_MessageInfo_t api_reply_recv(seL4_CPtr ep, seL4_MessageInfo_t msg, seL4_Word *badge,
UNUSED seL4_CPtr reply)
{
#ifdef CONFIG_KERNEL_MCS
return seL4_ReplyRecv(ep, msg, badge, reply);
#else
return seL4_ReplyRecv(ep, msg, badge);
#endif
}
static inline seL4_MessageInfo_t api_nbsend_recv(UNUSED seL4_CPtr send, UNUSED seL4_MessageInfo_t info,
UNUSED seL4_CPtr recv, UNUSED seL4_Word *badge,
UNUSED seL4_CPtr reply)
{
ZF_LOGF_IF(!config_set(CONFIG_KERNEL_MCS), "Not available on non MCS kernel");
#ifdef CONFIG_KERNEL_MCS
return seL4_NBSendRecv(send, info, recv, badge, reply);
#else
return seL4_MessageInfo_new(0, 0, 0, 0);
#endif
}
static inline seL4_MessageInfo_t api_nbsend_wait(UNUSED seL4_CPtr send, UNUSED seL4_MessageInfo_t info,
UNUSED seL4_CPtr recv, UNUSED seL4_Word *badge)
{
ZF_LOGF_IF(!config_set(CONFIG_KERNEL_MCS), "Not available on non MCS kernel");
#ifdef CONFIG_KERNEL_MCS
return seL4_NBSendWait(send, info, recv, badge);
#else
return seL4_MessageInfo_new(0, 0, 0, 0);
#endif
}
static inline seL4_Error api_tcb_configure(seL4_CPtr tcb, seL4_CPtr ep, UNUSED seL4_CPtr timeout_ep,
UNUSED seL4_CPtr sc, seL4_CPtr cspace,
seL4_Word cdata, seL4_CPtr vspace, seL4_Word vdata,
seL4_Word ipc_buffer_addr, seL4_CPtr ipc_buffer_cap)
{
#ifdef CONFIG_KERNEL_MCS
seL4_Error error = seL4_TCB_SetSpace(tcb, ep, cspace, cdata, vspace, vdata);
if (!error) {
error = seL4_TCB_SetIPCBuffer(tcb, ipc_buffer_addr, ipc_buffer_cap);
}
if (!error) {
error = seL4_TCB_SetTimeoutEndpoint(tcb, timeout_ep);
}
if (!error && sc != seL4_CapNull) {
error = seL4_SchedContext_Bind(sc, tcb);
}
return error;
#else
return seL4_TCB_Configure(tcb, ep, cspace, cdata, vspace, vdata,
ipc_buffer_addr, ipc_buffer_cap);
#endif
}
static inline seL4_Error api_tcb_set_sched_params(seL4_CPtr tcb, seL4_CPtr auth, seL4_Word prio,
seL4_Word mcp, UNUSED seL4_CPtr sc, UNUSED seL4_CPtr ep)
{
#ifdef CONFIG_KERNEL_MCS
return seL4_TCB_SetSchedParams(tcb, auth, mcp, prio, sc, ep);
#else
return seL4_TCB_SetSchedParams(tcb, auth, mcp, prio);
#endif
}
static inline seL4_Error api_tcb_set_space(seL4_CPtr tcb, seL4_CPtr ep,
seL4_CPtr cspace,
seL4_Word cdata, seL4_CPtr vspace, seL4_Word vdata)
{
return seL4_TCB_SetSpace(tcb, ep, cspace, cdata, vspace, vdata);
}
static inline seL4_Error api_sc_bind(UNUSED seL4_CPtr sc, UNUSED seL4_CPtr tcb)
{
if (!config_set(CONFIG_KERNEL_MCS)) {
return (seL4_Error) - ENOSYS;
}
#ifdef CONFIG_KERNEL_MCS
return seL4_SchedContext_Bind(sc, tcb);
#endif
}
static inline seL4_Error api_sc_unbind_object(UNUSED seL4_CPtr sc, UNUSED seL4_CPtr tcb)
{
if (!config_set(CONFIG_KERNEL_MCS)) {
return (seL4_Error) - ENOSYS;
}
#ifdef CONFIG_KERNEL_MCS
return seL4_SchedContext_UnbindObject(sc, tcb);
#endif
}
static inline seL4_Error api_sc_unbind(UNUSED seL4_CPtr sc)
{
if (!config_set(CONFIG_KERNEL_MCS)) {
return (seL4_Error) - ENOSYS;
}
#ifdef CONFIG_KERNEL_MCS
return seL4_SchedContext_Unbind(sc);
#endif
}
static inline seL4_SchedContext_Consumed_t api_sc_consumed(UNUSED seL4_CPtr sc)
{
if (!config_set(CONFIG_KERNEL_MCS)) {
return (seL4_SchedContext_Consumed_t) {
.error = (seL4_Error) - ENOSYS
};
}
#ifdef CONFIG_KERNEL_MCS
return seL4_SchedContext_Consumed(sc);
#endif
}
static inline seL4_Error api_sched_ctrl_configure(UNUSED seL4_CPtr sched_ctrl, UNUSED seL4_CPtr sc,
UNUSED uint64_t budget, UNUSED uint64_t period,
UNUSED seL4_Word refills, UNUSED seL4_Word badge)
{
if (!config_set(CONFIG_KERNEL_MCS)) {
return (seL4_Error) - ENOSYS;
}
#ifdef CONFIG_KERNEL_MCS
return seL4_SchedControl_Configure(sched_ctrl, sc, budget, period, refills, badge);
#endif
}