|  | /* | 
|  | * Copyright 2017, Data61 | 
|  | * Commonwealth Scientific and Industrial Research Organisation (CSIRO) | 
|  | * ABN 41 687 119 230. | 
|  | * | 
|  | * This software may be distributed and modified according to the terms of | 
|  | * the BSD 2-Clause license. Note that NO WARRANTY is provided. | 
|  | * See "LICENSE_BSD2.txt" for details. | 
|  | * | 
|  | * @TAG(DATA61_BSD) | 
|  | */ | 
|  |  | 
|  | #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 | 
|  | } |