diff options
author | Bjoern Brandenburg <bbb@mpi-sws.org> | 2012-05-30 04:16:32 -0400 |
---|---|---|
committer | Bjoern Brandenburg <bbb@mpi-sws.org> | 2012-06-26 05:08:24 -0400 |
commit | 4bc55d3b64fdf0af17f4777013a74fbef7f40ced (patch) | |
tree | 7b8754c683bcf33ac7acfd44b25e3a5baa6b7c8e | |
parent | 1f38cc0c41b88aadfd258ee2d6e9698ed3f42a42 (diff) |
Update to improved x86 Feather-Trace triggers
This patch imports recent upstream changes in Feather-Trace that reduce
register pressure around Feather-Trace triggers.
References: Commits 00713b8 and 225d734 in Feather-Trace.
https://github.com/brandenburg/feather-trace/commit/00713b878636867ce07291c588509b38fa5bf152
https://github.com/brandenburg/feather-trace/commit/225d7348a08682cd87f72b127142bdfd6c0c7890
-rw-r--r-- | arch/x86/include/asm/feather_trace_32.h | 96 | ||||
-rw-r--r-- | arch/x86/include/asm/feather_trace_64.h | 101 |
2 files changed, 145 insertions, 52 deletions
diff --git a/arch/x86/include/asm/feather_trace_32.h b/arch/x86/include/asm/feather_trace_32.h index 70202f90f169..75e81a9f9382 100644 --- a/arch/x86/include/asm/feather_trace_32.h +++ b/arch/x86/include/asm/feather_trace_32.h | |||
@@ -1,12 +1,45 @@ | |||
1 | /* Copyright (c) 2007-2012 Björn Brandenburg, <bbb@mpi-sws.org> | ||
2 | * | ||
3 | * Permission is hereby granted, free of charge, to any person obtaining | ||
4 | * a copy of this software and associated documentation files (the | ||
5 | * "Software"), to deal in the Software without restriction, including | ||
6 | * without limitation the rights to use, copy, modify, merge, publish, | ||
7 | * distribute, sublicense, and/or sell copies of the Software, and to | ||
8 | * permit persons to whom the Software is furnished to do so, subject to | ||
9 | * the following conditions: | ||
10 | * | ||
11 | * The above copyright notice and this permission notice shall be | ||
12 | * included in all copies or substantial portions of the Software. | ||
13 | * | ||
14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||
15 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||
16 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||
17 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | ||
18 | * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | ||
19 | * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||
20 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
21 | * SOFTWARE. | ||
22 | */ | ||
23 | |||
1 | /* Do not directly include this file. Include feather_trace.h instead */ | 24 | /* Do not directly include this file. Include feather_trace.h instead */ |
2 | 25 | ||
3 | #define feather_callback __attribute__((regparm(0))) | 26 | #define feather_callback __attribute__((regparm(3))) __attribute__((used)) |
4 | 27 | ||
5 | /* | 28 | /* |
6 | * make the compiler reload any register that is not saved in | 29 | * Make the compiler reload any register that is not saved in a cdecl function |
7 | * a cdecl function call | 30 | * call (minus the registers that we explicitly clobber as output registers). |
8 | */ | 31 | */ |
9 | #define CLOBBER_LIST "memory", "cc", "eax", "ecx", "edx" | 32 | #define __FT_CLOBBER_LIST0 "memory", "cc", "eax", "edx", "ecx" |
33 | #define __FT_CLOBBER_LIST1 "memory", "cc", "eax", "ecx" | ||
34 | #define __FT_CLOBBER_LIST2 "memory", "cc", "eax" | ||
35 | #define __FT_CLOBBER_LIST3 "memory", "cc", "eax" | ||
36 | |||
37 | #define __FT_TMP1(x) "=d" (x) | ||
38 | #define __FT_ARG1(x) "0" ((long) (x)) | ||
39 | #define __FT_TMP2(x) "=c" (x) | ||
40 | #define __FT_ARG2(x) "1" ((long) (x)) | ||
41 | |||
42 | #define __FT_ARG3(x) "r" ((long) (x)) | ||
10 | 43 | ||
11 | #define ft_event(id, callback) \ | 44 | #define ft_event(id, callback) \ |
12 | __asm__ __volatile__( \ | 45 | __asm__ __volatile__( \ |
@@ -16,64 +49,67 @@ | |||
16 | ".long " #id ", 0, 1b, 2f \n\t" \ | 49 | ".long " #id ", 0, 1b, 2f \n\t" \ |
17 | ".previous \n\t" \ | 50 | ".previous \n\t" \ |
18 | "2: \n\t" \ | 51 | "2: \n\t" \ |
19 | : : : CLOBBER_LIST) | 52 | : : : __FT_CLOBBER_LIST0) |
20 | 53 | ||
21 | #define ft_event0(id, callback) \ | 54 | #define ft_event0(id, callback) \ |
22 | __asm__ __volatile__( \ | 55 | __asm__ __volatile__( \ |
23 | "1: jmp 2f \n\t" \ | 56 | "1: jmp 2f \n\t" \ |
24 | " subl $4, %%esp \n\t" \ | 57 | " movl $" #id ", %%eax \n\t" \ |
25 | " movl $" #id ", (%%esp) \n\t" \ | ||
26 | " call " #callback " \n\t" \ | 58 | " call " #callback " \n\t" \ |
27 | " addl $4, %%esp \n\t" \ | ||
28 | ".section __event_table, \"aw\" \n\t" \ | 59 | ".section __event_table, \"aw\" \n\t" \ |
29 | ".long " #id ", 0, 1b, 2f \n\t" \ | 60 | ".long " #id ", 0, 1b, 2f \n\t" \ |
30 | ".previous \n\t" \ | 61 | ".previous \n\t" \ |
31 | "2: \n\t" \ | 62 | "2: \n\t" \ |
32 | : : : CLOBBER_LIST) | 63 | : : : __FT_CLOBBER_LIST0) |
33 | 64 | ||
34 | #define ft_event1(id, callback, param) \ | 65 | #define ft_event1(id, callback, param) \ |
66 | do { \ | ||
67 | long __ft_tmp1; \ | ||
35 | __asm__ __volatile__( \ | 68 | __asm__ __volatile__( \ |
36 | "1: jmp 2f \n\t" \ | 69 | "1: jmp 2f \n\t" \ |
37 | " subl $8, %%esp \n\t" \ | 70 | " movl $" #id ", %%eax \n\t" \ |
38 | " movl %0, 4(%%esp) \n\t" \ | ||
39 | " movl $" #id ", (%%esp) \n\t" \ | ||
40 | " call " #callback " \n\t" \ | 71 | " call " #callback " \n\t" \ |
41 | " addl $8, %%esp \n\t" \ | ||
42 | ".section __event_table, \"aw\" \n\t" \ | 72 | ".section __event_table, \"aw\" \n\t" \ |
43 | ".long " #id ", 0, 1b, 2f \n\t" \ | 73 | ".long " #id ", 0, 1b, 2f \n\t" \ |
44 | ".previous \n\t" \ | 74 | ".previous \n\t" \ |
45 | "2: \n\t" \ | 75 | "2: \n\t" \ |
46 | : : "r" (param) : CLOBBER_LIST) | 76 | : __FT_TMP1(__ft_tmp1) \ |
77 | : __FT_ARG1(param) \ | ||
78 | : __FT_CLOBBER_LIST1); \ | ||
79 | } while (0); | ||
47 | 80 | ||
48 | #define ft_event2(id, callback, param, param2) \ | 81 | #define ft_event2(id, callback, param, param2) \ |
82 | do { \ | ||
83 | long __ft_tmp1, __ft_tmp2; \ | ||
49 | __asm__ __volatile__( \ | 84 | __asm__ __volatile__( \ |
50 | "1: jmp 2f \n\t" \ | 85 | "1: jmp 2f \n\t" \ |
51 | " subl $12, %%esp \n\t" \ | 86 | " movl $" #id ", %%eax \n\t" \ |
52 | " movl %1, 8(%%esp) \n\t" \ | ||
53 | " movl %0, 4(%%esp) \n\t" \ | ||
54 | " movl $" #id ", (%%esp) \n\t" \ | ||
55 | " call " #callback " \n\t" \ | 87 | " call " #callback " \n\t" \ |
56 | " addl $12, %%esp \n\t" \ | ||
57 | ".section __event_table, \"aw\" \n\t" \ | 88 | ".section __event_table, \"aw\" \n\t" \ |
58 | ".long " #id ", 0, 1b, 2f \n\t" \ | 89 | ".long " #id ", 0, 1b, 2f \n\t" \ |
59 | ".previous \n\t" \ | 90 | ".previous \n\t" \ |
60 | "2: \n\t" \ | 91 | "2: \n\t" \ |
61 | : : "r" (param), "r" (param2) : CLOBBER_LIST) | 92 | : __FT_TMP1(__ft_tmp1), __FT_TMP2(__ft_tmp2) \ |
93 | : __FT_ARG1(param), __FT_ARG2(param2) \ | ||
94 | : __FT_CLOBBER_LIST2); \ | ||
95 | } while (0); | ||
62 | 96 | ||
63 | 97 | ||
64 | #define ft_event3(id, callback, p, p2, p3) \ | 98 | #define ft_event3(id, callback, param, param2, param3) \ |
99 | do { \ | ||
100 | long __ft_tmp1, __ft_tmp2; \ | ||
65 | __asm__ __volatile__( \ | 101 | __asm__ __volatile__( \ |
66 | "1: jmp 2f \n\t" \ | 102 | "1: jmp 2f \n\t" \ |
67 | " subl $16, %%esp \n\t" \ | 103 | " subl $4, %%esp \n\t" \ |
68 | " movl %2, 12(%%esp) \n\t" \ | 104 | " movl $" #id ", %%eax \n\t" \ |
69 | " movl %1, 8(%%esp) \n\t" \ | 105 | " movl %2, (%%esp) \n\t" \ |
70 | " movl %0, 4(%%esp) \n\t" \ | ||
71 | " movl $" #id ", (%%esp) \n\t" \ | ||
72 | " call " #callback " \n\t" \ | 106 | " call " #callback " \n\t" \ |
73 | " addl $16, %%esp \n\t" \ | 107 | " addl $4, %%esp \n\t" \ |
74 | ".section __event_table, \"aw\" \n\t" \ | 108 | ".section __event_table, \"aw\" \n\t" \ |
75 | ".long " #id ", 0, 1b, 2f \n\t" \ | 109 | ".long " #id ", 0, 1b, 2f \n\t" \ |
76 | ".previous \n\t" \ | 110 | ".previous \n\t" \ |
77 | "2: \n\t" \ | 111 | "2: \n\t" \ |
78 | : : "r" (p), "r" (p2), "r" (p3) : CLOBBER_LIST) | 112 | : __FT_TMP1(__ft_tmp1), __FT_TMP2(__ft_tmp2) \ |
79 | 113 | : __FT_ARG1(param), __FT_ARG2(param2), __FT_ARG3(param3) \ | |
114 | : __FT_CLOBBER_LIST3); \ | ||
115 | } while (0); | ||
diff --git a/arch/x86/include/asm/feather_trace_64.h b/arch/x86/include/asm/feather_trace_64.h index 54ac2aeb3a28..5ce49e2eebba 100644 --- a/arch/x86/include/asm/feather_trace_64.h +++ b/arch/x86/include/asm/feather_trace_64.h | |||
@@ -1,67 +1,124 @@ | |||
1 | /* Copyright (c) 2010 Andrea Bastoni, <bastoni@cs.unc.edu> | ||
2 | * Copyright (c) 2012 Björn Brandenburg, <bbb@mpi-sws.org> | ||
3 | * | ||
4 | * Permission is hereby granted, free of charge, to any person obtaining | ||
5 | * a copy of this software and associated documentation files (the | ||
6 | * "Software"), to deal in the Software without restriction, including | ||
7 | * without limitation the rights to use, copy, modify, merge, publish, | ||
8 | * distribute, sublicense, and/or sell copies of the Software, and to | ||
9 | * permit persons to whom the Software is furnished to do so, subject to | ||
10 | * the following conditions: | ||
11 | * | ||
12 | * The above copyright notice and this permission notice shall be | ||
13 | * included in all copies or substantial portions of the Software. | ||
14 | * | ||
15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||
16 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||
17 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||
18 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | ||
19 | * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | ||
20 | * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||
21 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
22 | * SOFTWARE. | ||
23 | */ | ||
24 | |||
1 | /* Do not directly include this file. Include feather_trace.h instead */ | 25 | /* Do not directly include this file. Include feather_trace.h instead */ |
2 | 26 | ||
3 | /* regparm is the default on x86_64 */ | 27 | /* regparm is the default on x86_64 */ |
4 | #define feather_callback | 28 | #define feather_callback __attribute__((used)) |
5 | 29 | ||
6 | # define _EVENT_TABLE(id,from,to) \ | 30 | #define __FT_EVENT_TABLE(id,from,to) \ |
7 | ".section __event_table, \"aw\"\n\t" \ | 31 | ".section __event_table, \"aw\"\n\t" \ |
8 | ".balign 8\n\t" \ | 32 | ".balign 8\n\t" \ |
9 | ".quad " #id ", 0, " #from ", " #to " \n\t" \ | 33 | ".quad " #id ", 0, " #from ", " #to " \n\t" \ |
10 | ".previous \n\t" | 34 | ".previous \n\t" |
11 | 35 | ||
12 | /* | 36 | /* |
13 | * x86_64 callee only owns rbp, rbx, r12 -> r15 | 37 | * x86_64 caller only owns rbp, rbx, r12-r15; |
14 | * the called can freely modify the others | 38 | * the callee can freely modify the others. |
15 | */ | 39 | */ |
16 | #define CLOBBER_LIST "memory", "cc", "rdi", "rsi", "rdx", "rcx", \ | 40 | #define __FT_CLOBBER_LIST0 "memory", "cc", "rdi", "rsi", "rdx", "rcx", \ |
41 | "r8", "r9", "r10", "r11", "rax" | ||
42 | |||
43 | #define __FT_CLOBBER_LIST1 "memory", "cc", "rdi", "rdx", "rcx", \ | ||
44 | "r8", "r9", "r10", "r11", "rax" | ||
45 | |||
46 | #define __FT_CLOBBER_LIST2 "memory", "cc", "rdi", "rcx", \ | ||
17 | "r8", "r9", "r10", "r11", "rax" | 47 | "r8", "r9", "r10", "r11", "rax" |
18 | 48 | ||
49 | #define __FT_CLOBBER_LIST3 "memory", "cc", "rdi", \ | ||
50 | "r8", "r9", "r10", "r11", "rax" | ||
51 | |||
52 | /* The registers RDI, RSI, RDX, RCX, R8 and R9 are used for integer and pointer | ||
53 | * arguments. */ | ||
54 | |||
55 | /* RSI */ | ||
56 | #define __FT_TMP1(x) "=S" (x) | ||
57 | #define __FT_ARG1(x) "0" ((long) (x)) | ||
58 | |||
59 | /* RDX */ | ||
60 | #define __FT_TMP2(x) "=d" (x) | ||
61 | #define __FT_ARG2(x) "1" ((long) (x)) | ||
62 | |||
63 | /* RCX */ | ||
64 | #define __FT_TMP3(x) "=c" (x) | ||
65 | #define __FT_ARG3(x) "2" ((long) (x)) | ||
66 | |||
19 | #define ft_event(id, callback) \ | 67 | #define ft_event(id, callback) \ |
20 | __asm__ __volatile__( \ | 68 | __asm__ __volatile__( \ |
21 | "1: jmp 2f \n\t" \ | 69 | "1: jmp 2f \n\t" \ |
22 | " call " #callback " \n\t" \ | 70 | " call " #callback " \n\t" \ |
23 | _EVENT_TABLE(id,1b,2f) \ | 71 | __FT_EVENT_TABLE(id,1b,2f) \ |
24 | "2: \n\t" \ | 72 | "2: \n\t" \ |
25 | : : : CLOBBER_LIST) | 73 | : : : __FT_CLOBBER_LIST0) |
26 | 74 | ||
27 | #define ft_event0(id, callback) \ | 75 | #define ft_event0(id, callback) \ |
28 | __asm__ __volatile__( \ | 76 | __asm__ __volatile__( \ |
29 | "1: jmp 2f \n\t" \ | 77 | "1: jmp 2f \n\t" \ |
30 | " movq $" #id ", %%rdi \n\t" \ | 78 | " movq $" #id ", %%rdi \n\t" \ |
31 | " call " #callback " \n\t" \ | 79 | " call " #callback " \n\t" \ |
32 | _EVENT_TABLE(id,1b,2f) \ | 80 | __FT_EVENT_TABLE(id,1b,2f) \ |
33 | "2: \n\t" \ | 81 | "2: \n\t" \ |
34 | : : : CLOBBER_LIST) | 82 | : : : __FT_CLOBBER_LIST0) |
35 | 83 | ||
36 | #define ft_event1(id, callback, param) \ | 84 | #define ft_event1(id, callback, param) \ |
85 | do { \ | ||
86 | long __ft_tmp1; \ | ||
37 | __asm__ __volatile__( \ | 87 | __asm__ __volatile__( \ |
38 | "1: jmp 2f \n\t" \ | 88 | "1: jmp 2f \n\t" \ |
39 | " movq %0, %%rsi \n\t" \ | ||
40 | " movq $" #id ", %%rdi \n\t" \ | 89 | " movq $" #id ", %%rdi \n\t" \ |
41 | " call " #callback " \n\t" \ | 90 | " call " #callback " \n\t" \ |
42 | _EVENT_TABLE(id,1b,2f) \ | 91 | __FT_EVENT_TABLE(id,1b,2f) \ |
43 | "2: \n\t" \ | 92 | "2: \n\t" \ |
44 | : : "r" (param) : CLOBBER_LIST) | 93 | : __FT_TMP1(__ft_tmp1) \ |
94 | : __FT_ARG1(param) \ | ||
95 | : __FT_CLOBBER_LIST1); \ | ||
96 | } while (0); | ||
45 | 97 | ||
46 | #define ft_event2(id, callback, param, param2) \ | 98 | #define ft_event2(id, callback, param, param2) \ |
99 | do { \ | ||
100 | long __ft_tmp1, __ft_tmp2; \ | ||
47 | __asm__ __volatile__( \ | 101 | __asm__ __volatile__( \ |
48 | "1: jmp 2f \n\t" \ | 102 | "1: jmp 2f \n\t" \ |
49 | " movq %1, %%rdx \n\t" \ | ||
50 | " movq %0, %%rsi \n\t" \ | ||
51 | " movq $" #id ", %%rdi \n\t" \ | 103 | " movq $" #id ", %%rdi \n\t" \ |
52 | " call " #callback " \n\t" \ | 104 | " call " #callback " \n\t" \ |
53 | _EVENT_TABLE(id,1b,2f) \ | 105 | __FT_EVENT_TABLE(id,1b,2f) \ |
54 | "2: \n\t" \ | 106 | "2: \n\t" \ |
55 | : : "r" (param), "r" (param2) : CLOBBER_LIST) | 107 | : __FT_TMP1(__ft_tmp1), __FT_TMP2(__ft_tmp2) \ |
108 | : __FT_ARG1(param), __FT_ARG2(param2) \ | ||
109 | : __FT_CLOBBER_LIST2); \ | ||
110 | } while (0); | ||
56 | 111 | ||
57 | #define ft_event3(id, callback, p, p2, p3) \ | 112 | #define ft_event3(id, callback, param, param2, param3) \ |
113 | do { \ | ||
114 | long __ft_tmp1, __ft_tmp2, __ft_tmp3; \ | ||
58 | __asm__ __volatile__( \ | 115 | __asm__ __volatile__( \ |
59 | "1: jmp 2f \n\t" \ | 116 | "1: jmp 2f \n\t" \ |
60 | " movq %2, %%rcx \n\t" \ | ||
61 | " movq %1, %%rdx \n\t" \ | ||
62 | " movq %0, %%rsi \n\t" \ | ||
63 | " movq $" #id ", %%rdi \n\t" \ | 117 | " movq $" #id ", %%rdi \n\t" \ |
64 | " call " #callback " \n\t" \ | 118 | " call " #callback " \n\t" \ |
65 | _EVENT_TABLE(id,1b,2f) \ | 119 | __FT_EVENT_TABLE(id,1b,2f) \ |
66 | "2: \n\t" \ | 120 | "2: \n\t" \ |
67 | : : "r" (p), "r" (p2), "r" (p3) : CLOBBER_LIST) | 121 | : __FT_TMP1(__ft_tmp1), __FT_TMP2(__ft_tmp2), __FT_TMP3(__ft_tmp3) \ |
122 | : __FT_ARG1(param), __FT_ARG2(param2), __FT_ARG3(param3) \ | ||
123 | : __FT_CLOBBER_LIST3); \ | ||
124 | } while (0); | ||