-
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.
arm64: klib: Optimised memory functions
This patch introduces AArch64-specific memory functions (memcpy, memmove, memchr, memset). These functions are not optimised for any CPU implementation but can be used as a starting point once hardware is available. Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
- Loading branch information
Catalin Marinas
committed
Mar 21, 2013
1 parent
7920720
commit 4a89922
Showing
8 changed files
with
246 additions
and
2 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
/* | ||
* 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_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,5 @@ | ||
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 |
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,44 @@ | ||
/* | ||
* 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 | ||
* 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 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) |
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) |