Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * arch/alpha/lib/copy_user.S
0004  *
0005  * Copy to/from user space, handling exceptions as we go..  This
0006  * isn't exactly pretty.
0007  *
0008  * This is essentially the same as "memcpy()", but with a few twists.
0009  * Notably, we have to make sure that $0 is always up-to-date and
0010  * contains the right "bytes left to copy" value (and that it is updated
0011  * only _after_ a successful copy). There is also some rather minor
0012  * exception setup stuff..
0013  */
0014 
0015 #include <asm/export.h>
0016 
0017 /* Allow an exception for an insn; exit if we get one.  */
0018 #define EXI(x,y...)         \
0019     99: x,##y;          \
0020     .section __ex_table,"a";    \
0021     .long 99b - .;          \
0022     lda $31, $exitin-99b($31);  \
0023     .previous
0024 
0025 #define EXO(x,y...)         \
0026     99: x,##y;          \
0027     .section __ex_table,"a";    \
0028     .long 99b - .;          \
0029     lda $31, $exitout-99b($31); \
0030     .previous
0031 
0032     .set noat
0033     .align 4
0034     .globl __copy_user
0035     .ent __copy_user
0036 __copy_user:
0037     .prologue 0
0038     mov $18,$0
0039     and $16,7,$3
0040     beq $0,$35
0041     beq $3,$36
0042     subq $3,8,$3
0043     .align 4
0044 $37:
0045     EXI( ldq_u $1,0($17) )
0046     EXO( ldq_u $2,0($16) )
0047     extbl $1,$17,$1
0048     mskbl $2,$16,$2
0049     insbl $1,$16,$1
0050     addq $3,1,$3
0051     bis $1,$2,$1
0052     EXO( stq_u $1,0($16) )
0053     subq $0,1,$0
0054     addq $16,1,$16
0055     addq $17,1,$17
0056     beq $0,$41
0057     bne $3,$37
0058 $36:
0059     and $17,7,$1
0060     bic $0,7,$4
0061     beq $1,$43
0062     beq $4,$48
0063     EXI( ldq_u $3,0($17) )
0064     .align 4
0065 $50:
0066     EXI( ldq_u $2,8($17) )
0067     subq $4,8,$4
0068     extql $3,$17,$3
0069     extqh $2,$17,$1
0070     bis $3,$1,$1
0071     EXO( stq $1,0($16) )
0072     addq $17,8,$17
0073     subq $0,8,$0
0074     addq $16,8,$16
0075     bis $2,$2,$3
0076     bne $4,$50
0077 $48:
0078     beq $0,$41
0079     .align 4
0080 $57:
0081     EXI( ldq_u $1,0($17) )
0082     EXO( ldq_u $2,0($16) )
0083     extbl $1,$17,$1
0084     mskbl $2,$16,$2
0085     insbl $1,$16,$1
0086     bis $1,$2,$1
0087     EXO( stq_u $1,0($16) )
0088     subq $0,1,$0
0089     addq $16,1,$16
0090     addq $17,1,$17
0091     bne $0,$57
0092     br $31,$41
0093     .align 4
0094 $43:
0095     beq $4,$65
0096     .align 4
0097 $66:
0098     EXI( ldq $1,0($17) )
0099     subq $4,8,$4
0100     EXO( stq $1,0($16) )
0101     addq $17,8,$17
0102     subq $0,8,$0
0103     addq $16,8,$16
0104     bne $4,$66
0105 $65:
0106     beq $0,$41
0107     EXI( ldq $2,0($17) )
0108     EXO( ldq $1,0($16) )
0109     mskql $2,$0,$2
0110     mskqh $1,$0,$1
0111     bis $2,$1,$2
0112     EXO( stq $2,0($16) )
0113     bis $31,$31,$0
0114 $41:
0115 $35:
0116 $exitin:
0117 $exitout:
0118     ret $31,($26),1
0119 
0120     .end __copy_user
0121 EXPORT_SYMBOL(__copy_user)