From: Jan Kiszka <jan.kis...@siemens.com> I-pipe makes sure that arguments of compat calls are ordered just like native calls. Dovetail does not. But it is better to use the kernel's syscall_get_arguments for retrieving the arguments anyway. Introduce pipeline_get_syscall_args to abstract that difference.
Signed-off-by: Jan Kiszka <jan.kis...@siemens.com> --- Applies on top of the dovetail branch, not yet next. include/cobalt/kernel/dovetail/pipeline/pipeline.h | 8 ++++++++ include/cobalt/kernel/ipipe/pipeline/pipeline.h | 12 ++++++++++++ .../arm/dovetail/include/asm/xenomai/syscall.h | 5 ----- .../x86/dovetail/include/asm/xenomai/syscall.h | 5 ----- .../cobalt/include/asm-generic/xenomai/syscall.h | 7 ------- kernel/cobalt/posix/syscall.c | 14 ++++++++++---- 6 files changed, 30 insertions(+), 21 deletions(-) diff --git a/include/cobalt/kernel/dovetail/pipeline/pipeline.h b/include/cobalt/kernel/dovetail/pipeline/pipeline.h index 3cc7268d00..685af12af4 100644 --- a/include/cobalt/kernel/dovetail/pipeline/pipeline.h +++ b/include/cobalt/kernel/dovetail/pipeline/pipeline.h @@ -6,6 +6,7 @@ #define _COBALT_KERNEL_DOVETAIL_PIPELINE_H #include <linux/irq_pipeline.h> +#include <asm/syscall.h> #include <cobalt/kernel/assert.h> #include <asm/xenomai/features.h> #include <pipeline/machine.h> @@ -90,4 +91,11 @@ static inline void pipeline_collect_features(struct cobalt_featinfo *f) f->clock_freq = 0; /* N/A */ } +static inline void pipeline_get_syscall_args(struct task_struct *task, + struct pt_regs *regs, + unsigned long *args) +{ + syscall_get_arguments(task, regs, args); +} + #endif /* !_COBALT_KERNEL_DOVETAIL_PIPELINE_H */ diff --git a/include/cobalt/kernel/ipipe/pipeline/pipeline.h b/include/cobalt/kernel/ipipe/pipeline/pipeline.h index fda962568a..ac9c92b1b0 100644 --- a/include/cobalt/kernel/ipipe/pipeline/pipeline.h +++ b/include/cobalt/kernel/ipipe/pipeline/pipeline.h @@ -11,6 +11,7 @@ #include <pipeline/machine.h> #include <asm/xenomai/features.h> +#include <asm/xenomai/syscall.h> #define xnsched_primary_domain cobalt_pipeline.domain @@ -81,4 +82,15 @@ static inline void pipeline_collect_features(struct cobalt_featinfo *f) f->clock_freq = cobalt_pipeline.clock_freq; } +static inline void pipeline_get_syscall_args(struct task_struct *task, + struct pt_regs *regs, + unsigned long *args) +{ + *args++ = __xn_reg_arg1(regs); + *args++ = __xn_reg_arg2(regs); + *args++ = __xn_reg_arg3(regs); + *args++ = __xn_reg_arg4(regs); + *args = __xn_reg_arg5(regs); +} + #endif /* !_COBALT_KERNEL_IPIPE_PIPELINE_H */ diff --git a/kernel/cobalt/arch/arm/dovetail/include/asm/xenomai/syscall.h b/kernel/cobalt/arch/arm/dovetail/include/asm/xenomai/syscall.h index eb4ec1bbe1..fe8c1853aa 100644 --- a/kernel/cobalt/arch/arm/dovetail/include/asm/xenomai/syscall.h +++ b/kernel/cobalt/arch/arm/dovetail/include/asm/xenomai/syscall.h @@ -59,11 +59,6 @@ }) #define __xn_reg_rval(__regs) ((__regs)->ARM_r0) -#define __xn_reg_arg1(__regs) ((__regs)->ARM_r1) -#define __xn_reg_arg2(__regs) ((__regs)->ARM_r2) -#define __xn_reg_arg3(__regs) ((__regs)->ARM_r3) -#define __xn_reg_arg4(__regs) ((__regs)->ARM_r4) -#define __xn_reg_arg5(__regs) ((__regs)->ARM_r5) #define __xn_reg_pc(__regs) ((__regs)->ARM_ip) #define __xn_reg_sp(__regs) ((__regs)->ARM_sp) diff --git a/kernel/cobalt/arch/x86/dovetail/include/asm/xenomai/syscall.h b/kernel/cobalt/arch/x86/dovetail/include/asm/xenomai/syscall.h index bf7a44ea0c..212840b5ef 100644 --- a/kernel/cobalt/arch/x86/dovetail/include/asm/xenomai/syscall.h +++ b/kernel/cobalt/arch/x86/dovetail/include/asm/xenomai/syscall.h @@ -29,11 +29,6 @@ */ #define __xn_reg_sys(regs) ((regs)->orig_ax) #define __xn_reg_rval(regs) ((regs)->ax) -#define __xn_reg_arg1(regs) ((regs)->di) -#define __xn_reg_arg2(regs) ((regs)->si) -#define __xn_reg_arg3(regs) ((regs)->dx) -#define __xn_reg_arg4(regs) ((regs)->r10) -#define __xn_reg_arg5(regs) ((regs)->r8) #define __xn_reg_pc(regs) ((regs)->ip) #define __xn_reg_sp(regs) ((regs)->sp) diff --git a/kernel/cobalt/include/asm-generic/xenomai/syscall.h b/kernel/cobalt/include/asm-generic/xenomai/syscall.h index 91bbf3bfd1..194583c184 100644 --- a/kernel/cobalt/include/asm-generic/xenomai/syscall.h +++ b/kernel/cobalt/include/asm-generic/xenomai/syscall.h @@ -36,13 +36,6 @@ #define access_wok(addr, size) access_ok(VERIFY_WRITE, (addr), (size)) #endif -#define __xn_reg_arglist(regs) \ - __xn_reg_arg1(regs), \ - __xn_reg_arg2(regs), \ - __xn_reg_arg3(regs), \ - __xn_reg_arg4(regs), \ - __xn_reg_arg5(regs) - #define __xn_copy_from_user(dstP, srcP, n) raw_copy_from_user(dstP, srcP, n) #define __xn_copy_to_user(dstP, srcP, n) raw_copy_to_user(dstP, srcP, n) #define __xn_put_user(src, dstP) __put_user(src, dstP) diff --git a/kernel/cobalt/posix/syscall.c b/kernel/cobalt/posix/syscall.c index 30c33dda61..6a471758de 100644 --- a/kernel/cobalt/posix/syscall.c +++ b/kernel/cobalt/posix/syscall.c @@ -486,6 +486,7 @@ int handle_head_syscall(bool caller_is_relaxed, struct pt_regs *regs) struct xnthread *thread; cobalt_syshand handler; struct task_struct *p; + unsigned long args[6]; unsigned int nr, code; long ret; @@ -592,7 +593,10 @@ restart: * handler (lostage ones), or rejected by allowed_syscall(). */ - ret = handler(__xn_reg_arglist(regs)); + p = current; + pipeline_get_syscall_args(current, regs, args); + + ret = handler(args[0], args[1], args[2], args[3], args[4]); if (ret == -ENOSYS && (sysflags & __xn_exec_adaptive)) { if (switched) { ret = xnthread_harden(); @@ -611,7 +615,6 @@ done: __xn_status_return(regs, ret); sigs = 0; if (!xnsched_root_p()) { - p = current; if (signal_pending(p) || xnthread_test_info(thread, XNKICKED)) { sigs = 1; @@ -677,6 +680,7 @@ int handle_root_syscall(struct pt_regs *regs) struct xnthread *thread; cobalt_syshand handler; struct task_struct *p; + unsigned long args[6]; unsigned int nr, code; long ret; @@ -735,7 +739,10 @@ restart: xnthread_propagate_schedparam(thread); } - ret = handler(__xn_reg_arglist(regs)); + p = current; + pipeline_get_syscall_args(p, regs, args); + + ret = handler(args[0], args[1], args[2], args[3], args[4]); if (ret == -ENOSYS && (sysflags & __xn_exec_adaptive)) { sysflags ^= __xn_exec_histage; if (switched) { @@ -756,7 +763,6 @@ restart: * just invoked, so make sure to fetch it. */ thread = xnthread_current(); - p = current; if (signal_pending(p)) { sigs = 1; prepare_for_signal(p, thread, regs, sysflags); -- 2.26.2