2005-04-17 02:20:36 +04:00
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
| MOTOROLA M I C R O P R O C E S S O R & M E M O R Y T E C H N O L O G Y G R O U P
| M6 8 0 0 0 H i - P e r f o r m a n c e M i c r o p r o c e s s o r D i v i s i o n
| M6 8 0 6 0 S o f t w a r e P a c k a g e
| Production R e l e a s e P 1 . 0 0 - - O c t o b e r 1 0 , 1 9 9 4
|
2007-10-20 01:21:04 +04:00
| M6 8 0 6 0 S o f t w a r e P a c k a g e C o p y r i g h t © 1 9 9 3 , 1 9 9 4 M o t o r o l a I n c . A l l r i g h t s r e s e r v e d .
2005-04-17 02:20:36 +04:00
|
| THE S O F T W A R E i s p r o v i d e d o n a n " A S I S " b a s i s a n d w i t h o u t w a r r a n t y .
| To t h e m a x i m u m e x t e n t p e r m i t t e d b y a p p l i c a b l e l a w ,
| MOTOROLA D I S C L A I M S A L L W A R R A N T I E S W H E T H E R E X P R E S S O R I M P L I E D ,
| INCLUDING I M P L I E D W A R R A N T I E S O F M E R C H A N T A B I L I T Y O R F I T N E S S F O R A P A R T I C U L A R P U R P O S E
| and a n y w a r r a n t y a g a i n s t i n f r i n g e m e n t w i t h r e g a r d t o t h e S O F T W A R E
| ( INCLUDING A N Y M O D I F I E D V E R S I O N S T H E R E O F ) a n d a n y a c c o m p a n y i n g w r i t t e n m a t e r i a l s .
|
| To t h e m a x i m u m e x t e n t p e r m i t t e d b y a p p l i c a b l e l a w ,
| IN N O E V E N T S H A L L M O T O R O L A B E L I A B L E F O R A N Y D A M A G E S W H A T S O E V E R
| ( INCLUDING W I T H O U T L I M I T A T I O N , D A M A G E S F O R L O S S O F B U S I N E S S P R O F I T S ,
| BUSINESS I N T E R R U P T I O N , L O S S O F B U S I N E S S I N F O R M A T I O N , O R O T H E R P E C U N I A R Y L O S S )
| ARISING O F T H E U S E O R I N A B I L I T Y T O U S E T H E S O F T W A R E .
| Motorola a s s u m e s n o r e s p o n s i b i l i t y f o r t h e m a i n t e n a n c e a n d s u p p o r t o f t h e S O F T W A R E .
|
| You a r e h e r e b y g r a n t e d a c o p y r i g h t l i c e n s e t o u s e , m o d i f y , a n d d i s t r i b u t e t h e S O F T W A R E
| so l o n g a s t h i s e n t i r e n o t i c e i s r e t a i n e d w i t h o u t a l t e r a t i o n i n a n y m o d i f i e d a n d / o r
| redistributed v e r s i o n s , a n d t h a t s u c h m o d i f i e d v e r s i o n s a r e c l e a r l y i d e n t i f i e d a s s u c h .
| No l i c e n s e s a r e g r a n t e d b y i m p l i c a t i o n , e s t o p p e l o r o t h e r w i s e u n d e r a n y p a t e n t s
| or t r a d e m a r k s o f M o t o r o l a , I n c .
| ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
| os. s
|
| This f i l e c o n t a i n s :
| - example " C a l l - O u t " s r e q u i r e d b y b o t h t h e I S P a n d F P S P .
|
# include < l i n u x / l i n k a g e . h >
| # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
| EXAMPLE C A L L - O U T S #
| #
| _ 0 6 0 _ dmem_ w r i t e ( ) #
| _ 0 6 0 _ dmem_ r e a d ( ) #
| _ 0 6 0 _ imem_ r e a d ( ) #
| _ 0 6 0 _ dmem_ r e a d _ b y t e ( ) #
| _ 0 6 0 _ dmem_ r e a d _ w o r d ( ) #
| _ 0 6 0 _ dmem_ r e a d _ l o n g ( ) #
| _ 0 6 0 _ imem_ r e a d _ w o r d ( ) #
| _ 0 6 0 _ imem_ r e a d _ l o n g ( ) #
| _ 0 6 0 _ dmem_ w r i t e _ b y t e ( ) #
| _ 0 6 0 _ dmem_ w r i t e _ w o r d ( ) #
| _ 0 6 0 _ dmem_ w r i t e _ l o n g ( ) #
| #
| _ 0 6 0 _ real_ t r a c e ( ) #
| _ 0 6 0 _ real_ a c c e s s ( ) #
| # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
| Each I O r o u t i n e c h e c k s t o s e e i f t h e m e m o r y w r i t e / r e a d i s t o / f r o m u s e r
| or s u p e r v i s o r a p p l i c a t i o n s p a c e . T h e e x a m p l e s b e l o w u s e s i m p l e " m o v e "
| instructions f o r s u p e r v i s o r m o d e a p p l i c a t i o n s a n d c a l l _ c o p y i n ( ) / _ c o p y o u t ( )
| for u s e r m o d e a p p l i c a t i o n s .
| When i n s t a l l i n g t h e 0 6 0 S P , t h e _ c o p y i n ( ) / _ c o p y o u t ( ) e q u i v a l e n t s f o r a
| given o p e r a t i n g s y s t e m s h o u l d b e s u b s t i t u t e d .
|
| The a d d r e s s e s w i t h i n t h e 0 6 0 S P a r e g u a r a n t e e d t o b e o n t h e s t a c k .
| The r e s u l t i s t h a t U n i x p r o c e s s e s a r e 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
| of a p a g e f a u l t d u r i n g a _ c o p y o u t .
|
| Linux/ 6 8 k : T h e _ 0 6 0 _ [ i d ] m e m _ { r e a d ,w r i t e } _ { b y t e ,w o r d ,l o n g } f u n c t i o n s
| ( i. e . a l l t h e k n o w n l e n g t h < = 4 ) a r e i m p l e m e n t e d b y s i n g l e m o v e s
| statements i n s t e a d o f ( m o r e e x p e n s i v e ) c o p y { i n ,o u t } c a l l s , i f
| working i n u s e r s p a c e
|
| _ 0 6 0 _ dmem_ w r i t e ( ) :
|
| Writes t o d a t a 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 .
|
| INPUTS :
| 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
| 0 x4 ( % a6 ) ,b i t 5 - 1 = s u p e r v i s o r m o d e , 0 = u s e r m o d e
| OUTPUTS :
| d1 - 0 = s u c c e s s , ! 0 = f a i l u r e
|
.global _060_dmem_write
_060_dmem_write :
subq. l #1 ,% d0
btst #0x5 ,0 x4 ( % 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 :
move. b ( % a0 ) + ,( % a1 ) + | c o p y 1 b y t e
dbra % d0 ,s u p e r _ w r i t e | q u i t i f - - c t r < 0
clr. l % d1 | r e t u r n s u c c e s s
rts
user_write :
move. b ( % a0 ) + ,% d1 | c o p y 1 b y t e
copyoutae :
movs. b % d1 ,( % a1 ) +
dbra % d0 ,u s e r _ w r i t e | q u i t i f - - c t r < 0
clr. l % d1 | r e t u r n s u c c e s s
rts
|
| _ 0 6 0 _ imem_ r e a d ( ) , _ 0 6 0 _ d m e m _ r e a d ( ) :
|
| Reads f r o m d a t a / i n s t r u c t i o n 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 .
|
| INPUTS :
| 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
| 0 x4 ( % a6 ) ,b i t 5 - 1 = s u p e r v i s o r m o d e , 0 = u s e r m o d e
| OUTPUTS :
| d1 - 0 = s u c c e s s , ! 0 = f a i l u r e
|
.global _060_imem_read
.global _060_dmem_read
_060_imem_read :
_060_dmem_read :
subq. l #1 ,% d0
btst #0x5 ,0 x4 ( % 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 :
move. b ( % a0 ) + ,( % a1 ) + | c o p y 1 b y t e
dbra % d0 ,s u p e r _ r e a d | q u i t i f - - c t r < 0
clr. l % d1 | r e t u r n s u c c e s s
rts
user_read :
copyinae :
movs. b ( % a0 ) + ,% d1
move. b % d1 ,( % a1 ) + | c o p y 1 b y t e
dbra % d0 ,u s e r _ r e a d | q u i t i f - - c t r < 0
clr. l % d1 | r e t u r n s u c c e s s
rts
|
| _ 0 6 0 _ dmem_ r e a d _ b y t e ( ) :
|
| Read a d a t a b y t e f r o m u s e r m e m o r y .
|
| INPUTS :
| a0 - u s e r s o u r c e a d d r e s s
| 0 x4 ( % a6 ) ,b i t 5 - 1 = s u p e r v i s o r m o d e , 0 = u s e r m o d e
| OUTPUTS :
| d0 - d a t a b y t e i n d0
| d1 - 0 = s u c c e s s , ! 0 = f a i l u r e
|
.global _060_dmem_read_byte
_060_dmem_read_byte :
clr. l % d0 | c l e a r w h o l e l o n g w o r d
clr. l % d1 | a s s u m e s u c c e s s
btst #0x5 ,0 x4 ( % a6 ) | c h e c k f o r s u p e r v i s o r s t a t e
bnes d m r b s | s u p e r v i s o r
dmrbuae : movs. b ( % a0 ) ,% d0 | f e t c h u s e r b y t e
rts
dmrbs : move. b ( % a0 ) ,% d0 | f e t c h s u p e r b y t e
rts
|
| _ 0 6 0 _ dmem_ r e a d _ w o r d ( ) :
|
| Read a d a t a w o r d f r o m u s e r m e m o r y .
|
| INPUTS :
| a0 - u s e r s o u r c e a d d r e s s
| 0 x4 ( % a6 ) ,b i t 5 - 1 = s u p e r v i s o r m o d e , 0 = u s e r m o d e
| OUTPUTS :
| d0 - d a t a w o r d i n d0
| d1 - 0 = s u c c e s s , ! 0 = f a i l u r e
|
| _ 0 6 0 _ imem_ r e a d _ w o r d ( ) :
|
| Read a n i n s t r u c t i o n w o r d f r o m u s e r m e m o r y .
|
| INPUTS :
| a0 - u s e r s o u r c e a d d r e s s
| 0 x4 ( % a6 ) ,b i t 5 - 1 = s u p e r v i s o r m o d e , 0 = u s e r m o d e
| OUTPUTS :
| d0 - i n s t r u c t i o n w o r d i n d0
| d1 - 0 = s u c c e s s , ! 0 = f a i l u r e
|
.global _060_dmem_read_word
.global _060_imem_read_word
_060_dmem_read_word :
_060_imem_read_word :
clr. l % d1 | a s s u m e s u c c e s s
clr. l % d0 | c l e a r w h o l e l o n g w o r d
btst #0x5 ,0 x4 ( % a6 ) | c h e c k f o r s u p e r v i s o r s t a t e
bnes d m r w s | s u p e r v i s o r
dmrwuae : movs. w ( % a0 ) , % d0 | f e t c h u s e r w o r d
rts
dmrws : move. w ( % a0 ) , % d0 | f e t c h s u p e r w o r d
rts
|
| _ 0 6 0 _ dmem_ r e a d _ l o n g ( ) :
|
|
| INPUTS :
| a0 - u s e r s o u r c e a d d r e s s
| 0 x4 ( % a6 ) ,b i t 5 - 1 = s u p e r v i s o r m o d e , 0 = u s e r m o d e
| OUTPUTS :
| d0 - d a t a l o n g w o r d i n d0
| d1 - 0 = s u c c e s s , ! 0 = f a i l u r e
|
| _ 0 6 0 _ imem_ r e a d _ l o n g ( ) :
|
| Read a n i n s t r u c t i o n l o n g w o r d f r o m u s e r m e m o r y .
|
| INPUTS :
| a0 - u s e r s o u r c e a d d r e s s
| 0 x4 ( % a6 ) ,b i t 5 - 1 = s u p e r v i s o r m o d e , 0 = u s e r m o d e
| OUTPUTS :
| d0 - i n s t r u c t i o n l o n g w o r d i n d0
| d1 - 0 = s u c c e s s , ! 0 = f a i l u r e
|
.global _060_dmem_read_long
.global _060_imem_read_long
_060_dmem_read_long :
_060_imem_read_long :
clr. l % d1 | a s s u m e s u c c e s s
btst #0x5 ,0 x4 ( % a6 ) | c h e c k f o r s u p e r v i s o r s t a t e
bnes d m r l s | s u p e r v i s o r
dmrluae : movs. l ( % a0 ) ,% d0 | f e t c h u s e r l o n g w o r d
rts
dmrls : move. l ( % a0 ) ,% d0 | f e t c h s u p e r l o n g w o r d
rts
|
| _ 0 6 0 _ dmem_ w r i t e _ b y t e ( ) :
|
| Write a d a t a b y t e t o u s e r m e m o r y .
|
| INPUTS :
| a0 - u s e r d e s t i n a t i o n a d d r e s s
| d0 - d a t a b y t e i n d0
| 0 x4 ( % a6 ) ,b i t 5 - 1 = s u p e r v i s o r m o d e , 0 = u s e r m o d e
| OUTPUTS :
| d1 - 0 = s u c c e s s , ! 0 = f a i l u r e
|
.global _060_dmem_write_byte
_060_dmem_write_byte :
clr. l % d1 | a s s u m e s u c c e s s
btst #0x5 ,0 x4 ( % a6 ) | c h e c k f o r s u p e r v i s o r s t a t e
bnes d m w b s | s u p e r v i s o r
dmwbuae : movs. b % d0 ,( % a0 ) | s t o r e u s e r b y t e
rts
dmwbs : move. b % d0 ,( % a0 ) | s t o r e s u p e r b y t e
rts
|
| _ 0 6 0 _ dmem_ w r i t e _ w o r d ( ) :
|
| Write a d a t a w o r d t o u s e r m e m o r y .
|
| INPUTS :
| a0 - u s e r d e s t i n a t i o n a d d r e s s
| d0 - d a t a w o r d i n d0
| 0 x4 ( % a6 ) ,b i t 5 - 1 = s u p e r v i s o r m o d e , 0 = u s e r m o d e
| OUTPUTS :
| d1 - 0 = s u c c e s s , ! 0 = f a i l u r e
|
.global _060_dmem_write_word
_060_dmem_write_word :
clr. l % d1 | a s s u m e s u c c e s s
btst #0x5 ,0 x4 ( % a6 ) | c h e c k f o r s u p e r v i s o r s t a t e
bnes d m w w s | s u p e r v i s o r
dmwwu :
dmwwuae : movs. w % d0 ,( % a0 ) | s t o r e u s e r w o r d
bras d m w w r
dmwws : move. w % d0 ,( % a0 ) | s t o r e s u p e r w o r d
dmwwr : clr. l % d1 | r e t u r n s u c c e s s
rts
|
| _ 0 6 0 _ dmem_ w r i t e _ l o n g ( ) :
|
| Write a d a t a l o n g w o r d t o u s e r m e m o r y .
|
| INPUTS :
| a0 - u s e r d e s t i n a t i o n a d d r e s s
| d0 - d a t a l o n g w o r d i n d0
| 0 x4 ( % a6 ) ,b i t 5 - 1 = s u p e r v i s o r m o d e , 0 = u s e r m o d e
| OUTPUTS :
| d1 - 0 = s u c c e s s , ! 0 = f a i l u r e
|
.global _060_dmem_write_long
_060_dmem_write_long :
clr. l % d1 | a s s u m e s u c c e s s
btst #0x5 ,0 x4 ( % a6 ) | c h e c k f o r s u p e r v i s o r s t a t e
bnes d m w l s | s u p e r v i s o r
dmwluae : movs. l % d0 ,( % a0 ) | s t o r e u s e r l o n g w o r d
rts
dmwls : move. l % d0 ,( % a0 ) | s t o r e s u p e r l o n g w o r d
rts
# if 0
| # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
| 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 . T h e _ c o p y i n / _ c o p y o u t
| below a s s u m e t h a t t h e S F C / D F C h a v e b e e n s e t p r e v i o u s l y .
|
| Linux/ 6 8 k : T h e s e a r e b a s i c a l l y n o n - i n l i n e d v e r s i o n s o f
| memcpy_ { t o ,f r o m } f s , b u t w i t h o u t l o n g - t r a n s f e r o p t i m i z a t i o n
| Note : Assumed t h a t S F C / D F C a r e p o i n t i n g c o r r e c t l y t o u s e r d a t a
| space. . . S h o u l d b e r i g h t , o r a r e t h e r e a n y e x c e p t i o n s ?
|
| int _ c o p y o u t ( s u p e r v i s o r _ a d d r , u s e r _ a d d r , n b y t e s )
|
.global _copyout
_copyout :
move. l 4 ( % s p ) ,% a0 | s o u r c e
move. l 8 ( % s p ) ,% a1 | d e s t i n a t i o n
move. l 1 2 ( % s p ) ,% d0 | c o u n t
subq. l #1 ,% d0
moreout :
move. b ( % a0 ) + ,% d1 | f e t c h s u p e r v i s o r b y t e
copyoutae :
movs. b % d1 ,( % a1 ) + | s t o r e u s e r b y t e
dbra % d0 ,m o r e o u t | a r e w e t h r o u g h y e t ?
moveq #0 ,% d0 | r e t u r n s u c c e s s
rts
|
| int _ c o p y i n ( u s e r _ a d d r , s u p e r v i s o r _ a d d r , n b y t e s )
|
.global _copyin
_copyin :
move. l 4 ( % s p ) ,% a0 | s o u r c e
move. l 8 ( % s p ) ,% a1 | d e s t i n a t i o n
move. l 1 2 ( % s p ) ,% d0 | c o u n t
subq. l #1 ,% d0
morein :
copyinae :
movs. b ( % a0 ) + ,% d1 | f e t c h u s e r b y t e
move. b % d1 ,( % a1 ) + | w r i t e s u p e r v i s o r b y t e
dbra % d0 ,m o r e i n | a r e w e t h r o u g h y e t ?
moveq #0 ,% d0 | r e t u r n s u c c e s s
rts
# endif
| # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
| _ 0 6 0 _ real_ t r a c e ( ) :
|
| This i s t h e e x i t p o i n t f o r t h e 0 6 0 F P S P w h e n a n i n s t r u c t i o n i s b e i n g t r a c e d
| and t h e r e a r e n o o t h e r h i g h e r p r i o r i t y e x c e p t i o n s p e n d i n g f o r t h i s i n s t r u c t i o n
| or t h e y h a v e a l r e a d y b e e n p r o c e s s e d .
|
| The s a m p l e c o d e b e l o w s i m p l y e x e c u t e s a n " r t e " .
|
.global _060_real_trace
_060_real_trace :
bral t r a p
|
| _ 0 6 0 _ real_ a c c e s s ( ) :
|
| This i s t h e e x i t p o i n t f o r t h e 0 6 0 F P S P w h e n a n a c c e s s e r r o r e x c e p t i o n
| is e n c o u n t e r e d . T h e r o u t i n e b e l o w s h o u l d p o i n t t o t h e o p e r a t i n g s y s t e m
| handler f o r a c c e s s e r r o r e x c e p t i o n s . T h e e x c e p t i o n s t a c k f r a m e i s a n
| 8 - word a c c e s s e r r o r f r a m e .
|
| The s a m p l e r o u t i n e b e l o w s i m p l y e x e c u t e s a n " r t e " i n s t r u c t i o n w h i c h
| is m o s t l i k e l y t h e i n c o r r e c t t h i n g t o d o a n d c o u l d p u t t h e s y s t e m
| into a n i n f i n i t e l o o p .
|
.global _060_real_access
_060_real_access :
bral b u s e r r
| Execption h a n d l i n g f o r m o v s a c c e s s t o i l l e g a l m e m o r y
.section .fixup , # alloc,#e x e c i n s t r
.even
1 : moveq #- 1 ,% d1
rts
.section _ _ ex_ t a b l e ,#a l l o c
.align 4
.long dmrbuae,1 b
.long dmrwuae,1 b
.long dmrluae,1 b
.long dmwbuae,1 b
.long dmwwuae,1 b
.long dmwluae,1 b
.long copyoutae,1 b
.long copyinae,1 b
.text