from include/linux/kernel.h: #define ALIGN(x,a) (((x)+(a)-1)&~((a)-1)) from crypto/cipher.c: unsigned int alignmask = ... u8 *src = (u8 *)ALIGN((unsigned long)buffer, alignmask + 1); ... unsigned int alignmask = ... u8 *tmp = (u8 *)ALIGN((unsigned long)buffer, alignmask + 1); ... unsigned int align; addr = ALIGN(addr, align); addr += ALIGN(tfm->__crt_alg->cra_ctxsize, align); The compiler first does ~((a)-1)) and then expands the unsigned int to unsigned long for the & operation. So we end up with only the lower 32 bits of the address. Who did smoke what to do this? Patch attached. -- Andreas Steinmetz SPAMmers use robotrap@domdv.de