@@ -8,26 +8,54 @@ void arch_static_call_transform(void *site, void *tramp, void *func, bool tail)
8
8
{
9
9
int err ;
10
10
bool is_ret0 = (func == __static_call_return0 );
11
- unsigned long target = (unsigned long )(is_ret0 ? tramp + PPC_SCT_RET0 : func );
12
- bool is_short = is_offset_in_branch_range ((long )target - (long )tramp );
13
-
14
- if (!tramp )
15
- return ;
11
+ unsigned long _tramp = (unsigned long )tramp ;
12
+ unsigned long _func = (unsigned long )func ;
13
+ unsigned long _ret0 = _tramp + PPC_SCT_RET0 ;
14
+ bool is_short = is_offset_in_branch_range ((long )func - (long )(site ? : tramp ));
16
15
17
16
mutex_lock (& text_mutex );
18
17
19
- if (func && !is_short ) {
20
- err = patch_ulong (tramp + PPC_SCT_DATA , target );
21
- if (err )
22
- goto out ;
18
+ if (site && tail ) {
19
+ if (!func )
20
+ err = patch_instruction (site , ppc_inst (PPC_RAW_BLR ()));
21
+ else if (is_ret0 )
22
+ err = patch_branch (site , _ret0 , 0 );
23
+ else if (is_short )
24
+ err = patch_branch (site , _func , 0 );
25
+ else if (tramp )
26
+ err = patch_branch (site , _tramp , 0 );
27
+ else
28
+ err = 0 ;
29
+ } else if (site ) {
30
+ if (!func )
31
+ err = patch_instruction (site , ppc_inst (PPC_RAW_NOP ()));
32
+ else if (is_ret0 )
33
+ err = patch_instruction (site , ppc_inst (PPC_RAW_LI (_R3 , 0 )));
34
+ else if (is_short )
35
+ err = patch_branch (site , _func , BRANCH_SET_LINK );
36
+ else if (tramp )
37
+ err = patch_branch (site , _tramp , BRANCH_SET_LINK );
38
+ else
39
+ err = 0 ;
40
+ } else if (tramp ) {
41
+ if (func && !is_short ) {
42
+ err = patch_ulong (tramp + PPC_SCT_DATA , _func );
43
+ if (err )
44
+ goto out ;
45
+ }
46
+
47
+ if (!func )
48
+ err = patch_instruction (tramp , ppc_inst (PPC_RAW_BLR ()));
49
+ else if (is_ret0 )
50
+ err = patch_branch (tramp , _ret0 , 0 );
51
+ else if (is_short )
52
+ err = patch_branch (tramp , _func , 0 );
53
+ else
54
+ err = patch_instruction (tramp , ppc_inst (PPC_RAW_NOP ()));
55
+ } else {
56
+ err = 0 ;
23
57
}
24
58
25
- if (!func )
26
- err = patch_instruction (tramp , ppc_inst (PPC_RAW_BLR ()));
27
- else if (is_short )
28
- err = patch_branch (tramp , target , 0 );
29
- else
30
- err = patch_instruction (tramp , ppc_inst (PPC_RAW_NOP ()));
31
59
out :
32
60
mutex_unlock (& text_mutex );
33
61
0 commit comments