On 2015/05/27 11:27, He Kuang wrote: > hi, Alexei > > On 2015/5/27 1:50, Alexei Starovoitov wrote: >> On 5/25/15 1:33 AM, He Kuang wrote: >>> Right, I learnt regparm(3) is mandatory in x86_32, according to rules, >>> the first three args will go to regparm(ax, dx, cx). But we should not >>> refer arg1~3 to ax, dx, cx because of 64bit parameters (other reasons?). >>> >>> Consider this keyword is used for generating bpf prologue which fetches >>> formal parameters when no debuginfo is provided, for this purpose, we can: >>> 1) We just help fetch the $regs or $regparms(If the keyword is >>> $regparms, ax/dx/cx is fetched, nothing related to args) to bpf arglists >>> and leave the rest things to bpf prog writer. >>> >>> 2) Keep that on platforms like x86_64 and skip this feature on >>> platforms like x86_32. >>> >>> or any other suggestions? >> >> Single argument like $regparam or whatever name cannot work on all >> architectures, that's why in the very beginning I suggested >> 'func(long, char, void*)' syntax to describe arguments when debuginfo >> is not available. Calling convention for scalars is simple enough on >> all major architectures. x64_64 - trivial, i64_32 - a bit more involved, >> but simple enough so that list of types of arguments is enough to figure >> out which register or register pair or stack should be used to fetch >> argN. >> >> > As Masami has reminded, the use of 'asmlinkage' forces regparm=0, and > we can't destinguish them without debuginfo, so 'func(long, char, > void*)' syntax not work in everywhere. > > In fact, all the context infos are there in bpf prog(pt_regs in arg1). > To the non-debuginfo case, without the help of prologue, user steps > following flow to fetch params: > > 1. pt_regs(arg1) + architecture => calling regs > > 2. calling regs + function prototype(SEC) + gcc attributes(like > asmlinkage) => formal parameters > > '$regparms' do the 1st step, though not a full workaround. But for the > lack of gcc attributes, it seems we can't do the 2nd step. Any ideas?
If you don't have the debuginfo, $regparams will help, but not cover all the cases. This just means users may need to take care of using it. Actually, in most cases, I'm sure $regparams will work fine, since most functions are not asmlinkage'ed. If you consider bpf requires correct parameters, you need debuginfo or something like it, e.g. the pre-analyzed cache of perf-probe (see https://lkml.org/lkml/2014/10/31/207). Thank you, -- Masami HIRAMATSU Linux Technology Research Center, System Productivity Research Dept. Center for Technology Innovation - Systems Engineering Hitachi, Ltd., Research & Development Group E-mail: masami.hiramatsu...@hitachi.com -- 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/