]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/sparc/kernel/una_asm_32.S
sparc: prepare kernel/ for unification
[linux-2.6-omap-h63xx.git] / arch / sparc / kernel / una_asm_32.S
diff --git a/arch/sparc/kernel/una_asm_32.S b/arch/sparc/kernel/una_asm_32.S
new file mode 100644 (file)
index 0000000..8cc0345
--- /dev/null
@@ -0,0 +1,153 @@
+/* una_asm.S: Kernel unaligned trap assembler helpers.
+ *
+ * Copyright (C) 1996,2005,2008 David S. Miller (davem@davemloft.net)
+ * Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
+ */
+
+#include <linux/errno.h>
+
+       .text
+
+retl_efault:
+       retl
+        mov    -EFAULT, %o0
+
+       /* int __do_int_store(unsigned long *dst_addr, int size,
+        *                    unsigned long *src_val)
+        *
+        * %o0 = dest_addr
+        * %o1 = size
+        * %o2 = src_val
+        *
+        * Return '0' on success, -EFAULT on failure.
+        */
+       .globl  __do_int_store
+__do_int_store:
+       ld      [%o2], %g1
+       cmp     %1, 2
+       be      2f
+        cmp    %1, 4
+       be      1f
+        srl    %g1, 24, %g2
+       srl     %g1, 16, %g7
+4:     stb     %g2, [%o0]
+       srl     %g1, 8, %g2
+5:     stb     %g7, [%o0 + 1]
+       ld      [%o2 + 4], %g7
+6:     stb     %g2, [%o0 + 2]
+       srl     %g7, 24, %g2
+7:     stb     %g1, [%o0 + 3]
+       srl     %g7, 16, %g1
+8:     stb     %g2, [%o0 + 4]
+       srl     %g7, 8, %g2
+9:     stb     %g1, [%o0 + 5]
+10:    stb     %g2, [%o0 + 6]
+       b       0f
+11:     stb    %g7, [%o0 + 7]
+1:     srl     %g1, 16, %g7
+12:    stb     %g2, [%o0]
+       srl     %g1, 8, %g2
+13:    stb     %g7, [%o0 + 1]
+14:    stb     %g2, [%o0 + 2]
+       b       0f
+15:     stb    %g1, [%o0 + 3]
+2:     srl     %g1, 8, %g2
+16:    stb     %g2, [%o0]
+17:    stb     %g1, [%o0 + 1]
+0:     retl
+        mov    0, %o0
+
+       .section __ex_table,#alloc
+       .word   4b, retl_efault
+       .word   5b, retl_efault
+       .word   6b, retl_efault
+       .word   7b, retl_efault
+       .word   8b, retl_efault
+       .word   9b, retl_efault
+       .word   10b, retl_efault
+       .word   11b, retl_efault
+       .word   12b, retl_efault
+       .word   13b, retl_efault
+       .word   14b, retl_efault
+       .word   15b, retl_efault
+       .word   16b, retl_efault
+       .word   17b, retl_efault
+       .previous
+
+       /* int do_int_load(unsigned long *dest_reg, int size,
+        *                 unsigned long *saddr, int is_signed)
+        *
+        * %o0 = dest_reg
+        * %o1 = size
+        * %o2 = saddr
+        * %o3 = is_signed
+        *
+        * Return '0' on success, -EFAULT on failure.
+        */
+       .globl  do_int_load
+do_int_load:
+       cmp     %o1, 8
+       be      9f
+        cmp    %o1, 4
+       be      6f
+4:      ldub   [%o2], %g1
+5:     ldub    [%o2 + 1], %g2
+       sll     %g1, 8, %g1
+       tst     %o3
+       be      3f
+        or     %g1, %g2, %g1
+       sll     %g1, 16, %g1
+       sra     %g1, 16, %g1
+3:     b       0f
+        st     %g1, [%o0]
+6:     ldub    [%o2 + 1], %g2
+       sll     %g1, 24, %g1
+7:     ldub    [%o2 + 2], %g7
+       sll     %g2, 16, %g2
+8:     ldub    [%o2 + 3], %g3
+       sll     %g7, 8, %g7
+       or      %g3, %g2, %g3
+       or      %g7, %g3, %g7
+       or      %g1, %g7, %g1
+       b       0f
+        st     %g1, [%o0]
+9:     ldub    [%o2], %g1
+10:    ldub    [%o2 + 1], %g2
+       sll     %g1, 24, %g1
+11:    ldub    [%o2 + 2], %g7
+       sll     %g2, 16, %g2
+12:    ldub    [%o2 + 3], %g3
+       sll     %g7, 8, %g7
+       or      %g1, %g2, %g1
+       or      %g7, %g3, %g7
+       or      %g1, %g7, %g7
+13:    ldub    [%o2 + 4], %g1
+       st      %g7, [%o0]
+14:    ldub    [%o2 + 5], %g2
+       sll     %g1, 24, %g1
+15:    ldub    [%o2 + 6], %g7
+       sll     %g2, 16, %g2
+16:    ldub    [%o2 + 7], %g3
+       sll     %g7, 8, %g7
+       or      %g1, %g2, %g1
+       or      %g7, %g3, %g7
+       or      %g1, %g7, %g7
+       st      %g7, [%o0 + 4]
+0:     retl
+        mov    0, %o0
+
+       .section __ex_table,#alloc
+       .word   4b, retl_efault
+       .word   5b, retl_efault
+       .word   6b, retl_efault
+       .word   7b, retl_efault
+       .word   8b, retl_efault
+       .word   9b, retl_efault
+       .word   10b, retl_efault
+       .word   11b, retl_efault
+       .word   12b, retl_efault
+       .word   13b, retl_efault
+       .word   14b, retl_efault
+       .word   15b, retl_efault
+       .word   16b, retl_efault
+       .previous