2005-04-16 15:20:36 -07:00
/ *
* arch/ s39 0 / l i b / u a c c e s s . S
* _ _ copy_ { f r o m | t o } _ u s e r f u n c t i o n s .
*
* s3 9 0
* Copyright ( C ) 2 0 0 0 ,2 0 0 2 I B M D e u t s c h l a n d E n t w i c k l u n g G m b H , I B M C o r p o r a t i o n
* Authors( s ) : M a r t i n S c h w i d e f s k y ( s c h w i d e f s k y @de.ibm.com)
*
* These f u n c t i o n s h a v e s t a n d a r d c a l l i n t e r f a c e
* /
# include < l i n u x / e r r n o . h >
# include < a s m / l o w c o r e . h >
2005-09-09 20:57:26 +02:00
# include < a s m / a s m - o f f s e t s . h >
2005-04-16 15:20:36 -07:00
.text
.align 4
.globl __copy_from_user_asm
# % r2 = t o , % r3 = n , % r4 = f r o m
__copy_from_user_asm :
slr % r0 ,% r0
0 : mvcp 0 ( % r3 ,% r2 ) ,0 ( % r4 ) ,% r0
jnz 1 f
slr % r2 ,% r2
br % r14
1 : la % r2 ,2 5 6 ( % r2 )
la % r4 ,2 5 6 ( % r4 )
ahi % r3 ,- 2 5 6
2 : mvcp 0 ( % r3 ,% r2 ) ,0 ( % r4 ) ,% r0
jnz 1 b
3 : slr % r2 ,% r2
br % r14
4 : lhi % r0 ,- 4 0 9 6
lr % r5 ,% r4
slr % r5 ,% r0
nr % r5 ,% r0 # % r 5 = ( % r4 + 4 0 9 6 ) & - 4 0 9 6
slr % r5 ,% r4 # % r 5 = #b y t e s t o n e x t u s e r p a g e b o u n d a r y
clr % r3 ,% r5 # c o p y c r o s s e s n e x t p a g e b o u n d a r y ?
jnh 6 f # n o , t h e c u r r e n t p a g e f a u l t e d
# move w i t h t h e r e d u c e d l e n g t h w h i c h i s < 2 5 6
5 : mvcp 0 ( % r5 ,% r2 ) ,0 ( % r4 ) ,% r0
slr % r3 ,% r5
6 : lr % r2 ,% r3
br % r14
.section _ _ ex_ t a b l e ," a "
.long 0 b,4 b
.long 2 b,4 b
.long 5 b,6 b
.previous
.align 4
.text
.globl __copy_to_user_asm
# % r2 = f r o m , % r3 = n , % r4 = t o
__copy_to_user_asm :
slr % r0 ,% r0
0 : mvcs 0 ( % r3 ,% r4 ) ,0 ( % r2 ) ,% r0
jnz 1 f
slr % r2 ,% r2
br % r14
1 : la % r2 ,2 5 6 ( % r2 )
la % r4 ,2 5 6 ( % r4 )
ahi % r3 ,- 2 5 6
2 : mvcs 0 ( % r3 ,% r4 ) ,0 ( % r2 ) ,% r0
jnz 1 b
3 : slr % r2 ,% r2
br % r14
4 : lhi % r0 ,- 4 0 9 6
lr % r5 ,% r4
slr % r5 ,% r0
nr % r5 ,% r0 # % r 5 = ( % r4 + 4 0 9 6 ) & - 4 0 9 6
slr % r5 ,% r4 # % r 5 = #b y t e s t o n e x t u s e r p a g e b o u n d a r y
clr % r3 ,% r5 # c o p y c r o s s e s n e x t p a g e b o u n d a r y ?
jnh 6 f # n o , t h e c u r r e n t p a g e f a u l t e d
# move w i t h t h e r e d u c e d l e n g t h w h i c h i s < 2 5 6
5 : mvcs 0 ( % r5 ,% r4 ) ,0 ( % r2 ) ,% r0
slr % r3 ,% r5
6 : lr % r2 ,% r3
br % r14
.section _ _ ex_ t a b l e ," a "
.long 0 b,4 b
.long 2 b,4 b
.long 5 b,6 b
.previous
.align 4
.text
.globl __copy_in_user_asm
# % r2 = f r o m , % r3 = n , % r4 = t o
__copy_in_user_asm :
sacf 2 5 6
bras 1 ,1 f
mvc 0 ( 1 ,% r4 ) ,0 ( % r2 )
0 : mvc 0 ( 2 5 6 ,% r4 ) ,0 ( % r2 )
la % r2 ,2 5 6 ( % r2 )
la % r4 ,2 5 6 ( % r4 )
1 : ahi % r3 ,- 2 5 6
jnm 0 b
2 : ex % r3 ,0 ( % r1 )
sacf 0
slr % r2 ,% r2
br 1 4
3 : mvc 0 ( 1 ,% r4 ) ,0 ( % r2 )
la % r2 ,1 ( % r2 )
la % r4 ,1 ( % r4 )
ahi % r3 ,- 1
jnm 3 b
4 : lr % r2 ,% r3
sacf 0
br % r14
.section _ _ ex_ t a b l e ," a "
.long 0 b,3 b
.long 2 b,3 b
.long 3 b,4 b
.previous
.align 4
.text
.globl __clear_user_asm
# % r2 = t o , % r3 = n
__clear_user_asm :
bras % r5 ,0 f
.long empty_zero_page
0 : l % r5 ,0 ( % r5 )
slr % r0 ,% r0
1 : mvcs 0 ( % r3 ,% r2 ) ,0 ( % r5 ) ,% r0
jnz 2 f
slr % r2 ,% r2
br % r14
2 : la % r2 ,2 5 6 ( % r2 )
ahi % r3 ,- 2 5 6
3 : mvcs 0 ( % r3 ,% r2 ) ,0 ( % r5 ) ,% r0
jnz 2 b
4 : slr % r2 ,% r2
br % r14
5 : lhi % r0 ,- 4 0 9 6
lr % r4 ,% r2
slr % r4 ,% r0
nr % r4 ,% r0 # % r 4 = ( % r2 + 4 0 9 6 ) & - 4 0 9 6
slr % r4 ,% r2 # % r 4 = #b y t e s t o n e x t u s e r p a g e b o u n d a r y
clr % r3 ,% r4 # c l e a r c r o s s e s n e x t p a g e b o u n d a r y ?
jnh 7 f # n o , t h e c u r r e n t p a g e f a u l t e d
# clear w i t h t h e r e d u c e d l e n g t h w h i c h i s < 2 5 6
6 : mvcs 0 ( % r4 ,% r2 ) ,0 ( % r5 ) ,% r0
slr % r3 ,% r4
7 : lr % r2 ,% r3
br % r14
.section _ _ ex_ t a b l e ," a "
.long 1 b,5 b
.long 3 b,5 b
.long 6 b,7 b
.previous
.align 4
.text
.globl __strncpy_from_user_asm
# % r2 = c o u n t , % r3 = d s t , % r4 = s r c
__strncpy_from_user_asm :
lhi % r0 ,0
lr % r1 ,% r4
la % r4 ,0 ( % r4 ) # c l e a r h i g h o r d e r b i t f r o m % r 4
la % r2 ,0 ( % r2 ,% r4 ) # % r 2 p o i n t s t o f i r s t b y t e a f t e r s t r i n g
sacf 2 5 6
0 : srst % r2 ,% r1
jo 0 b
sacf 0
lr % r1 ,% r2
jh 1 f # \ 0 f o u n d i n s t r i n g ?
ahi % r1 ,1 # i n c l u d e \ 0 i n c o p y
1 : slr % r1 ,% r4 # % r 1 = c o p y l e n g t h ( w i t h o u t \ 0 )
slr % r2 ,% r4 # % r 2 = r e t u r n l e n g t h ( i n c l u d i n g \ 0 )
2 : mvcp 0 ( % r1 ,% r3 ) ,0 ( % r4 ) ,% r0
jnz 3 f
br % r14
3 : la % r3 ,2 5 6 ( % r3 )
la % r4 ,2 5 6 ( % r4 )
ahi % r1 ,- 2 5 6
mvcp 0 ( % r1 ,% r3 ) ,0 ( % r4 ) ,% r0
jnz 3 b
br % r14
4 : sacf 0
lhi % r2 ,- E F A U L T
br % r14
.section _ _ ex_ t a b l e ," a "
.long 0 b,4 b
.previous
.align 4
.text
.globl __strnlen_user_asm
# % r2 = c o u n t , % r3 = s r c
__strnlen_user_asm :
lhi % r0 ,0
lr % r1 ,% r3
la % r3 ,0 ( % r3 ) # c l e a r h i g h o r d e r b i t f r o m % r 4
la % r2 ,0 ( % r2 ,% r3 ) # % r 2 p o i n t s t o f i r s t b y t e a f t e r s t r i n g
sacf 2 5 6
0 : srst % r2 ,% r1
jo 0 b
sacf 0
ahi % r2 ,1 # s t r n l e n _ u s e r r e s u l t i n c l u d e s t h e \ 0
2006-03-07 21:55:37 -08:00
# or r e t u r n c o u n t + 1 i f \ 0 n o t f o u n d
slr % r2 ,% r3
2005-04-16 15:20:36 -07:00
br % r14
2 : sacf 0
2006-03-07 21:55:37 -08:00
slr % r2 ,% r2 # r e t u r n 0 o n e x c e p t i o n
2005-04-16 15:20:36 -07:00
br % r14
.section _ _ ex_ t a b l e ," a "
.long 0 b,2 b
.previous