Commit 424c70b
bpf, arm64: adjust the offset of str/ldr(immediate) to positive number
The BPF STX/LDX instruction uses offset relative to the FP to address
stack space. Since the BPF_FP locates at the top of the frame, the offset
is usually a negative number. However, arm64 str/ldr immediate instruction
requires that offset be a positive number. Therefore, this patch tries to
convert the offsets.
The method is to find the negative offset furthest from the FP firstly.
Then add it to the FP, calculate a bottom position, called FPB, and then
adjust the offsets in other STR/LDX instructions relative to FPB.
FPB is saved using the callee-saved register x27 of arm64 which is not
used yet.
Before adjusting the offset, the patch checks every instruction to ensure
that the FP does not change in run-time. If the FP may change, no offset
is adjusted.
For example, for the following bpftrace command:
bpftrace -e 'kprobe:do_sys_open { printf("opening: %s\n", str(arg1)); }'
Without this patch, jited code(fragment):
0: bti c
4: stp x29, x30, [sp, #-16]!
8: mov x29, sp
c: stp x19, x20, [sp, #-16]!
10: stp x21, x22, [sp, #-16]!
14: stp x25, x26, [sp, #-16]!
18: mov x25, sp
1c: mov x26, #0x0 // #0
20: bti j
24: sub sp, sp, #0x90
28: add x19, x0, #0x0
2c: mov x0, #0x0 // #0
30: mov x10, #0xffffffffffffff78 // #-136
34: str x0, [x25, x10]
38: mov x10, #0xffffffffffffff80 // #-128
3c: str x0, [x25, x10]
40: mov x10, #0xffffffffffffff88 // #-120
44: str x0, [x25, x10]
48: mov x10, #0xffffffffffffff90 // #-112
4c: str x0, [x25, x10]
50: mov x10, #0xffffffffffffff98 // #-104
54: str x0, [x25, x10]
58: mov x10, #0xffffffffffffffa0 // #-96
5c: str x0, [x25, x10]
60: mov x10, #0xffffffffffffffa8 // #-88
64: str x0, [x25, x10]
68: mov x10, #0xffffffffffffffb0 // #-80
6c: str x0, [x25, x10]
70: mov x10, #0xffffffffffffffb8 // #-72
74: str x0, [x25, x10]
78: mov x10, #0xffffffffffffffc0 // #-64
7c: str x0, [x25, x10]
80: mov x10, #0xffffffffffffffc8 // #-56
84: str x0, [x25, x10]
88: mov x10, #0xffffffffffffffd0 // #-48
8c: str x0, [x25, x10]
90: mov x10, #0xffffffffffffffd8 // #-40
94: str x0, [x25, x10]
98: mov x10, #0xffffffffffffffe0 // #-32
9c: str x0, [x25, x10]
a0: mov x10, #0xffffffffffffffe8 // #-24
a4: str x0, [x25, x10]
a8: mov x10, #0xfffffffffffffff0 // #-16
ac: str x0, [x25, x10]
b0: mov x10, #0xfffffffffffffff8 // #-8
b4: str x0, [x25, x10]
b8: mov x10, #0x8 // #8
bc: ldr x2, [x19, x10]
[...]
With this patch, jited code(fragment):
0: bti c
4: stp x29, x30, [sp, #-16]!
8: mov x29, sp
c: stp x19, x20, [sp, #-16]!
10: stp x21, x22, [sp, #-16]!
14: stp x25, x26, [sp, #-16]!
18: stp x27, x28, [sp, #-16]!
1c: mov x25, sp
20: sub x27, x25, #0x88
24: mov x26, #0x0 // #0
28: bti j
2c: sub sp, sp, #0x90
30: add x19, x0, #0x0
34: mov x0, #0x0 // #0
38: str x0, [x27]
3c: str x0, [x27, #8]
40: str x0, [x27, #16]
44: str x0, [x27, #24]
48: str x0, [x27, #32]
4c: str x0, [x27, #40]
50: str x0, [x27, #48]
54: str x0, [x27, #56]
58: str x0, [x27, #64]
5c: str x0, [x27, #72]
60: str x0, [x27, #80]
64: str x0, [x27, #88]
68: str x0, [x27, #96]
6c: str x0, [x27, #104]
70: str x0, [x27, #112]
74: str x0, [x27, #120]
78: str x0, [x27, #128]
7c: ldr x2, [x19, #8]
[...]
Signed-off-by: Xu Kuohai <[email protected]>1 parent 5b7034b commit 424c70b
1 file changed
+138
-27
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
26 | 26 | | |
27 | 27 | | |
28 | 28 | | |
| 29 | + | |
29 | 30 | | |
30 | 31 | | |
31 | 32 | | |
| |||
63 | 64 | | |
64 | 65 | | |
65 | 66 | | |
| 67 | + | |
66 | 68 | | |
67 | 69 | | |
68 | 70 | | |
| |||
73 | 75 | | |
74 | 76 | | |
75 | 77 | | |
| 78 | + | |
76 | 79 | | |
77 | 80 | | |
78 | 81 | | |
| |||
218 | 221 | | |
219 | 222 | | |
220 | 223 | | |
221 | | - | |
| 224 | + | |
222 | 225 | | |
223 | 226 | | |
224 | 227 | | |
| |||
234 | 237 | | |
235 | 238 | | |
236 | 239 | | |
237 | | - | |
| 240 | + | |
238 | 241 | | |
239 | | - | |
| 242 | + | |
240 | 243 | | |
241 | 244 | | |
242 | 245 | | |
| |||
248 | 251 | | |
249 | 252 | | |
250 | 253 | | |
| 254 | + | |
251 | 255 | | |
252 | 256 | | |
253 | 257 | | |
| |||
286 | 290 | | |
287 | 291 | | |
288 | 292 | | |
| 293 | + | |
289 | 294 | | |
290 | 295 | | |
291 | 296 | | |
| |||
306 | 311 | | |
307 | 312 | | |
308 | 313 | | |
| 314 | + | |
| 315 | + | |
309 | 316 | | |
310 | 317 | | |
311 | 318 | | |
| |||
553 | 560 | | |
554 | 561 | | |
555 | 562 | | |
| 563 | + | |
556 | 564 | | |
557 | 565 | | |
558 | 566 | | |
559 | 567 | | |
| 568 | + | |
| 569 | + | |
560 | 570 | | |
561 | 571 | | |
562 | 572 | | |
| |||
650 | 660 | | |
651 | 661 | | |
652 | 662 | | |
| 663 | + | |
| 664 | + | |
653 | 665 | | |
654 | 666 | | |
655 | 667 | | |
| |||
658 | 670 | | |
659 | 671 | | |
660 | 672 | | |
| 673 | + | |
| 674 | + | |
| 675 | + | |
661 | 676 | | |
662 | 677 | | |
663 | 678 | | |
| |||
1012 | 1027 | | |
1013 | 1028 | | |
1014 | 1029 | | |
| 1030 | + | |
| 1031 | + | |
| 1032 | + | |
| 1033 | + | |
| 1034 | + | |
| 1035 | + | |
| 1036 | + | |
1015 | 1037 | | |
1016 | 1038 | | |
1017 | | - | |
1018 | | - | |
| 1039 | + | |
| 1040 | + | |
1019 | 1041 | | |
1020 | 1042 | | |
1021 | 1043 | | |
1022 | 1044 | | |
1023 | 1045 | | |
1024 | 1046 | | |
1025 | | - | |
1026 | | - | |
| 1047 | + | |
| 1048 | + | |
1027 | 1049 | | |
1028 | 1050 | | |
1029 | 1051 | | |
1030 | 1052 | | |
1031 | 1053 | | |
1032 | 1054 | | |
1033 | | - | |
1034 | | - | |
| 1055 | + | |
| 1056 | + | |
1035 | 1057 | | |
1036 | 1058 | | |
1037 | 1059 | | |
1038 | 1060 | | |
1039 | 1061 | | |
1040 | 1062 | | |
1041 | | - | |
1042 | | - | |
| 1063 | + | |
| 1064 | + | |
1043 | 1065 | | |
1044 | 1066 | | |
1045 | 1067 | | |
| |||
1070 | 1092 | | |
1071 | 1093 | | |
1072 | 1094 | | |
| 1095 | + | |
| 1096 | + | |
| 1097 | + | |
| 1098 | + | |
| 1099 | + | |
| 1100 | + | |
| 1101 | + | |
1073 | 1102 | | |
1074 | 1103 | | |
1075 | 1104 | | |
1076 | 1105 | | |
1077 | | - | |
1078 | | - | |
| 1106 | + | |
| 1107 | + | |
1079 | 1108 | | |
1080 | 1109 | | |
1081 | 1110 | | |
1082 | 1111 | | |
1083 | 1112 | | |
1084 | 1113 | | |
1085 | | - | |
1086 | | - | |
| 1114 | + | |
| 1115 | + | |
1087 | 1116 | | |
1088 | 1117 | | |
1089 | 1118 | | |
1090 | 1119 | | |
1091 | 1120 | | |
1092 | 1121 | | |
1093 | | - | |
1094 | | - | |
| 1122 | + | |
| 1123 | + | |
1095 | 1124 | | |
1096 | 1125 | | |
1097 | 1126 | | |
1098 | 1127 | | |
1099 | 1128 | | |
1100 | 1129 | | |
1101 | | - | |
1102 | | - | |
| 1130 | + | |
| 1131 | + | |
1103 | 1132 | | |
1104 | 1133 | | |
1105 | 1134 | | |
| |||
1113 | 1142 | | |
1114 | 1143 | | |
1115 | 1144 | | |
| 1145 | + | |
| 1146 | + | |
| 1147 | + | |
| 1148 | + | |
| 1149 | + | |
| 1150 | + | |
| 1151 | + | |
1116 | 1152 | | |
1117 | 1153 | | |
1118 | | - | |
1119 | | - | |
| 1154 | + | |
| 1155 | + | |
1120 | 1156 | | |
1121 | 1157 | | |
1122 | 1158 | | |
1123 | 1159 | | |
1124 | 1160 | | |
1125 | 1161 | | |
1126 | | - | |
1127 | | - | |
| 1162 | + | |
| 1163 | + | |
1128 | 1164 | | |
1129 | 1165 | | |
1130 | 1166 | | |
1131 | 1167 | | |
1132 | 1168 | | |
1133 | 1169 | | |
1134 | | - | |
1135 | | - | |
| 1170 | + | |
| 1171 | + | |
1136 | 1172 | | |
1137 | 1173 | | |
1138 | 1174 | | |
1139 | 1175 | | |
1140 | 1176 | | |
1141 | 1177 | | |
1142 | | - | |
1143 | | - | |
| 1178 | + | |
| 1179 | + | |
1144 | 1180 | | |
1145 | 1181 | | |
1146 | 1182 | | |
| |||
1167 | 1203 | | |
1168 | 1204 | | |
1169 | 1205 | | |
| 1206 | + | |
| 1207 | + | |
| 1208 | + | |
| 1209 | + | |
| 1210 | + | |
| 1211 | + | |
| 1212 | + | |
| 1213 | + | |
| 1214 | + | |
| 1215 | + | |
| 1216 | + | |
| 1217 | + | |
| 1218 | + | |
| 1219 | + | |
| 1220 | + | |
| 1221 | + | |
| 1222 | + | |
| 1223 | + | |
| 1224 | + | |
| 1225 | + | |
| 1226 | + | |
| 1227 | + | |
| 1228 | + | |
| 1229 | + | |
| 1230 | + | |
| 1231 | + | |
| 1232 | + | |
| 1233 | + | |
| 1234 | + | |
| 1235 | + | |
| 1236 | + | |
| 1237 | + | |
| 1238 | + | |
| 1239 | + | |
| 1240 | + | |
| 1241 | + | |
| 1242 | + | |
| 1243 | + | |
| 1244 | + | |
| 1245 | + | |
| 1246 | + | |
| 1247 | + | |
| 1248 | + | |
| 1249 | + | |
| 1250 | + | |
| 1251 | + | |
| 1252 | + | |
| 1253 | + | |
| 1254 | + | |
| 1255 | + | |
| 1256 | + | |
| 1257 | + | |
| 1258 | + | |
| 1259 | + | |
| 1260 | + | |
| 1261 | + | |
| 1262 | + | |
| 1263 | + | |
| 1264 | + | |
| 1265 | + | |
| 1266 | + | |
| 1267 | + | |
| 1268 | + | |
| 1269 | + | |
| 1270 | + | |
| 1271 | + | |
| 1272 | + | |
| 1273 | + | |
| 1274 | + | |
| 1275 | + | |
| 1276 | + | |
| 1277 | + | |
| 1278 | + | |
1170 | 1279 | | |
1171 | 1280 | | |
1172 | 1281 | | |
| |||
1288 | 1397 | | |
1289 | 1398 | | |
1290 | 1399 | | |
| 1400 | + | |
| 1401 | + | |
1291 | 1402 | | |
1292 | 1403 | | |
1293 | 1404 | | |
| |||
0 commit comments