Re: Fix asm constraint in put_user

David Mosberger-Tang
2005-11-21T16:08:42Z

If memory services, you should use the "o" constraint instead. Note
that there is no "memory" clobber, so if you change from "m" to "r"
constraint, GCC won't know that the location at "addr" is being stored
to.

--david

On 11/21/05, Andreas Schwab <schwab@suse.de> wrote:
> The st insn on the ia64 does not allow the post-increment to come from a
> register (only ld does). Thus the "m" constraint is not suitable for the
> asm statement in __put_user_size.
>
> Signed-off-by: Andreas Schwab <schwab@suse.de>
>
> --- linux-2.6.14/include/asm-ia64/uaccess.h.~1~ 2005-10-28 02:02:08.000000000 +0200
> +++ linux-2.6.14/include/asm-ia64/uaccess.h 2005-11-20 18:15:46.559296784 +0100
> @@ -154,10 +154,10 @@ do { \
> # define __put_user_size(val, addr, n, err) \
> do { \
> register long __pu_r8 asm ("r8") = 0; \
> - asm volatile ("\n[1:]\tst"#n" %1=%r2%P1\t// %0 gets overwritten by exception handler\n" \
> + asm volatile ("\n[1:]\tst"#n" [%1]=%r2\t// %0 gets overwritten by exception handler\n" \
> "\t.xdata4 \"__ex_table\", 1b-., 1f-.\n" \
> "[1:]" \
> - : "=r"(__pu_r8) : "m"(__m(addr)), "rO"(val), "0"(__pu_r8)); \
> + : "=r"(__pu_r8) : "r"(addr), "rO"(val), "0"(__pu_r8)); \
> (err) = __pu_r8; \
> } while (0)
>
>
> Andreas.
>
> --
> Andreas Schwab, SuSE Labs, schwab@suse.de
> SuSE Linux Products GmbH, Maxfeldstraße 5, 90409 Nürnberg, Germany
> PGP key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
> "And now for something completely different."
> -
> To unsubscribe from this list: send the line "unsubscribe linux-ia64" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>

--
Mosberger Consulting LLC, voice/fax: 510-744-9372,
http://www.mosberger-consulting.com/
35706 Runckel Lane, Fremont, CA 94536