... > > + /* Generally speaking, the compiler will pass the arguments > > + * on-stack with "push" instruction, which will take 8-byte > > + * on the stack. On this case, there won't be garbage values > > On this case -> In this case. The same for below another case. > > > + * while we copy the arguments from origin stack frame to current > > + * in BPF_DW. > > + * > > + * However, sometimes the compiler will only allocate 4-byte on > > + * the stack for the arguments. For now, this case will only > > + * happen if there is only one argument on-stack and its size > > + * not more than 4 byte. On this case, there will be garbage > > + * values on the upper 4-byte where we store the argument on > > + * current stack frame. Is that right for 86-64? IIRC arguments always take (at least) 64bits. For any 32bit argument (register or stack) the high bits are undefined. (Maybe in kernel they are always zero? >From 32bit userspace they are definitely random.) I think the called code is also responsible form masking 8 and 16bit values (in reality char/short args and return values just add code bloat). A 128bit value is either passed in two registers or two stack slots. If the last register is skipped it will be used for the next argument. David - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)