[PATCH RFC 4/4] arch/sparc: Add accurate exception reporting in M7memcpy

2017-07-27 Thread Babu Moger
Add accurate exception reporting in M7memcpy

Signed-off-by: Babu Moger 
---
 arch/sparc/lib/M7copy_from_user.S |   11 +-
 arch/sparc/lib/M7copy_to_user.S   |   10 +-
 arch/sparc/lib/M7memcpy.S |  396 ++--
 arch/sparc/lib/Memcpy_utils.S |  182 +
 4 files changed, 390 insertions(+), 209 deletions(-)

diff --git a/arch/sparc/lib/M7copy_from_user.S 
b/arch/sparc/lib/M7copy_from_user.S
index d0689d7..66464b3 100644
--- a/arch/sparc/lib/M7copy_from_user.S
+++ b/arch/sparc/lib/M7copy_from_user.S
@@ -5,23 +5,22 @@
  */
 
 
-#define EX_LD(x)   \
+#define EX_LD(x, y)\
 98:x;  \
.section __ex_table,"a";\
.align 4;   \
-   .word 98b, __restore_asi;   \
+   .word 98b, y;   \
.text;  \
.align 4;
 
-#define EX_LD_FP(x)\
+#define EX_LD_FP(x, y) \
 98:x;  \
.section __ex_table,"a";\
.align 4;   \
-   .word 98b, __restore_asi_fp;\
+   .word 98b, y##_fp;  \
.text;  \
.align 4;
 
-
 #ifndef ASI_AIUS
 #define ASI_AIUS   0x11
 #endif
@@ -35,7 +34,7 @@
rd  %asi, %g1;  \
cmp %g1, ASI_AIUS;  \
bne,pn  %icc, raw_copy_in_user; \
-   nop
+nop
 #endif
 
 #include "M7memcpy.S"
diff --git a/arch/sparc/lib/M7copy_to_user.S b/arch/sparc/lib/M7copy_to_user.S
index d3be132..a60ac46 100644
--- a/arch/sparc/lib/M7copy_to_user.S
+++ b/arch/sparc/lib/M7copy_to_user.S
@@ -5,19 +5,19 @@
  */
 
 
-#define EX_ST(x)   \
+#define EX_ST(x, y)\
 98:x;  \
.section __ex_table,"a";\
.align 4;   \
-   .word 98b, __restore_asi;   \
+   .word 98b, y;   \
.text;  \
.align 4;
 
-#define EX_ST_FP(x)\
+#define EX_ST_FP(x, y) \
 98:x;  \
.section __ex_table,"a";\
.align 4;   \
-   .word 98b, __restore_asi_fp;\
+   .word 98b, y##_fp;  \
.text;  \
.align 4;
 
@@ -45,7 +45,7 @@
rd  %asi, %g1;  \
cmp %g1, ASI_AIUS;  \
bne,pn  %icc, raw_copy_in_user; \
-   nop
+nop
 #endif
 
 #include "M7memcpy.S"
diff --git a/arch/sparc/lib/M7memcpy.S b/arch/sparc/lib/M7memcpy.S
index d49f702..5cb3dae 100644
--- a/arch/sparc/lib/M7memcpy.S
+++ b/arch/sparc/lib/M7memcpy.S
@@ -96,17 +96,17 @@
 #endif
 
 #ifndef EX_LD
-#define EX_LD(x)   x
+#define EX_LD(x,y) x
 #endif
 #ifndef EX_LD_FP
-#define EX_LD_FP(x)x
+#define EX_LD_FP(x,y)  x
 #endif
 
 #ifndef EX_ST
-#define EX_ST(x)   x
+#define EX_ST(x,y) x
 #endif
 #ifndef EX_ST_FP
-#define EX_ST_FP(x)x
+#define EX_ST_FP(x,y)  x
 #endif
 
 #ifndef EX_RETVAL
@@ -207,9 +207,9 @@ FUNC_NAME:
sub %o1, %o0, %o1   ! %o1 gets the difference
 7: ! dst aligning loop
add %o1, %o0, %o4
-   EX_LD(LOAD(ldub, %o4, %o4)) ! load one byte
+   EX_LD(LOAD(ldub, %o4, %o4), memcpy_retl_o2_plus_o5) ! load one byte
subcc   %o5, 1, %o5
-   EX_ST(STORE(stb, %o4, %o0))
+   EX_ST(STORE(stb, %o4, %o0), memcpy_retl_o2_plus_o5_plus_1)
bgu,pt  %ncc, 7b
 add%o0, 1, %o0 ! advance dst
add %o1, %o0, %o1   ! restore %o1
@@ -234,64 +234,64 @@ FUNC_NAME:
ble,pn  %ncc, .Lmedl63  ! skip big loop if less than 64 bytes
 nop
 .Lmedl64:
-   EX_LD(LOAD(ldx, %o1, %o4))  ! load
+   EX_LD(LOAD(ldx, %o1, %o4), memcpy_retl_o2_plus_63)  ! load
subcc   %o2, 64, %o2! decrement length count
-   EX_ST(STORE(stx, %o4, %o0)) ! and store
-   EX_LD(LOAD(ldx, %o1+8, %o3))! a block of 64 bytes
-   EX_ST(STORE(stx, %o3, %o0+8))
-   EX_LD(LOAD(ldx, %o1+16, %o4))
-   EX_ST(STORE(stx, %o4, %o0+16))
-   EX_LD(LOAD(ldx, %o1+24, %o3))
-   EX_ST(STORE(stx, %o3, %o0+24))
-   EX_LD(LOAD(ldx, %o1+32, %o4))   ! load
-   EX_ST(STORE(stx, %o4, %o0+32))  ! and store
-   EX_LD(LOAD(ldx, %o1+40, %o3))   ! a block of 64 bytes
+   EX_ST(STORE(stx, %o4, %o0), memcpy_retl_o2_plus_63_64)  ! and store
+   EX_LD(LOAD(ldx, %o1+8, %o3), memcpy_retl_o2_plus_63_56) ! a block of 64
+   EX_ST(STORE(stx, %o3, %o0+8), memcpy_retl_o2_plus_63_56)
+   EX_LD(LOAD(ldx, %o1+16, %o4), memcpy_retl_o2_plus_63_48)
+   

[PATCH RFC 4/4] arch/sparc: Add accurate exception reporting in M7memcpy

2017-07-27 Thread Babu Moger
Add accurate exception reporting in M7memcpy

Signed-off-by: Babu Moger 
---
 arch/sparc/lib/M7copy_from_user.S |   11 +-
 arch/sparc/lib/M7copy_to_user.S   |   10 +-
 arch/sparc/lib/M7memcpy.S |  396 ++--
 arch/sparc/lib/Memcpy_utils.S |  182 +
 4 files changed, 390 insertions(+), 209 deletions(-)

diff --git a/arch/sparc/lib/M7copy_from_user.S 
b/arch/sparc/lib/M7copy_from_user.S
index d0689d7..66464b3 100644
--- a/arch/sparc/lib/M7copy_from_user.S
+++ b/arch/sparc/lib/M7copy_from_user.S
@@ -5,23 +5,22 @@
  */
 
 
-#define EX_LD(x)   \
+#define EX_LD(x, y)\
 98:x;  \
.section __ex_table,"a";\
.align 4;   \
-   .word 98b, __restore_asi;   \
+   .word 98b, y;   \
.text;  \
.align 4;
 
-#define EX_LD_FP(x)\
+#define EX_LD_FP(x, y) \
 98:x;  \
.section __ex_table,"a";\
.align 4;   \
-   .word 98b, __restore_asi_fp;\
+   .word 98b, y##_fp;  \
.text;  \
.align 4;
 
-
 #ifndef ASI_AIUS
 #define ASI_AIUS   0x11
 #endif
@@ -35,7 +34,7 @@
rd  %asi, %g1;  \
cmp %g1, ASI_AIUS;  \
bne,pn  %icc, raw_copy_in_user; \
-   nop
+nop
 #endif
 
 #include "M7memcpy.S"
diff --git a/arch/sparc/lib/M7copy_to_user.S b/arch/sparc/lib/M7copy_to_user.S
index d3be132..a60ac46 100644
--- a/arch/sparc/lib/M7copy_to_user.S
+++ b/arch/sparc/lib/M7copy_to_user.S
@@ -5,19 +5,19 @@
  */
 
 
-#define EX_ST(x)   \
+#define EX_ST(x, y)\
 98:x;  \
.section __ex_table,"a";\
.align 4;   \
-   .word 98b, __restore_asi;   \
+   .word 98b, y;   \
.text;  \
.align 4;
 
-#define EX_ST_FP(x)\
+#define EX_ST_FP(x, y) \
 98:x;  \
.section __ex_table,"a";\
.align 4;   \
-   .word 98b, __restore_asi_fp;\
+   .word 98b, y##_fp;  \
.text;  \
.align 4;
 
@@ -45,7 +45,7 @@
rd  %asi, %g1;  \
cmp %g1, ASI_AIUS;  \
bne,pn  %icc, raw_copy_in_user; \
-   nop
+nop
 #endif
 
 #include "M7memcpy.S"
diff --git a/arch/sparc/lib/M7memcpy.S b/arch/sparc/lib/M7memcpy.S
index d49f702..5cb3dae 100644
--- a/arch/sparc/lib/M7memcpy.S
+++ b/arch/sparc/lib/M7memcpy.S
@@ -96,17 +96,17 @@
 #endif
 
 #ifndef EX_LD
-#define EX_LD(x)   x
+#define EX_LD(x,y) x
 #endif
 #ifndef EX_LD_FP
-#define EX_LD_FP(x)x
+#define EX_LD_FP(x,y)  x
 #endif
 
 #ifndef EX_ST
-#define EX_ST(x)   x
+#define EX_ST(x,y) x
 #endif
 #ifndef EX_ST_FP
-#define EX_ST_FP(x)x
+#define EX_ST_FP(x,y)  x
 #endif
 
 #ifndef EX_RETVAL
@@ -207,9 +207,9 @@ FUNC_NAME:
sub %o1, %o0, %o1   ! %o1 gets the difference
 7: ! dst aligning loop
add %o1, %o0, %o4
-   EX_LD(LOAD(ldub, %o4, %o4)) ! load one byte
+   EX_LD(LOAD(ldub, %o4, %o4), memcpy_retl_o2_plus_o5) ! load one byte
subcc   %o5, 1, %o5
-   EX_ST(STORE(stb, %o4, %o0))
+   EX_ST(STORE(stb, %o4, %o0), memcpy_retl_o2_plus_o5_plus_1)
bgu,pt  %ncc, 7b
 add%o0, 1, %o0 ! advance dst
add %o1, %o0, %o1   ! restore %o1
@@ -234,64 +234,64 @@ FUNC_NAME:
ble,pn  %ncc, .Lmedl63  ! skip big loop if less than 64 bytes
 nop
 .Lmedl64:
-   EX_LD(LOAD(ldx, %o1, %o4))  ! load
+   EX_LD(LOAD(ldx, %o1, %o4), memcpy_retl_o2_plus_63)  ! load
subcc   %o2, 64, %o2! decrement length count
-   EX_ST(STORE(stx, %o4, %o0)) ! and store
-   EX_LD(LOAD(ldx, %o1+8, %o3))! a block of 64 bytes
-   EX_ST(STORE(stx, %o3, %o0+8))
-   EX_LD(LOAD(ldx, %o1+16, %o4))
-   EX_ST(STORE(stx, %o4, %o0+16))
-   EX_LD(LOAD(ldx, %o1+24, %o3))
-   EX_ST(STORE(stx, %o3, %o0+24))
-   EX_LD(LOAD(ldx, %o1+32, %o4))   ! load
-   EX_ST(STORE(stx, %o4, %o0+32))  ! and store
-   EX_LD(LOAD(ldx, %o1+40, %o3))   ! a block of 64 bytes
+   EX_ST(STORE(stx, %o4, %o0), memcpy_retl_o2_plus_63_64)  ! and store
+   EX_LD(LOAD(ldx, %o1+8, %o3), memcpy_retl_o2_plus_63_56) ! a block of 64
+   EX_ST(STORE(stx, %o3, %o0+8), memcpy_retl_o2_plus_63_56)
+   EX_LD(LOAD(ldx, %o1+16, %o4), memcpy_retl_o2_plus_63_48)
+   EX_ST(STORE(stx, %o4, %o0+16),