diff options
author | Vijay Kumar <vijay.ac.kumar@oracle.com> | 2017-10-11 14:50:02 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-11-15 00:26:45 -0500 |
commit | 41413a60352cf8a7f0dd4a869d6e5c3e25aa89b2 (patch) | |
tree | f7437b5b92807dcbd7938574944d909b2b588f13 | |
parent | 9a08862a5d2e266ecea1865547463da2745fc687 (diff) |
sparc64: Define SPARC default fls function
fls will now require a boot time patching on T4 and above.
Redefining it under arch/sparc/lib.
Signed-off-by: Vijay Kumar <vijay.ac.kumar@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | arch/sparc/include/asm/bitops_64.h | 3 | ||||
-rw-r--r-- | arch/sparc/lib/Makefile | 1 | ||||
-rw-r--r-- | arch/sparc/lib/fls.S | 67 |
3 files changed, 70 insertions, 1 deletions
diff --git a/arch/sparc/include/asm/bitops_64.h b/arch/sparc/include/asm/bitops_64.h index 2d522402a937..30aea561176f 100644 --- a/arch/sparc/include/asm/bitops_64.h +++ b/arch/sparc/include/asm/bitops_64.h | |||
@@ -22,9 +22,10 @@ void set_bit(unsigned long nr, volatile unsigned long *addr); | |||
22 | void clear_bit(unsigned long nr, volatile unsigned long *addr); | 22 | void clear_bit(unsigned long nr, volatile unsigned long *addr); |
23 | void change_bit(unsigned long nr, volatile unsigned long *addr); | 23 | void change_bit(unsigned long nr, volatile unsigned long *addr); |
24 | 24 | ||
25 | int fls(unsigned int word); | ||
26 | |||
25 | #include <asm-generic/bitops/non-atomic.h> | 27 | #include <asm-generic/bitops/non-atomic.h> |
26 | 28 | ||
27 | #include <asm-generic/bitops/fls.h> | ||
28 | #include <asm-generic/bitops/__fls.h> | 29 | #include <asm-generic/bitops/__fls.h> |
29 | #include <asm-generic/bitops/fls64.h> | 30 | #include <asm-generic/bitops/fls64.h> |
30 | 31 | ||
diff --git a/arch/sparc/lib/Makefile b/arch/sparc/lib/Makefile index a1a2d39ec96e..3b9f5e0c1bcd 100644 --- a/arch/sparc/lib/Makefile +++ b/arch/sparc/lib/Makefile | |||
@@ -16,6 +16,7 @@ lib-$(CONFIG_SPARC64) += atomic_64.o | |||
16 | lib-$(CONFIG_SPARC32) += lshrdi3.o ashldi3.o | 16 | lib-$(CONFIG_SPARC32) += lshrdi3.o ashldi3.o |
17 | lib-$(CONFIG_SPARC32) += muldi3.o bitext.o cmpdi2.o | 17 | lib-$(CONFIG_SPARC32) += muldi3.o bitext.o cmpdi2.o |
18 | lib-$(CONFIG_SPARC64) += multi3.o | 18 | lib-$(CONFIG_SPARC64) += multi3.o |
19 | lib-$(CONFIG_SPARC64) += fls.o | ||
19 | 20 | ||
20 | lib-$(CONFIG_SPARC64) += copy_page.o clear_page.o bzero.o | 21 | lib-$(CONFIG_SPARC64) += copy_page.o clear_page.o bzero.o |
21 | lib-$(CONFIG_SPARC64) += csum_copy.o csum_copy_from_user.o csum_copy_to_user.o | 22 | lib-$(CONFIG_SPARC64) += csum_copy.o csum_copy_from_user.o csum_copy_to_user.o |
diff --git a/arch/sparc/lib/fls.S b/arch/sparc/lib/fls.S new file mode 100644 index 000000000000..06b8d300bcae --- /dev/null +++ b/arch/sparc/lib/fls.S | |||
@@ -0,0 +1,67 @@ | |||
1 | /* fls.S: SPARC default fls definition. | ||
2 | * | ||
3 | * SPARC default fls definition, which follows the same algorithm as | ||
4 | * in generic fls(). This function will be boot time patched on T4 | ||
5 | * and onward. | ||
6 | */ | ||
7 | |||
8 | #include <linux/linkage.h> | ||
9 | #include <asm/export.h> | ||
10 | |||
11 | .text | ||
12 | .register %g2, #scratch | ||
13 | .register %g3, #scratch | ||
14 | ENTRY(fls) | ||
15 | brz,pn %o0, 6f | ||
16 | mov 0, %o1 | ||
17 | sethi %hi(0xffff0000), %g3 | ||
18 | mov %o0, %g2 | ||
19 | andcc %o0, %g3, %g0 | ||
20 | be,pt %icc, 8f | ||
21 | mov 32, %o1 | ||
22 | sethi %hi(0xff000000), %g3 | ||
23 | andcc %g2, %g3, %g0 | ||
24 | bne,pt %icc, 3f | ||
25 | sethi %hi(0xf0000000), %g3 | ||
26 | sll %o0, 8, %o0 | ||
27 | 1: | ||
28 | add %o1, -8, %o1 | ||
29 | sra %o0, 0, %o0 | ||
30 | mov %o0, %g2 | ||
31 | 2: | ||
32 | sethi %hi(0xf0000000), %g3 | ||
33 | 3: | ||
34 | andcc %g2, %g3, %g0 | ||
35 | bne,pt %icc, 4f | ||
36 | sethi %hi(0xc0000000), %g3 | ||
37 | sll %o0, 4, %o0 | ||
38 | add %o1, -4, %o1 | ||
39 | sra %o0, 0, %o0 | ||
40 | mov %o0, %g2 | ||
41 | 4: | ||
42 | andcc %g2, %g3, %g0 | ||
43 | be,a,pt %icc, 7f | ||
44 | sll %o0, 2, %o0 | ||
45 | 5: | ||
46 | xnor %g0, %o0, %o0 | ||
47 | srl %o0, 31, %o0 | ||
48 | sub %o1, %o0, %o1 | ||
49 | 6: | ||
50 | jmp %o7 + 8 | ||
51 | sra %o1, 0, %o0 | ||
52 | 7: | ||
53 | add %o1, -2, %o1 | ||
54 | ba,pt %xcc, 5b | ||
55 | sra %o0, 0, %o0 | ||
56 | 8: | ||
57 | sll %o0, 16, %o0 | ||
58 | sethi %hi(0xff000000), %g3 | ||
59 | sra %o0, 0, %o0 | ||
60 | mov %o0, %g2 | ||
61 | andcc %g2, %g3, %g0 | ||
62 | bne,pt %icc, 2b | ||
63 | mov 16, %o1 | ||
64 | ba,pt %xcc, 1b | ||
65 | sll %o0, 8, %o0 | ||
66 | ENDPROC(fls) | ||
67 | EXPORT_SYMBOL(fls) | ||