From: Brenden Blanco <bbla...@plumgrid.com> Date: Wed, 3 Aug 2016 11:29:52 -0700
> On Wed, Aug 03, 2016 at 10:29:58AM -0700, Tom Herbert wrote: >> On Wed, Aug 3, 2016 at 10:11 AM, Alexei Starovoitov >> <alexei.starovoi...@gmail.com> wrote: >> > On Wed, Aug 03, 2016 at 10:01:54AM -0700, Tom Herbert wrote: >> >> On Tue, Jul 19, 2016 at 12:16 PM, Brenden Blanco <bbla...@plumgrid.com> >> >> wrote: > [...] >> >> > +SEC("xdp1") >> >> > +int xdp_prog1(struct xdp_md *ctx) >> >> > +{ >> >> > + void *data_end = (void *)(long)ctx->data_end; >> >> > + void *data = (void *)(long)ctx->data; >> >> >> >> Brendan, >> >> >> >> It seems that the cast to long here is done because data_end and data >> >> are u32s in xdp_md. So the effect is that we are upcasting a >> >> thirty-bit integer into a sixty-four bit pointer (in fact without the >> >> cast we see compiler warnings). I don't understand how this can be >> >> correct. Can you shed some light on this? >> > >> > please see: >> > http://lists.iovisor.org/pipermail/iovisor-dev/2016-August/000355.html >> > >> That doesn't explain it. The only thing I can figure is that there is >> an implicit assumption somewhere that even though the pointer size may >> be 64 bits, only the low order thirty-two bits are relevant in this >> environment (i.e. upper bit are always zero for any pointers)-- so >> then it would safe store pointers as u32 and to upcast them to void *. > No, the actual pointer storage is always void* sized (see struct > xdp_buff). The mangling is cosmetic. The verifier converts the > underlying bpf load instruction to the right sized operation. And this is what Alexei meant by "meta". Tom this stuff works just fine.