2005-04-17 02:20:36 +04:00
|
| skeleton. s a 3 . 2 4 / 2 6 / 9 1
|
| This f i l e c o n t a i n s c o d e t h a t i s s y s t e m d e p e n d e n t a n d w i l l
| need t o b e m o d i f i e d t o i n s t a l l t h e F P S P .
|
| Each e n t r y p o i n t f o r e x c e p t i o n ' x x x x ' b e g i n s w i t h a ' j m p f p s p _ x x x x ' .
| Put a n y t a r g e t s y s t e m s p e c i f i c h a n d l i n g t h a t m u s t b e d o n e i m m e d i a t e l y
| before t h e j u m p i n s t r u c t i o n . I f t h e r e n o h a n d l i n g n e c e s s a r y , t h e n
| the ' f p s p _ x x x x ' h a n d l e r e n t r y p o i n t s h o u l d b e p l a c e d i n t h e e x c e p t i o n
| table s o t h a t t h e ' j m p ' c a n b e e l i m i n a t e d . I f t h e F P S P d e t e r m i n e s t h a t t h e
| exception i s o n e t h a t m u s t b e r e p o r t e d t h e n t h e r e w i l l b e a
| return f r o m t h e p a c k a g e b y a ' j m p r e a l _ x x x x ' . A t t h a t p o i n t
| the m a c h i n e s t a t e w i l l b e i d e n t i c a l t o t h e s t a t e b e f o r e
| the F P S P w a s e n t e r e d . I n p a r t i c u l a r , w h a t e v e r c o n d i t i o n
| that c a u s e d t h e e x c e p t i o n w i l l s t i l l b e p e n d i n g w h e n t h e F P S P
| package r e t u r n s . T h u s , t h e r e w i l l b e s y s t e m s p e c i f i c c o d e
| to h a n d l e t h e e x c e p t i o n .
|
| If t h e e x c e p t i o n w a s c o m p l e t e l y h a n d l e d b y t h e p a c k a g e , t h e n
| the r e t u r n w i l l b e v i a a ' j m p f p s p _ d o n e ' . U n l e s s t h e r e i s
| OS s p e c i f i c w o r k t o b e d o n e ( s u c h a s h a n d l i n g a c o n t e x t s w i t c h o r
| interrupt) t h e u s e r p r o g r a m c a n b e r e s u m e d v i a ' r t e ' .
|
| In t h e f o l l o w i n g s k e l e t o n c o d e , s o m e t y p i c a l ' r e a l _ x x x x ' h a n d l i n g
| code i s s h o w n . T h i s c o d e m a y n e e d t o b e m o v e d t o a n a p p r o p r i a t e
| place i n t h e t a r g e t s y s t e m , o r r e w r i t t e n .
|
| Copyright ( C ) M o t o r o l a , I n c . 1 9 9 0
| All R i g h t s R e s e r v e d
|
2006-02-12 04:55:48 +03:00
| For d e t a i l s o n t h e l i c e n s e f o r t h i s f i l e , p l e a s e s e e t h e
| file, R E A D M E , i n t h i s s a m e d i r e c t o r y .
2005-04-17 02:20:36 +04:00
|
| Modified f o r L i n u x - 1 . 3 . x b y J e s S o r e n s e n ( j d s @kom.auc.dk)
|
# include < l i n u x / l i n k a g e . h >
# include < a s m / e n t r y . h >
2005-09-09 22:57:26 +04:00
# include < a s m / a s m - o f f s e t s . h >
2005-04-17 02:20:36 +04:00
| SKELETON i d n t 2 ,1 | M o t o r o l a 0 4 0 F l o a t i n g P o i n t S o f t w a r e P a c k a g e
| section 1 5
|
| The f o l l o w i n g c o u n t e r s a r e u s e d f o r s t a n d a l o n e t e s t i n g
|
| section 8
# include " f p s p . h "
| xref b12 3 8 _ f i x
|
| Divide b y Z e r o e x c e p t i o n
|
| All d z e x c e p t i o n s a r e ' r e a l ' , h e n c e n o f p s p _ d z e n t r y p o i n t .
|
.global dz
.global real_dz
dz :
real_dz :
link % a6 ,#- L O C A L _ S I Z E
fsave - ( % s p )
bclrb #E 1 ,E _ B Y T E ( % a6 )
frestore ( % s p ) +
unlk % a6
SAVE_ A L L _ I N T
GET_ C U R R E N T ( % d0 )
movel % s p ,% s p @- | stack frame pointer argument
bsrl t r a p _ c
addql #4 ,% s p
bral r e t _ f r o m _ e x c e p t i o n
|
| Inexact e x c e p t i o n
|
| All i n e x a c t e x c e p t i o n s a r e r e a l , b u t t h e ' r e a l ' h a n d l e r
| will p r o b a b l y w a n t t o c l e a r t h e p e n d i n g e x c e p t i o n .
| The p r o v i d e d c o d e w i l l c l e a r t h e E 3 e x c e p t i o n ( i f p e n d i n g ) ,
| otherwise c l e a r t h e E 1 e x c e p t i o n . T h e f r e s t o r e i s n o t r e a l l y
| necessary f o r E 1 e x c e p t i o n s .
|
| Code f o l l o w i n g t h e ' i n e x ' l a b e l i s t o h a n d l e b u g #1232 . I n t h i s
| bug, i f a n E 1 s n a n , o v f l , o r u n f l o c c u r r e d , a n d t h e p r o c e s s w a s
| swapped o u t b e f o r e t a k i n g t h e e x c e p t i o n , t h e e x c e p t i o n t a k e n o n
| return w a s i n e x , r a t h e r t h a n t h e c o r r e c t e x c e p t i o n . T h e s n a n , o v f l ,
| and u n f l e x c e p t i o n t o b e t a k e n m u s t n o t h a v e b e e n e n a b l e d . T h e
| fix i s t o c h e c k f o r E 1 , a n d t h e e x i s t e n c e o f o n e o f s n a n , o v f l ,
| or u n f l b i t s s e t i n t h e f p s r . I f a n y o f t h e s e a r e s e t , b r a n c h
| to t h e a p p r o p r i a t e h a n d l e r f o r t h e e x c e p t i o n i n t h e f p s r . N o t e
| that t h i s f i x i s o n l y f o r d43 b p a r t s , a n d i s s k i p p e d i f t h e
| version n u m b e r i s n o t $ 4 0 .
|
|
.global real_inex
.global inex
inex :
link % a6 ,#- L O C A L _ S I Z E
fsave - ( % s p )
cmpib #V E R _ 40 ,( % s p ) | t e s t v e r s i o n n u m b e r
bnes n o t _ f m t 4 0
fmovel % f p s r ,- ( % s p )
btstb #E 1 ,E _ B Y T E ( % a6 ) | t e s t f o r E 1 s e t
beqs n o t _ b12 3 2
btstb #s n a n _ b i t , 2 ( % s p ) | t e s t f o r s n a n
beq i n e x _ c k o f l
addl #4 ,% s p
frestore ( % s p ) +
unlk % a6
bra s n a n
inex_ckofl :
btstb #o v f l _ b i t , 2 ( % s p ) | t e s t f o r o v f l
beq i n e x _ c k u f l
addl #4 ,% s p
frestore ( % s p ) +
unlk % a6
bra o v f l
inex_ckufl :
btstb #u n f l _ b i t , 2 ( % s p ) | t e s t f o r u n f l
beq n o t _ b12 3 2
addl #4 ,% s p
frestore ( % s p ) +
unlk % a6
bra u n f l
|
| We d o n o t h a v e t h e b u g 1 2 3 2 c a s e . C l e a n u p t h e s t a c k a n d c a l l
| real_ i n e x .
|
not_b1232 :
addl #4 ,% s p
frestore ( % s p ) +
unlk % a6
real_inex :
link % a6 ,#- L O C A L _ S I Z E
fsave - ( % s p )
not_fmt40 :
bclrb #E 3 ,E _ B Y T E ( % a6 ) | c l e a r a n d t e s t E 3 f l a g
beqs i n e x _ c k e 1
|
| Clear d i r t y b i t o n d e s t r e s i s t e r i n t h e f r a m e b e f o r e b r a n c h i n g
| to b12 3 8 _ f i x .
|
moveml % d0 / % d1 ,U S E R _ D A ( % a6 )
bfextu C M D R E G 1 B ( % a6 ) { #6 : #3 } ,% d0 | g e t d e s t r e g n o
bclrb % d0 ,F P R _ D I R T Y _ B I T S ( % a6 ) | c l r d e s t d i r t y b i t
bsrl b12 3 8 _ f i x | t e s t f o r b u g 1 2 3 8 c a s e
moveml U S E R _ D A ( % a6 ) ,% d0 / % d1
bras i n e x _ d o n e
inex_cke1 :
bclrb #E 1 ,E _ B Y T E ( % a6 )
inex_done :
frestore ( % s p ) +
unlk % a6
SAVE_ A L L _ I N T
GET_ C U R R E N T ( % d0 )
movel % s p ,% s p @- | stack frame pointer argument
bsrl t r a p _ c
addql #4 ,% s p
bral r e t _ f r o m _ e x c e p t i o n
|
| Overflow e x c e p t i o n
|
| xref f p s p _ o v f l
.global real_ovfl
.global ovfl
ovfl :
jmp f p s p _ o v f l
real_ovfl :
link % a6 ,#- L O C A L _ S I Z E
fsave - ( % s p )
bclrb #E 3 ,E _ B Y T E ( % a6 ) | c l e a r a n d t e s t E 3 f l a g
bnes o v f l _ d o n e
bclrb #E 1 ,E _ B Y T E ( % a6 )
ovfl_done :
frestore ( % s p ) +
unlk % a6
SAVE_ A L L _ I N T
GET_ C U R R E N T ( % d0 )
movel % s p ,% s p @- | stack frame pointer argument
bsrl t r a p _ c
addql #4 ,% s p
bral r e t _ f r o m _ e x c e p t i o n
|
| Underflow e x c e p t i o n
|
| xref f p s p _ u n f l
.global real_unfl
.global unfl
unfl :
jmp f p s p _ u n f l
real_unfl :
link % a6 ,#- L O C A L _ S I Z E
fsave - ( % s p )
bclrb #E 3 ,E _ B Y T E ( % a6 ) | c l e a r a n d t e s t E 3 f l a g
bnes u n f l _ d o n e
bclrb #E 1 ,E _ B Y T E ( % a6 )
unfl_done :
frestore ( % s p ) +
unlk % a6
SAVE_ A L L _ I N T
GET_ C U R R E N T ( % d0 )
movel % s p ,% s p @- | stack frame pointer argument
bsrl t r a p _ c
addql #4 ,% s p
bral r e t _ f r o m _ e x c e p t i o n
|
| Signalling N A N e x c e p t i o n
|
| xref f p s p _ s n a n
.global real_snan
.global snan
snan :
jmp f p s p _ s n a n
real_snan :
link % a6 ,#- L O C A L _ S I Z E
fsave - ( % s p )
bclrb #E 1 ,E _ B Y T E ( % a6 ) | s n a n i s a l w a y s a n E 1 e x c e p t i o n
frestore ( % s p ) +
unlk % a6
SAVE_ A L L _ I N T
GET_ C U R R E N T ( % d0 )
movel % s p ,% s p @- | stack frame pointer argument
bsrl t r a p _ c
addql #4 ,% s p
bral r e t _ f r o m _ e x c e p t i o n
|
| Operand E r r o r e x c e p t i o n
|
| xref f p s p _ o p e r r
.global real_operr
.global operr
operr :
jmp f p s p _ o p e r r
real_operr :
link % a6 ,#- L O C A L _ S I Z E
fsave - ( % s p )
bclrb #E 1 ,E _ B Y T E ( % a6 ) | o p e r r i s a l w a y s a n E 1 e x c e p t i o n
frestore ( % s p ) +
unlk % a6
SAVE_ A L L _ I N T
GET_ C U R R E N T ( % d0 )
movel % s p ,% s p @- | stack frame pointer argument
bsrl t r a p _ c
addql #4 ,% s p
bral r e t _ f r o m _ e x c e p t i o n
|
| BSUN e x c e p t i o n
|
| This s a m p l e h a n d l e r s i m p l y c l e a r s t h e n a n b i t i n t h e F P S R .
|
| xref f p s p _ b s u n
.global real_bsun
.global bsun
bsun :
jmp f p s p _ b s u n
real_bsun :
link % a6 ,#- L O C A L _ S I Z E
fsave - ( % s p )
bclrb #E 1 ,E _ B Y T E ( % a6 ) | b s u n i s a l w a y s a n E 1 e x c e p t i o n
fmovel % F P S R ,- ( % s p )
bclrb #n a n _ b i t , ( % s p )
fmovel ( % s p ) + ,% F P S R
frestore ( % s p ) +
unlk % a6
SAVE_ A L L _ I N T
GET_ C U R R E N T ( % d0 )
movel % s p ,% s p @- | stack frame pointer argument
bsrl t r a p _ c
addql #4 ,% s p
bral r e t _ f r o m _ e x c e p t i o n
|
| F- l i n e e x c e p t i o n
|
| A ' r e a l ' F - l i n e e x c e p t i o n i s o n e t h a t t h e F P S P i s n ' t s u p p o s e d t o
| handle. E . g . a n i n s t r u c t i o n w i t h a c o - p r o c e s s o r I D t h a t i s n o t 1 .
|
|
| xref f p s p _ f l i n e
.global real_fline
.global fline
fline :
jmp f p s p _ f l i n e
real_fline :
SAVE_ A L L _ I N T
GET_ C U R R E N T ( % d0 )
movel % s p ,% s p @- | stack frame pointer argument
bsrl t r a p _ c
addql #4 ,% s p
bral r e t _ f r o m _ e x c e p t i o n
|
| Unsupported d a t a t y p e e x c e p t i o n
|
| xref f p s p _ u n s u p p
.global real_unsupp
.global unsupp
unsupp :
jmp f p s p _ u n s u p p
real_unsupp :
link % a6 ,#- L O C A L _ S I Z E
fsave - ( % s p )
bclrb #E 1 ,E _ B Y T E ( % a6 ) | u n s u p p i s a l w a y s a n E 1 e x c e p t i o n
frestore ( % s p ) +
unlk % a6
SAVE_ A L L _ I N T
GET_ C U R R E N T ( % d0 )
movel % s p ,% s p @- | stack frame pointer argument
bsrl t r a p _ c
addql #4 ,% s p
bral r e t _ f r o m _ e x c e p t i o n
|
| Trace e x c e p t i o n
|
.global real_trace
real_trace :
|
bral t r a p
|
| fpsp_ f m t _ e r r o r - - - e x i t p o i n t f o r f r a m e f o r m a t e r r o r
|
| The f p u s t a c k f r a m e d o e s n o t m a t c h t h e f r a m e s e x i s t i n g
| or p l a n n e d a t t h e t i m e o f t h i s w r i t i n g . T h e f p s p i s
| unable t o h a n d l e f r a m e s i z e s n o t i n t h e f o l l o w i n g
| version : size p a i r s :
|
| { 4 0 6 0 , 4 1 6 0 } - busy f r a m e
| { 4 0 2 8 , 4 1 3 0 } - unimp f r a m e
| { 4 0 0 0 , 4 1 0 0 } - idle f r a m e
|
| This e n t r y p o i n t s i m p l y h o l d s a n f - l i n e i l l e g a l v a l u e .
| Replace t h i s w i t h a c a l l t o y o u r k e r n e l p a n i c c o d e o r
| code t o h a n d l e f u t u r e r e v i s i o n s o f t h e f p u .
|
.global fpsp_fmt_error
fpsp_fmt_error :
.long 0xf27f0000 | f- l i n e i l l e g a l
|
| fpsp_ d o n e - - - F P S P e x i t p o i n t
|
| The e x c e p t i o n h a s b e e n h a n d l e d b y t h e p a c k a g e a n d w e a r e r e a d y
| to r e t u r n t o u s e r m o d e , b u t t h e r e m a y b e O S s p e c i f i c c o d e
| to e x e c u t e b e f o r e w e d o . I f t h e r e i s , d o i t n o w .
|
|
.global fpsp_done
fpsp_done :
btst #0x5 ,% s p @ | supervisor bit set in saved SR?
beq . L n o t k e r n
rte
.Lnotkern :
SAVE_ A L L _ I N T
GET_ C U R R E N T ( % d0 )
2005-11-14 03:06:59 +03:00
| deliver s i g n a l s , r e s c h e d u l e e t c . .
jra r e t _ f r o m _ e x c e p t i o n
2005-04-17 02:20:36 +04:00
|
| mem_ w r i t e - - - w r i t e t o u s e r o r s u p e r v i s o r a d d r e s s s p a c e
|
| Writes t o m e m o r y w h i l e i n s u p e r v i s o r m o d e . c o p y o u t a c c o m p l i s h e s
| this v i a a ' m o v e s ' i n s t r u c t i o n . c o p y o u t i s a U N I X S V R 3 ( a n d l a t e r ) f u n c t i o n .
| If y o u d o n ' t h a v e c o p y o u t , u s e t h e l o c a l c o p y o f t h e f u n c t i o n b e l o w .
|
| a0 - s u p e r v i s o r s o u r c e a d d r e s s
| a1 - u s e r d e s t i n a t i o n a d d r e s s
| d0 - n u m b e r o f b y t e s t o w r i t e ( m a x i m u m c o u n t i s 1 2 )
|
| The s u p e r v i s o r s o u r c e a d d r e s s i s g u a r a n t e e d t o p o i n t i n t o t h e s u p e r v i s o r
| stack. T h e r e s u l t i s t h a t a U N I X
| process i s a l l o w e d t o s l e e p a s a c o n s e q u e n c e o f a p a g e f a u l t d u r i n g
| copyout. T h e p r o b a b i l i t y o f a p a g e f a u l t i s e x c e e d i n g l y s m a l l b e c a u s e
| the 6 8 0 4 0 a l w a y s r e a d s t h e d e s t i n a t i o n a d d r e s s a n d t h u s t h e p a g e
| faults s h o u l d h a v e a l r e a d y b e e n h a n d l e d .
|
| If t h e E X C _ S R s h o w s t h a t t h e e x c e p t i o n w a s f r o m s u p e r v i s o r s p a c e ,
| then j u s t d o a d u m b ( a n d s l o w ) m e m o r y m o v e . I n a U N I X e n v i r o n m e n t
| there s h o u l d n ' t b e a n y s u p e r v i s o r m o d e f l o a t i n g p o i n t e x c e p t i o n s .
|
.global mem_write
mem_write :
btstb #5 ,E X C _ S R ( % a6 ) | c h e c k f o r s u p e r v i s o r s t a t e
beqs u s e r _ w r i t e
super_write :
moveb ( % a0 ) + ,( % a1 ) +
subql #1 ,% d0
bnes s u p e r _ w r i t e
rts
user_write :
movel % d1 ,- ( % s p ) | p r e s e r v e d1 j u s t i n c a s e
movel % d0 ,- ( % s p )
movel % a1 ,- ( % s p )
movel % a0 ,- ( % s p )
jsr c o p y o u t
addw #12 ,% s p
movel ( % s p ) + ,% d1
rts
|
| mem_ r e a d - - - r e a d f r o m u s e r o r s u p e r v i s o r a d d r e s s s p a c e
|
| Reads f r o m m e m o r y w h i l e i n s u p e r v i s o r m o d e . c o p y i n a c c o m p l i s h e s
| this v i a a ' m o v e s ' i n s t r u c t i o n . c o p y i n i s a U N I X S V R 3 ( a n d l a t e r ) f u n c t i o n .
| If y o u d o n ' t h a v e c o p y i n , u s e t h e l o c a l c o p y o f t h e f u n c t i o n b e l o w .
|
| The F P S P c a l l s m e m _ r e a d t o r e a d t h e o r i g i n a l F - l i n e i n s t r u c t i o n i n o r d e r
| to e x t r a c t t h e d a t a r e g i s t e r n u m b e r w h e n t h e ' D n ' a d d r e s s i n g m o d e i s
| used.
|
| Input :
| a0 - u s e r s o u r c e a d d r e s s
| a1 - s u p e r v i s o r d e s t i n a t i o n a d d r e s s
| d0 - n u m b e r o f b y t e s t o r e a d ( m a x i m u m c o u n t i s 1 2 )
|
| Like m e m _ w r i t e , m e m _ r e a d a l w a y s r e a d s w i t h a s u p e r v i s o r
| destination a d d r e s s o n t h e s u p e r v i s o r s t a c k . A l s o l i k e m e m _ w r i t e ,
| the E X C _ S R i s c h e c k e d a n d a s i m p l e m e m o r y c o p y i s d o n e i f r e a d i n g
| from s u p e r v i s o r s p a c e i s i n d i c a t e d .
|
.global mem_read
mem_read :
btstb #5 ,E X C _ S R ( % a6 ) | c h e c k f o r s u p e r v i s o r s t a t e
beqs u s e r _ r e a d
super_read :
moveb ( % a0 ) + ,( % a1 ) +
subql #1 ,% d0
bnes s u p e r _ r e a d
rts
user_read :
movel % d1 ,- ( % s p ) | p r e s e r v e d1 j u s t i n c a s e
movel % d0 ,- ( % s p )
movel % a1 ,- ( % s p )
movel % a0 ,- ( % s p )
jsr c o p y i n
addw #12 ,% s p
movel ( % s p ) + ,% d1
rts
|
| Use t h e s e r o u t i n e s i f y o u r k e r n e l d o e s n ' t h a v e c o p y o u t / c o p y i n e q u i v a l e n t s .
| Assumes t h a t D 0 / D 1 / A 0 / A 1 a r e s c r a t c h r e g i s t e r s . c o p y o u t o v e r w r i t e s D F C ,
| and c o p y i n o v e r w r i t e s S F C .
|
copyout :
movel 4 ( % s p ) ,% a0 | s o u r c e
movel 8 ( % s p ) ,% a1 | d e s t i n a t i o n
movel 1 2 ( % s p ) ,% d0 | c o u n t
subl #1 ,% d0 | d e c c o u n t b y 1 f o r d b r a
movel #1 ,% d1
| DFC i s a l r e a d y s e t
| movec % d1 ,% D F C | s e t d f c f o r u s e r d a t a s p a c e
moreout :
moveb ( % a0 ) + ,% d1 | f e t c h s u p e r v i s o r b y t e
out_ea :
movesb % d1 ,( % a1 ) + | w r i t e u s e r b y t e
dbf % d0 ,m o r e o u t
rts
copyin :
movel 4 ( % s p ) ,% a0 | s o u r c e
movel 8 ( % s p ) ,% a1 | d e s t i n a t i o n
movel 1 2 ( % s p ) ,% d0 | c o u n t
subl #1 ,% d0 | d e c c o u n t b y 1 f o r d b r a
movel #1 ,% d1
| SFC i s a l r e a d y s e t
| movec % d1 ,% S F C | s e t s f c f o r u s e r s p a c e
morein :
in_ea :
movesb ( % a0 ) + ,% d1 | f e t c h u s e r b y t e
moveb % d1 ,( % a1 ) + | w r i t e s u p e r v i s o r b y t e
dbf % d0 ,m o r e i n
rts
.section .fixup , # alloc,#e x e c i n s t r
.even
1 :
jbra f p s p04 0 _ d i e
.section _ _ ex_ t a b l e ,#a l l o c
.align 4
.long in_ e a ,1 b
.long out_ e a ,1 b
| end