Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /* una_asm.S: Kernel unaligned trap assembler helpers.
0003  *
0004  * Copyright (C) 1996,2005,2008 David S. Miller (davem@davemloft.net)
0005  * Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
0006  */
0007 
0008 #include <linux/errno.h>
0009 
0010     .text
0011 
0012 retl_efault:
0013     retl
0014      mov    -EFAULT, %o0
0015 
0016     /* int __do_int_store(unsigned long *dst_addr, int size,
0017      *                    unsigned long *src_val)
0018      *
0019      * %o0 = dest_addr
0020      * %o1 = size
0021      * %o2 = src_val
0022      *
0023      * Return '0' on success, -EFAULT on failure.
0024      */
0025     .globl  __do_int_store
0026 __do_int_store:
0027     ld  [%o2], %g1
0028     cmp %o1, 2
0029     be  2f
0030      cmp    %o1, 4
0031     be  1f
0032      srl    %g1, 24, %g2
0033     srl %g1, 16, %g7
0034 4:  stb %g2, [%o0]
0035     srl %g1, 8, %g2
0036 5:  stb %g7, [%o0 + 1]
0037     ld  [%o2 + 4], %g7
0038 6:  stb %g2, [%o0 + 2]
0039     srl %g7, 24, %g2
0040 7:  stb %g1, [%o0 + 3]
0041     srl %g7, 16, %g1
0042 8:  stb %g2, [%o0 + 4]
0043     srl %g7, 8, %g2
0044 9:  stb %g1, [%o0 + 5]
0045 10: stb %g2, [%o0 + 6]
0046     b   0f
0047 11:  stb    %g7, [%o0 + 7]
0048 1:  srl %g1, 16, %g7
0049 12: stb %g2, [%o0]
0050     srl %g1, 8, %g2
0051 13: stb %g7, [%o0 + 1]
0052 14: stb %g2, [%o0 + 2]
0053     b   0f
0054 15:  stb    %g1, [%o0 + 3]
0055 2:  srl %g1, 8, %g2
0056 16: stb %g2, [%o0]
0057 17: stb %g1, [%o0 + 1]
0058 0:  retl
0059      mov    0, %o0
0060 
0061     .section __ex_table,#alloc
0062     .word   4b, retl_efault
0063     .word   5b, retl_efault
0064     .word   6b, retl_efault
0065     .word   7b, retl_efault
0066     .word   8b, retl_efault
0067     .word   9b, retl_efault
0068     .word   10b, retl_efault
0069     .word   11b, retl_efault
0070     .word   12b, retl_efault
0071     .word   13b, retl_efault
0072     .word   14b, retl_efault
0073     .word   15b, retl_efault
0074     .word   16b, retl_efault
0075     .word   17b, retl_efault
0076     .previous
0077 
0078     /* int do_int_load(unsigned long *dest_reg, int size,
0079      *                 unsigned long *saddr, int is_signed)
0080      *
0081      * %o0 = dest_reg
0082      * %o1 = size
0083      * %o2 = saddr
0084      * %o3 = is_signed
0085      *
0086      * Return '0' on success, -EFAULT on failure.
0087      */
0088     .globl  do_int_load
0089 do_int_load:
0090     cmp %o1, 8
0091     be  9f
0092      cmp    %o1, 4
0093     be  6f
0094 4:   ldub   [%o2], %g1
0095 5:  ldub    [%o2 + 1], %g2
0096     sll %g1, 8, %g1
0097     tst %o3
0098     be  3f
0099      or %g1, %g2, %g1
0100     sll %g1, 16, %g1
0101     sra %g1, 16, %g1
0102 3:  b   0f
0103      st %g1, [%o0]
0104 6:  ldub    [%o2 + 1], %g2
0105     sll %g1, 24, %g1
0106 7:  ldub    [%o2 + 2], %g7
0107     sll %g2, 16, %g2
0108 8:  ldub    [%o2 + 3], %g3
0109     sll %g7, 8, %g7
0110     or  %g3, %g2, %g3
0111     or  %g7, %g3, %g7
0112     or  %g1, %g7, %g1
0113     b   0f
0114      st %g1, [%o0]
0115 9:  ldub    [%o2], %g1
0116 10: ldub    [%o2 + 1], %g2
0117     sll %g1, 24, %g1
0118 11: ldub    [%o2 + 2], %g7
0119     sll %g2, 16, %g2
0120 12: ldub    [%o2 + 3], %g3
0121     sll %g7, 8, %g7
0122     or  %g1, %g2, %g1
0123     or  %g7, %g3, %g7
0124     or  %g1, %g7, %g7
0125 13: ldub    [%o2 + 4], %g1
0126     st  %g7, [%o0]
0127 14: ldub    [%o2 + 5], %g2
0128     sll %g1, 24, %g1
0129 15: ldub    [%o2 + 6], %g7
0130     sll %g2, 16, %g2
0131 16: ldub    [%o2 + 7], %g3
0132     sll %g7, 8, %g7
0133     or  %g1, %g2, %g1
0134     or  %g7, %g3, %g7
0135     or  %g1, %g7, %g7
0136     st  %g7, [%o0 + 4]
0137 0:  retl
0138      mov    0, %o0
0139 
0140     .section __ex_table,#alloc
0141     .word   4b, retl_efault
0142     .word   5b, retl_efault
0143     .word   6b, retl_efault
0144     .word   7b, retl_efault
0145     .word   8b, retl_efault
0146     .word   9b, retl_efault
0147     .word   10b, retl_efault
0148     .word   11b, retl_efault
0149     .word   12b, retl_efault
0150     .word   13b, retl_efault
0151     .word   14b, retl_efault
0152     .word   15b, retl_efault
0153     .word   16b, retl_efault
0154     .previous