[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH v2 6/9] lib/syscall_shim: introduce syscalls macro layer
To provide a syscall user needs to use macro UK_SYSCALL_DEFINE. The syntax is the following: UK_SYSCALL_DEFINE(syscall_name, argument_1_type, argument_1_name, ...) { <syscall_body>; } Signed-off-by: Yuri Volchkov <yuri.volchkov@xxxxxxxxx> --- lib/syscall_shim/Makefile.uk | 6 +- lib/syscall_shim/include/uk/syscall.h | 150 ++++++++++++++++++++++++++ 2 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 lib/syscall_shim/include/uk/syscall.h diff --git a/lib/syscall_shim/Makefile.uk b/lib/syscall_shim/Makefile.uk index 0f7754df..50ee28ca 100644 --- a/lib/syscall_shim/Makefile.uk +++ b/lib/syscall_shim/Makefile.uk @@ -46,5 +46,9 @@ $(LIBSYSCALL_SHIM_INCLUDES_PATH)/syscall_stubs.h.new: $(AWK) -f $(LIBSYSCALL_SHIM_BASE)/gen_stubs.awk \ $(LIBSYSCALL_SHIM_TEMPL) > $@) -LIBSYSCALL_SHIM_CLEAN = $(LIBSYSCALL_SHIM_PHONY_SRC) $(LIBSYSCALL_SHIM_PHONY_SRC_NEW) $(LIBSYSCALL_SHIM_GEN_SRC) +CINCLUDES-$(CONFIG_LIBSYSCALL_SHIM) += -I$(LIBSYSCALL_SHIM_BUILD)/include +CXXINCLUDES-$(CONFIG_LIBSYSCALL_SHIM) += -I$(LIBSYSCALL_SHIM_BUILD)/include +CINCLUDES-y += -I$(LIBSYSCALL_SHIM_BASE)/include +CXXINCLUDES-y += -I$(LIBSYSCALL_SHIM_BASE)/include +LIBSYSCALL_SHIM_CLEAN = $(LIBSYSCALL_SHIM_PHONY_SRC) $(LIBSYSCALL_SHIM_PHONY_SRC_NEW) $(LIBSYSCALL_SHIM_GEN_SRC) $(LIBSYSCALL_SHIM_GEN_SRC) diff --git a/lib/syscall_shim/include/uk/syscall.h b/lib/syscall_shim/include/uk/syscall.h new file mode 100644 index 00000000..96811918 --- /dev/null +++ b/lib/syscall_shim/include/uk/syscall.h @@ -0,0 +1,150 @@ +/* SPDX-License-Identifier: BSD-3-Clause */ +/* + * Authors: Yuri Volchkov <yuri.volchkov@xxxxxxxxx> + * + * + * Copyright (c) 2019, NEC Laboratories Europe GmbH, NEC Corporation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY. + */ + +#ifndef __UK_SYSCALL_H__ +#define __UK_SYSCALL_H__ + +#include <uk/essentials.h> +#include <errno.h> +#include <uk/print.h> + +#define __uk_scc(X) ((long) (X)) +typedef long syscall_arg_t; + +#define __uk_syscall(syscall_nr, ...) \ + UK_CONCAT(uk_syscall_fn_, syscall_nr) (__VA_ARGS__) + +#define __uk_syscall0(n) __uk_syscall(n) +#define __uk_syscall1(n,a) __uk_syscall(n,__uk_scc(a)) +#define __uk_syscall2(n,a,b) __uk_syscall(n,__uk_scc(a),__uk_scc(b)) +#define __uk_syscall3(n,a,b,c) __uk_syscall(n,__uk_scc(a),__uk_scc(b),__uk_scc(c)) +#define __uk_syscall4(n,a,b,c,d) __uk_syscall(n,__uk_scc(a),__uk_scc(b),__uk_scc(c),__uk_scc(d)) +#define __uk_syscall5(n,a,b,c,d,e) __uk_syscall(n,__uk_scc(a),__uk_scc(b),__uk_scc(c),__uk_scc(d),__uk_scc(e)) +#define __uk_syscall6(n,a,b,c,d,e,f) __uk_syscall(n,__uk_scc(a),__uk_scc(b),__uk_scc(c),__uk_scc(d),__uk_scc(e),__uk_scc(f)) +#define __uk_syscall7(n,a,b,c,d,e,f,g) (__uk_syscall)(n,__uk_scc(a),__uk_scc(b),__uk_scc(c),__uk_scc(d),__uk_scc(e),__uk_scc(f),__uk_scc(g)) + + +#define __SYSCALL_NARGS_X(a,b,c,d,e,f,g,h,n,...) n +#define __SYSCALL_NARGS(...) __SYSCALL_NARGS_X(__VA_ARGS__,7,6,5,4,3,2,1,0,) + +#define __SYSCALL_DEF_NARGS_X(z, a1,a2, b1,b2, c1,c2, d1,d2, e1,e2, f1,f2, g1,g2, nr, ...) nr +#define __SYSCALL_DEF_NARGS(...) __SYSCALL_DEF_NARGS_X(__VA_ARGS__, 7,7, 6,6, 5,5, 4,4, 3,3, 2,2, 1,1,0) + +#define __UK_NAME2SCALL_FN(name) UK_CONCAT(uk_syscall_, name) + +#define UK_ARG_MAP1(m, type, arg) m(type, arg) +#define UK_ARG_MAP2(m, type, arg, ...) m(type, arg), UK_ARG_MAP1(m, __VA_ARGS__) +#define UK_ARG_MAP3(m, type, arg, ...) m(type, arg), UK_ARG_MAP2(m, __VA_ARGS__) +#define UK_ARG_MAP4(m, type, arg, ...) m(type, arg), UK_ARG_MAP3(m, __VA_ARGS__) +#define UK_ARG_MAP5(m, type, arg, ...) m(type, arg), UK_ARG_MAP4(m, __VA_ARGS__) +#define UK_ARG_MAP6(m, type, arg, ...) m(type, arg), UK_ARG_MAP5(m, __VA_ARGS__) +#define UK_ARG_MAP7(m, type, arg, ...) m(type, arg), UK_ARG_MAP6(m, __VA_ARGS__) +#define UK_ARG_MAPx(nr_args, ...) UK_CONCAT(UK_ARG_MAP, nr_args)(__VA_ARGS__) + +#define S_ARG_LONG(type, arg) unsigned long arg +#define S_ARG_ACTUAL(type, arg) type arg +#define S_ARG_CAST(type, arg) (type) arg + + +/* NOTE and TODO: + * Currently all the functions in unikraft which are mimicking + * libc behavior (writev, open, mount, etc) are handling 'errno' + * on their own. To comply with that syscall_shim expects syscall + * implementation to set errno, and return 0 in case of success + * or -1 (or whatever the man page says) in case of failure. + * + * This has to be reconsidered later. The corresponding functions + * in unikraft should not touch errno, and syscall_shim should + * provide 2 syscall functions - one that handles return and the + * one which does not. + * + * A good reference would be musl implementation. + */ +#ifdef CONFIG_LIBSYSCALL_SHIM +#define __UK_SYSCALL_DEFINE(x, name, ...) \ + static inline long __##name(UK_ARG_MAPx(x, S_ARG_ACTUAL, __VA_ARGS__)); \ + long name(UK_ARG_MAPx(x, S_ARG_LONG, __VA_ARGS__)) \ + { \ + long ret = __##name( \ + UK_ARG_MAPx(x, S_ARG_CAST, __VA_ARGS__)); \ + return ret; \ + } \ + static inline long __##name(UK_ARG_MAPx(x, S_ARG_ACTUAL, __VA_ARGS__)) +#else +#define __UK_SYSCALL_DEFINE(x, name, ...) \ + static inline long name(UK_ARG_MAPx(x, S_ARG_ACTUAL, __VA_ARGS__)) +#endif + +#define _UK_SYSCALL_DEFINE(...) __UK_SYSCALL_DEFINE(__VA_ARGS__) +#define UK_SYSCALL_DEFINE(name, ...) \ + _UK_SYSCALL_DEFINE(__SYSCALL_DEF_NARGS(__VA_ARGS__), \ + __UK_NAME2SCALL_FN(name), \ + __VA_ARGS__) + +#define __UK_SPROTO_ARGS_TYPE unsigned long +#define __UK_SPROTO_ARGS0() void +#define __UK_SPROTO_ARGS1() __UK_SPROTO_ARGS_TYPE a +#define __UK_SPROTO_ARGS2() __UK_SPROTO_ARGS1(), __UK_SPROTO_ARGS_TYPE b +#define __UK_SPROTO_ARGS3() __UK_SPROTO_ARGS2(), __UK_SPROTO_ARGS_TYPE c +#define __UK_SPROTO_ARGS4() __UK_SPROTO_ARGS3(), __UK_SPROTO_ARGS_TYPE d +#define __UK_SPROTO_ARGS5() __UK_SPROTO_ARGS4(), __UK_SPROTO_ARGS_TYPE e +#define __UK_SPROTO_ARGS6() __UK_SPROTO_ARGS5(), __UK_SPROTO_ARGS_TYPE f +#define __UK_SPROTO_ARGS7() __UK_SPROTO_ARGS6(), __UK_SPROTO_ARGS_TYPE g +#define __UK_SPROTO_ARGSx(args_nr) \ + UK_CONCAT(__UK_SPROTO_ARGS, args_nr)() + +#define UK_SYSCALL_PROTO(args_nr, syscall_name) \ + long UK_CONCAT(uk_syscall_, syscall_name)( \ + __UK_SPROTO_ARGSx(args_nr)) + +#define uk_syscall_stub(syscall_name) ({ \ + uk_pr_debug("syscall \"" syscall_name \ + "\" is not implemented"); \ + errno = -ENOSYS; \ + -1; \ + }) + + +#ifdef CONFIG_LIBSYSCALL_SHIM +#include <uk/bits/syscall_nrs.h> +#include <uk/bits/syscall_map.h> +#include <uk/bits/provided_syscalls.h> +#include <uk/bits/syscall_stubs.h> + +#define syscall(...) \ + UK_CONCAT(__uk_syscall, __SYSCALL_NARGS(__VA_ARGS__))(__VA_ARGS__) +#endif + +#endif /* __UK_SYSCALL_H__ */ -- 2.19.2 _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |