2005-04-16 15:20:36 -07:00
/ *
* linux/ a r c h / m 6 8 k n o m m u / p l a t f o r m / 5 3 0 7 / e n t r y . S
*
2007-07-19 01:49:12 -07:00
* Copyright ( C ) 1 9 9 9 - 2 0 0 7 , G r e g U n g e r e r ( g e r g @snapgear.com)
2005-04-16 15:20:36 -07:00
* Copyright ( C ) 1 9 9 8 D . J e f f D i o n n e < j e f f @lineo.ca>,
* Kenneth A l b a n o w s k i < k j a h d s @kjahds.com>,
2006-06-26 11:37:57 +10:00
* Copyright ( C ) 2 0 0 0 L i n e o I n c . ( w w w . l i n e o . c o m )
* Copyright ( C ) 2 0 0 4 - 2 0 0 6 M a c q E l e c t r o n i q u e S A . ( w w w . m a c q e l . c o m )
2005-04-16 15:20:36 -07:00
*
* Based o n :
*
* linux/ a r c h / m 6 8 k / k e r n e l / e n t r y . S
*
* Copyright ( C ) 1 9 9 1 , 1 9 9 2 L i n u s T o r v a l d s
*
* This f i l e i s s u b j e c t t o t h e t e r m s a n d c o n d i t i o n s o f t h e G N U G e n e r a l P u b l i c
* License. S e e t h e f i l e R E A D M E . l e g a l i n t h e m a i n d i r e c t o r y o f t h i s a r c h i v e
* for m o r e d e t a i l s .
*
* Linux/ m 6 8 k s u p p o r t b y H a m i s h M a c d o n a l d
*
* 6 8 0 6 0 fixes b y J e s p e r S k o v
* ColdFire s u p p o r t b y G r e g U n g e r e r ( g e r g @snapgear.com)
* 5 3 0 7 fixes b y D a v i d W . M i l l e r
* linux 2 . 4 s u p p o r t D a v i d M c C u l l o u g h < d a v i d m @snapgear.com>
* Bug, s p e e d a n d m a i n t a i n a b i l i t y f i x e s b y P h i l i p p e D e M u y t e r < p h d m @macqel.be>
* /
# include < l i n u x / s y s . h >
# include < l i n u x / l i n k a g e . h >
# include < a s m / u n i s t d . h >
# include < a s m / t h r e a d _ i n f o . h >
# include < a s m / e r r n o . h >
# include < a s m / s e t u p . h >
# include < a s m / s e g m e n t . h >
# include < a s m / a s m - o f f s e t s . h >
# include < a s m / e n t r y . h >
2010-11-04 13:53:26 +10:00
# ifdef C O N F I G _ C O L D F I R E _ S W _ A 7
/ *
* Define s o f t w a r e c o p i e s o f t h e s u p e r v i s o r a n d u s e r s t a c k p o i n t e r s .
* /
2005-04-16 15:20:36 -07:00
.bss
sw_ksp :
.long 0
sw_usp :
.long 0
2010-11-04 13:53:26 +10:00
# endif / * C O N F I G _ C O L D F I R E _ S W _ A 7 * /
2005-04-16 15:20:36 -07:00
.text
.globl system_call
.globl resume
.globl ret_from_exception
.globl ret_from_signal
.globl sys_call_table
.globl inthandler
.globl fasthandler
2006-06-26 11:37:57 +10:00
enosys :
mov. l #s y s _ n i _ s y s c a l l , % d 3
bra 1 f
2005-04-16 15:20:36 -07:00
ENTRY( s y s t e m _ c a l l )
SAVE_ A L L
move #0x2000 ,% s r / * e n a b l e i n t r s a g a i n * /
2006-06-26 11:37:57 +10:00
cmpl #N R _ s y s c a l l s , % d 0
jcc e n o s y s
2005-04-16 15:20:36 -07:00
lea s y s _ c a l l _ t a b l e ,% a0
2006-06-26 11:37:57 +10:00
lsll #2 ,% d0 / * m o v e l % a0 @(%d0:l:4),%d3 */
movel % a0 @(%d0),%d3
jeq e n o s y s
2005-04-16 15:20:36 -07:00
2006-06-26 11:37:57 +10:00
1 :
2005-04-16 15:20:36 -07:00
movel % s p ,% d2 / * g e t t h r e a d _ i n f o p o i n t e r * /
andl #- T H R E A D _ S I Z E , % d 2 / * a t s t a r t o f k e r n e l s t a c k * /
movel % d2 ,% a0
2007-10-23 14:37:54 +10:00
movel % a0 @,%a1 /* save top of frame */
movel % s p ,% a1 @(TASK_THREAD+THREAD_ESP0)
2006-06-26 11:37:57 +10:00
btst #( T I F _ S Y S C A L L _ T R A C E % 8 ) ,% a0 @(TI_FLAGS+(31-TIF_SYSCALL_TRACE)/8)
2005-04-16 15:20:36 -07:00
bnes 1 f
movel % d3 ,% a0
jbsr % a0 @
2009-09-20 21:32:32 +10:00
movel % d0 ,% s p @(PT_OFF_D0) /* save the return value */
2005-04-16 15:20:36 -07:00
jra r e t _ f r o m _ e x c e p t i o n
1 :
2009-09-20 21:32:32 +10:00
movel #- E N O S Y S , % d 2 / * s t r a c e n e e d s - E N O S Y S i n P T _ O F F _ D 0 * /
movel % d2 ,P T _ O F F _ D 0 ( % s p ) / * o n s y s c a l l e n t r y * /
2005-04-16 15:20:36 -07:00
subql #4 ,% s p
SAVE_ S W I T C H _ S T A C K
2010-10-22 15:12:34 +10:00
jbsr s y s c a l l _ t r a c e _ e n t e r
2005-04-16 15:20:36 -07:00
RESTORE_ S W I T C H _ S T A C K
addql #4 ,% s p
movel % d3 ,% a0
jbsr % a0 @
2009-09-20 21:32:32 +10:00
movel % d0 ,% s p @(PT_OFF_D0) /* save the return value */
2005-04-16 15:20:36 -07:00
subql #4 ,% s p / * d u m m y r e t u r n a d d r e s s * /
SAVE_ S W I T C H _ S T A C K
2010-10-22 15:12:34 +10:00
jbsr s y s c a l l _ t r a c e _ l e a v e
2005-04-16 15:20:36 -07:00
ret_from_signal :
RESTORE_ S W I T C H _ S T A C K
addql #4 ,% s p
ret_from_exception :
2008-05-01 12:17:49 +10:00
move #0x2700 ,% s r / * d i s a b l e i n t r s * /
2009-09-20 21:32:32 +10:00
btst #5 ,% s p @(PT_OFF_SR) /* check if returning to kernel */
2005-04-16 15:20:36 -07:00
jeq L u s e r _ r e t u r n / * i f s o , s k i p r e s c h e d , s i g n a l s * /
2008-05-01 12:16:29 +10:00
# ifdef C O N F I G _ P R E E M P T
movel % s p ,% d1 / * g e t t h r e a d _ i n f o p o i n t e r * /
andl #- T H R E A D _ S I Z E , % d 1 / * a t b a s e o f k e r n e l s t a c k * /
movel % d1 ,% a0
movel % a0 @(TI_FLAGS),%d1 /* get thread_info->flags */
2010-09-13 14:10:45 +10:00
andl #( 1 < < T I F _ N E E D _ R E S C H E D ) ,% d1
2008-05-01 12:16:29 +10:00
jeq L k e r n e l _ r e t u r n
movel % a0 @(TI_PREEMPTCOUNT),%d1
cmpl #0 ,% d1
jne L k e r n e l _ r e t u r n
pea L k e r n e l _ r e t u r n
jmp p r e e m p t _ s c h e d u l e _ i r q / * p r e e m p t t h e k e r n e l * /
# endif
2005-04-16 15:20:36 -07:00
Lkernel_return :
moveml % s p @,%d1-%d5/%a0-%a2
lea % s p @(32),%sp /* space for 8 regs */
movel % s p @+,%d0
addql #4 ,% s p / * o r i g d0 * /
addl % s p @+,%sp /* stk adj */
rte
Luser_return :
movel % s p ,% d1 / * g e t t h r e a d _ i n f o p o i n t e r * /
andl #- T H R E A D _ S I Z E , % d 1 / * a t b a s e o f k e r n e l s t a c k * /
movel % d1 ,% a0
movel % a0 @(TI_FLAGS),%d1 /* get thread_info->flags */
jne L w o r k _ t o _ d o / * s t i l l w o r k t o d o * /
Lreturn :
2010-11-04 13:53:26 +10:00
RESTORE_ U S E R
2005-04-16 15:20:36 -07:00
Lwork_to_do :
movel % a0 @(TI_FLAGS),%d1 /* get thread_info->flags */
2008-05-01 12:17:49 +10:00
move #0x2000 ,% s r / * e n a b l e i n t r s a g a i n * /
2005-04-16 15:20:36 -07:00
btst #T I F _ N E E D _ R E S C H E D , % d 1
jne r e s c h e d u l e
/* GERG: do we need something here for TRACEing?? */
Lsignal_return :
subql #4 ,% s p / * d u m m y r e t u r n a d d r e s s * /
SAVE_ S W I T C H _ S T A C K
pea % s p @(SWITCH_STACK_SIZE)
jsr d o _ s i g n a l
2010-10-11 17:09:20 -04:00
addql #4 ,% s p
2005-04-16 15:20:36 -07:00
RESTORE_ S W I T C H _ S T A C K
addql #4 ,% s p
2010-10-11 23:29:28 -04:00
jmp L u s e r _ r e t u r n
2005-04-16 15:20:36 -07:00
/ *
* This i s t h e g e n e r i c i n t e r r u p t h a n d l e r ( f o r a l l h a r d w a r e i n t e r r u p t
2011-03-30 22:57:33 -03:00
* sources) . C a l l s u p t o h i g h l e v e l c o d e t o d o a l l t h e w o r k .
2005-04-16 15:20:36 -07:00
* /
ENTRY( i n t h a n d l e r )
SAVE_ A L L
moveq #- 1 ,% d0
2009-09-20 21:32:32 +10:00
movel % d0 ,% s p @(PT_OFF_ORIG_D0)
2005-04-16 15:20:36 -07:00
2009-09-20 21:32:32 +10:00
movew % s p @(PT_OFF_FORMATVEC),%d0 /* put exception # in d0 */
2005-04-16 15:20:36 -07:00
andl #0x03fc ,% d0 / * m a s k o u t v e c t o r o n l y * /
2007-07-19 01:49:12 -07:00
movel % s p ,% s p @- /* push regs arg */
2005-04-16 15:20:36 -07:00
lsrl #2 ,% d0 / * c a l c u l a t e r e a l v e c t o r # * /
2007-07-19 01:49:12 -07:00
movel % d0 ,% s p @- /* push vector number */
jbsr d o _ I R Q / * c a l l h i g h l e v e l i r q h a n d l e r * /
lea % s p @(8),%sp /* pop args off stack */
2005-04-16 15:20:36 -07:00
2010-11-03 16:21:05 +10:00
bra r e t _ f r o m _ e x c e p t i o n
2005-04-16 15:20:36 -07:00
/ *
* Beware - w h e n e n t e r i n g r e s u m e , p r e v ( t h e c u r r e n t t a s k ) i s
* in a0 , n e x t ( t h e n e w t a s k ) i s i n a1 ,s o d o n ' t c h a n g e t h e s e
* registers u n t i l t h e i r c o n t e n t s a r e n o l o n g e r n e e d e d .
2007-07-25 22:07:20 +10:00
* This i s a l w a y s c a l l e d i n s u p e r v i s o r m o d e , s o d o n ' t b o t h e r t o s a v e
* and r e s t o r e s r ; user's process sr is actually in the stack.
2005-04-16 15:20:36 -07:00
* /
ENTRY( r e s u m e )
movel % a0 , % d1 / * g e t p r e v t h r e a d i n d1 * /
2010-11-04 13:53:26 +10:00
RDUSP
movel % a2 ,% a0 @(TASK_THREAD+THREAD_USP)
2005-04-16 15:20:36 -07:00
SAVE_ S W I T C H _ S T A C K
movel % s p ,% a0 @(TASK_THREAD+THREAD_KSP) /* save kernel stack pointer */
movel % a1 @(TASK_THREAD+THREAD_KSP),%sp /* restore new thread stack */
RESTORE_ S W I T C H _ S T A C K
movel % a1 @(TASK_THREAD+THREAD_USP),%a0 /* restore thread user stack */
2010-11-04 13:53:26 +10:00
WRUSP
2005-04-16 15:20:36 -07:00
rts