-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'arm64-klib' into upstream
* arm64-klib: arm64: klib: Optimised atomic bitops arm64: klib: Optimised string functions arm64: klib: Optimised memory functions
- Loading branch information
Showing
12 changed files
with
418 additions
and
18 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
/* | ||
* 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/>. | ||
*/ | ||
#ifndef __ASM_STRING_H | ||
#define __ASM_STRING_H | ||
|
||
#define __HAVE_ARCH_STRRCHR | ||
extern char *strrchr(const char *, int c); | ||
|
||
#define __HAVE_ARCH_STRCHR | ||
extern char *strchr(const char *, int c); | ||
|
||
#define __HAVE_ARCH_MEMCPY | ||
extern void *memcpy(void *, const void *, __kernel_size_t); | ||
|
||
#define __HAVE_ARCH_MEMMOVE | ||
extern void *memmove(void *, const void *, __kernel_size_t); | ||
|
||
#define __HAVE_ARCH_MEMCHR | ||
extern void *memchr(const void *, int, __kernel_size_t); | ||
|
||
#define __HAVE_ARCH_MEMSET | ||
extern void *memset(void *, int, __kernel_size_t); | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
/* | ||
* 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 | ||
smp_dmb ish | ||
1: ldxr x2, [x1] | ||
lsr x0, x2, x3 // Save old value of bit | ||
\instr x2, x2, x4 // toggle bit | ||
stxr w2, x2, [x1] | ||
cbnz w2, 1b | ||
smp_dmb ish | ||
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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) |
Oops, something went wrong.