From: Joel.soete@freebel.net
To: parisc-linux@parisc-linux.org
Subject: [parisc-linux] Need help to improve uaccess.h patch
Date: Fri, 4 Oct 2002 17:24:45 +0200 [thread overview]
Message-ID: <3D8EED0B00001557@ocpmta5.be.tiscali.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 8837 bytes --]
Hi all,
With evms-1.2.0, I test following draft of uaccess.h.
Can somebody have a close look on this code to make it relevant for all
(I not sure of exception condition (ie segv) because I do not find any way
to stress it and do not find usage of get_user_asm_64)?
Thanks in advance for attention and futher help,
Joel
########
--- uaccess.h.orig 2002-10-04 10:23:59.000000000 +0200
+++ uaccess.h 2002-10-04 17:07:54.000000000 +0200
@@ -35,10 +35,15 @@
#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 LDD_KERNEL(x, ptr) __get_kernel_asm_64(x, ptr)
+
+#define LDD_USER(x, ptr) __get_user_asm_64(x, ptr)
+
+#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)
@@ -68,27 +73,28 @@
({ \
register long __gu_err __asm__ ("r8") = 0; \
register long __gu_val __asm__ ("r9") = 0; \
+ \
+ unsigned int __tmp = 0; \
\
if (segment_eq(get_fs(),KERNEL_DS)) { \
switch (sizeof(*(ptr))) { \
- case 1: __get_kernel_asm("ldb",ptr); break; \
- case 2: __get_kernel_asm("ldh",ptr); break; \
- case 4: __get_kernel_asm("ldw",ptr); break; \
- case 8: LDD_KERNEL(ptr); break; \
+ case 1: __get_kernel_asm("ldb",x, ptr); break; \
+ case 2: __get_kernel_asm("ldh",x, ptr); break; \
+ case 4: __get_kernel_asm("ldw",x, ptr); break; \
+ case 8: LDD_KERNEL(x, ptr); break; \
default: BUG(); break; \
} \
} \
else { \
switch (sizeof(*(ptr))) { \
- case 1: __get_user_asm("ldb",ptr); break; \
- case 2: __get_user_asm("ldh",ptr); break; \
- case 4: __get_user_asm("ldw",ptr); break; \
- case 8: LDD_USER(ptr); break; \
+ case 1: __get_user_asm("ldb",x, ptr); break; \
+ case 2: __get_user_asm("ldh",x, ptr); break; \
+ case 4: __get_user_asm("ldw",x, ptr); break; \
+ case 8: LDD_USER(x, ptr); break; \
default: BUG(); break; \
} \
} \
\
- (x) = (__typeof__(*(ptr))) __gu_val; \
__gu_err; \
})
@@ -113,7 +119,7 @@
: "=r"(__gu_val), "=r"(__gu_err) \
: "r"(ptr), "1"(__gu_err));
#else
-#define __get_kernel_asm(ldx,ptr) \
+#define __get_kernel_asm(ldx,x, ptr) \
__asm__("\n1:\t" ldx "\t0(%2),%0\n" \
"2:\n" \
"\t.section __ex_table,\"a\"\n" \
@@ -121,9 +127,25 @@
"\t.word\t(2b-1b)+3\n" \
"\t.previous" \
: "=r"(__gu_val), "=r"(__gu_err) \
- : "r"(ptr), "1"(__gu_err));
+ : "r"(ptr), "1"(__gu_err)); \
+ (x) = (__typeof__(*(ptr))) __gu_val;
-#define __get_user_asm(ldx,ptr) \
+#define __get_kernel_asm_64(x, ptr) \
+ __asm__ ("\n\tldw\t4(%1),%3\n" \
+ "1:\tstw\t%3,4(%2)\n" \
+ "\tldw\t0(%1),%3\n" \
+ "2:\tstw\t%3,0(%2)\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"(__gu_err) \
+ : "r"(ptr), "r"(&(x)), "r"(__tmp), "0"(__gu_err));
+
+#define __get_user_asm(ldx,x, ptr) \
__asm__("\n1:\t" ldx "\t0(%%sr3,%2),%0\n" \
"2:\n" \
"\t.section __ex_table,\"a\"\n" \
@@ -131,19 +153,38 @@
"\t.word\t(2b-1b)+3\n" \
"\t.previous" \
: "=r"(__gu_val), "=r"(__gu_err) \
- : "r"(ptr), "1"(__gu_err));
+ : "r"(ptr), "1"(__gu_err)); \
+ (x) = (__typeof__(*(ptr))) __gu_val;
+
+#define __get_user_asm_64(x, ptr) \
+ __asm__ ("\n\tldw\t4(%%sr3,%1),%3\n" \
+ "1:\tstw\t%3,4(%2)\n" \
+ "\tldw\t0(%%sr3,%1),%3\n" \
+ "2:\tstw\t%3,0(%2)\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"(__gu_err) \
+ : "r"(ptr), "r"(&(x)), "r"(__tmp), "0"(__gu_err));
+
#endif
#define __put_user(x,ptr) \
({ \
register long __pu_err __asm__ ("r8") = 0; \
+ unsigned long long X = (unsigned long long) x; \
+ unsigned long long * __tmp = 0; \
\
if (segment_eq(get_fs(),KERNEL_DS)) { \
switch (sizeof(*(ptr))) { \
case 1: __put_kernel_asm("stb",x,ptr); break; \
case 2: __put_kernel_asm("sth",x,ptr); break; \
case 4: __put_kernel_asm("stw",x,ptr); break; \
- case 8: STD_KERNEL(x,ptr); break; \
+ case 8: STD_KERNEL(X,ptr); break; \
default: BUG(); break; \
} \
} \
@@ -152,7 +193,7 @@
case 1: __put_user_asm("stb",x,ptr); break; \
case 2: __put_user_asm("sth",x,ptr); break; \
case 4: __put_user_asm("stw",x,ptr); break; \
- case 8: STD_USER(x,ptr); break; \
+ case 8: STD_USER(X,ptr); break; \
default: BUG(); break; \
} \
} \
@@ -200,6 +241,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 +267,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(%2),%3\n" \
+ "1:\tstw\t%3,0(%%sr3,%1)\n" \
+ "\tldw\t4(%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
#########
[-- Attachment #2: pa-uaccess_h.patch --]
[-- Type: application/octet-stream, Size: 8493 bytes --]
--- uaccess.h.orig 2002-10-04 10:23:59.000000000 +0200
+++ uaccess.h 2002-10-04 17:07:54.000000000 +0200
@@ -35,10 +35,15 @@
#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 LDD_KERNEL(x, ptr) __get_kernel_asm_64(x, ptr)
+
+#define LDD_USER(x, ptr) __get_user_asm_64(x, ptr)
+
+#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)
@@ -68,27 +73,28 @@
({ \
register long __gu_err __asm__ ("r8") = 0; \
register long __gu_val __asm__ ("r9") = 0; \
+ \
+ unsigned int __tmp = 0; \
\
if (segment_eq(get_fs(),KERNEL_DS)) { \
switch (sizeof(*(ptr))) { \
- case 1: __get_kernel_asm("ldb",ptr); break; \
- case 2: __get_kernel_asm("ldh",ptr); break; \
- case 4: __get_kernel_asm("ldw",ptr); break; \
- case 8: LDD_KERNEL(ptr); break; \
+ case 1: __get_kernel_asm("ldb",x, ptr); break; \
+ case 2: __get_kernel_asm("ldh",x, ptr); break; \
+ case 4: __get_kernel_asm("ldw",x, ptr); break; \
+ case 8: LDD_KERNEL(x, ptr); break; \
default: BUG(); break; \
} \
} \
else { \
switch (sizeof(*(ptr))) { \
- case 1: __get_user_asm("ldb",ptr); break; \
- case 2: __get_user_asm("ldh",ptr); break; \
- case 4: __get_user_asm("ldw",ptr); break; \
- case 8: LDD_USER(ptr); break; \
+ case 1: __get_user_asm("ldb",x, ptr); break; \
+ case 2: __get_user_asm("ldh",x, ptr); break; \
+ case 4: __get_user_asm("ldw",x, ptr); break; \
+ case 8: LDD_USER(x, ptr); break; \
default: BUG(); break; \
} \
} \
\
- (x) = (__typeof__(*(ptr))) __gu_val; \
__gu_err; \
})
@@ -113,7 +119,7 @@
: "=r"(__gu_val), "=r"(__gu_err) \
: "r"(ptr), "1"(__gu_err));
#else
-#define __get_kernel_asm(ldx,ptr) \
+#define __get_kernel_asm(ldx,x, ptr) \
__asm__("\n1:\t" ldx "\t0(%2),%0\n" \
"2:\n" \
"\t.section __ex_table,\"a\"\n" \
@@ -121,9 +127,25 @@
"\t.word\t(2b-1b)+3\n" \
"\t.previous" \
: "=r"(__gu_val), "=r"(__gu_err) \
- : "r"(ptr), "1"(__gu_err));
+ : "r"(ptr), "1"(__gu_err)); \
+ (x) = (__typeof__(*(ptr))) __gu_val;
-#define __get_user_asm(ldx,ptr) \
+#define __get_kernel_asm_64(x, ptr) \
+ __asm__ ("\n\tldw\t4(%1),%3\n" \
+ "1:\tstw\t%3,4(%2)\n" \
+ "\tldw\t0(%1),%3\n" \
+ "2:\tstw\t%3,0(%2)\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"(__gu_err) \
+ : "r"(ptr), "r"(&(x)), "r"(__tmp), "0"(__gu_err));
+
+#define __get_user_asm(ldx,x, ptr) \
__asm__("\n1:\t" ldx "\t0(%%sr3,%2),%0\n" \
"2:\n" \
"\t.section __ex_table,\"a\"\n" \
@@ -131,19 +153,38 @@
"\t.word\t(2b-1b)+3\n" \
"\t.previous" \
: "=r"(__gu_val), "=r"(__gu_err) \
- : "r"(ptr), "1"(__gu_err));
+ : "r"(ptr), "1"(__gu_err)); \
+ (x) = (__typeof__(*(ptr))) __gu_val;
+
+#define __get_user_asm_64(x, ptr) \
+ __asm__ ("\n\tldw\t4(%%sr3,%1),%3\n" \
+ "1:\tstw\t%3,4(%2)\n" \
+ "\tldw\t0(%%sr3,%1),%3\n" \
+ "2:\tstw\t%3,0(%2)\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"(__gu_err) \
+ : "r"(ptr), "r"(&(x)), "r"(__tmp), "0"(__gu_err));
+
#endif
#define __put_user(x,ptr) \
({ \
register long __pu_err __asm__ ("r8") = 0; \
+ unsigned long long X = (unsigned long long) x; \
+ unsigned long long * __tmp = 0; \
\
if (segment_eq(get_fs(),KERNEL_DS)) { \
switch (sizeof(*(ptr))) { \
case 1: __put_kernel_asm("stb",x,ptr); break; \
case 2: __put_kernel_asm("sth",x,ptr); break; \
case 4: __put_kernel_asm("stw",x,ptr); break; \
- case 8: STD_KERNEL(x,ptr); break; \
+ case 8: STD_KERNEL(X,ptr); break; \
default: BUG(); break; \
} \
} \
@@ -152,7 +193,7 @@
case 1: __put_user_asm("stb",x,ptr); break; \
case 2: __put_user_asm("sth",x,ptr); break; \
case 4: __put_user_asm("stw",x,ptr); break; \
- case 8: STD_USER(x,ptr); break; \
+ case 8: STD_USER(X,ptr); break; \
default: BUG(); break; \
} \
} \
@@ -200,6 +241,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 +267,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(%2),%3\n" \
+ "1:\tstw\t%3,0(%%sr3,%1)\n" \
+ "\tldw\t4(%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
next reply other threads:[~2002-10-04 15:31 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-10-04 15:24 Joel.soete [this message]
2002-10-04 16:08 ` [parisc-linux] Need help to improve uaccess.h patch Randolph Chung
2002-10-05 20:22 ` Joel Soete
2002-10-05 22:10 ` John David Anglin
2002-10-06 0:07 ` Randolph Chung
-- strict thread matches above, loose matches on Subject: below --
2002-10-07 16:12 jsoe0708
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3D8EED0B00001557@ocpmta5.be.tiscali.com \
--to=joel.soete@freebel.net \
--cc=parisc-linux@parisc-linux.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox