On Fri, 2024-07-19 at 18:54 -0700, Alexei Starovoitov wrote: [...] > > So, the point stands: from C compiler pov pointer &b escapes, > > and compiler is not really allowed to replace object at that offset > > with garbage. Why do you think the program is broken? > > This is apples to oranges. > Compiler sees that the address of 'b' is taken and passed > into a function with side effect. > Whether 3rd arg of bpf_probe_read_kernel() is void * or long > is irrelevant. Compilers will do it, because it's a C language > requirement. > > > I don't mind dropping the patch in question, but I agree with Andrii's > > viewpoint that there is nothing wrong with this use case. > > bpf_probe_read_kernel() is not special and it's 3rd argument is > some kernel address. Whether it's stack pointer or anything else > is irrelevant. > JITs and verifier are allowed to do any optimizations on stack > and any other memory completely ignoring presence of > bpf_probe_read_kernel() and what is being passed into it. > > Tomorrow we will teach arm64 JIT to replace stack spill/fill with > spare register read/write. There is no way we're going to special case > a particular fp-16 slot because fp-16 was passed into probe_read. Ok, I will re-submit w/o these two patches. Andrii also requested to re-structure the check contract function to reset .nocsr_pattern and .spills_num marks to 0 upon contract violation.