On Thu, 2024-02-01 at 04:21 +0000, Kumar Kartikeya Dwivedi wrote: > Until now, the program counter value stored in frame descriptor entries > was the instruction index of the BPF program's insn and callsites when > going down the frames in a call chain. However, at runtime, the program > counter will be the pointer to the next instruction, and thus needs to > be computed in a position independent way to tally it at runtime to find > the frame descriptor when unwinding. > > To do this, we first convert the global instruction index into an > instruction index relative to the start of a subprog, and add 1 to it > (to reflect that at runtime, the program counter points to the next > instruction). Then, we modify the JIT (for now, x86) to convert them > to instruction offsets relative to the start of the JIT image, which is > the prog->bpf_func of the subprog in question at runtime. > > Later, subtracting the prog->bpf_func pointer from runtime program > counter will yield the same offset, and allow us to figure out the > corresponding frame descriptor entry. Would it be possible to instead embed an address (or index) of the corresponding frame descriptor in instruction stream itself? E.g. do LD_imm64 and pass it as a first parameter for bpf_throw()? Thus avoiding the necessity to track ip changes. [...]