Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) // Copyright (C) 2005-2017 Andes Technology Corporation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4) #ifndef __NDS32_FUTEX_H__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5) #define __NDS32_FUTEX_H__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) #include <linux/futex.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) #include <linux/uaccess.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) #include <asm/errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) #define __futex_atomic_ex_table(err_reg)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) 	"	.pushsection __ex_table,\"a\"\n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) 	"	.align	3\n"					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) 	"	.long	1b, 4f\n"				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) 	"	.long	2b, 4f\n"				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) 	"	.popsection\n"					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) 	"	.pushsection .fixup,\"ax\"\n"			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) 	"4:	move	%0, " err_reg "\n"			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) 	"	b	3b\n"					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) 	"	.popsection"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) #define __futex_atomic_op(insn, ret, oldval, tmp, uaddr, oparg)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 	smp_mb();						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) 	asm volatile(					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 	"	movi	$ta, #0\n"				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 	"1:	llw	%1, [%2+$ta]\n"				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 	"	" insn "\n"					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 	"2:	scw	%0, [%2+$ta]\n"				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) 	"	beqz	%0, 1b\n"				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 	"	movi	%0, #0\n"				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 	"3:\n"							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) 	__futex_atomic_ex_table("%4")				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 	: "=&r" (ret), "=&r" (oldval)				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 	: "r" (uaddr), "r" (oparg), "i" (-EFAULT)		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 	: "cc", "memory")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) static inline int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) futex_atomic_cmpxchg_inatomic(u32 * uval, u32 __user * uaddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 			      u32 oldval, u32 newval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 	int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 	u32 val, tmp, flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 	if (!access_ok(uaddr, sizeof(u32)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 		return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 	smp_mb();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 	asm volatile ("       movi    $ta, #0\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 		      "1:     llw     %1, [%6 + $ta]\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 		      "       sub     %3, %1, %4\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 		      "       cmovz   %2, %5, %3\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 		      "       cmovn   %2, %1, %3\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 		      "2:     scw     %2, [%6 + $ta]\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 		      "       beqz    %2, 1b\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 		      "3:\n                   " __futex_atomic_ex_table("%7")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 		      :"+&r"(ret), "=&r"(val), "=&r"(tmp), "=&r"(flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 		      :"r"(oldval), "r"(newval), "r"(uaddr), "i"(-EFAULT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 		      :"$ta", "memory");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 	smp_mb();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	*uval = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) static inline int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) arch_futex_atomic_op_inuser(int op, int oparg, int *oval, u32 __user *uaddr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	int oldval = 0, ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 	if (!access_ok(uaddr, sizeof(u32)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 		return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 	switch (op) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 	case FUTEX_OP_SET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 		__futex_atomic_op("move	%0, %3", ret, oldval, tmp, uaddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 				  oparg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 	case FUTEX_OP_ADD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 		__futex_atomic_op("add	%0, %1, %3", ret, oldval, tmp, uaddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 				  oparg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 	case FUTEX_OP_OR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 		__futex_atomic_op("or	%0, %1, %3", ret, oldval, tmp, uaddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 				  oparg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	case FUTEX_OP_ANDN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 		__futex_atomic_op("and	%0, %1, %3", ret, oldval, tmp, uaddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 				  ~oparg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 	case FUTEX_OP_XOR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 		__futex_atomic_op("xor	%0, %1, %3", ret, oldval, tmp, uaddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 				  oparg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 		ret = -ENOSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 	if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 		*oval = oldval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #endif /* __NDS32_FUTEX_H__ */