On 08/11/2017 11:57 AM, Wangnan (F) wrote: > > > On 2017/8/11 17:17, Thomas-Mich Richter wrote: >> On 08/11/2017 07:19 AM, Wangnan (F) wrote:
[....] > Your analysis is correct. > >> >> Maybe the solution is to add an endianness convertion into the gen_read_mem() >> function. > > That means alert the prologue. We can utilize the size field in BPF_LDX_MEM. > > Could you please try this patch: > > diff --git a/tools/perf/util/bpf-prologue.c b/tools/perf/util/bpf-prologue.c > index 6cdbee1..aadbda4 100644 > --- a/tools/perf/util/bpf-prologue.c > +++ b/tools/perf/util/bpf-prologue.c > @@ -258,7 +258,7 @@ gen_prologue_slowpath(struct bpf_insn_pos *pos, > > /* Final pass: read to registers */ > for (i = 0; i < nargs; i++) > - ins(BPF_LDX_MEM(BPF_DW, BPF_PROLOGUE_START_ARG_REG + i, > + ins(BPF_LDX_MEM(BPF_W, BPF_PROLOGUE_START_ARG_REG + i, > BPF_REG_FP, -BPF_REG_SIZE * (i + 1)), pos); > > ins(BPF_JMP_IMM(BPF_JA, BPF_REG_0, 0, JMP_TO_SUCCESS_CODE), pos); > > > On your platform and check if the value of f_mode is correct? > > NOTE: 64 bit load becomes incorrect after applying this patch. I want to make > sure > the behavior of 32 bit BPF load instruction works correct on big endian > machine. > > Thank you. > This patch solves the issue with the first parameter. Now I see the correct value of f_mode member of struct-file. As you said the other loads are wrong. Here is the output of the trace: perf-13438 [000] d..2 2102.392312: : f_mode 6001f offset:0 orig:0 perf-13438 [000] d..2 2102.392414: : f_mode 2001d offset:0 orig:0 perf-13438 [000] d..2 2102.392440: : f_mode 2001d offset:0 orig:0 perf-13438 [000] d..2 2102.392453: : f_mode 6001f offset:0 orig:0 PS: When I ran this test I undid the changes to tests/bpf-test-script-prologue.c. It was in its original state when this test was executed. -- Thomas Richter, Dept 3303, IBM LTC Boeblingen Germany -- Vorsitzende des Aufsichtsrats: Martina Koederitz Geschäftsführung: Dirk Wittkopp Sitz der Gesellschaft: Böblingen / Registergericht: Amtsgericht Stuttgart, HRB 243294