hc
2024-05-10 ee930fffee469d076998274a2ca55e13dc1efb67
kernel/kernel/trace/trace_probe_tmpl.h
....@@ -54,7 +54,7 @@
5454 * If dest is NULL, don't store result and return required dynamic data size.
5555 */
5656 static int
57
-process_fetch_insn(struct fetch_insn *code, struct pt_regs *regs,
57
+process_fetch_insn(struct fetch_insn *code, void *rec,
5858 void *dest, void *base);
5959 static nokprobe_inline int fetch_store_strlen(unsigned long addr);
6060 static nokprobe_inline int
....@@ -143,6 +143,8 @@
143143 array:
144144 /* the last stage: Loop on array */
145145 if (code->op == FETCH_OP_LP_ARRAY) {
146
+ if (ret < 0)
147
+ ret = 0;
146148 total += ret;
147149 if (++i < code->param) {
148150 code = s3;
....@@ -188,7 +190,7 @@
188190
189191 /* Store the value of each argument */
190192 static nokprobe_inline void
191
-store_trace_args(void *data, struct trace_probe *tp, struct pt_regs *regs,
193
+store_trace_args(void *data, struct trace_probe *tp, void *rec,
192194 int header_size, int maxlen)
193195 {
194196 struct probe_arg *arg;
....@@ -203,12 +205,14 @@
203205 /* Point the dynamic data area if needed */
204206 if (unlikely(arg->dynamic))
205207 *dl = make_data_loc(maxlen, dyndata - base);
206
- ret = process_fetch_insn(arg->code, regs, dl, base);
207
- if (unlikely(ret < 0 && arg->dynamic)) {
208
- *dl = make_data_loc(0, dyndata - base);
209
- } else {
210
- dyndata += ret;
211
- maxlen -= ret;
208
+ ret = process_fetch_insn(arg->code, rec, dl, base);
209
+ if (arg->dynamic) {
210
+ if (unlikely(ret < 0)) {
211
+ *dl = make_data_loc(0, dyndata - base);
212
+ } else {
213
+ dyndata += ret;
214
+ maxlen -= ret;
215
+ }
212216 }
213217 }
214218 }