blob: 20a955bc737f3602e65dd57a05f5631efa3ac6ff [file] [log] [blame]
#ifndef _SYSCALL_DO_H_
#define _SYSCALL_DO_H_
#ifdef __cplusplus
extern "C" {
#endif
#ifdef _OS_BUILD_
#error "Syscalls should not be called from OS code"
#endif
#include <cpu/inc/syscallDo.h>
#include <syscall.h>
#include <stdarg.h>
#include <seos.h>
#include <util.h>
/* it is always safe to use this, but using syscallDo0P .. syscallDo4P macros may produce faster code for free */
static inline uintptr_t syscallDoGeneric(uint32_t syscallNo, ...)
{
uintptr_t ret;
va_list vl;
va_start(vl, syscallNo);
#ifdef SYSCALL_PARAMS_PASSED_AS_PTRS
ret = cpuSyscallDo(syscallNo, &vl);
#else
ret = cpuSyscallDo(syscallNo, *(uint32_t*)&vl);
#endif
va_end(vl);
return ret;
}
#ifdef cpuSyscallDo0P
#define syscallDo0P(syscallNo) cpuSyscallDo0P(syscallNo)
#else
#define syscallDo0P(syscallNo) syscallDoGeneric(syscallNo)
#endif
#ifdef cpuSyscallDo1P
#define syscallDo1P(syscallNo,p1) cpuSyscallDo1P(syscallNo,p1)
#else
#define syscallDo1P(syscallNo,p1) syscallDoGeneric(syscallNo,p1)
#endif
#ifdef cpuSyscallDo2P
#define syscallDo2P(syscallNo,p1,p2) cpuSyscallDo2P(syscallNo,p1,p2)
#else
#define syscallDo2P(syscallNo,p1,p2) syscallDoGeneric(syscallNo,p1,p2)
#endif
#ifdef cpuSyscallDo3P
#define syscallDo3P(syscallNo,p1,p2,p3) cpuSyscallDo3P(syscallNo,p1,p2,p3)
#else
#define syscallDo3P(syscallNo,p1,p2,p3) syscallDoGeneric(syscallNo,p1,p2,p3)
#endif
#ifdef cpuSyscallDo4P
#define syscallDo4P(syscallNo,p1,p2,p3,p4) cpuSyscallDo4P(syscallNo,p1,p2,p3,p4)
#else
#define syscallDo4P(syscallNo,p1,p2,p3,p4) syscallDoGeneric(syscallNo,p1,p2,p3,p4)
#endif
//system syscalls live here
static inline bool eOsEventSubscribe(uint32_t tid, uint32_t evtType)
{
return syscallDo2P(SYSCALL_NO(SYSCALL_DOMAIN_OS, SYSCALL_OS_MAIN, SYSCALL_OS_MAIN_EVENTQ, SYSCALL_OS_MAIN_EVTQ_SUBCRIBE), tid, evtType);
}
static inline bool eOsEventUnsubscribe(uint32_t tid, uint32_t evtType)
{
return syscallDo2P(SYSCALL_NO(SYSCALL_DOMAIN_OS, SYSCALL_OS_MAIN, SYSCALL_OS_MAIN_EVENTQ, SYSCALL_OS_MAIN_EVTQ_UNSUBCRIBE), tid, evtType);
}
static inline bool eOsEnqueueEvt(uint32_t evtType, void *evtData, EventFreeF evtFreeF, bool external)
{
return syscallDo4P(SYSCALL_NO(SYSCALL_DOMAIN_OS, SYSCALL_OS_MAIN, SYSCALL_OS_MAIN_EVENTQ, SYSCALL_OS_MAIN_EVTQ_ENQUEUE), evtType, evtData, evtFreeF, external);
}
static inline bool eOsDefer(OsDeferCbkF callback, void *cookie)
{
return syscallDo2P(SYSCALL_NO(SYSCALL_DOMAIN_OS, SYSCALL_OS_MAIN, SYSCALL_OS_MAIN_EVENTQ, SYSCALL_OS_MAIN_EVTQ_FUNC_DEFER), callback, cookie);
}
static inline void eOsLogvInternal(enum LogLevel level, const char *str, uintptr_t args_list)
{
(void)syscallDo3P(SYSCALL_NO(SYSCALL_DOMAIN_OS, SYSCALL_OS_MAIN, SYSCALL_OS_MAIN_LOGGING, SYSCALL_OS_MAIN_LOG_LOGV), level, str, args_list);
}
static inline void eOsLogv(enum LogLevel level, const char *str, va_list vl)
{
eOsLogvInternal(level, str, VA_LIST_TO_INTEGER(vl));
}
static inline void eOsLog(enum LogLevel level, const char *str, ...)
{
va_list vl;
va_start(vl, str);
eOsLogvInternal(level, str, VA_LIST_TO_INTEGER(vl));
va_end(vl);
}
#ifdef __cplusplus
}
#endif
#endif