From mboxrd@z Thu Jan 1 00:00:00 1970 From: Philippe Gerum Subject: [PATCH Dovetail 13/13] cobalt/syscall: pipeline: abstract syscall entry points Date: Sat, 2 Jan 2021 10:33:53 +0100 Message-Id: <20210102093353.3195090-14-rpm@xenomai.org> In-Reply-To: <20210102093353.3195090-1-rpm@xenomai.org> References: <20210102093353.3195090-1-rpm@xenomai.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: Discussions about the Xenomai project List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: xenomai@xenomai.org From: Philippe Gerum The I-pipe and Dovetail differ only marginally with respect to syscall handling. Abstract only the few details we need to cope with both interfaces. No functional change is introduced. Signed-off-by: Philippe Gerum --- .../cobalt/kernel/ipipe/pipeline/kevents.h | 3 ++ .../cobalt/kernel/ipipe/pipeline/pipeline.h | 2 ++ include/cobalt/kernel/sched.h | 2 -- kernel/cobalt/ipipe/Makefile | 2 +- kernel/cobalt/ipipe/syscall.c | 29 +++++++++++++++++++ kernel/cobalt/posix/process.h | 3 -- kernel/cobalt/posix/syscall.c | 28 ++++-------------- kernel/cobalt/posix/syscall.h | 7 +++++ 8 files changed, 47 insertions(+), 29 deletions(-) create mode 100644 kernel/cobalt/ipipe/syscall.c diff --git a/include/cobalt/kernel/ipipe/pipeline/kevents.h b/include/cobalt/kernel/ipipe/pipeline/kevents.h index 30425a96b..2f186a57e 100644 --- a/include/cobalt/kernel/ipipe/pipeline/kevents.h +++ b/include/cobalt/kernel/ipipe/pipeline/kevents.h @@ -7,6 +7,9 @@ #ifndef _COBALT_KERNEL_IPIPE_KEVENTS_H #define _COBALT_KERNEL_IPIPE_KEVENTS_H +#define KEVENT_PROPAGATE 0 +#define KEVENT_STOP 1 + struct cobalt_process; struct cobalt_thread; diff --git a/include/cobalt/kernel/ipipe/pipeline/pipeline.h b/include/cobalt/kernel/ipipe/pipeline/pipeline.h index 0ffc9b00b..fb0465fb2 100644 --- a/include/cobalt/kernel/ipipe/pipeline/pipeline.h +++ b/include/cobalt/kernel/ipipe/pipeline/pipeline.h @@ -11,6 +11,8 @@ #include +#define xnsched_realtime_domain cobalt_pipeline.domain + #define PIPELINE_NR_IRQS IPIPE_NR_IRQS typedef unsigned long spl_t; diff --git a/include/cobalt/kernel/sched.h b/include/cobalt/kernel/sched.h index 5d278838f..ad815b595 100644 --- a/include/cobalt/kernel/sched.h +++ b/include/cobalt/kernel/sched.h @@ -233,8 +233,6 @@ static inline void xnsched_set_self_resched(struct xnsched *sched) sched->status |= XNRESCHED; } -#define xnsched_realtime_domain cobalt_pipeline.domain - /* Set resched flag for the given scheduler. */ #ifdef CONFIG_SMP diff --git a/kernel/cobalt/ipipe/Makefile b/kernel/cobalt/ipipe/Makefile index 0490f8800..3c0ad2098 100644 --- a/kernel/cobalt/ipipe/Makefile +++ b/kernel/cobalt/ipipe/Makefile @@ -2,4 +2,4 @@ ccflags-y += -Ikernel obj-y += pipeline.o -pipeline-y := init.o intr.o kevents.o apc.o tick.o +pipeline-y := init.o intr.o kevents.o apc.o tick.o syscall.o diff --git a/kernel/cobalt/ipipe/syscall.c b/kernel/cobalt/ipipe/syscall.c new file mode 100644 index 000000000..18aa996bd --- /dev/null +++ b/kernel/cobalt/ipipe/syscall.c @@ -0,0 +1,29 @@ +/* + * SPDX-License-Identifier: GPL-2.0 + * + * Copyright (C) 2005 Philippe Gerum + * Copyright (C) 2005 Gilles Chanteperdrix + */ + +#include +#include +#include +#include + +int ipipe_syscall_hook(struct ipipe_domain *ipd, struct pt_regs *regs) +{ + if (unlikely(is_secondary_domain())) + return handle_root_syscall(regs); + + return handle_head_syscall(ipd != &xnsched_realtime_domain, regs); +} + +int ipipe_fastcall_hook(struct pt_regs *regs) +{ + int ret; + + ret = handle_head_syscall(false, regs); + XENO_BUG_ON(COBALT, ret == KEVENT_PROPAGATE); + + return ret; +} diff --git a/kernel/cobalt/posix/process.h b/kernel/cobalt/posix/process.h index a2f4ec591..22142ee03 100644 --- a/kernel/cobalt/posix/process.h +++ b/kernel/cobalt/posix/process.h @@ -23,9 +23,6 @@ #include #include -#define KEVENT_PROPAGATE 0 -#define KEVENT_STOP 1 - #define NR_PERSONALITIES 4 #if BITS_PER_LONG < NR_PERSONALITIES #error "NR_PERSONALITIES overflows internal bitmap" diff --git a/kernel/cobalt/posix/syscall.c b/kernel/cobalt/posix/syscall.c index 4d2331ddc..3b3eaee8e 100644 --- a/kernel/cobalt/posix/syscall.c +++ b/kernel/cobalt/posix/syscall.c @@ -18,7 +18,6 @@ */ #include #include -#include #include #include #include @@ -26,6 +25,7 @@ #include #include #include +#include #include #include "internal.h" #include "thread.h" @@ -475,7 +475,7 @@ static inline int allowed_syscall(struct cobalt_process *process, return cap_raised(current_cap(), CAP_SYS_NICE); } -static int handle_head_syscall(struct ipipe_domain *ipd, struct pt_regs *regs) +int handle_head_syscall(bool caller_is_relaxed, struct pt_regs *regs) { struct cobalt_process *process; int switched, sigs, sysflags; @@ -553,7 +553,7 @@ restart: /* * The syscall must run from the Linux domain. */ - if (ipd == &xnsched_realtime_domain) { + if (!caller_is_relaxed) { /* * Request originates from the Xenomai domain: * relax the caller then invoke the syscall @@ -578,7 +578,7 @@ restart: * hand it over to our secondary-mode dispatcher. * Otherwise, invoke the syscall handler immediately. */ - if (ipd != &xnsched_realtime_domain) + if (caller_is_relaxed) return KEVENT_PROPAGATE; } @@ -667,7 +667,7 @@ bad_syscall: return KEVENT_STOP; } -static int handle_root_syscall(struct ipipe_domain *ipd, struct pt_regs *regs) +int handle_root_syscall(struct pt_regs *regs) { int sysflags, switched, sigs; struct xnthread *thread; @@ -777,24 +777,6 @@ ret_handled: return KEVENT_STOP; } -int ipipe_syscall_hook(struct ipipe_domain *ipd, struct pt_regs *regs) -{ - if (unlikely(is_secondary_domain())) - return handle_root_syscall(ipd, regs); - - return handle_head_syscall(ipd, regs); -} - -int ipipe_fastcall_hook(struct pt_regs *regs) -{ - int ret; - - ret = handle_head_syscall(&xnsched_realtime_domain, regs); - XENO_BUG_ON(COBALT, ret == KEVENT_PROPAGATE); - - return ret; -} - long cobalt_restart_syscall_placeholder(struct restart_block *param) { return -EINVAL; diff --git a/kernel/cobalt/posix/syscall.h b/kernel/cobalt/posix/syscall.h index 690cb2263..3a4c98d7a 100644 --- a/kernel/cobalt/posix/syscall.h +++ b/kernel/cobalt/posix/syscall.h @@ -20,6 +20,8 @@ #include +struct pt_regs; + /* Regular (native) syscall handler implementation. */ #define COBALT_SYSCALL(__name, __mode, __args) \ long CoBaLt_ ## __name __args @@ -30,4 +32,9 @@ #include +int handle_head_syscall(bool caller_is_relaxed, + struct pt_regs *regs); + +int handle_root_syscall(struct pt_regs *regs); + #endif /* !_COBALT_POSIX_SYSCALL_H */ -- 2.26.2