diff options
Diffstat (limited to 'arch/arm64/lib')
| -rw-r--r-- | arch/arm64/lib/Makefile | 4 | ||||
| -rw-r--r-- | arch/arm64/lib/bitops.S | 68 | ||||
| -rw-r--r-- | arch/arm64/lib/memchr.S (renamed from arch/arm64/lib/bitops.c) | 37 | ||||
| -rw-r--r-- | arch/arm64/lib/memcpy.S | 53 | ||||
| -rw-r--r-- | arch/arm64/lib/memmove.S | 57 | ||||
| -rw-r--r-- | arch/arm64/lib/memset.S | 53 | ||||
| -rw-r--r-- | arch/arm64/lib/strchr.S | 42 | ||||
| -rw-r--r-- | arch/arm64/lib/strrchr.S | 43 | 
8 files changed, 347 insertions, 10 deletions
diff --git a/arch/arm64/lib/Makefile b/arch/arm64/lib/Makefile index 2fb7f6092aa..59acc0ef046 100644 --- a/arch/arm64/lib/Makefile +++ b/arch/arm64/lib/Makefile @@ -1,4 +1,6 @@  lib-y		:= bitops.o delay.o					\  		   strncpy_from_user.o strnlen_user.o clear_user.o	\  		   copy_from_user.o copy_to_user.o copy_in_user.o	\ -		   copy_page.o clear_page.o +		   copy_page.o clear_page.o				\ +		   memchr.o memcpy.o memmove.o memset.o			\ +		   strchr.o strrchr.o diff --git a/arch/arm64/lib/bitops.S b/arch/arm64/lib/bitops.S new file mode 100644 index 00000000000..36216d30cb9 --- /dev/null +++ b/arch/arm64/lib/bitops.S @@ -0,0 +1,68 @@ +/* + * Based on arch/arm/lib/bitops.h + * + * Copyright (C) 2013 ARM Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ + +#include <linux/linkage.h> +#include <asm/assembler.h> + +/* + * x0: bits 5:0  bit offset + *     bits 63:6 word offset + * x1: address + */ +	.macro	bitop, name, instr +ENTRY(	\name	) +	and	x3, x0, #63		// Get bit offset +	eor	x0, x0, x3		// Clear low bits +	mov	x2, #1 +	add	x1, x1, x0, lsr #3	// Get word offset +	lsl	x3, x2, x3		// Create mask +1:	ldxr	x2, [x1] +	\instr	x2, x2, x3 +	stxr	w0, x2, [x1] +	cbnz	w0, 1b +	ret +ENDPROC(\name	) +	.endm + +	.macro	testop, name, instr +ENTRY(	\name	) +	and	x3, x0, #63		// Get bit offset +	eor	x0, x0, x3		// Clear low bits +	mov	x2, #1 +	add	x1, x1, x0, lsr #3	// Get word offset +	lsl	x4, x2, x3		// Create mask +1:	ldaxr	x2, [x1] +	lsr	x0, x2, x3		// Save old value of bit +	\instr	x2, x2, x4		// toggle bit +	stlxr	w5, x2, [x1] +	cbnz	w5, 1b +	and	x0, x0, #1 +3:	ret +ENDPROC(\name	) +	.endm + +/* + * Atomic bit operations. + */ +	bitop	change_bit, eor +	bitop	clear_bit, bic +	bitop	set_bit, orr + +	testop	test_and_change_bit, eor +	testop	test_and_clear_bit, bic +	testop	test_and_set_bit, orr diff --git a/arch/arm64/lib/bitops.c b/arch/arm64/lib/memchr.S index aa4965e60ac..8636b754916 100644 --- a/arch/arm64/lib/bitops.c +++ b/arch/arm64/lib/memchr.S @@ -1,5 +1,8 @@  /* - * Copyright (C) 2012 ARM Limited + * Based on arch/arm/lib/memchr.S + * + * Copyright (C) 1995-2000 Russell King + * Copyright (C) 2013 ARM Ltd.   *   * This program is free software; you can redistribute it and/or modify   * it under the terms of the GNU General Public License version 2 as @@ -14,12 +17,28 @@   * along with this program.  If not, see <http://www.gnu.org/licenses/>.   */ -#include <linux/kernel.h> -#include <linux/spinlock.h> -#include <linux/atomic.h> +#include <linux/linkage.h> +#include <asm/assembler.h> -#ifdef CONFIG_SMP -arch_spinlock_t __atomic_hash[ATOMIC_HASH_SIZE] __lock_aligned = { -       [0 ... (ATOMIC_HASH_SIZE-1)]  = __ARCH_SPIN_LOCK_UNLOCKED -}; -#endif +/* + * Find a character in an area of memory. + * + * Parameters: + *	x0 - buf + *	x1 - c + *	x2 - n + * Returns: + *	x0 - address of first occurrence of 'c' or 0 + */ +ENTRY(memchr) +	and	w1, w1, #0xff +1:	subs	x2, x2, #1 +	b.mi	2f +	ldrb	w3, [x0], #1 +	cmp	w3, w1 +	b.ne	1b +	sub	x0, x0, #1 +	ret +2:	mov	x0, #0 +	ret +ENDPROC(memchr) diff --git a/arch/arm64/lib/memcpy.S b/arch/arm64/lib/memcpy.S new file mode 100644 index 00000000000..27b5003609b --- /dev/null +++ b/arch/arm64/lib/memcpy.S @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2013 ARM Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ + +#include <linux/linkage.h> +#include <asm/assembler.h> + +/* + * Copy a buffer from src to dest (alignment handled by the hardware) + * + * Parameters: + *	x0 - dest + *	x1 - src + *	x2 - n + * Returns: + *	x0 - dest + */ +ENTRY(memcpy) +	mov	x4, x0 +	subs	x2, x2, #8 +	b.mi	2f +1:	ldr	x3, [x1], #8 +	subs	x2, x2, #8 +	str	x3, [x4], #8 +	b.pl	1b +2:	adds	x2, x2, #4 +	b.mi	3f +	ldr	w3, [x1], #4 +	sub	x2, x2, #4 +	str	w3, [x4], #4 +3:	adds	x2, x2, #2 +	b.mi	4f +	ldrh	w3, [x1], #2 +	sub	x2, x2, #2 +	strh	w3, [x4], #2 +4:	adds	x2, x2, #1 +	b.mi	5f +	ldrb	w3, [x1] +	strb	w3, [x4] +5:	ret +ENDPROC(memcpy) diff --git a/arch/arm64/lib/memmove.S b/arch/arm64/lib/memmove.S new file mode 100644 index 00000000000..b79fdfa42d3 --- /dev/null +++ b/arch/arm64/lib/memmove.S @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2013 ARM Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ + +#include <linux/linkage.h> +#include <asm/assembler.h> + +/* + * Move a buffer from src to test (alignment handled by the hardware). + * If dest <= src, call memcpy, otherwise copy in reverse order. + * + * Parameters: + *	x0 - dest + *	x1 - src + *	x2 - n + * Returns: + *	x0 - dest + */ +ENTRY(memmove) +	cmp	x0, x1 +	b.ls	memcpy +	add	x4, x0, x2 +	add	x1, x1, x2 +	subs	x2, x2, #8 +	b.mi	2f +1:	ldr	x3, [x1, #-8]! +	subs	x2, x2, #8 +	str	x3, [x4, #-8]! +	b.pl	1b +2:	adds	x2, x2, #4 +	b.mi	3f +	ldr	w3, [x1, #-4]! +	sub	x2, x2, #4 +	str	w3, [x4, #-4]! +3:	adds	x2, x2, #2 +	b.mi	4f +	ldrh	w3, [x1, #-2]! +	sub	x2, x2, #2 +	strh	w3, [x4, #-2]! +4:	adds	x2, x2, #1 +	b.mi	5f +	ldrb	w3, [x1, #-1] +	strb	w3, [x4, #-1] +5:	ret +ENDPROC(memmove) diff --git a/arch/arm64/lib/memset.S b/arch/arm64/lib/memset.S new file mode 100644 index 00000000000..87e4a68fbbb --- /dev/null +++ b/arch/arm64/lib/memset.S @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2013 ARM Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ + +#include <linux/linkage.h> +#include <asm/assembler.h> + +/* + * Fill in the buffer with character c (alignment handled by the hardware) + * + * Parameters: + *	x0 - buf + *	x1 - c + *	x2 - n + * Returns: + *	x0 - buf + */ +ENTRY(memset) +	mov	x4, x0 +	and	w1, w1, #0xff +	orr	w1, w1, w1, lsl #8 +	orr	w1, w1, w1, lsl #16 +	orr	x1, x1, x1, lsl #32 +	subs	x2, x2, #8 +	b.mi	2f +1:	str	x1, [x4], #8 +	subs	x2, x2, #8 +	b.pl	1b +2:	adds	x2, x2, #4 +	b.mi	3f +	sub	x2, x2, #4 +	str	w1, [x4], #4 +3:	adds	x2, x2, #2 +	b.mi	4f +	sub	x2, x2, #2 +	strh	w1, [x4], #2 +4:	adds	x2, x2, #1 +	b.mi	5f +	strb	w1, [x4] +5:	ret +ENDPROC(memset) diff --git a/arch/arm64/lib/strchr.S b/arch/arm64/lib/strchr.S new file mode 100644 index 00000000000..dae0cf5591f --- /dev/null +++ b/arch/arm64/lib/strchr.S @@ -0,0 +1,42 @@ +/* + * Based on arch/arm/lib/strchr.S + * + * Copyright (C) 1995-2000 Russell King + * Copyright (C) 2013 ARM Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ + +#include <linux/linkage.h> +#include <asm/assembler.h> + +/* + * Find the first occurrence of a character in a string. + * + * Parameters: + *	x0 - str + *	x1 - c + * Returns: + *	x0 - address of first occurrence of 'c' or 0 + */ +ENTRY(strchr) +	and	w1, w1, #0xff +1:	ldrb	w2, [x0], #1 +	cmp	w2, w1 +	ccmp	w2, wzr, #4, ne +	b.ne	1b +	sub	x0, x0, #1 +	cmp	w2, w1 +	csel	x0, x0, xzr, eq +	ret +ENDPROC(strchr) diff --git a/arch/arm64/lib/strrchr.S b/arch/arm64/lib/strrchr.S new file mode 100644 index 00000000000..61eabd9a289 --- /dev/null +++ b/arch/arm64/lib/strrchr.S @@ -0,0 +1,43 @@ +/* + * Based on arch/arm/lib/strrchr.S + * + * Copyright (C) 1995-2000 Russell King + * Copyright (C) 2013 ARM Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ + +#include <linux/linkage.h> +#include <asm/assembler.h> + +/* + * Find the last occurrence of a character in a string. + * + * Parameters: + *	x0 - str + *	x1 - c + * Returns: + *	x0 - address of last occurrence of 'c' or 0 + */ +ENTRY(strrchr) +	mov	x3, #0 +	and	w1, w1, #0xff +1:	ldrb	w2, [x0], #1 +	cbz	w2, 2f +	cmp	w2, w1 +	b.ne	1b +	sub	x3, x0, #1 +	b	1b +2:	mov	x0, x3 +	ret +ENDPROC(strrchr)  |