Linux PARISC architecture development
 help / color / mirror / Atom feed
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
 
 

             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