diff options
author | Vineet Gupta <vgupta@synopsys.com> | 2016-09-19 19:42:25 -0400 |
---|---|---|
committer | Vineet Gupta <vgupta@synopsys.com> | 2016-09-30 17:48:22 -0400 |
commit | 86effd0dc675c36caed7b954d7f4f63b77c353b5 (patch) | |
tree | 618b2e5e1bed7286aead4cb7c4fe83157bdb583c | |
parent | 5a205a32ffccf6e720a2d2b3aee44b16619016a6 (diff) |
ARC: dw2 unwind: enable cfi pseudo ops in string lib
This uses a new set of annoations viz. ENTRY_CFI/END_CFI to enabel cfi
ops generation.
Note that we didn't change the normal ENTRY/EXIT as we don't actually
want unwind info in the trap/exception/interrutp handlers which use
these, as unwinder then gets confused (it keeps recursing vs. stopping).
Semantically these are leaf routines and unwinding should stop when it
hits those routines.
Before
------
28.52% 1.19% 9929 hackbench libuClibc-1.0.17.so [.] __write_nocancel
|
---__write_nocancel
|--8.95%--EV_Trap
| --8.25%--sys_write
| |--3.93%--sock_write_iter
...
|--2.62%--memset <==== [LEAF entry as no unwind info]
^^^^^^
After
-----
29.46% 1.24% 13622 hackbench libuClibc-1.0.17.so [.] __write_nocancel
|
---__write_nocancel
|--9.31%--EV_Trap
| --8.62%--sys_write
| |--4.17%--sock_write_iter
...
|--6.19%--sys_write
| --6.19%--sock_write_iter
| unix_stream_sendmsg
| |--1.62%--sock_alloc_send_pskb
| |--0.89%--sock_def_readable
| |--0.88%--_raw_spin_unlock_irqrestore
| |--0.69%--memset
| | ^^^^^^ <==== [now in proper callframe]
| |
| --0.52%--skb_copy_datagram_from_iter
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
-rw-r--r-- | arch/arc/kernel/ctx_sw_asm.S | 3 | ||||
-rw-r--r-- | arch/arc/lib/memcmp.S | 4 | ||||
-rw-r--r-- | arch/arc/lib/memcpy-700.S | 4 | ||||
-rw-r--r-- | arch/arc/lib/memcpy-archs.S | 4 | ||||
-rw-r--r-- | arch/arc/lib/memset-archs.S | 8 | ||||
-rw-r--r-- | arch/arc/lib/memset.S | 8 | ||||
-rw-r--r-- | arch/arc/lib/strchr-700.S | 4 | ||||
-rw-r--r-- | arch/arc/lib/strcmp-archs.S | 4 | ||||
-rw-r--r-- | arch/arc/lib/strcmp.S | 4 | ||||
-rw-r--r-- | arch/arc/lib/strcpy-700.S | 4 | ||||
-rw-r--r-- | arch/arc/lib/strlen.S | 4 |
11 files changed, 26 insertions, 25 deletions
diff --git a/arch/arc/kernel/ctx_sw_asm.S b/arch/arc/kernel/ctx_sw_asm.S index e6890b1f8650..7c1f365ef3d2 100644 --- a/arch/arc/kernel/ctx_sw_asm.S +++ b/arch/arc/kernel/ctx_sw_asm.S | |||
@@ -23,6 +23,7 @@ | |||
23 | .global __switch_to | 23 | .global __switch_to |
24 | .type __switch_to, @function | 24 | .type __switch_to, @function |
25 | __switch_to: | 25 | __switch_to: |
26 | CFI_STARTPROC | ||
26 | 27 | ||
27 | /* Save regs on kernel mode stack of task */ | 28 | /* Save regs on kernel mode stack of task */ |
28 | st.a blink, [sp, -4] | 29 | st.a blink, [sp, -4] |
@@ -59,4 +60,4 @@ __switch_to: | |||
59 | ld.ab blink, [sp, 4] | 60 | ld.ab blink, [sp, 4] |
60 | j [blink] | 61 | j [blink] |
61 | 62 | ||
62 | END(__switch_to) | 63 | END_CFI(__switch_to) |
diff --git a/arch/arc/lib/memcmp.S b/arch/arc/lib/memcmp.S index a4015e7d9ab7..21a103044b70 100644 --- a/arch/arc/lib/memcmp.S +++ b/arch/arc/lib/memcmp.S | |||
@@ -16,7 +16,7 @@ | |||
16 | #define SHIFT r2 | 16 | #define SHIFT r2 |
17 | #endif | 17 | #endif |
18 | 18 | ||
19 | ENTRY(memcmp) | 19 | ENTRY_CFI(memcmp) |
20 | or r12,r0,r1 | 20 | or r12,r0,r1 |
21 | asl_s r12,r12,30 | 21 | asl_s r12,r12,30 |
22 | sub r3,r2,1 | 22 | sub r3,r2,1 |
@@ -149,4 +149,4 @@ ENTRY(memcmp) | |||
149 | .Lnil: | 149 | .Lnil: |
150 | j_s.d [blink] | 150 | j_s.d [blink] |
151 | mov r0,0 | 151 | mov r0,0 |
152 | END(memcmp) | 152 | END_CFI(memcmp) |
diff --git a/arch/arc/lib/memcpy-700.S b/arch/arc/lib/memcpy-700.S index 3222573e50de..ba0beccdaafd 100644 --- a/arch/arc/lib/memcpy-700.S +++ b/arch/arc/lib/memcpy-700.S | |||
@@ -8,7 +8,7 @@ | |||
8 | 8 | ||
9 | #include <linux/linkage.h> | 9 | #include <linux/linkage.h> |
10 | 10 | ||
11 | ENTRY(memcpy) | 11 | ENTRY_CFI(memcpy) |
12 | or r3,r0,r1 | 12 | or r3,r0,r1 |
13 | asl_s r3,r3,30 | 13 | asl_s r3,r3,30 |
14 | mov_s r5,r0 | 14 | mov_s r5,r0 |
@@ -63,4 +63,4 @@ ENTRY(memcpy) | |||
63 | .Lendbloop: | 63 | .Lendbloop: |
64 | j_s.d [blink] | 64 | j_s.d [blink] |
65 | stb r12,[r5,0] | 65 | stb r12,[r5,0] |
66 | END(memcpy) | 66 | END_CFI(memcpy) |
diff --git a/arch/arc/lib/memcpy-archs.S b/arch/arc/lib/memcpy-archs.S index f96c75edf30a..d61044dd8b58 100644 --- a/arch/arc/lib/memcpy-archs.S +++ b/arch/arc/lib/memcpy-archs.S | |||
@@ -40,7 +40,7 @@ | |||
40 | # define ZOLAND 0xF | 40 | # define ZOLAND 0xF |
41 | #endif | 41 | #endif |
42 | 42 | ||
43 | ENTRY(memcpy) | 43 | ENTRY_CFI(memcpy) |
44 | prefetch [r1] ; Prefetch the read location | 44 | prefetch [r1] ; Prefetch the read location |
45 | prefetchw [r0] ; Prefetch the write location | 45 | prefetchw [r0] ; Prefetch the write location |
46 | mov.f 0, r2 | 46 | mov.f 0, r2 |
@@ -233,4 +233,4 @@ ENTRY(memcpy) | |||
233 | .Lcopybytewise_3: | 233 | .Lcopybytewise_3: |
234 | j [blink] | 234 | j [blink] |
235 | 235 | ||
236 | END(memcpy) | 236 | END_CFI(memcpy) |
diff --git a/arch/arc/lib/memset-archs.S b/arch/arc/lib/memset-archs.S index 365b18364815..62ad4bcb841a 100644 --- a/arch/arc/lib/memset-archs.S +++ b/arch/arc/lib/memset-archs.S | |||
@@ -10,7 +10,7 @@ | |||
10 | 10 | ||
11 | #undef PREALLOC_NOT_AVAIL | 11 | #undef PREALLOC_NOT_AVAIL |
12 | 12 | ||
13 | ENTRY(memset) | 13 | ENTRY_CFI(memset) |
14 | prefetchw [r0] ; Prefetch the write location | 14 | prefetchw [r0] ; Prefetch the write location |
15 | mov.f 0, r2 | 15 | mov.f 0, r2 |
16 | ;;; if size is zero | 16 | ;;; if size is zero |
@@ -112,11 +112,11 @@ ENTRY(memset) | |||
112 | 112 | ||
113 | j [blink] | 113 | j [blink] |
114 | 114 | ||
115 | END(memset) | 115 | END_CFI(memset) |
116 | 116 | ||
117 | ENTRY(memzero) | 117 | ENTRY_CFI(memzero) |
118 | ; adjust bzero args to memset args | 118 | ; adjust bzero args to memset args |
119 | mov r2, r1 | 119 | mov r2, r1 |
120 | b.d memset ;tail call so need to tinker with blink | 120 | b.d memset ;tail call so need to tinker with blink |
121 | mov r1, 0 | 121 | mov r1, 0 |
122 | END(memzero) | 122 | END_CFI(memzero) |
diff --git a/arch/arc/lib/memset.S b/arch/arc/lib/memset.S index d36bd43fc98d..cf736f9aa403 100644 --- a/arch/arc/lib/memset.S +++ b/arch/arc/lib/memset.S | |||
@@ -10,7 +10,7 @@ | |||
10 | 10 | ||
11 | #define SMALL 7 /* Must be at least 6 to deal with alignment/loop issues. */ | 11 | #define SMALL 7 /* Must be at least 6 to deal with alignment/loop issues. */ |
12 | 12 | ||
13 | ENTRY(memset) | 13 | ENTRY_CFI(memset) |
14 | mov_s r4,r0 | 14 | mov_s r4,r0 |
15 | or r12,r0,r2 | 15 | or r12,r0,r2 |
16 | bmsk.f r12,r12,1 | 16 | bmsk.f r12,r12,1 |
@@ -46,14 +46,14 @@ ENTRY(memset) | |||
46 | stb.ab r1,[r4,1] | 46 | stb.ab r1,[r4,1] |
47 | .Ltiny_end: | 47 | .Ltiny_end: |
48 | j_s [blink] | 48 | j_s [blink] |
49 | END(memset) | 49 | END_CFI(memset) |
50 | 50 | ||
51 | ; memzero: @r0 = mem, @r1 = size_t | 51 | ; memzero: @r0 = mem, @r1 = size_t |
52 | ; memset: @r0 = mem, @r1 = char, @r2 = size_t | 52 | ; memset: @r0 = mem, @r1 = char, @r2 = size_t |
53 | 53 | ||
54 | ENTRY(memzero) | 54 | ENTRY_CFI(memzero) |
55 | ; adjust bzero args to memset args | 55 | ; adjust bzero args to memset args |
56 | mov r2, r1 | 56 | mov r2, r1 |
57 | mov r1, 0 | 57 | mov r1, 0 |
58 | b memset ;tail call so need to tinker with blink | 58 | b memset ;tail call so need to tinker with blink |
59 | END(memzero) | 59 | END_CFI(memzero) |
diff --git a/arch/arc/lib/strchr-700.S b/arch/arc/lib/strchr-700.S index b725d5862107..2d300daae2ae 100644 --- a/arch/arc/lib/strchr-700.S +++ b/arch/arc/lib/strchr-700.S | |||
@@ -13,7 +13,7 @@ | |||
13 | 13 | ||
14 | #include <linux/linkage.h> | 14 | #include <linux/linkage.h> |
15 | 15 | ||
16 | ENTRY(strchr) | 16 | ENTRY_CFI(strchr) |
17 | extb_s r1,r1 | 17 | extb_s r1,r1 |
18 | asl r5,r1,8 | 18 | asl r5,r1,8 |
19 | bmsk r2,r0,1 | 19 | bmsk r2,r0,1 |
@@ -130,4 +130,4 @@ ENTRY(strchr) | |||
130 | j_s.d [blink] | 130 | j_s.d [blink] |
131 | mov.mi r0,0 | 131 | mov.mi r0,0 |
132 | #endif /* ENDIAN */ | 132 | #endif /* ENDIAN */ |
133 | END(strchr) | 133 | END_CFI(strchr) |
diff --git a/arch/arc/lib/strcmp-archs.S b/arch/arc/lib/strcmp-archs.S index 4f338eec3365..fae9e82a09eb 100644 --- a/arch/arc/lib/strcmp-archs.S +++ b/arch/arc/lib/strcmp-archs.S | |||
@@ -8,7 +8,7 @@ | |||
8 | 8 | ||
9 | #include <linux/linkage.h> | 9 | #include <linux/linkage.h> |
10 | 10 | ||
11 | ENTRY(strcmp) | 11 | ENTRY_CFI(strcmp) |
12 | or r2, r0, r1 | 12 | or r2, r0, r1 |
13 | bmsk_s r2, r2, 1 | 13 | bmsk_s r2, r2, 1 |
14 | brne r2, 0, @.Lcharloop | 14 | brne r2, 0, @.Lcharloop |
@@ -75,4 +75,4 @@ ENTRY(strcmp) | |||
75 | .Lcmpend: | 75 | .Lcmpend: |
76 | j_s.d [blink] | 76 | j_s.d [blink] |
77 | sub r0, r2, r3 | 77 | sub r0, r2, r3 |
78 | END(strcmp) | 78 | END_CFI(strcmp) |
diff --git a/arch/arc/lib/strcmp.S b/arch/arc/lib/strcmp.S index 3544600fefe6..fb20096e5008 100644 --- a/arch/arc/lib/strcmp.S +++ b/arch/arc/lib/strcmp.S | |||
@@ -15,7 +15,7 @@ | |||
15 | 15 | ||
16 | #include <linux/linkage.h> | 16 | #include <linux/linkage.h> |
17 | 17 | ||
18 | ENTRY(strcmp) | 18 | ENTRY_CFI(strcmp) |
19 | or r2,r0,r1 | 19 | or r2,r0,r1 |
20 | bmsk_s r2,r2,1 | 20 | bmsk_s r2,r2,1 |
21 | brne r2,0,.Lcharloop | 21 | brne r2,0,.Lcharloop |
@@ -93,4 +93,4 @@ ENTRY(strcmp) | |||
93 | .Lcmpend: | 93 | .Lcmpend: |
94 | j_s.d [blink] | 94 | j_s.d [blink] |
95 | sub r0,r2,r3 | 95 | sub r0,r2,r3 |
96 | END(strcmp) | 96 | END_CFI(strcmp) |
diff --git a/arch/arc/lib/strcpy-700.S b/arch/arc/lib/strcpy-700.S index 8422f38e1218..6a6c1553807d 100644 --- a/arch/arc/lib/strcpy-700.S +++ b/arch/arc/lib/strcpy-700.S | |||
@@ -18,7 +18,7 @@ | |||
18 | 18 | ||
19 | #include <linux/linkage.h> | 19 | #include <linux/linkage.h> |
20 | 20 | ||
21 | ENTRY(strcpy) | 21 | ENTRY_CFI(strcpy) |
22 | or r2,r0,r1 | 22 | or r2,r0,r1 |
23 | bmsk_s r2,r2,1 | 23 | bmsk_s r2,r2,1 |
24 | brne.d r2,0,charloop | 24 | brne.d r2,0,charloop |
@@ -67,4 +67,4 @@ charloop: | |||
67 | brne.d r3,0,charloop | 67 | brne.d r3,0,charloop |
68 | stb.ab r3,[r10,1] | 68 | stb.ab r3,[r10,1] |
69 | j [blink] | 69 | j [blink] |
70 | END(strcpy) | 70 | END_CFI(strcpy) |
diff --git a/arch/arc/lib/strlen.S b/arch/arc/lib/strlen.S index 53cfd5685a5f..839b44b8d055 100644 --- a/arch/arc/lib/strlen.S +++ b/arch/arc/lib/strlen.S | |||
@@ -8,7 +8,7 @@ | |||
8 | 8 | ||
9 | #include <linux/linkage.h> | 9 | #include <linux/linkage.h> |
10 | 10 | ||
11 | ENTRY(strlen) | 11 | ENTRY_CFI(strlen) |
12 | or r3,r0,7 | 12 | or r3,r0,7 |
13 | ld r2,[r3,-7] | 13 | ld r2,[r3,-7] |
14 | ld.a r6,[r3,-3] | 14 | ld.a r6,[r3,-3] |
@@ -80,4 +80,4 @@ ENTRY(strlen) | |||
80 | .Learly_end: | 80 | .Learly_end: |
81 | b.d .Lend | 81 | b.d .Lend |
82 | sub_s.ne r1,r1,r1 | 82 | sub_s.ne r1,r1,r1 |
83 | END(strlen) | 83 | END_CFI(strlen) |