On Fri, Jun 9, 2023 at 5:12 AM Yonghong Song <yhs@xxxxxxxx> wrote: > > > > On 6/7/23 8:17 PM, Menglong Dong wrote: > > On Thu, Jun 8, 2023 at 4:09 AM Alexei Starovoitov > > <alexei.starovoitov@xxxxxxxxx> wrote: > >> > >> On Wed, Jun 07, 2023 at 08:59:09PM +0800, menglong8.dong@xxxxxxxxx wrote: > >>> From: Menglong Dong <imagedong@xxxxxxxxxxx> > >>> > >>> For now, the BPF program of type BPF_PROG_TYPE_TRACING can only be used > >>> on the kernel functions whose arguments count less than 6. This is not > >>> friendly at all, as too many functions have arguments count more than 6. > >>> > >>> Therefore, let's enhance it by increasing the function arguments count > >>> allowed in arch_prepare_bpf_trampoline(), for now, only x86_64. > >>> > >>> For the case that we don't need to call origin function, which means > >>> without BPF_TRAMP_F_CALL_ORIG, we need only copy the function arguments > >>> that stored in the frame of the caller to current frame. The arguments > >>> of arg6-argN are stored in "$rbp + 0x18", we need copy them to > >>> "$rbp - regs_off + (6 * 8)". > >>> > >>> For the case with BPF_TRAMP_F_CALL_ORIG, we need prepare the arguments > >>> in stack before call origin function, which means we need alloc extra > >>> "8 * (arg_count - 6)" memory in the top of the stack. Note, there should > >>> not be any data be pushed to the stack before call the origin function. > >>> Then, we have to store rbx with 'mov' instead of 'push'. > >> > >> x86-64 psABI requires stack to be 16-byte aligned when args are passed on the stack. > >> I don't see this logic in the patch. > > > > Yeah, it seems I missed this logic......:) > > > > I have not figure out the rule of the alignment, but after > > observing the behavior of the compiler, the stack seems > > should be like this: > > > > ------ stack frame begin > > rbp > > > > xxx -- this part should be aligned in 16-byte > > > > ------ end of arguments in stack > > xxx > > ------ begin of arguments in stack > > > > So the code should be: > > > > + if (nr_regs > 6 && (flags & BPF_TRAMP_F_CALL_ORIG)) { > > + stack_size = ALIGN(stack_size, 16); > > + stack_size += (nr_regs - 6) * 8; > > + } > > > > Am I right? > > This is the stack_size, you should ensure stack pointer is 16-byte aligned. Oh, I see. Considering the begin of the stack frame should already be 16-byte aligned, what we should do here is to make the size of the current stack frame 16-byte aligned. Then, rsp will be 16-byte aligned. Am I right? Which means the code should be: + if (nr_regs > 6 && (flags & BPF_TRAMP_F_CALL_ORIG)) { + stack_size += (nr_regs - 6) * 8; + stack_size = ALIGN(stack_size, 16); + } Then, the size of current stack frame will be: stack_size + 8(rbp) + 8(rip) This is the example that I refer to: https://godbolt.org/z/7o9nh4nbc > > > > > Thanks! > > Menglong Dong