diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-22 10:38:37 -0500 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-22 10:38:37 -0500 |
commit | fcc9d2e5a6c89d22b8b773a64fb4ad21ac318446 (patch) | |
tree | a57612d1888735a2ec7972891b68c1ac5ec8faea /arch/arm/lib | |
parent | 8dea78da5cee153b8af9c07a2745f6c55057fe12 (diff) |
Diffstat (limited to 'arch/arm/lib')
-rw-r--r-- | arch/arm/lib/delay.S | 69 | ||||
-rw-r--r-- | arch/arm/lib/strncpy_from_user.S | 43 | ||||
-rw-r--r-- | arch/arm/lib/strnlen_user.S | 40 |
3 files changed, 152 insertions, 0 deletions
diff --git a/arch/arm/lib/delay.S b/arch/arm/lib/delay.S new file mode 100644 index 00000000000..3c9a05c8d20 --- /dev/null +++ b/arch/arm/lib/delay.S | |||
@@ -0,0 +1,69 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/lib/delay.S | ||
3 | * | ||
4 | * Copyright (C) 1995, 1996 Russell King | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | #include <linux/linkage.h> | ||
11 | #include <asm/assembler.h> | ||
12 | #include <asm/param.h> | ||
13 | .text | ||
14 | |||
15 | .LC0: .word loops_per_jiffy | ||
16 | .LC1: .word (2199023*HZ)>>11 | ||
17 | |||
18 | /* | ||
19 | * r0 <= 2000 | ||
20 | * lpj <= 0x01ffffff (max. 3355 bogomips) | ||
21 | * HZ <= 1000 | ||
22 | */ | ||
23 | |||
24 | ENTRY(__udelay) | ||
25 | ldr r2, .LC1 | ||
26 | mul r0, r2, r0 | ||
27 | ENTRY(__const_udelay) @ 0 <= r0 <= 0x7fffff06 | ||
28 | mov r1, #-1 | ||
29 | ldr r2, .LC0 | ||
30 | ldr r2, [r2] @ max = 0x01ffffff | ||
31 | add r0, r0, r1, lsr #32-14 | ||
32 | mov r0, r0, lsr #14 @ max = 0x0001ffff | ||
33 | add r2, r2, r1, lsr #32-10 | ||
34 | mov r2, r2, lsr #10 @ max = 0x00007fff | ||
35 | mul r0, r2, r0 @ max = 2^32-1 | ||
36 | add r0, r0, r1, lsr #32-6 | ||
37 | movs r0, r0, lsr #6 | ||
38 | moveq pc, lr | ||
39 | |||
40 | /* | ||
41 | * loops = r0 * HZ * loops_per_jiffy / 1000000 | ||
42 | * | ||
43 | * Oh, if only we had a cycle counter... | ||
44 | */ | ||
45 | |||
46 | @ Delay routine | ||
47 | ENTRY(__delay) | ||
48 | subs r0, r0, #1 | ||
49 | #if 0 | ||
50 | movls pc, lr | ||
51 | subs r0, r0, #1 | ||
52 | movls pc, lr | ||
53 | subs r0, r0, #1 | ||
54 | movls pc, lr | ||
55 | subs r0, r0, #1 | ||
56 | movls pc, lr | ||
57 | subs r0, r0, #1 | ||
58 | movls pc, lr | ||
59 | subs r0, r0, #1 | ||
60 | movls pc, lr | ||
61 | subs r0, r0, #1 | ||
62 | movls pc, lr | ||
63 | subs r0, r0, #1 | ||
64 | #endif | ||
65 | bhi __delay | ||
66 | mov pc, lr | ||
67 | ENDPROC(__udelay) | ||
68 | ENDPROC(__const_udelay) | ||
69 | ENDPROC(__delay) | ||
diff --git a/arch/arm/lib/strncpy_from_user.S b/arch/arm/lib/strncpy_from_user.S new file mode 100644 index 00000000000..f202d7bd164 --- /dev/null +++ b/arch/arm/lib/strncpy_from_user.S | |||
@@ -0,0 +1,43 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/lib/strncpy_from_user.S | ||
3 | * | ||
4 | * Copyright (C) 1995-2000 Russell King | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | #include <linux/linkage.h> | ||
11 | #include <asm/assembler.h> | ||
12 | #include <asm/errno.h> | ||
13 | |||
14 | .text | ||
15 | .align 5 | ||
16 | |||
17 | /* | ||
18 | * Copy a string from user space to kernel space. | ||
19 | * r0 = dst, r1 = src, r2 = byte length | ||
20 | * returns the number of characters copied (strlen of copied string), | ||
21 | * -EFAULT on exception, or "len" if we fill the whole buffer | ||
22 | */ | ||
23 | ENTRY(__strncpy_from_user) | ||
24 | mov ip, r1 | ||
25 | 1: subs r2, r2, #1 | ||
26 | ldrusr r3, r1, 1, pl | ||
27 | bmi 2f | ||
28 | strb r3, [r0], #1 | ||
29 | teq r3, #0 | ||
30 | bne 1b | ||
31 | sub r1, r1, #1 @ take NUL character out of count | ||
32 | 2: sub r0, r1, ip | ||
33 | mov pc, lr | ||
34 | ENDPROC(__strncpy_from_user) | ||
35 | |||
36 | .pushsection .fixup,"ax" | ||
37 | .align 0 | ||
38 | 9001: mov r3, #0 | ||
39 | strb r3, [r0, #0] @ null terminate | ||
40 | mov r0, #-EFAULT | ||
41 | mov pc, lr | ||
42 | .popsection | ||
43 | |||
diff --git a/arch/arm/lib/strnlen_user.S b/arch/arm/lib/strnlen_user.S new file mode 100644 index 00000000000..0ecbb459c4f --- /dev/null +++ b/arch/arm/lib/strnlen_user.S | |||
@@ -0,0 +1,40 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/lib/strnlen_user.S | ||
3 | * | ||
4 | * Copyright (C) 1995-2000 Russell King | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | #include <linux/linkage.h> | ||
11 | #include <asm/assembler.h> | ||
12 | #include <asm/errno.h> | ||
13 | |||
14 | .text | ||
15 | .align 5 | ||
16 | |||
17 | /* Prototype: unsigned long __strnlen_user(const char *str, long n) | ||
18 | * Purpose : get length of a string in user memory | ||
19 | * Params : str - address of string in user memory | ||
20 | * Returns : length of string *including terminator* | ||
21 | * or zero on exception, or n + 1 if too long | ||
22 | */ | ||
23 | ENTRY(__strnlen_user) | ||
24 | mov r2, r0 | ||
25 | 1: | ||
26 | ldrusr r3, r0, 1 | ||
27 | teq r3, #0 | ||
28 | beq 2f | ||
29 | subs r1, r1, #1 | ||
30 | bne 1b | ||
31 | add r0, r0, #1 | ||
32 | 2: sub r0, r0, r2 | ||
33 | mov pc, lr | ||
34 | ENDPROC(__strnlen_user) | ||
35 | |||
36 | .pushsection .fixup,"ax" | ||
37 | .align 0 | ||
38 | 9001: mov r0, #0 | ||
39 | mov pc, lr | ||
40 | .popsection | ||