aboutsummaryrefslogtreecommitdiff
path: root/include/apos/uapi.h
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2023-04-30 17:06:02 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2023-04-30 17:06:02 +0300
commitea5ebe0809fb31b9f125ac0689f706cc5f3f078f (patch)
tree17081bd689709a9bfe48467c458425dea876bddd /include/apos/uapi.h
parent8a5e4cf53d981e793fca90d9b51bd395265cf4db (diff)
downloadkmi-ea5ebe0809fb31b9f125ac0689f706cc5f3f078f.tar.gz
kmi-ea5ebe0809fb31b9f125ac0689f706cc5f3f078f.zip
rename to kmi
Diffstat (limited to 'include/apos/uapi.h')
-rw-r--r--include/apos/uapi.h792
1 files changed, 0 insertions, 792 deletions
diff --git a/include/apos/uapi.h b/include/apos/uapi.h
deleted file mode 100644
index fefd1bf..0000000
--- a/include/apos/uapi.h
+++ /dev/null
@@ -1,792 +0,0 @@
-/* SPDX-License-Identifier: GPL-3.0-or-later */
-/* Copyright 2021 - 2022, Kim Kuparinen < kimi.h.kuparinen@gmail.com > */
-
-#ifndef APOS_UAPI_H
-#define APOS_UAPI_H
-
-/**
- * @file uapi.h
- * Userspace api, syscall declarations.
- */
-
-#include <apos/syscalls.h>
-#include <apos/vmem.h>
-
-/**
- * Syscall function type.
- * Let's start with five arguments and see where that goes
- */
-typedef void (*sys_t)(struct tcb *t, long, long, long, long, long);
-
-/**
- * Syscall argument type.
- *
- * \todo: Should this be arch specific? should be the size of an integer
- * register.
- */
-typedef long sys_arg_t;
-
-/**
- * Return structure of syscall.
- * \note Field names are generic, and can be used for whatever,
- * check documentation of whatever you're doing.
- * @todo should this be placed into syscalls.h?
- */
-struct sys_ret {
- /** Status. */
- sys_arg_t s;
-
- /** First argument. */
- sys_arg_t ar0;
-
- /** Second argument. */
- sys_arg_t ar1;
-
- /** Third argument. */
- sys_arg_t ar2;
-
- /** Fourth argument. */
- sys_arg_t ar3;
-
- /** Fifth argument. */
- sys_arg_t ar4;
-};
-
-/** Helper for returning sys_ret with 0 arguments. */
-#define SYS_RET0() (struct sys_ret){0, 0, 0, 0, 0, 0}
-
-/** Helper for returning sys_ret with 1 arguments. */
-#define SYS_RET1(a) (struct sys_ret){a, 0, 0, 0, 0, 0}
-
-/** Helper for returning sys_ret with 2 arguments. */
-#define SYS_RET2(a, b) (struct sys_ret){a, b, 0, 0, 0, 0}
-
-/** Helper for returning sys_ret with 3 arguments. */
-#define SYS_RET3(a, b, c) (struct sys_ret){a, b, c, 0, 0, 0}
-
-/** Helper for returning sys_ret with 4 arguments. */
-#define SYS_RET4(a, b, c, d) (struct sys_ret){a, b, c, d, 0, 0}
-
-/** Helper for returning sys_ret with 5 arguments. */
-#define SYS_RET5(a, b, c, d, e) (struct sys_ret){a, b, c, d, e, 0}
-
-/** Helper for returning sys_ret with 6 arguments. */
-#define SYS_RET6(a, b, c, d, e, f) (struct sys_ret){a, b, c, d, e, f}
-
-/**
- * Helper macro for declaring syscalls with zero arguments.
- *
- * The idea is that all syscalls externally have the same amount of arguments,
- * but then by using some helper macros (see below) we can make actually
- * implementing the syscall more intuitive and less noisy.
- *
- * @param name Name of syscall.
- */
-#define SYSCALL_DECLARE0(name) \
- void sys_##name(struct tcb *t, \
- sys_arg_t a, \
- sys_arg_t b, \
- sys_arg_t c, \
- sys_arg_t d, \
- sys_arg_t e);
-
-/**
- * Helper macro for declaring syscalls with one argument.
- *
- * @param name Name of syscall.
- * @param a Name of argument.
- */
-#define SYSCALL_DECLARE1(name, a) \
- void sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \
- sys_arg_t c, \
- sys_arg_t d, sys_arg_t e);
-
-/**
- * Helper macro for declaring syscalls with two arguments.
- *
- * @param name Name of syscall.
- * @param a Name of first argument.
- * @param b Name of second argument.
- */
-#define SYSCALL_DECLARE2(name, a, b) \
- void sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \
- sys_arg_t c, \
- sys_arg_t d, sys_arg_t e);
-
-/**
- * Helper macro for declaring syscalls with three arguments.
- *
- * @param name Name of syscall.
- * @param a Name of first argument.
- * @param b Name of second argument.
- * @param c Name of third argument.
- */
-#define SYSCALL_DECLARE3(name, a, b, c) \
- void sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \
- sys_arg_t c, \
- sys_arg_t d, sys_arg_t e);
-
-/**
- * Helper macro for declaring syscalls with four arguments.
- *
- * @param name Name of syscall.
- * @param a Name of first argument.
- * @param b Name of second argument.
- * @param c Name of third argument.
- * @param d Name of fourth argument.
- */
-#define SYSCALL_DECLARE4(name, a, b, c, d) \
- void sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \
- sys_arg_t c, \
- sys_arg_t d, sys_arg_t e);
-
-/**
- * Helper macro for declaring syscalls with five arguments.
- *
- * @param name Name of syscall.
- * @param a Name of first argument.
- * @param b Name of second argument.
- * @param c Name of third argument.
- * @param d Name of fourth argument.
- * @param e Name of fifth argument.
- */
-#define SYSCALL_DECLARE5(name, a, b, c, d, e) \
- void sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \
- sys_arg_t c, \
- sys_arg_t d, sys_arg_t e);
-
-/**
- * Helper macro for defining syscall with zero arguments.
- *
- * @param name Name of syscall.
- */
-#define SYSCALL_DEFINE0(name) \
- static inline void __##name(struct tcb *t); \
- void sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \
- sys_arg_t c, \
- sys_arg_t d, sys_arg_t e) \
- { \
- UNUSED(a); \
- UNUSED(b); \
- UNUSED(c); \
- UNUSED(d); \
- UNUSED(e); \
- __##name(t); \
- } \
- static inline void __##name
-
-/**
- * Helper macro for defining syscall with one argument.
- *
- * @param name Name of syscall.
- */
-#define SYSCALL_DEFINE1(name) \
- static inline void __##name(struct tcb *, sys_arg_t); \
- void sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \
- sys_arg_t c, \
- sys_arg_t d, sys_arg_t e) \
- { \
- UNUSED(b); \
- UNUSED(c); \
- UNUSED(d); \
- UNUSED(e); \
- __##name(t, a); \
- } \
- static inline void __##name
-
-/**
- * Helper macro for defining syscall with two arguments.
- *
- * @param name Name of syscall.
- */
-#define SYSCALL_DEFINE2(name) \
- static inline void __##name(struct tcb *, sys_arg_t, \
- sys_arg_t); \
- void sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \
- sys_arg_t c, \
- sys_arg_t d, sys_arg_t e) \
- { \
- UNUSED(c); \
- UNUSED(d); \
- UNUSED(e); \
- __##name(t, a, b); \
- } \
- static inline void __##name
-
-/**
- * Helper macro for defining syscall with three arguments.
- *
- * @param name Name of syscall.
- */
-#define SYSCALL_DEFINE3(name) \
- static inline void __##name(struct tcb *, sys_arg_t, \
- sys_arg_t, \
- sys_arg_t); \
- void sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \
- sys_arg_t c, \
- sys_arg_t d, sys_arg_t e) \
- { \
- UNUSED(d); \
- UNUSED(e); \
- __##name(t, a, b, c); \
- } \
- static inline void __##name
-
-/**
- * Helper macro for defining syscall with four arguments.
- *
- * @param name Name of syscall.
- */
-#define SYSCALL_DEFINE4(name) \
- static inline void __##name(struct tcb *, sys_arg_t, \
- sys_arg_t, sys_arg_t, \
- sys_arg_t); \
- void sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \
- sys_arg_t c, \
- sys_arg_t d, sys_arg_t e) \
- { \
- UNUSED(e); \
- __##name(t, a, b, c, d); \
- } \
- static inline void __##name
-
-/**
- * Helper macro for defining syscall with five arguments.
- *
- * @param name Name of syscall.
- */
-#define SYSCALL_DEFINE5(name) \
- static inline void __##name(struct tcb *, sys_arg_t, \
- sys_arg_t, sys_arg_t, \
- sys_arg_t, sys_arg_t); \
- void sys_##name(struct tcb *t, sys_arg_t a, sys_arg_t b, \
- sys_arg_t c, \
- sys_arg_t d, sys_arg_t e) \
- { \
- __##name(t, a, b, c, d, e); \
- } \
- static void __##name
-
-/** @name Misc syscalls. */
-/** @{ */
-
-/**
- * Noop syscall.
- *
- * @param t Current tcb.
- * @param a Unused.
- * @param b Unused.
- * @param c Unused.
- * @param d Unused.
- * @param e Unused.
- *
- * Returns \ref OK and 0.
- */
-SYSCALL_DECLARE0(noop);
-
-/**
- * Putch syscall.
- *
- * @param t Current tcb.
- * @param ch Character to put.
- * @param b Unused.
- * @param c Unused.
- * @param d Unused.
- * @param e Unused.
- *
- * Returns \ref OK and 0.
- */
-SYSCALL_DECLARE1(putch, ch);
-
-/** @} */
-
-/* @name Memory handling syscalls. */
-/** @{ */
-/**
- * Request memory syscall.
- *
- * Allocates at least the specified size of allocation to current effective
- * process.
- *
- * @param t Current tcb.
- * @param size Size of allocation.
- * @param flags Flags of allocation.
- * @param c Unused.
- * @param d Unused.
- * @param e Unused.
- *
- * Returns \ref OK and start of memory allocation.
- */
-SYSCALL_DECLARE2(req_mem, size, flags);
-
-/**
- * Request one page of memory. The nearest fitting size is chosen.
- *
- * This might be better implemented as some number of adjacent physical pages,
- * but the underlying physical page allocator doesn't really handle it very
- * well. This weird design decision is because I don't know if there are devices
- * whose drivers need multiple adjacent physical pages, only that at least
- * virtio devices need to be able to access the physical address of a single
- * page. Basic adjacent physical pages can be made from higher order pages,
- * just with a massive overhead. Still, probably good eough for now.
- *
- * For example, if you need two adjacent 4K pages, you pass size = 8K and you
- * get back a 2M page, if one is available.
- *
- * @param t Current tcb.
- * @param size Required size of region.
- * @param flags Mapping flags to use.
- * @param c Unused.
- * @param d Unused.
- * @param e Unused.
- *
- * Returns \ref ERR_OOMEM if no page is available, otherwise \c OK, virtual
- * address, actual size, physical size in that order.
- */
-SYSCALL_DECLARE2(req_page, size, flags);
-
-/**
- * Request physical memory syscall.
- *
- * Allocates at least the specified size of allocation which includes the
- * physical start address somewhere in the allocation to the current effective
- * process.
- *
- * @param t Current tcb.
- * @param paddr Start of physical allocation.
- * @param size Size of physical allocation.
- * @param flags Flags of physical allocation.
- * @param d Unused.
- * @param e Unused.
- *
- * Returns \ref OK and start of memory allocation.
- */
-SYSCALL_DECLARE3(req_pmem, paddr, size, flags);
-
-/**
- * Request fixed memory syscall.
- *
- * Allocates at least the specified size of allocation which includes the start
- * address of allocation to the current effective process.
- *
- * @param t Current tcb.
- * @param start Start of allocation.
- * @param size Size of allocation.
- * @param flags Flags of allocation.
- * @param d Unused.
- * @param e Unused.
- *
- * Returns \ref OK and start of memory allocation.
- */
-SYSCALL_DECLARE3(req_fixmem, start, size, flags);
-
-/**
- * Request shared memory syscall.
- *
- * Allocates a region that can be shared between different processes, that is at
- * least the specified size of allocation. When clients are freeing memory, the
- * underlying physical allocation will not be freed unless the owning reference
- * (server) frees it.
- *
- * @param t Current tcb.
- * @param tid Thread to share memory with.
- * @param size Size of allocation.
- * @param sflags Flags of allocation for server, that is \p t.
- * @param cflags Flags of allocation for client, that is \p tid.
- * @param e Unused.
- *
- * Returns \ref OK and start of memory allocation.
- */
-SYSCALL_DECLARE4(req_sharedmem, tid, size, sflags, cflags);
-
-/**
- * Free memory syscall.
- *
- * Frees the memory region pointed to.
- *
- * @param t Current tcb.
- * @param start Start of memory.
- * @param b Unused.
- * @param c Unused.
- * @param d Unused.
- * @param e Unused.
- *
- * Returns \ref OK and 0.
- */
-SYSCALL_DECLARE1(free_mem, start);
-/** @} */
-
-/** @name Timer syscalls. */
-/** @{ */
-/**
- * Get timer accuracy in Hertz syscall.
- *
- * @param t Current tcb.
- * @param a Unused.
- * @param b Unused.
- * @param c Unused.
- * @param d Unused.
- * @param e Unused.
- *
- * Returns \ref OK and frequency.
- * \todo Should this be some kind of config request instead of a separate
- * syscall?
- */
-SYSCALL_DECLARE0(timebase);
-
-/**
- * Get current ticks.
- *
- * @param t Current tcb.
- * @param a Unused.
- * @param b Unused.
- * @param c Unused.
- * @param d Unused.
- * @param e Unused.
- *
- * Returns current ticks.
- */
-SYSCALL_DECLARE0(ticks);
-
-/**
- * Request relative timer syscall.
- *
- * Request timer that triggers a number of ticks in the future.
- *
- * @param t Current tcb.
- * @param ticks Number of ticks from now.
- * @param mult Number of times to trigger.
- * @param c Unused.
- * @param d Unused.
- * @param e Unused.
- *
- * Returns \ref OK and ID of timer.
- */
-SYSCALL_DECLARE2(req_rel_timer, ticks, mult);
-
-/**
- * Request absolute timer syscall.
- *
- * Request timer that triggers at some absolute timepoint.
- *
- * @param t Current tcb.
- * @param ticks Timepoint.
- * @param mult Multiplier.
- * @param c Unused.
- * @param d Unused.
- * @param e Unused.
- *
- * Returns \ref OK and ID of timer.
- * \todo Check repeat value.
- */
-SYSCALL_DECLARE2(req_abs_timer, ticks, mult);
-
-/**
- * Free timer syscall.
- *
- * @param t Current tcb.
- * @param cid ID of timer to free.
- * @param b Unused.
- * @param c Unused.
- * @param d Unused.
- * @param e Unused.
- *
- * Returns \ref OK.
- */
-SYSCALL_DECLARE1(free_timer, cid);
-/** @} */
-
-/** @name IPC syscalls. */
-/** @{ */
-/**
- * Report process status as server syscall.
- *
- * @param t Current tcb.
- * @param callback Callback to request handler.
- * @param b Unused.
- * @param c Unused.
- * @param d Unused.
- * @param e Unused.
- *
- * Returns \ref OK.
- */
-SYSCALL_DECLARE1(ipc_server, callback);
-
-/**
- * Request syscall.
- *
- * @param t Current tcb.
- * @param pid Request target process.
- * @param d0 First request argument.
- * @param d1 Second request argument.
- * @param d2 Third forwarding argument.
- * @param d3 Fourth forwarding argument.
- *
- * Returns \ref OK and whatever the server sends back on success, otherwise some
- * other status value.
- */
-SYSCALL_DECLARE5(ipc_req, pid, d0, d1, d2, d3);
-
-/**
- * Forwarding syscall.
- *
- * In a server request handler, do a request to some other server on behalf of
- * whoever called us up.
- *
- * @param t Current tcb.
- * @param pid Forwarding target process.
- * @param d0 First forwarding argument.
- * @param d1 Second forwarding argument.
- * @param d2 Third forwarding argument.
- * @param d3 Fourth forwarding argument.
- *
- * Returns \ref OK and whatever the server sends back on success, otherwise some
- * other status value.
- */
-SYSCALL_DECLARE5(ipc_fwd, pid, d0, d1, d2, d3);
-
-/**
- * Response syscall.
- *
- * @param t Current tcb.
- * @param d0 First response argument.
- * @param d1 Second response argument.
- * @param d2 Third response argument.
- * @param d3 Fourth response argument.
- * @param e Unused.
- *
- * Returns \c d0 and \c d1.
- */
-SYSCALL_DECLARE4(ipc_resp, d0, d1, d2, d3);
-
-/**
- * Notify thread syscall.
- *
- * @param t Current tcb.
- * @param tid Thread ID to notify.
- * @param b Unused.
- * @param c Unused.
- * @param d Unused.
- * @param e Unused.
- *
- * Returns \ref OK and 0.
- */
-SYSCALL_DECLARE1(ipc_notify, tid);
-/** @} */
-
-/** @name Process handling syscalls. */
-/** @{ */
-/**
- * Create thread syscall.
- *
- * Creates thread in current effective process context.
- *
- * @param t Current tcb.
- * @param func Function to call on startup.
- * @param d0 Argument 0.
- * @param d1 Argument 1.
- * @param d2 Argument 2.
- * @param d3 Argument 3.
- *
- * Returns \ref OK and 0.
- * \todo Should this take stack size etc?
- */
-SYSCALL_DECLARE5(create, func, d0, d1, d2, d3);
-
-/**
- * Fork process syscall.
- *
- * Forks a process, much like in *nix systems.
- *
- * @param t Current tcb.
- * @param a Unused.
- * @param b Unused.
- * @param c Unused.
- * @param d Unused.
- * @param e Unused.
- *
- * Returns \ref OK and 0.
- */
-SYSCALL_DECLARE0(fork);
-
-/**
- * Execute binary syscall.
- *
- * Executes a new binary in existing process space.
- *
- * @param t Current tcb.
- * @param bin Address of binary.
- * @param interp Optional address of interpreter.
- * @param c Unused.
- * @param d Unused.
- * @param e Unused.
- *
- * Returns \ref OK and 0.
- * \todo Check other return codes.
- */
-SYSCALL_DECLARE2(exec, bin, interp);
-
-/**
- * Spawn binary syscall. Try to prefer over unixy fork/exec.
- *
- * Executes a new binary in new process space.
- *
- * @param t Current tcb.
- * @param bin Address of binary.
- * @param interp Optional address of interpreter.
- * @param c Unused.
- * @param d Unused.
- * @param e Unused.
- *
- * Retuns \ref OK and 0.
- * \todo Check other return codes.
- */
-SYSCALL_DECLARE2(spawn, bin, interp);
-
-/**
- * Kill syscall.
- *
- * @param t Current tcb.
- * @param tid Thread ID to kill. 0 if self.
- * @param b Unused.
- * @param c Unused.
- * @param d Unused.
- * @param e Unused.
- *
- * Returns \ref OK if not called on itself, otherwise doesn't return.
- */
-SYSCALL_DECLARE1(kill, tid);
-
-/**
- * Swap syscall.
- *
- * Swap currently running thread.
- *
- * @param t Current tcb.
- * @param tid Thread to swap to.
- * @param b Unused.
- * @param c Unused.
- * @param d Unused.
- * @param e Unused.
- *
- * Returns \ref OK and 0.
- */
-SYSCALL_DECLARE1(swap, tid);
-
-/** @} */
-
-/** @name Configuration syscalls. */
-/** @{ */
-/**
- * Set configuration syscall.
- *
- * Set some runtime parameter.
- *
- * @param t Current tcb.
- * @param param Parameter to set.
- * @param val Value to set parameter to.
- * @param c Unused.
- * @param d Unused.
- * @param e Unused.
- *
- * Returns \ref OK and 0.
- */
-SYSCALL_DECLARE2(conf_set, param, val);
-
-/**
- * Get configuration syscall.
- *
- * Get some runtime parameter.
- *
- * @param t Current tcb.
- * @param param Parameter to get.
- * @param b Unused.
- * @param c Unused.
- * @param d Unused.
- * @param e Unused.
- *
- * Returns \ref OK.
- */
-SYSCALL_DECLARE1(conf_get, param);
-
-/**
- * Set capabilities.
- *
- * @param t Current tcb.
- * @param tid Thread ID whose capabilities to set.
- * @param off Offset of capability, multiple of \c bits(cap).
- * @param caps Mask of capabilities to set.
- * @param d Unused.
- * @param e Unused.
- *
- * Returns \ref OK on success, \ref ERR_INVAL on invalid input.
- */
-SYSCALL_DECLARE3(set_cap, tid, off, caps);
-
-/**
- * Get capabilities.
- *
- * @param t Current tcb.
- * @param tid Thread ID whose capabilities to get.
- * @param off Offset of capability, multiple of \c bits(cap).
- * @param c Unused.
- * @param d Unused.
- * @param e Unused.
- *
- * Returns \ref OK, capabilities.
- */
-SYSCALL_DECLARE2(get_cap, tid, off);
-
-/**
- * Clear capabilities.
- *
- * @param t Current tcb.
- * @param tid Thread ID whose capabilities to clear.
- * @param off Offset of capability, multiple of \c bits(cap).
- * @param cap Mask of capabilities to clear.
- * @param d Unused.
- * @param e Unused.
- *
- * Returns \ref OK.
- */
-SYSCALL_DECLARE3(clear_cap, tid, off, cap);
-
-/**
- * Power off syscall.
- *
- * Either shut down or reboot system.
- *
- * @param t Current tcb.
- * @param type Type of shutdown. \see poweroff_type.
- * @param b Unused.
- * @param c Unused.
- * @param d Unused.
- * @param e Unused.
- *
- * Shouldn't return at all.
- */
-SYSCALL_DECLARE1(poweroff, type);
-/** @} */
-
-/**
- * Dispatch to correct syscall handler.
- *
- * @param syscall Syscall number.
- * @param a Syscall argument 0.
- * @param b Syscall argument 1.
- * @param c Syscall argument 2.
- * @param d Syscall argument 3.
- * @param e Syscall argument 4.
- * @param t Current tcb.
- * Returns whatever the specified syscall returns.
- */
-void handle_syscall(sys_arg_t syscall, sys_arg_t a, sys_arg_t b,
- sys_arg_t c, sys_arg_t d, sys_arg_t e, struct tcb *t);
-
-/** \todo Should I add variable names as well, to make the documentation a bit
- * more readable? */
-
-#include <arch/proc.h>
-#define return_args(t, x) {set_args((t), (x)); return;}
-
-#endif /* APOS_UAPI_H */