On Thu, Jun 8, 2023 at 4:09 AM Alexei Starovoitov alexei.starovoitov@gmail.com wrote:
On Wed, Jun 07, 2023 at 08:59:09PM +0800, menglong8.dong@gmail.com wrote:
From: Menglong Dong imagedong@tencent.com
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?
Thanks! Menglong Dong