Linux PARISC architecture development
 help / color / mirror / Atom feed
* [parisc-linux] some whitespace rework and attempt to beautify inline asm stuff?
@ 2006-04-11  9:37 Joel Soete
  2006-04-16 20:14 ` [parisc-linux] Does it lakes some cloberred r1 in __put_kernel_asm() 64bit? Joel Soete
  2006-04-16 20:37 ` [parisc-linux] more whitespace rework and attempt to beautify inline asm stuff? Joel Soete
  0 siblings, 2 replies; 7+ messages in thread
From: Joel Soete @ 2006-04-11  9:37 UTC (permalink / raw)
  To: Parisc List

[-- Attachment #1: Type: text/plain, Size: 13963 bytes --]

Hello all,

Reading some .s output like memcpy, I was worry that some labels was not in
the column as e.g.:
       pmc_store_exc:
[...]
       1:      ldw 0(%sr1,%r19), %r22
[...]

or otc code in first column:
[...]
shrpw %r3, %r1, %sar, %r28

here I attache a patch
--- linux-2.6.17-rc1-pa1/arch/parisc/lib/memcpy.c.Orig  2006-04-10
07:24:31.000000000 +0000
+++ linux-2.6.17-rc1-pa1/arch/parisc/lib/memcpy.c       2006-04-10
15:05:38.000000000 +0000
@@ -79,20 +79,24 @@
 #define get_user_space() (segment_eq(get_fs(), KERNEL_DS) ? 0 : mfsp(3))
 #define get_kernel_space() (0)

-#define MERGE(w0, sh_1, w1, sh_2)  ({                                  \
+#define MERGE(w0, sh_1, w1, sh_2)      ({                              \
        unsigned int _r;                                                \
-       asm volatile (                                                  \
-       "mtsar %3\n"                                                    \
-       "shrpw %1, %2, %%sar, %0\n"                                     \
-       : "=r"(_r)                                                      \
-       : "r"(w0), "r"(w1), "r"(sh_2)                                   \
+       __asm__ __volatile__ ("\n"                                      \
+       "       mtsar           %3\n"                                   \
+       "       shrpw           %1, %2,%%sar, %0"                       \
+               : "=r"(_r)                                              \
+               : "r"(w0), "r"(w1), "r"(sh_2)                           \
        );                                                              \
        _r;                                                             \
 })
 #define THRESHOLD      16

 #ifdef DEBUG_MEMCPY
-#define DPRINTF(fmt, args...) do { printk(KERN_DEBUG "%s:%d:%s ", __FILE__,
__LINE__, __FUNCTION__ ); printk(KERN_DEBUG fmt, ##args
 ); } while (0)
+#define DPRINTF(fmt, args...) do {                                     \
+       printk(KERN_DEBUG "%s:%d:%s ",                                  \
+               __FILE__, __LINE__, __FUNCTION__ );                     \
+       printk(KERN_DEBUG fmt, ##args );                                \
+} while (0)
 #else
 #define DPRINTF(fmt, args...)
 #endif
@@ -103,69 +107,81 @@
 #define EXC_WORD ".dword"
 #endif

-#define def_load_ai_insn(_insn,_sz,_tt,_s,_a,_t,_e)    \
-       __asm__ __volatile__ (                          \
-       "1:\t" #_insn ",ma " #_sz "(" _s ",%1), %0\n"   \
-       "\t.section __ex_table,\"aw\"\n"                \
-       "\t" EXC_WORD "\t1b\n"                          \
-       "\t" EXC_WORD "\t" #_e "\n"                     \
-       "\t.previous\n"                                 \
-       : _tt(_t), "+r"(_a)                             \
-       :                                               \
-       : "r8")
-
-#define def_store_ai_insn(_insn,_sz,_tt,_s,_a,_t,_e)   \
-       __asm__ __volatile__ (                          \
-       "1:\t" #_insn ",ma %1, " #_sz "(" _s ",%0)\n"   \
-       "\t.section __ex_table,\"aw\"\n"                \
-       "\t" EXC_WORD "\t1b\n"                          \
-       "\t" EXC_WORD "\t" #_e "\n"                     \
-       "\t.previous\n"                                 \
-       : "+r"(_a)                                      \
-       : _tt(_t)                                       \
-       : "r8")
-
-#define ldbma(_s, _a, _t, _e) def_load_ai_insn(ldbs,1,"=r",_s,_a,_t,_e)
-#define stbma(_s, _t, _a, _e) def_store_ai_insn(stbs,1,"r",_s,_a,_t,_e)
-#define ldwma(_s, _a, _t, _e) def_load_ai_insn(ldw,4,"=r",_s,_a,_t,_e)
-#define stwma(_s, _t, _a, _e) def_store_ai_insn(stw,4,"r",_s,_a,_t,_e)
-#define flddma(_s, _a, _t, _e) def_load_ai_insn(fldd,8,"=f",_s,_a,_t,_e)
-#define fstdma(_s, _t, _a, _e) def_store_ai_insn(fstd,8,"f",_s,_a,_t,_e)
-
-#define def_load_insn(_insn,_tt,_s,_o,_a,_t,_e)        \
-       __asm__ __volatile__ (                          \
-       "1:\t" #_insn " " #_o "(" _s ",%1), %0\n"       \
-       "\t.section __ex_table,\"aw\"\n"                \
-       "\t" EXC_WORD "\t1b\n"                          \
-       "\t" EXC_WORD "\t" #_e "\n"                     \
-       "\t.previous\n"                                 \
-       : _tt(_t)                                       \
-       : "r"(_a)                                       \
-       : "r8")
-
-#define def_store_insn(_insn,_tt,_s,_t,_o,_a,_e)       \
-       __asm__ __volatile__ (                          \
-       "1:\t" #_insn " %0, " #_o "(" _s ",%1)\n"       \
-       "\t.section __ex_table,\"aw\"\n"                \
-       "\t" EXC_WORD "\t1b\n"                          \
-       "\t" EXC_WORD "\t" #_e "\n"                     \
-       "\t.previous\n"                                 \
-       :                                               \
-       : _tt(_t), "r"(_a)                              \
-       : "r8")
+#define def_load_ai_insn(_insn, _sz, _tt, _s, _a, _t, _e)              \
+       __asm__ __volatile__ ("\n"                                      \
+       "1:     " #_insn ",ma           " #_sz "(" _s ", %1), %0\n"     \
+       "       .section __ex_table,\"aw\"\n"                           \
+       "       " EXC_WORD "    1b\n"                                   \
+       "       " EXC_WORD "    " #_e "\n"                              \
+       "       .previous"                                              \
+               : _tt(_t), "+r"(_a)                                     \
+               :                                                       \
+               : "r8"                                                  \
+       )
+
+#define def_store_ai_insn(_insn, _sz, _tt, _s, _a, _t, _e)             \
+       __asm__ __volatile__ ("\n"                                      \
+       "1:     " #_insn ",ma           %1, " #_sz "(" _s ", %0)\n"     \
+       "       .section __ex_table,\"aw\"\n"                           \
+       "       " EXC_WORD "    1b\n"                                   \
+       "       " EXC_WORD "    " #_e "\n"                              \
+       "       .previous"                                              \
+               : "+r"(_a)                                              \
+               : _tt(_t)                                               \
+               : "r8"                                                  \
+       )
+
+#define ldbma(_s, _a, _t, _e) def_load_ai_insn(ldbs, 1, "=r", _s, _a, _t, _e)
+#define stbma(_s, _t, _a, _e) def_store_ai_insn(stbs, 1, "r", _s, _a, _t, _e)
+#define ldwma(_s, _a, _t, _e) def_load_ai_insn(ldw, 4, "=r", _s, _a, _t, _e)
+#define stwma(_s, _t, _a, _e) def_store_ai_insn(stw, 4, "r", _s, _a, _t, _e)
+#define flddma(_s, _a, _t, _e) def_load_ai_insn(fldd, 8, "=f", _s, _a, _t, _e)
+#define fstdma(_s, _t, _a, _e) def_store_ai_insn(fstd, 8, "f", _s, _a, _t, _e)
+
+#define def_load_insn(_insn, _tt, _s, _o, _a, _t, _e)                  \
+       __asm__ __volatile__ ("\n"                                      \
+       "1:     " #_insn "              " #_o "(" _s ", %1), %0\n"      \
+       "       .section __ex_table,\"aw\"\n"                           \
+       "       " EXC_WORD "    1b\n"                                   \
+       "       " EXC_WORD "    " #_e "\n"                              \
+       "       .previous"                                              \
+               : _tt(_t)                                               \
+               : "r"(_a)                                               \
+               : "r8"                                                  \
+       )
+
+#define def_store_insn(_insn, _tt, _s, _t, _o, _a, _e)                 \
+       __asm__ __volatile__ ("\n"                                      \
+       "1:     " #_insn "              %0, " #_o "(" _s ", %1)\n"      \
+       "       .section __ex_table,\"aw\"\n"                           \
+       "       " EXC_WORD "    1b\n"                                   \
+       "       " EXC_WORD "    " #_e "\n"                              \
+       "       .previous"                                              \
+               :                                                       \
+               : _tt(_t), "r"(_a)                                      \
+               : "r8"                                                  \
+       )

-#define ldw(_s,_o,_a,_t,_e)    def_load_insn(ldw,"=r",_s,_o,_a,_t,_e)
-#define stw(_s,_t,_o,_a,_e)    def_store_insn(stw,"r",_s,_t,_o,_a,_e)
+#define ldw(_s, _o, _a, _t, _e)        def_load_insn(ldw, "=r", _s, _o, _a,
_t, _e)
+#define stw(_s, _t, _o, _a, _e)        def_store_insn(stw, "r", _s, _t, _o,
_a, _e)

 #ifdef  CONFIG_PREFETCH
 extern inline void prefetch_src(const void *addr)
 {
-       __asm__("ldw 0(" s_space ",%0), %%r0" : : "r" (addr));
+       __asm__ ("\n"
+       "       ldw             0(" s_space ", %0), %%r0"
+               :
+               : "r" (addr)
+       );
 }

 extern inline void prefetch_dst(const void *addr)
 {
-       __asm__("ldd 0(" d_space ",%0), %%r0" : : "r" (addr));
+       __asm__ ("\n"
+       "       ldd             0(" d_space ", %0), %%r0"
+               :
+               : "r" (addr)
+       );
 }
 #else
 #define prefetch_src(addr)
@@ -278,14 +294,14 @@
        return 0;

 handle_load_error:
-       __asm__ __volatile__ ("cda_ldw_exc:\n");
+       __asm__ __volatile__ ("\ncda_ldw_exc:\n");
        d = &__get_cpu_var(exception_data);
        DPRINTF("cda_ldw_exc: o_len=%lu fault_addr=%lu o_src=%lu ret=%lu\n",
                o_len, d->fault_addr, o_src, o_len - d->fault_addr + o_src);
        return o_len * 4 - d->fault_addr + o_src;

 handle_store_error:
-       __asm__ __volatile__ ("cda_stw_exc:\n");
+       __asm__ __volatile__ ("\ncda_stw_exc:\n");
        d = &__get_cpu_var(exception_data);
        DPRINTF("cda_stw_exc: o_len=%lu fault_addr=%lu o_dst=%lu ret=%lu\n",
                o_len, d->fault_addr, o_dst, o_len - d->fault_addr + o_dst);
@@ -374,7 +390,7 @@

 word_copy:
        while (len >= 8*sizeof(unsigned int)) {
-               register unsigned int r1,r2,r3,r4,r5,r6,r7,r8;
+               register unsigned int r1, r2, r3, r4, r5, r6, r7, r8;
                /* prefetch_src((char *)pws + L1_CACHE_BYTES); */
                ldwma(s_space, pws, r1, pmc_load_exc);
                ldwma(s_space, pws, r2, pmc_load_exc);
@@ -397,7 +413,7 @@
        }

        while (len >= 4*sizeof(unsigned int)) {
-               register unsigned int r1,r2,r3,r4;
+               register unsigned int r1, r2, r3, r4;
                ldwma(s_space, pws, r1, pmc_load_exc);
                ldwma(s_space, pws, r2, pmc_load_exc);
                ldwma(s_space, pws, r3, pmc_load_exc);
@@ -472,14 +488,14 @@
        goto byte_copy;

 handle_load_error:
-       __asm__ __volatile__ ("pmc_load_exc:\n");
+       __asm__ __volatile__ ("\npmc_load_exc:\n");
        d = &__get_cpu_var(exception_data);
        DPRINTF("pmc_load_exc: o_len=%lu fault_addr=%lu o_src=%lu ret=%lu\n",
                o_len, d->fault_addr, o_src, o_len - d->fault_addr + o_src);
        return o_len - d->fault_addr + o_src;

 handle_store_error:
-       __asm__ __volatile__ ("pmc_store_exc:\n");
+       __asm__ __volatile__ ("\npmc_store_exc:\n");
        d = &__get_cpu_var(exception_data);
        DPRINTF("pmc_store_exc: o_len=%lu fault_addr=%lu o_dst=%lu ret=%lu\n",
                o_len, d->fault_addr, o_dst, o_len - d->fault_addr + o_dst);
====<>====

 which seems to make the drill:
-       pmc_store_exc:
+
+pmc_store_exc:

 #NO_APP
        addil LR'per_cpu__exception_data-$global$,%r27
@@ -450,37 +451,37 @@
        ldi 0,%r1
 .L38:
 #APP
-       1:      ldw 0(%sr1,%r19), %r22
+
+1:     ldw             0(%sr1, %r19), %r22
        .section __ex_table,"aw"
        .word   1b
        .word   cda_ldw_exc
        .previous
-
-       mtsar %r29
-shrpw %r3, %r1, %sar, %r28
-
-       1:      stw %r28, 0(%sr2,%r20)
+
+       mtsar           %r29
+       shrpw           %r3, %r1,%sar, %r28
+
+1:     stw             %r28, 0(%sr2, %r20)
[...]

Not sure it was usefull but that made me attemptimg to use a same asm bloc
template.

BTW, I tried to apply the same template to some uaccess.h and figure out that
this hunk din't mentioned that "r1" was cloberred (iirc in fixup text) while
the 32bit one did:

#ifdef __LP64__
#define __put_kernel_asm(stx,x,ptr)                         \
       __asm__ __volatile__ (                              \
               "\n1:\t" stx "\t%2,0(%1)\n"                 \
               "\t.section __ex_table,\"aw\"\n"            \
               "\t.dword\t1b,fixup_put_user_skip_1\n"      \
               "\t.previous"                               \
               : "=r"(__pu_err)                            \
               : "r"(ptr), "r"(x), "0"(__pu_err))
[snip]
#else
#define __put_kernel_asm(stx,x,ptr)                         \
       __asm__ __volatile__ (                              \
               "\n1:\t" stx "\t%2,0(%1)\n"                 \
               "\t.section __ex_table,\"aw\"\n"            \
                "\t.word\t1b,fixup_put_user_skip_1\n"      \
                "\t.previous"                              \
               : "=r"(__pu_err)                            \
               : "r"(ptr), "r"(x), "0"(__pu_err)           \
               : "r1")
[snip]

mmm, doen't seems to change anything (I just check sys_parisc32.s) but may be
else where?

Thanks,
    Joel




---------------------------------------------------------------
A free anti-spam and anti-virus filter on all Scarlet mailboxes
More info on http://www.scarlet.be/

[-- Attachment #2: memcpy.c.beautify.diff --]
[-- Type: text/plain, Size: 7563 bytes --]

--- linux-2.6.17-rc1-pa1/arch/parisc/lib/memcpy.c.Orig	2006-04-10 07:24:31.000000000 +0000
+++ linux-2.6.17-rc1-pa1/arch/parisc/lib/memcpy.c	2006-04-10 15:05:38.000000000 +0000
@@ -79,20 +79,24 @@
 #define get_user_space() (segment_eq(get_fs(), KERNEL_DS) ? 0 : mfsp(3))
 #define get_kernel_space() (0)
 
-#define MERGE(w0, sh_1, w1, sh_2)  ({					\
+#define MERGE(w0, sh_1, w1, sh_2)	({				\
 	unsigned int _r;						\
-	asm volatile (							\
-	"mtsar %3\n"							\
-	"shrpw %1, %2, %%sar, %0\n"					\
-	: "=r"(_r)							\
-	: "r"(w0), "r"(w1), "r"(sh_2)					\
+	__asm__ __volatile__ ("\n"					\
+	"	mtsar		%3\n"					\
+	"	shrpw		%1, %2,%%sar, %0"			\
+		: "=r"(_r)						\
+		: "r"(w0), "r"(w1), "r"(sh_2)				\
 	);								\
 	_r;								\
 })
 #define THRESHOLD	16
 
 #ifdef DEBUG_MEMCPY
-#define DPRINTF(fmt, args...) do { printk(KERN_DEBUG "%s:%d:%s ", __FILE__, __LINE__, __FUNCTION__ ); printk(KERN_DEBUG fmt, ##args ); } while (0)
+#define DPRINTF(fmt, args...) do {					\
+	printk(KERN_DEBUG "%s:%d:%s ",					\
+		__FILE__, __LINE__, __FUNCTION__ );			\
+	printk(KERN_DEBUG fmt, ##args );				\
+} while (0)
 #else
 #define DPRINTF(fmt, args...)
 #endif
@@ -103,69 +107,81 @@
 #define EXC_WORD ".dword"
 #endif
 
-#define def_load_ai_insn(_insn,_sz,_tt,_s,_a,_t,_e)	\
-	__asm__ __volatile__ (				\
-	"1:\t" #_insn ",ma " #_sz "(" _s ",%1), %0\n" 	\
-	"\t.section __ex_table,\"aw\"\n"		\
-	"\t" EXC_WORD "\t1b\n"				\
-	"\t" EXC_WORD "\t" #_e "\n"			\
-	"\t.previous\n"					\
-	: _tt(_t), "+r"(_a)				\
-	: 						\
-	: "r8")
-
-#define def_store_ai_insn(_insn,_sz,_tt,_s,_a,_t,_e) 	\
-	__asm__ __volatile__ (				\
-	"1:\t" #_insn ",ma %1, " #_sz "(" _s ",%0)\n" 	\
-	"\t.section __ex_table,\"aw\"\n"		\
-	"\t" EXC_WORD "\t1b\n"				\
-	"\t" EXC_WORD "\t" #_e "\n"			\
-	"\t.previous\n"					\
-	: "+r"(_a) 					\
-	: _tt(_t)					\
-	: "r8")
-
-#define ldbma(_s, _a, _t, _e) def_load_ai_insn(ldbs,1,"=r",_s,_a,_t,_e)
-#define stbma(_s, _t, _a, _e) def_store_ai_insn(stbs,1,"r",_s,_a,_t,_e)
-#define ldwma(_s, _a, _t, _e) def_load_ai_insn(ldw,4,"=r",_s,_a,_t,_e)
-#define stwma(_s, _t, _a, _e) def_store_ai_insn(stw,4,"r",_s,_a,_t,_e)
-#define flddma(_s, _a, _t, _e) def_load_ai_insn(fldd,8,"=f",_s,_a,_t,_e)
-#define fstdma(_s, _t, _a, _e) def_store_ai_insn(fstd,8,"f",_s,_a,_t,_e)
-
-#define def_load_insn(_insn,_tt,_s,_o,_a,_t,_e) 	\
-	__asm__ __volatile__ (				\
-	"1:\t" #_insn " " #_o "(" _s ",%1), %0\n"	\
-	"\t.section __ex_table,\"aw\"\n"		\
-	"\t" EXC_WORD "\t1b\n"				\
-	"\t" EXC_WORD "\t" #_e "\n"			\
-	"\t.previous\n"					\
-	: _tt(_t) 					\
-	: "r"(_a)					\
-	: "r8")
-
-#define def_store_insn(_insn,_tt,_s,_t,_o,_a,_e) 	\
-	__asm__ __volatile__ (				\
-	"1:\t" #_insn " %0, " #_o "(" _s ",%1)\n" 	\
-	"\t.section __ex_table,\"aw\"\n"		\
-	"\t" EXC_WORD "\t1b\n"				\
-	"\t" EXC_WORD "\t" #_e "\n"			\
-	"\t.previous\n"					\
-	: 						\
-	: _tt(_t), "r"(_a)				\
-	: "r8")
+#define def_load_ai_insn(_insn, _sz, _tt, _s, _a, _t, _e)		\
+	__asm__ __volatile__ ("\n"					\
+	"1:	" #_insn ",ma		" #_sz "(" _s ", %1), %0\n"	\
+	"	.section __ex_table,\"aw\"\n"				\
+	"	" EXC_WORD "	1b\n"					\
+	"	" EXC_WORD "	" #_e "\n"				\
+	"	.previous"						\
+		: _tt(_t), "+r"(_a)					\
+		: 							\
+		: "r8"							\
+	)
+
+#define def_store_ai_insn(_insn, _sz, _tt, _s, _a, _t, _e)		\
+	__asm__ __volatile__ ("\n"					\
+	"1:	" #_insn ",ma		%1, " #_sz "(" _s ", %0)\n" 	\
+	"	.section __ex_table,\"aw\"\n"				\
+	"	" EXC_WORD "	1b\n"					\
+	"	" EXC_WORD "	" #_e "\n"				\
+	"	.previous"						\
+		: "+r"(_a) 						\
+		: _tt(_t)						\
+		: "r8"							\
+	)
+
+#define ldbma(_s, _a, _t, _e) def_load_ai_insn(ldbs, 1, "=r", _s, _a, _t, _e)
+#define stbma(_s, _t, _a, _e) def_store_ai_insn(stbs, 1, "r", _s, _a, _t, _e)
+#define ldwma(_s, _a, _t, _e) def_load_ai_insn(ldw, 4, "=r", _s, _a, _t, _e)
+#define stwma(_s, _t, _a, _e) def_store_ai_insn(stw, 4, "r", _s, _a, _t, _e)
+#define flddma(_s, _a, _t, _e) def_load_ai_insn(fldd, 8, "=f", _s, _a, _t, _e)
+#define fstdma(_s, _t, _a, _e) def_store_ai_insn(fstd, 8, "f", _s, _a, _t, _e)
+
+#define def_load_insn(_insn, _tt, _s, _o, _a, _t, _e) 			\
+	__asm__ __volatile__ ("\n"					\
+	"1:	" #_insn "		" #_o "(" _s ", %1), %0\n"	\
+	"	.section __ex_table,\"aw\"\n"				\
+	"	" EXC_WORD "	1b\n"					\
+	"	" EXC_WORD "	" #_e "\n"				\
+	"	.previous"						\
+		: _tt(_t) 						\
+		: "r"(_a)						\
+		: "r8"							\
+	)
+
+#define def_store_insn(_insn, _tt, _s, _t, _o, _a, _e)			\
+	__asm__ __volatile__ ("\n"					\
+	"1:	" #_insn "		%0, " #_o "(" _s ", %1)\n"	\
+	"	.section __ex_table,\"aw\"\n"				\
+	"	" EXC_WORD "	1b\n"					\
+	"	" EXC_WORD "	" #_e "\n"				\
+	"	.previous"						\
+		: 							\
+		: _tt(_t), "r"(_a)					\
+		: "r8"							\
+	)
 
-#define ldw(_s,_o,_a,_t,_e)	def_load_insn(ldw,"=r",_s,_o,_a,_t,_e)
-#define stw(_s,_t,_o,_a,_e) 	def_store_insn(stw,"r",_s,_t,_o,_a,_e)
+#define ldw(_s, _o, _a, _t, _e)	def_load_insn(ldw, "=r", _s, _o, _a, _t, _e)
+#define stw(_s, _t, _o, _a, _e)	def_store_insn(stw, "r", _s, _t, _o, _a, _e)
 
 #ifdef  CONFIG_PREFETCH
 extern inline void prefetch_src(const void *addr)
 {
-	__asm__("ldw 0(" s_space ",%0), %%r0" : : "r" (addr));
+	__asm__ ("\n"
+	"	ldw		0(" s_space ", %0), %%r0"
+		:
+		: "r" (addr)
+	);
 }
 
 extern inline void prefetch_dst(const void *addr)
 {
-	__asm__("ldd 0(" d_space ",%0), %%r0" : : "r" (addr));
+	__asm__ ("\n"
+	"	ldd		0(" d_space ", %0), %%r0"
+		:
+		: "r" (addr)
+	);
 }
 #else
 #define prefetch_src(addr)
@@ -278,14 +294,14 @@
 	return 0;
 
 handle_load_error:
-	__asm__ __volatile__ ("cda_ldw_exc:\n");
+	__asm__ __volatile__ ("\ncda_ldw_exc:\n");
 	d = &__get_cpu_var(exception_data);
 	DPRINTF("cda_ldw_exc: o_len=%lu fault_addr=%lu o_src=%lu ret=%lu\n",
 		o_len, d->fault_addr, o_src, o_len - d->fault_addr + o_src);
 	return o_len * 4 - d->fault_addr + o_src;
 
 handle_store_error:
-	__asm__ __volatile__ ("cda_stw_exc:\n");
+	__asm__ __volatile__ ("\ncda_stw_exc:\n");
 	d = &__get_cpu_var(exception_data);
 	DPRINTF("cda_stw_exc: o_len=%lu fault_addr=%lu o_dst=%lu ret=%lu\n",
 		o_len, d->fault_addr, o_dst, o_len - d->fault_addr + o_dst);
@@ -374,7 +390,7 @@
 
 word_copy:
 	while (len >= 8*sizeof(unsigned int)) {
-		register unsigned int r1,r2,r3,r4,r5,r6,r7,r8;
+		register unsigned int r1, r2, r3, r4, r5, r6, r7, r8;
 		/* prefetch_src((char *)pws + L1_CACHE_BYTES); */
 		ldwma(s_space, pws, r1, pmc_load_exc);
 		ldwma(s_space, pws, r2, pmc_load_exc);
@@ -397,7 +413,7 @@
 	}
 
 	while (len >= 4*sizeof(unsigned int)) {
-		register unsigned int r1,r2,r3,r4;
+		register unsigned int r1, r2, r3, r4;
 		ldwma(s_space, pws, r1, pmc_load_exc);
 		ldwma(s_space, pws, r2, pmc_load_exc);
 		ldwma(s_space, pws, r3, pmc_load_exc);
@@ -472,14 +488,14 @@
 	goto byte_copy;
 
 handle_load_error:
-	__asm__ __volatile__ ("pmc_load_exc:\n");
+	__asm__ __volatile__ ("\npmc_load_exc:\n");
 	d = &__get_cpu_var(exception_data);
 	DPRINTF("pmc_load_exc: o_len=%lu fault_addr=%lu o_src=%lu ret=%lu\n",
 		o_len, d->fault_addr, o_src, o_len - d->fault_addr + o_src);
 	return o_len - d->fault_addr + o_src;
 
 handle_store_error:
-	__asm__ __volatile__ ("pmc_store_exc:\n");
+	__asm__ __volatile__ ("\npmc_store_exc:\n");
 	d = &__get_cpu_var(exception_data);
 	DPRINTF("pmc_store_exc: o_len=%lu fault_addr=%lu o_dst=%lu ret=%lu\n",
 		o_len, d->fault_addr, o_dst, o_len - d->fault_addr + o_dst);

[-- Attachment #3: uaccess.h.beautify.diff --]
[-- Type: text/plain, Size: 14563 bytes --]

--- linux-2.6.17-rc1-pa1/include/asm-parisc/uaccess.h.Orig	2006-04-10 14:05:32.000000000 +0000
+++ linux-2.6.17-rc1-pa1/include/asm-parisc/uaccess.h	2006-04-10 16:28:14.000000000 +0000
@@ -76,97 +76,122 @@
 	unsigned long fault_addr;
 };
 
-#define __get_user(x,ptr)                               \
-({                                                      \
-	register long __gu_err __asm__ ("r8") = 0;      \
-	register long __gu_val __asm__ ("r9") = 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;		\
-	    default: __get_kernel_bad(); 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;		\
-	    default: __get_user_bad(); break;           \
-	    }                                           \
-	}                                               \
-							\
-	(x) = (__typeof__(*(ptr))) __gu_val;            \
-	__gu_err;                                       \
+#define __get_user(x, ptr)	({				\
+								\
+	register long __gu_err __asm__ ("r8") = 0;		\
+	register long __gu_val __asm__ ("r9") = 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;				\
+			default: __get_kernel_bad();		\
+				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;				\
+			default: __get_user_bad();		\
+				break;				\
+		}						\
+	}							\
+								\
+	(x) = (__typeof__(*(ptr))) __gu_val;			\
+	__gu_err;						\
 })
 
 #ifdef __LP64__
-#define __get_kernel_asm(ldx,ptr)                       \
-	__asm__("\n1:\t" ldx "\t0(%2),%0\n"             \
-		"\t.section __ex_table,\"aw\"\n"        \
-		"\t.dword\t1b,fixup_get_user_skip_1\n"	\
-		"\t.previous"                          	\
-		: "=r"(__gu_val), "=r"(__gu_err)        \
+#define __get_kernel_asm(ldx, ptr)			\
+	__asm__ ("\n"					\
+	"1:	" ldx "		0(%2), %0\n"		\
+	"	.section __ex_table,\"aw\"\n"		\
+	"	.dword	1b, fixup_get_user_skip_1\n"	\
+	"	.previous"				\
+		: "=r"(__gu_val), "=r"(__gu_err)	\
 		: "r"(ptr), "1"(__gu_err)		\
-		: "r1");
+		: "r1"					\
+	)
 
-#define __get_user_asm(ldx,ptr)                         \
-	__asm__("\n1:\t" ldx "\t0(%%sr3,%2),%0\n"       \
-		"\t.section __ex_table,\"aw\"\n"	\
-		"\t.dword\t1b,fixup_get_user_skip_1\n"	\
-		"\t.previous"				\
-		: "=r"(__gu_val), "=r"(__gu_err)        \
+#define __get_user_asm(ldx, ptr)			\
+	__asm__ ("\n"					\
+	"1:	" ldx "		0(%%sr3, %2), %0\n"	\
+	"	.section __ex_table,\"aw\"\n"		\
+	"	.dword	1b, fixup_get_user_skip_1\n"	\
+	"	.previous"				\
+		: "=r"(__gu_val), "=r"(__gu_err)	\
 		: "r"(ptr), "1"(__gu_err)		\
-		: "r1");
+		: "r1"					\
+	)
 #else
-#define __get_kernel_asm(ldx,ptr)                       \
-	__asm__("\n1:\t" ldx "\t0(%2),%0\n"             \
-		"\t.section __ex_table,\"aw\"\n"        \
-		"\t.word\t1b,fixup_get_user_skip_1\n"	\
-		"\t.previous"                          	\
-		: "=r"(__gu_val), "=r"(__gu_err)        \
+#define __get_kernel_asm(ldx, ptr)			\
+	__asm__ ("\n"					\
+	"1:	" ldx "		0(%2), %0\n"		\
+	"	.section __ex_table,\"aw\"\n"		\
+	"	.word	1b, fixup_get_user_skip_1\n"	\
+	"	.previous"				\
+		: "=r"(__gu_val), "=r"(__gu_err)	\
 		: "r"(ptr), "1"(__gu_err)		\
-		: "r1");
+		: "r1"					\
+	)
 
-#define __get_user_asm(ldx,ptr)                         \
-	__asm__("\n1:\t" ldx "\t0(%%sr3,%2),%0\n"       \
-		"\t.section __ex_table,\"aw\"\n"	\
-		 "\t.word\t1b,fixup_get_user_skip_1\n"	\
-		 "\t.previous"                          \
-		: "=r"(__gu_val), "=r"(__gu_err)        \
+#define __get_user_asm(ldx, ptr)			\
+	__asm__ ("\n"					\
+	"1:	" ldx "		0(%%sr3, %2), %0\n"	\
+	"	.section __ex_table,\"aw\"\n"		\
+	"	.word	1b, fixup_get_user_skip_1\n"	\
+	"	.previous"				\
+		: "=r"(__gu_val), "=r"(__gu_err)	\
 		: "r"(ptr), "1"(__gu_err)		\
-		: "r1");
+		: "r1"					\
+	)
 #endif /* !__LP64__ */
 
-#define __put_user(x,ptr)                                       \
-({								\
-	register long __pu_err __asm__ ("r8") = 0;      	\
-        __typeof__(*(ptr)) __x = (__typeof__(*(ptr)))(x);	\
-								\
-	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;			\
-	    default: __put_kernel_bad(); break;			\
-	    }                                                   \
-	}                                                       \
-	else {                                                  \
-	    switch (sizeof(*(ptr))) {                           \
-	    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;			\
-	    default: __put_user_bad(); break;			\
-	    }                                                   \
-	}                                                       \
-								\
-	__pu_err;						\
+#define __put_user(x, ptr)	({					\
+									\
+	register long __pu_err __asm__ ("r8") = 0;			\
+        __typeof__(*(ptr)) __x = (__typeof__(*(ptr)))(x);		\
+									\
+	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;					\
+			default: __put_kernel_bad();			\
+				break;					\
+		}							\
+	} else {							\
+		switch (sizeof(*(ptr))) {				\
+			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;					\
+			default: __put_user_bad();			\
+				break;					\
+		}							\
+	}								\
+	__pu_err;							\
 })
 
 /*
@@ -176,75 +201,82 @@
  */
 
 #ifdef __LP64__
-#define __put_kernel_asm(stx,x,ptr)                         \
-	__asm__ __volatile__ (                              \
-		"\n1:\t" stx "\t%2,0(%1)\n"                 \
-		"\t.section __ex_table,\"aw\"\n"            \
-		"\t.dword\t1b,fixup_put_user_skip_1\n"	    \
-		"\t.previous"                               \
-		: "=r"(__pu_err)                            \
-		: "r"(ptr), "r"(x), "0"(__pu_err))
-
-#define __put_user_asm(stx,x,ptr)                           \
-	__asm__ __volatile__ (                              \
-		"\n1:\t" stx "\t%2,0(%%sr3,%1)\n"           \
-		"\t.section __ex_table,\"aw\"\n"            \
-		 "\t.dword\t1b,fixup_put_user_skip_1\n"	    \
-		 "\t.previous"                              \
-		: "=r"(__pu_err)                            \
-		: "r"(ptr), "r"(x), "0"(__pu_err)	    \
-		: "r1")
+#define __put_kernel_asm(stx, x, ptr)			\
+	__asm__ __volatile__ ("\n"			\
+	"1:	" stx "		%2, 0(%1)\n"		\
+	"	.section __ex_table,\"aw\"\n"		\
+	"	.dword	1b, fixup_put_user_skip_1\n"	\
+	"	.previous"				\
+		: "=r"(__pu_err)			\
+		: "r"(ptr), "r"(x), "0"(__pu_err)	\
+		: "r1"					\
+	)
+
+#define __put_user_asm(stx, x, ptr)			\
+	__asm__ __volatile__ ("\n"			\
+	"1:	" stx "		%2, 0(%%sr3, %1)\n"	\
+	"	.section __ex_table,\"aw\"\n"		\
+	"	.dword	1b, fixup_put_user_skip_1\n"    \
+	"	.previous"				\
+		: "=r"(__pu_err)			\
+		: "r"(ptr), "r"(x), "0"(__pu_err)	\
+		: "r1"					\
+	)
 #else
-#define __put_kernel_asm(stx,x,ptr)                         \
-	__asm__ __volatile__ (                              \
-		"\n1:\t" stx "\t%2,0(%1)\n"                 \
-		"\t.section __ex_table,\"aw\"\n"            \
-		 "\t.word\t1b,fixup_put_user_skip_1\n"	    \
-		 "\t.previous"                              \
-		: "=r"(__pu_err)                            \
-		: "r"(ptr), "r"(x), "0"(__pu_err)	    \
-		: "r1")
-
-#define __put_user_asm(stx,x,ptr)                           \
-	__asm__ __volatile__ (                              \
-		"\n1:\t" stx "\t%2,0(%%sr3,%1)\n"           \
-		"\t.section __ex_table,\"aw\"\n"            \
-		 "\t.word\t1b,fixup_put_user_skip_1\n"      \
-		 "\t.previous"                              \
-		: "=r"(__pu_err)                            \
-		: "r"(ptr), "r"(x), "0"(__pu_err)	    \
-		: "r1")
-
-#define __put_kernel_asm64(__val,ptr) do {		    	    \
-	u64 __val64 = (u64)(__val);				    \
-	u32 hi = (__val64) >> 32;					    \
-	u32 lo = (__val64) & 0xffffffff;				    \
-	__asm__ __volatile__ (				    \
-		"\n1:\tstw %2,0(%1)\n"			    \
-		"\n2:\tstw %3,4(%1)\n"			    \
-		"\t.section __ex_table,\"aw\"\n"	    \
-		 "\t.word\t1b,fixup_put_user_skip_2\n"	    \
-		 "\t.word\t2b,fixup_put_user_skip_1\n"	    \
-		 "\t.previous"				    \
-		: "=r"(__pu_err)                            \
-		: "r"(ptr), "r"(hi), "r"(lo), "0"(__pu_err) \
-		: "r1");				    \
+#define __put_kernel_asm(stx, x, ptr)			\
+	__asm__ __volatile__ ("\n"			\
+	"1:	" stx "		%2, 0(%1)\n"		\
+	"	.section __ex_table,\"aw\"\n"		\
+	"	.word	1b, fixup_put_user_skip_1\n"	\
+	"	.previous"				\
+		: "=r"(__pu_err)			\
+		: "r"(ptr), "r"(x), "0"(__pu_err)	\
+		: "r1"					\
+	)
+
+#define __put_user_asm(stx, x, ptr)			\
+	__asm__ __volatile__ ("\n"			\
+	"1:	" stx "		%2, 0(%%sr3, %1)\n"	\
+	"	.section __ex_table,\"aw\"\n"		\
+	"	.word	1b, fixup_put_user_skip_1\n"	\
+	"	.previous"				\
+		: "=r"(__pu_err)			\
+		: "r"(ptr), "r"(x), "0"(__pu_err)	\
+		: "r1"					\
+	)
+
+#define __put_kernel_asm64(__val, ptr) do {			\
+	u64 __val64 = (u64)(__val);				\
+	u32 hi = (__val64) >> 32;				\
+	u32 lo = (__val64) & 0xffffffff;			\
+	__asm__ __volatile__ ("\n"				\
+	"1:	stw		%2, 0(%1)\n"			\
+	"2:	stw		%3, 4(%1)\n"			\
+	"	.section __ex_table,\"aw\"\n"			\
+	"	.word	1b, fixup_put_user_skip_2\n"		\
+	"	.word	2b, fixup_put_user_skip_1\n"		\
+	"	.previous"					\
+		: "=r"(__pu_err)				\
+		: "r"(ptr), "r"(hi), "r"(lo), "0"(__pu_err)	\
+		: "r1"						\
+	);							\
 } while (0)
 
-#define __put_user_asm64(__val,ptr) do {		    	    \
-	u64 __val64 = (u64)__val;				    \
-	u32 hi = (__val64) >> 32;					    \
-	u32 lo = (__val64) & 0xffffffff;				    \
-	__asm__ __volatile__ (				    \
-		"\n1:\tstw %2,0(%%sr3,%1)\n"		    \
-		"\n2:\tstw %3,4(%%sr3,%1)\n"		    \
-		"\t.section __ex_table,\"aw\"\n"	    \
-		 "\t.word\t1b,fixup_get_user_skip_2\n"	    \
-		 "\t.word\t2b,fixup_get_user_skip_1\n"	    \
-		 "\t.previous"				    \
-		: "=r"(__pu_err)                            \
-		: "r"(ptr), "r"(hi), "r"(lo), "0"(__pu_err) \
-		: "r1");				    \
+#define __put_user_asm64(__val, ptr) do {			\
+	u64 __val64 = (u64)__val;				\
+	u32 hi = (__val64) >> 32;				\
+	u32 lo = (__val64) & 0xffffffff;			\
+	__asm__ __volatile__ ("\n"				\
+	"1:	stw		%2, 0(%%sr3, %1)\n"		\
+	"2:	stw		%3, 4(%%sr3, %1)\n"		\
+	"	.section __ex_table,\"aw\"\n"			\
+	"	.word	1b, fixup_get_user_skip_2\n"		\
+	"	.word	2b, fixup_get_user_skip_1\n"		\
+	"	.previous"					\
+		: "=r"(__pu_err)				\
+		: "r"(ptr), "r"(hi), "r"(lo), "0"(__pu_err)	\
+		: "r1"						\
+	);							\
 } while (0)
 
 #endif /* !__LP64__ */
@@ -256,7 +288,8 @@
 
 extern unsigned long lcopy_to_user(void __user *, const void *, unsigned long);
 extern unsigned long lcopy_from_user(void *, const void __user *, unsigned long);
-extern unsigned long lcopy_in_user(void __user *, const void __user *, unsigned long);
+extern unsigned long lcopy_in_user(void __user *, const void __user *,
+					unsigned long);
 extern long lstrncpy_from_user(char *, const char __user *, long);
 extern unsigned lclear_user(void __user *,unsigned long);
 extern long lstrnlen_user(const char __user *,long);
@@ -265,19 +298,24 @@
  * Complex access routines -- macros
  */
 
-#define strncpy_from_user lstrncpy_from_user
-#define strnlen_user lstrnlen_user
-#define strlen_user(str) lstrnlen_user(str, 0x7fffffffL)
-#define clear_user lclear_user
-#define __clear_user lclear_user
-
-unsigned long copy_to_user(void __user *dst, const void *src, unsigned long len);
-#define __copy_to_user copy_to_user
-unsigned long copy_from_user(void *dst, const void __user *src, unsigned long len);
-#define __copy_from_user copy_from_user
-unsigned long copy_in_user(void __user *dst, const void __user *src, unsigned long len);
-#define __copy_in_user copy_in_user
-#define __copy_to_user_inatomic __copy_to_user
-#define __copy_from_user_inatomic __copy_from_user
+#define strncpy_from_user	lstrncpy_from_user
+#define strnlen_user		lstrnlen_user
+#define strlen_user(str)	lstrnlen_user(str, 0x7fffffffL)
+#define clear_user		lclear_user
+#define __clear_user		lclear_user
+
+unsigned long copy_to_user(void __user *dst, const void *src,
+				unsigned long len);
+#define __copy_to_user	copy_to_user
+
+unsigned long copy_from_user(void *dst, const void __user *src,
+				unsigned long len);
+#define __copy_from_user 	copy_from_user
+
+unsigned long copy_in_user(void __user *dst, const void __user *src,
+				unsigned long len);
+#define __copy_in_user			copy_in_user
+#define __copy_to_user_inatomic		__copy_to_user
+#define __copy_from_user_inatomic	__copy_from_user
 
 #endif /* __PARISC_UACCESS_H */

[-- Attachment #4: Type: text/plain, Size: 169 bytes --]

_______________________________________________
parisc-linux mailing list
parisc-linux@lists.parisc-linux.org
http://lists.parisc-linux.org/mailman/listinfo/parisc-linux

^ permalink raw reply	[flat|nested] 7+ messages in thread
[parent not found: <IY13E1$80C55BA8C044E2D421CA2D8B24C31D6A@scarlet.be>]
* Re: [parisc-linux] Does it lakes some cloberred r1 in __put_kernel_asm() 64bit?
@ 2006-04-21  9:13 Joel Soete
  0 siblings, 0 replies; 7+ messages in thread
From: Joel Soete @ 2006-04-21  9:13 UTC (permalink / raw)
  To: carlos; +Cc: parisc-linux

[-- Attachment #1: Type: text/plain, Size: 1617 bytes --]

> On 4/20/06, Joel Soete <soete.joel@tiscali.be> wrote:
> > Please help me I hate this game:
> >   - tel me why?
> >   - no tel me why not?
> >   - ...
>
> This is all part of learning. We want to teach you to do some of the
> research yourself before emailing to the list. When you send email you
> should have some research done which contributes to the solution of
> the problem. For example the research you have done below is exactly
> what I would have expected from a serious hacker. This is an excellent
> amount of research! Good work Joel.
>
Ok next time I will do so

> > > a) What does a clobber mean from the viewpoint of an __asm?
> >
> > Sorry, I was the first to put this question:
> > "btw I had another question: what's the meaning of 'clobber' in the sens of
> > asm extension of gcc?
>
> *I* know the answer. The question is intended for you to learn how to research.
> Google is a horrible research tool. I recommend going to the source. GCC has
> great manuals.
>
> a) Go to "http://gcc.gnu.org/"
> b) Click on "Manual"
> c) Click on "GCC 4.1.0 Manual"
> d) Read sections 5.34 and 5.35 describing the behaviour of asm's.
>
> Please read the manuals if you don't know the answer. It keeps others from
> being frustrated. The manuals were written for a reason.
>
installing gcc-4.0-doc dpkg is also a way to access to info files ;-)

According to your next mail:
<http://lists.parisc-linux.org/pipermail/parisc-linux/2006-April/028827.html>

Here attched is the patch proposal (just includes some few white space
cleanup) ;-)

Thanks a lot all,
    Joel

[-- Attachment #2: FixupUpdate.diff --]
[-- Type: text/plain, Size: 8869 bytes --]

--- ./include/asm-parisc/uaccess.h.Orig	2005-09-14 14:57:40.000000000 +0200
+++ ./include/asm-parisc/uaccess.h	2006-04-21 10:32:54.000000000 +0200
@@ -49,20 +49,20 @@
 #define STD_KERNEL(x, ptr)	__put_kernel_asm64(x,ptr)
 #define STD_USER(x, ptr)	__put_user_asm64(x,ptr)
 #else
-#define LDD_KERNEL(ptr) __get_kernel_asm("ldd",ptr)
-#define LDD_USER(ptr) __get_user_asm("ldd",ptr)
-#define STD_KERNEL(x, ptr) __put_kernel_asm("std",x,ptr)
-#define STD_USER(x, ptr) __put_user_asm("std",x,ptr)
+#define LDD_KERNEL(ptr)		__get_kernel_asm("ldd",ptr)
+#define LDD_USER(ptr)		__get_user_asm("ldd",ptr)
+#define STD_KERNEL(x, ptr)	__put_kernel_asm("std",x,ptr)
+#define STD_USER(x, ptr)	__put_user_asm("std",x,ptr)
 #endif
 
 /*
  * The exception table contains two values: the first is an address
  * for an instruction that is allowed to fault, and the second is
- * the address to the fixup routine. 
+ * the address to the fixup routine.
  */
 
 struct exception_table_entry {
-	unsigned long insn;  /* address of insn that is allowed to fault.   */
+	unsigned long insn;  /* address of insn that is allowed to fault. */
 	long fixup;          /* fixup routine */
 };
 
@@ -76,6 +76,58 @@
 	unsigned long fault_addr;
 };
 
+/*
+  Refering to Carlos' mail:
+  <http://lists.parisc-linux.org/pipermail/parisc-linux/2006-April/028827.html>
+
+  Routines used reside in:
+  ~~~~~~~~~~~~~~~~~
+  kernel/entry.S
+  kernel/traps.c
+  mm/fault.c
+
+  Exception Stages:
+  ~~~~~~~~~~~~~~
+  Exception happens.
+  Trap handler executes.
+  We don't handle the exception in assembly(?)
+  Shadow registers are not enough to execute C code.
+  All registers saved.
+  Load or Store has an exception table entry "fixup" in the kernel.
+  iaoq[0] and iaoq[1] are set to the address of the fixup.
+  PSW has the B-bit zeroed.
+  When the interrupt returns you execute the fixup function.
+
+  A: The process of interruption does not clobber any registers.
+  Corollory: The process of fixup uses r8/r9 as outputs, with r1 clobbered.
+
+  A: The fixups run in the original context of the failed load/store.
+
+  Generic Fixup Functions
+  ~~~~~~~~~~~~~~~~~~
+  There are 4 generic fixup functions:
+  The first 2 correspond to failed loads.
+  The second 2 correspond to failed stores.
+  There is also a FIXUP_BRANCH in the emulation routines.
+
+  arch/parisc/lib/fixup.S
+  fixup_get_user_skip_1  (Skip 1 word, used in 32-bit mode)
+  fixup_get_user_skip_2  (Skip 2 words, used in 64-bit mode)
+  fixup_put_user_skip_1  ( " )
+  fixup_put_user_skip_2  ( " )
+
+  The macro "get_fault_ip" is used by each of the 4 generic
+  fixups and clobbers both inputs and r1.
+
+  The registers used for each of the following functions:
+  r8 - Stores return value / Used as temp in "get_fault_ip1" clobbered.
+
+  Caveats:
+  - The fixup routines read the exception tables but don't list that
+    memory as an input. Hence mixing put and get user/kernel
+    calls and modifications to the exception tables is dangerous?
+ */
+
 #define __get_user(x,ptr)                               \
 ({                                                      \
 	register long __gu_err __asm__ ("r8") = 0;      \
@@ -183,7 +235,8 @@
 		"\t.dword\t1b,fixup_put_user_skip_1\n"	    \
 		"\t.previous"                               \
 		: "=r"(__pu_err)                            \
-		: "r"(ptr), "r"(x), "0"(__pu_err))
+		: "r"(ptr), "r"(x), "0"(__pu_err)	    \
+		: "r1")
 
 #define __put_user_asm(stx,x,ptr)                           \
 	__asm__ __volatile__ (                              \
@@ -215,10 +268,10 @@
 		: "r"(ptr), "r"(x), "0"(__pu_err)	    \
 		: "r1")
 
-#define __put_kernel_asm64(__val,ptr) do {		    	    \
-	u64 __val64 = (u64)(__val);				    \
-	u32 hi = (__val64) >> 32;					    \
-	u32 lo = (__val64) & 0xffffffff;				    \
+#define __put_kernel_asm64(__val,ptr) do {		    \
+	u64 __val64 = (u64)(__val);			    \
+	u32 hi = (__val64) >> 32;			    \
+	u32 lo = (__val64) & 0xffffffff;		    \
 	__asm__ __volatile__ (				    \
 		"\n1:\tstw %2,0(%1)\n"			    \
 		"\n2:\tstw %3,4(%1)\n"			    \
@@ -231,10 +284,10 @@
 		: "r1");				    \
 } while (0)
 
-#define __put_user_asm64(__val,ptr) do {		    	    \
-	u64 __val64 = (u64)__val;				    \
-	u32 hi = (__val64) >> 32;					    \
-	u32 lo = (__val64) & 0xffffffff;				    \
+#define __put_user_asm64(__val,ptr) do {		    \
+	u64 __val64 = (u64)__val;			    \
+	u32 hi = (__val64) >> 32;			    \
+	u32 lo = (__val64) & 0xffffffff;		    \
 	__asm__ __volatile__ (				    \
 		"\n1:\tstw %2,0(%%sr3,%1)\n"		    \
 		"\n2:\tstw %3,4(%%sr3,%1)\n"		    \
--- ./arch/parisc/kernel/unaligned.c.Orig	2006-04-21 10:36:23.000000000 +0200
+++ ./arch/parisc/kernel/unaligned.c	2006-04-21 10:45:18.000000000 +0200
@@ -39,13 +39,15 @@
 #define RFMT "%08lx"
 #endif
 
-#define FIXUP_BRANCH(lbl) \
+/* see <include/asm-parisc/uaccess.h> Carlos' mail reference */
+
+#define FIXUP_BRANCH(lbl)				\
 	"\tldil L%%" #lbl ", %%r1\n"			\
 	"\tldo R%%" #lbl "(%%r1), %%r1\n"		\
 	"\tbv,n %%r0(%%r1)\n"
 
 /* 1111 1100 0000 0000 0001 0011 1100 0000 */
-#define OPCODE1(a,b,c)	((a)<<26|(b)<<12|(c)<<6) 
+#define OPCODE1(a,b,c)	((a)<<26|(b)<<12|(c)<<6)
 #define OPCODE2(a,b)	((a)<<26|(b)<<1)
 #define OPCODE3(a,b)	((a)<<26|(b)<<2)
 #define OPCODE4(a)	((a)<<26)
@@ -132,7 +134,7 @@
 	unsigned long val = 0;
 	int ret;
 
-	DPRINTF("load " RFMT ":" RFMT " to r%d for 2 bytes\n", 
+	DPRINTF("load " RFMT ":" RFMT " to r%d for 2 bytes\n",
 		regs->isr, regs->ior, toreg);
 
 	__asm__ __volatile__  (
@@ -157,7 +159,7 @@
 "	.previous\n"
 	: "=r" (val), "=r" (ret)
 	: "0" (val), "r" (saddr), "r" (regs->isr)
-	: "r20" );
+	: "r1", "r20" );
 
 	DPRINTF("val = 0x" RFMT "\n", val);
 
@@ -173,7 +175,7 @@
 	unsigned long val = 0;
 	int ret;
 
-	DPRINTF("load " RFMT ":" RFMT " to r%d for 4 bytes\n", 
+	DPRINTF("load " RFMT ":" RFMT " to r%d for 4 bytes\n",
 		regs->isr, regs->ior, toreg);
 
 	__asm__ __volatile__  (
@@ -202,7 +204,7 @@
 "	.previous\n"
 	: "=r" (val), "=r" (ret)
 	: "0" (val), "r" (saddr), "r" (regs->isr)
-	: "r19", "r20" );
+	: "r1", "r19", "r20" );
 
 	DPRINTF("val = 0x" RFMT "\n", val);
 
@@ -219,7 +221,7 @@
 	__u64 val = 0;
 	int ret;
 
-	DPRINTF("load " RFMT ":" RFMT " to r%d for 8 bytes\n", 
+	DPRINTF("load " RFMT ":" RFMT " to r%d for 8 bytes\n",
 		regs->isr, regs->ior, toreg);
 #ifdef CONFIG_PA20
 
@@ -253,7 +255,7 @@
 "	.previous\n"
 	: "=r" (val), "=r" (ret)
 	: "0" (val), "r" (saddr), "r" (regs->isr)
-	: "r19", "r20" );
+	: "r1", "r19", "r20" );
 #else
     {
 	unsigned long valh=0,vall=0;
@@ -287,7 +289,7 @@
 "	.previous\n"
 	: "=r" (valh), "=r" (vall), "=r" (ret)
 	: "0" (valh), "1" (vall), "r" (saddr), "r" (regs->isr)
-	: "r19", "r20" );
+	: "r1", "r19", "r20" );
 	val=((__u64)valh<<32)|(__u64)vall;
     }
 #endif
@@ -310,7 +312,7 @@
 	if (!frreg)
 		val = 0;
 
-	DPRINTF("store r%d (0x" RFMT ") to " RFMT ":" RFMT " for 2 bytes\n", frreg, 
+	DPRINTF("store r%d (0x" RFMT ") to " RFMT ":" RFMT " for 2 bytes\n", frreg,
 		val, regs->isr, regs->ior);
 
 	__asm__ __volatile__ (
@@ -335,7 +337,7 @@
 "	.previous\n"
 	: "=r" (ret)
 	: "r" (val), "r" (regs->ior), "r" (regs->isr)
-	: "r19" );
+	: "r1", "r19" );
 
 	return ret;
 }
@@ -352,7 +354,7 @@
 	else
 		val = 0;
 
-	DPRINTF("store r%d (0x" RFMT ") to " RFMT ":" RFMT " for 4 bytes\n", frreg, 
+	DPRINTF("store r%d (0x" RFMT ") to " RFMT ":" RFMT " for 4 bytes\n", frreg,
 		val, regs->isr, regs->ior);
 
 
@@ -389,7 +391,7 @@
 "	.previous\n"
 	: "=r" (ret)
 	: "r" (val), "r" (regs->ior), "r" (regs->isr)
-	: "r19", "r20", "r21", "r22", "r1" );
+	: "r1", "r19", "r20", "r21", "r22" );
 
 	return 0;
 }
@@ -405,7 +407,7 @@
 	else
 		val = 0;
 
-	DPRINTF("store r%d (0x%016llx) to " RFMT ":" RFMT " for 8 bytes\n", frreg, 
+	DPRINTF("store r%d (0x%016llx) to " RFMT ":" RFMT " for 8 bytes\n", frreg,
 		val,  regs->isr, regs->ior);
 
 #ifdef CONFIG_PA20
@@ -450,7 +452,7 @@
 "	.previous\n"
 	: "=r" (ret)
 	: "r" (val), "r" (regs->ior), "r" (regs->isr)
-	: "r19", "r20", "r21", "r22", "r1" );
+	: "r1", "r19", "r20", "r21", "r22" );
 #else
     {
 	unsigned long valh=(val>>32),vall=(val&0xffffffffl);
@@ -495,7 +497,7 @@
 "	.previous\n"
 	: "=r" (ret)
 	: "r" (valh), "r" (vall), "r" (regs->ior), "r" (regs->isr)
-	: "r19", "r20", "r21", "r1" );
+	: "r1", "r19", "r20", "r21" );
     }
 #endif
 
@@ -523,7 +525,7 @@
 			last_time = jiffies;
 		}
 
-		if (!(current->thread.flags & PARISC_UAC_NOPRINT) 
+		if (!(current->thread.flags & PARISC_UAC_NOPRINT)
 		    && ++unaligned_count < 5) {
 			char buf[256];
 			sprintf(buf, "%s(%d): unaligned access to 0x" RFMT " at ip=0x" RFMT "\n",

[-- Attachment #3: Type: text/plain, Size: 169 bytes --]

_______________________________________________
parisc-linux mailing list
parisc-linux@lists.parisc-linux.org
http://lists.parisc-linux.org/mailman/listinfo/parisc-linux

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2006-04-21  9:13 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-04-11  9:37 [parisc-linux] some whitespace rework and attempt to beautify inline asm stuff? Joel Soete
2006-04-16 20:14 ` [parisc-linux] Does it lakes some cloberred r1 in __put_kernel_asm() 64bit? Joel Soete
2006-04-18 20:35   ` Carlos O'Donell
2006-04-18 22:35     ` Michael S. Zick
2006-04-16 20:37 ` [parisc-linux] more whitespace rework and attempt to beautify inline asm stuff? Joel Soete
     [not found] <IY13E1$80C55BA8C044E2D421CA2D8B24C31D6A@scarlet.be>
2006-04-20 17:09 ` [parisc-linux] Does it lakes some cloberred r1 in __put_kernel_asm() 64bit? Carlos O'Donell
  -- strict thread matches above, loose matches on Subject: below --
2006-04-21  9:13 Joel Soete

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox