On 11/05, Namhyung Kim wrote: > > This is what I have for now: > > static void __user *get_user_vaddr(struct pt_regs *regs, unsigned long addr, > struct trace_uprobe *tu) > { > unsigned long base_addr; > unsigned long vaddr; > > base_addr = instruction_pointer(regs) - tu->offset; > vaddr = base_addr + addr; > > return (void __force __user *) vaddr; > } > > When I tested it, it was able to fetch global and bss data from both of > executable and library properly.
Heh ;) I didn't expect you will agree with this suggestion. But if you think it can work - great! Let me clarify just in case. Yes, _personally_ I think we should try to avoid the vma games, and it looks better to me this way. But I won't argue if you change your mind, I understand this approach has its own disadvantages. As for "-= tu->offset"... Can't we avoid it? User-space needs to calculate the "@" argument anyway, why it can't also substruct this offset? Or perhaps we can change parse_probe_arg("@") to update "param" ? Yes, in this case it needs another argument, not sure... > But it still doesn't work for uretprobes > as you said before. This looks simple, + if (is_ret_probe(tu)) { + saved_ip = instruction_pointer(regs); + instruction_pointer_set(func); + } store_trace_args(...); + if (is_ret_probe(tu)) + instruction_pointer_set(saved_ip); although not pretty. > This symbol offset calculation was done in the getsymoff which implemented > like below (I'm sure there's a much simpler way to do this, but ...). Perhaps I'll even try to read/understand it later, but this elf stuff is the black magic to me ;) Oleg. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/