Messages in this thread | | | Date | Wed, 26 Dec 2001 20:22:21 +0100 (CET) | From | Frank Cornelis <> | Subject | Re: Weird __put_user_asm behavior |
| |
Hey,
> The old code evaluates addr once, your new code evaluates it twice. > Have you tried an inline function instead of a macro? > linux/fs/binfmt_elf.c contains a few lines that probably break if 'addr' > is evaluated twice: > <<<<<<< > argv = (elf_caddr_t *) sp; > if (!ibcs) { > __put_user((elf_addr_t)(unsigned long) envp,--sp); > __put_user((elf_addr_t)(unsigned long) argv,--sp); > } > <<<<<<<<<
Double evaluation of the (addr) expression seems to be my problem, not register clobbering as I first thought. Although all the macro's that are using __put_user_asm also use __typeof__(*(addr)) *__their_local_addr = (addr); // further use __their_local_addr ... one apparently needs to repeat this 'localization' of (addr) in order to have only one evaluation of (addr) at the end. I always found the macro paragraph in my first C book -'A Book on C'- a little too short :).
Anyway, thanks to all for the help.
Frank.
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |