[PATCH V3] Add C-SKY architecture support

Guo Ren guoren at kernel.org
Wed Apr 3 13:45:04 UTC 2019


Hi Dmitry,

Ping.

Is there any problem with the csky porting patch ? You can try it with:
https://gitlab.com/c-sky/buildroot/-/jobs/189665176/artifacts/browse/output/images/

See readme.txt for quick start.

Best Regards
 Guo Ren

On Mon, Mar 25, 2019 at 11:03:56AM +0800, guoren at kernel.org wrote:
> From: Guo Ren <ren_guo at c-sky.com>
> 
> This is port of C-SKY architecture for strace. There is a little
> difference between abiv1 and abiv2, we use __CSKYABIV2__ from GCC-csky
> to distinguish.
> 
> TODO:
>  - personality, mpers (multi personality support)
> 
> Changelog:
>  - Fixup get_syscall_args.c with orig_a0.
>  - Coding convention and remove Copyright line.
>  - Remove arch_defs_.h.
> 
> Thx for the reviewers:
>  - Dmitry V. Levin <ldv at altlinux.org>
> 
> Signed-off-by: Guo Ren <ren_guo at c-sky.com>
> Cc: Dmitry V. Levin <ldv at altlinux.org>
> ---
>  Makefile.am                   | 10 ++++++++++
>  cacheflush.c                  |  4 ++--
>  clone.c                       |  2 +-
>  configure.ac                  |  4 ++++
>  linux/csky/arch_regs.c        |  8 ++++++++
>  linux/csky/get_error.c        | 15 +++++++++++++++
>  linux/csky/get_scno.c         | 15 +++++++++++++++
>  linux/csky/get_syscall_args.c | 16 ++++++++++++++++
>  linux/csky/ioctls_arch0.h     |  1 +
>  linux/csky/ioctls_inc0.h      |  1 +
>  linux/csky/raw_syscall.h      | 29 +++++++++++++++++++++++++++++
>  linux/csky/set_error.c        | 17 +++++++++++++++++
>  linux/csky/set_scno.c         | 14 ++++++++++++++
>  linux/csky/syscallent.h       |  4 ++++
>  14 files changed, 137 insertions(+), 3 deletions(-)
>  create mode 100644 linux/csky/arch_regs.c
>  create mode 100644 linux/csky/get_error.c
>  create mode 100644 linux/csky/get_scno.c
>  create mode 100644 linux/csky/get_syscall_args.c
>  create mode 100644 linux/csky/ioctls_arch0.h
>  create mode 100644 linux/csky/ioctls_inc0.h
>  create mode 100644 linux/csky/raw_syscall.h
>  create mode 100644 linux/csky/set_error.c
>  create mode 100644 linux/csky/set_scno.c
>  create mode 100644 linux/csky/syscallent.h
> 
> diff --git a/Makefile.am b/Makefile.am
> index 56987ae..b594691 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -510,6 +510,16 @@ EXTRA_DIST =				\
>  	linux/bfin/set_error.c		\
>  	linux/bfin/set_scno.c		\
>  	linux/bfin/syscallent.h		\
> +	linux/csky/arch_regs.c		\
> +	linux/csky/get_error.c		\
> +	linux/csky/get_scno.c		\
> +	linux/csky/get_syscall_args.c	\
> +	linux/csky/ioctls_arch0.h	\
> +	linux/csky/ioctls_inc0.h	\
> +	linux/csky/raw_syscall.h	\
> +	linux/csky/set_error.c		\
> +	linux/csky/set_scno.c		\
> +	linux/csky/syscallent.h		\
>  	linux/bfin/userent.h		\
>  	linux/check_scno.c		\
>  	linux/dummy.h			\
> diff --git a/cacheflush.c b/cacheflush.c
> index f38a3f9..401aa8f 100644
> --- a/cacheflush.c
> +++ b/cacheflush.c
> @@ -49,7 +49,7 @@ SYS_FUNC(cacheflush)
>  }
>  #endif /* M68K */
>  
> -#ifdef BFIN
> +#if defined(BFIN) || defined(CSKY)
>  static const struct xlat cacheflush_flags[] = {
>  	XLAT(ICACHE),
>  	XLAT(DCACHE),
> @@ -68,7 +68,7 @@ SYS_FUNC(cacheflush)
>  
>  	return RVAL_DECODED;
>  }
> -#endif /* BFIN */
> +#endif /* BFIN || CSKY */
>  
>  #ifdef SH
>  static const struct xlat cacheflush_flags[] = {
> diff --git a/clone.c b/clone.c
> index 64c7e95..da05f1d 100644
> --- a/clone.c
> +++ b/clone.c
> @@ -42,7 +42,7 @@
>  # define ARG_PTID	2
>  # define ARG_CTID	((current_personality != 1) ? 3 : 4)
>  # define ARG_TLS	((current_personality != 1) ? 4 : 3)
> -#elif defined ALPHA || defined TILE || defined OR1K
> +#elif defined ALPHA || defined TILE || defined OR1K || defined CSKY
>  # define ARG_FLAGS	0
>  # define ARG_STACK	1
>  # define ARG_PTID	2
> diff --git a/configure.ac b/configure.ac
> index c95fd22..86d3626 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -79,6 +79,10 @@ bfin)
>  	arch=bfin
>  	AC_DEFINE([BFIN], 1, [Define for the Blackfin architecture.])
>  	;;
> +csky*)
> +	arch=csky
> +	AC_DEFINE([CSKY], 1, [Define for the C-SKY architecture])
> +	;;
>  hppa*|parisc*)
>  	arch=hppa
>  	AC_DEFINE([HPPA], 1, [Define for the HPPA architecture.])
> diff --git a/linux/csky/arch_regs.c b/linux/csky/arch_regs.c
> new file mode 100644
> index 0000000..5434f4b
> --- /dev/null
> +++ b/linux/csky/arch_regs.c
> @@ -0,0 +1,8 @@
> +/*
> + * SPDX-License-Identifier: LGPL-2.1-or-later
> + */
> +
> +static struct pt_regs csky_regs;
> +#define ARCH_REGS_FOR_GETREGSET	csky_regs
> +#define ARCH_PC_REG		csky_regs.pc
> +#define ARCH_SP_REG		csky_regs.usp;
> diff --git a/linux/csky/get_error.c b/linux/csky/get_error.c
> new file mode 100644
> index 0000000..8b26b3a
> --- /dev/null
> +++ b/linux/csky/get_error.c
> @@ -0,0 +1,15 @@
> +/*
> + * SPDX-License-Identifier: LGPL-2.1-or-later
> + */
> +#include "negated_errno.h"
> +
> +static void
> +arch_get_error(struct tcb *tcp, const bool check_errno)
> +{
> +	if (check_errno && is_negated_errno(csky_regs.a0)) {
> +		tcp->u_rval = -1;
> +		tcp->u_error = -csky_regs.a0;
> +	} else {
> +		tcp->u_rval = csky_regs.a0;
> +	}
> +}
> diff --git a/linux/csky/get_scno.c b/linux/csky/get_scno.c
> new file mode 100644
> index 0000000..53635a8
> --- /dev/null
> +++ b/linux/csky/get_scno.c
> @@ -0,0 +1,15 @@
> +/*
> + * SPDX-License-Identifier: LGPL-2.1-or-later
> + */
> +
> +/* Return codes: 1 - ok, 0 - ignore, other - error. */
> +static int
> +arch_get_scno(struct tcb *tcp)
> +{
> +#if defined(__CSKYABIV2__)
> +	tcp->scno = csky_regs.regs[3];
> +#else
> +	tcp->scno = csky_regs.r1;
> +#endif
> +	return 1;
> +}
> diff --git a/linux/csky/get_syscall_args.c b/linux/csky/get_syscall_args.c
> new file mode 100644
> index 0000000..e3db419
> --- /dev/null
> +++ b/linux/csky/get_syscall_args.c
> @@ -0,0 +1,16 @@
> +/*
> + * SPDX-License-Identifier: LGPL-2.1-or-later
> + */
> +
> +/* Return -1 on error or 1 on success (never 0!). */
> +static int
> +arch_get_syscall_args(struct tcb *tcp)
> +{
> +	tcp->u_arg[0] = csky_regs.orig_a0;
> +	tcp->u_arg[1] = csky_regs.a1;
> +	tcp->u_arg[2] = csky_regs.a2;
> +	tcp->u_arg[3] = csky_regs.a3;
> +	tcp->u_arg[4] = csky_regs.regs[0];
> +	tcp->u_arg[5] = csky_regs.regs[1];
> +	return 1;
> +}
> diff --git a/linux/csky/ioctls_arch0.h b/linux/csky/ioctls_arch0.h
> new file mode 100644
> index 0000000..8b7ac89
> --- /dev/null
> +++ b/linux/csky/ioctls_arch0.h
> @@ -0,0 +1 @@
> +/* Generated by ioctls_gen.sh from definitions found in $linux/arch/csky/include/ tree. */
> diff --git a/linux/csky/ioctls_inc0.h b/linux/csky/ioctls_inc0.h
> new file mode 100644
> index 0000000..4aecf98
> --- /dev/null
> +++ b/linux/csky/ioctls_inc0.h
> @@ -0,0 +1 @@
> +#include "32/ioctls_inc.h"
> diff --git a/linux/csky/raw_syscall.h b/linux/csky/raw_syscall.h
> new file mode 100644
> index 0000000..b77e838
> --- /dev/null
> +++ b/linux/csky/raw_syscall.h
> @@ -0,0 +1,29 @@
> +/*
> + * SPDX-License-Identifier: LGPL-2.1-or-later
> + */
> +
> +#ifndef STRACE_RAW_SYSCALL_H
> +#define STRACE_RAW_SYSCALL_H
> +
> +# include "kernel_types.h"
> +
> +static inline kernel_ulong_t
> +raw_syscall_0(const kernel_ulong_t nr, kernel_ulong_t *err)
> +{
> +#if defined(__CSKYABIV2__)
> +	register kernel_ulong_t scno __asm__("r7") = nr;
> +#else
> +	register kernel_ulong_t scno __asm__("r1") = nr;
> +#endif
> +	register kernel_ulong_t a0 __asm__("a0");
> +	asm volatile("trap 0"
> +		: "+r"(scno), "=r"(a0)
> +		:
> +		: "memory");
> +
> +	*err = 0;
> +	return a0;
> +}
> +# define raw_syscall_0 raw_syscall_0
> +
> +#endif /* !STRACE_RAW_SYSCALL_H */
> diff --git a/linux/csky/set_error.c b/linux/csky/set_error.c
> new file mode 100644
> index 0000000..3eddf0f
> --- /dev/null
> +++ b/linux/csky/set_error.c
> @@ -0,0 +1,17 @@
> +/*
> + * SPDX-License-Identifier: LGPL-2.1-or-later
> + */
> +
> +static int
> +arch_set_error(struct tcb *tcp)
> +{
> +	csky_regs.a0 = -tcp->u_error;
> +	return set_regs(tcp->pid);
> +}
> +
> +static int
> +arch_set_success(struct tcb *tcp)
> +{
> +	csky_regs.a0 = tcp->u_rval;
> +	return set_regs(tcp->pid);
> +}
> diff --git a/linux/csky/set_scno.c b/linux/csky/set_scno.c
> new file mode 100644
> index 0000000..4aac53f
> --- /dev/null
> +++ b/linux/csky/set_scno.c
> @@ -0,0 +1,14 @@
> +/*
> + * SPDX-License-Identifier: LGPL-2.1-or-later
> + */
> +
> +static int
> +arch_set_scno(struct tcb *tcp, kernel_ulong_t scno)
> +{
> +#if defined(__CSKYABIV2__)
> +	csky_regs.regs[3] = scno;
> +#else
> +	csky_regs.r1 = scno;
> +#endif
> +	return set_regs(tcp->pid);
> +}
> diff --git a/linux/csky/syscallent.h b/linux/csky/syscallent.h
> new file mode 100644
> index 0000000..33e3e73
> --- /dev/null
> +++ b/linux/csky/syscallent.h
> @@ -0,0 +1,4 @@
> +#include "32/syscallent.h"
> +/* [244 ... 259] are arch specific */
> +[244] = {1,    0,	SEN(set_thread_area), "set_thread_area"},
> +[245] = {3,    0,	SEN(cacheflush), "cacheflush"},
> -- 
> 2.7.4
> 
> -- 
> Strace-devel mailing list
> Strace-devel at lists.strace.io
> https://lists.strace.io/mailman/listinfo/strace-devel


More information about the Strace-devel mailing list