[parisc-linux] MM gurus help request
jsoe0708@tiscali.be
jsoe0708@tiscali.be
Fri, 27 Sep 2002 17:11:23 +0200
Sorry it is bad :(
>
>Hi all,
>
>To manage put_user(x, ptr) with x a 64bits (long long), I found another
way
>to access the address of x and suggest following solution.
>
>--- uaccess.h.orig 2002-09-25 13:59:09.000000000 +0200
>+++ uaccess.h 2002-09-27 16:57:06.000000000 +0200
>@@ -35,10 +35,13 @@
> #define get_user __get_user
>
> #if BITS_PER_LONG == 32
>+
> #define LDD_KERNEL(ptr) BUG()
> #define LDD_USER(ptr) BUG()
>-#define STD_KERNEL(x, ptr) BUG()
>-#define STD_USER(x, ptr) BUG()
>+#define STD_KERNEL(x, ptr) __put_kernel_asm_64(x, ptr)
>+
>+#define STD_USER(x, ptr) __put_user_asm_64(x, ptr)
>+
> #else
> #define LDD_KERNEL(ptr) __get_kernel_asm("ldd",ptr)
> #define LDD_USER(ptr) __get_user_asm("ldd",ptr)
>@@ -137,6 +140,7 @@
> #define __put_user(x,ptr) \
> ({ \
> register long __pu_err __asm__ ("r8") = 0; \
>+ register long long * __tmp = 0; \
> \
> if (segment_eq(get_fs(),KERNEL_DS)) { \
> switch (sizeof(*(ptr))) { \
>@@ -200,6 +204,22 @@
> : "=r"(__pu_err) \
> : "r"(ptr), "r"(x), "0"(__pu_err))
>
>+#define __put_kernel_asm_64(x, ptr) \
>+ __asm__ __volatile__ ( \
>+ "\n\tldw\t0(%2),%3\n" \
>+ "1:\tstw\t%3,0(%1)\n" \
>+ "\tldw\t4(%2),%3\n" \
>+ "2:\tstw\t%3,4(%1)\n" \
>+ "3:\n" \
>+ "\t.section __ex_table,\"a\"\n" \
>+ "\t.word\t1b\n" \
>+ "\t.word\t(3b-1b)+1\n" \
>+ "\t.word\t2b\n" \
>+ "\t.word\t(3b-2b)+1\n" \
>+ "\t.previous" \
>+ : "=r"(__pu_err) \
>+ : "r"(ptr), "r"(&x), "r"(__tmp), "0"(__pu_err))
>+
> #define __put_user_asm(stx,x,ptr) \
> __asm__ __volatile__ ( \
> "\n1:\t" stx "\t%2,0(%%sr3,%1)\n" \
>@@ -210,6 +230,23 @@
> "\t.previous" \
> : "=r"(__pu_err) \
> : "r"(ptr), "r"(x), "0"(__pu_err))
>+
>+#define __put_user_asm_64(x, ptr) \
>+ __asm__ __volatile__ ( \
>+ "\n\tldw\t0(%%sr3,%2),%3\n" \
>+ "1:\tstw\t%3,0(%%sr3,%1)\n" \
>+ "\tldw\t4(%%sr3,%2),%3\n" \
>+ "2:\tstw\t%3,4(%%sr3,%1)\n" \
>+ "3:\n" \
>+ "\t.section __ex_table,\"a\"\n" \
>+ "\t.word\t1b\n" \
>+ "\t.word\t(3b-1b)+1\n" \
>+ "\t.word\t2b\n" \
>+ "\t.word\t(3b-2b)+1\n" \
>+ "\t.previous" \
>+ : "=r"(__pu_err) \
>+ : "r"(ptr), "r"(&x), "r"(__tmp), "0"(__pu_err))
>+
> #endif
>
(&x) works when it is a variable not with a symbolic constant as 0.
Sorry,
Joel