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.
Thanks!
Menglong Dong