2005-04-16 15:20:36 -07:00
/ *
2014-08-21 22:10:31 +10:00
* entry. S - - n o n - m m u 6 8 0 0 0 i n t e r r u p t a n d e x c e p t i o n e n t r y p o i n t s
2005-04-16 15:20:36 -07:00
*
* 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
* /
# include < l i n u x / l i n k a g e . h >
# include < a s m / t h r e a d _ i n f o . h >
# include < a s m / u n i s t d . 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 / t r a p s . 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 >
.text
.globl system_call
.globl resume
.globl ret_from_exception
.globl ret_from_signal
.globl sys_call_table
.globl bad_interrupt
.globl inthandler1
.globl inthandler2
.globl inthandler3
.globl inthandler4
.globl inthandler5
.globl inthandler6
.globl inthandler7
badsys :
2009-09-20 21:32:32 +10:00
movel #- E N O S Y S , % s p @ ( P T _ O F F _ D 0 )
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
do_trace :
2010-08-17 18:52:39 +02:00
movel #- E N O S Y S , % s p @ ( P T _ O F F _ D 0 ) / * n e e d e d f o r s t r a c e * /
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
2009-09-20 21:32:32 +10:00
movel % s p @(PT_OFF_ORIG_D0),%d1
2005-04-16 15:20:36 -07:00
movel #- E N O S Y S , % d 0
cmpl #N R _ s y s c a l l s , % d 1
jcc 1 f
lsl #2 ,% d1
lea s y s _ c a l l _ t a b l e , % a0
jbsr % a0 @(%d1)
2010-08-17 18:52:39 +02:00
1 : 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
jra r e t _ f r o m _ e x c e p t i o n
ENTRY( s y s t e m _ c a l l )
2011-06-22 13:50:44 +10:00
SAVE_ A L L _ S Y S
2005-04-16 15:20:36 -07:00
/* save top of frame*/
2010-08-17 18:52:39 +02:00
pea % s p @
jbsr s e t _ e s p0
addql #4 ,% s p
2005-04-16 15:20:36 -07:00
2009-09-20 21:32:32 +10:00
movel % s p @(PT_OFF_ORIG_D0),%d0
2005-04-16 15:20:36 -07:00
movel % s p ,% d1 / * g e t t h r e a d _ i n f o p o i n t e r * /
2005-09-02 10:42:52 +10:00
andl #- T H R E A D _ S I Z E , % d 1
2005-04-16 15:20:36 -07:00
movel % d1 ,% a2
2011-03-29 15:55:36 +10:00
btst #( T I F _ S Y S C A L L _ T R A C E % 8 ) ,% a2 @(TINFO_FLAGS+(31-TIF_SYSCALL_TRACE)/8)
2005-04-16 15:20:36 -07:00
jne d o _ t r a c e
cmpl #N R _ s y s c a l l s , % d 0
jcc b a d s y s
lsl #2 ,% d0
lea s y s _ c a l l _ t a b l e ,% a0
movel % a0 @(%d0), %a0
jbsr % a0 @
2010-08-17 18:52:39 +02:00
movel % d0 ,% s p @(PT_OFF_D0) /* save the return value*/
2005-04-16 15:20:36 -07:00
ret_from_exception :
2010-08-17 18:52:39 +02: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 * /
Lkernel_return :
RESTORE_ A L L
Luser_return :
/* only allow interrupts when we are really the last one on the*/
/* kernel stack, otherwise stack overflow can occur during*/
/* heavy interrupt load*/
andw #A L L O W I N T , % s r
movel % s p ,% d1 / * g e t t h r e a d _ i n f o p o i n t e r * /
2005-09-02 10:42:52 +10:00
andl #- T H R E A D _ S I Z E , % d 1
2005-04-16 15:20:36 -07:00
movel % d1 ,% a2
2010-10-11 23:29:28 -04:00
1 :
2011-03-29 15:55:36 +10:00
move % a2 @(TINFO_FLAGS),%d1 /* thread_info->flags */
2005-04-16 15:20:36 -07:00
jne L w o r k _ t o _ d o
RESTORE_ A L L
Lwork_to_do :
2011-03-29 15:55:36 +10:00
movel % a2 @(TINFO_FLAGS),%d1 /* thread_info->flags */
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
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)
2012-04-24 01:46:23 -04:00
bsrw d o _ n o t i f y _ r e s u m e
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
jra 1 b
2005-04-16 15:20:36 -07:00
/ *
* This i s t h e m a i n i n t e r r u p t h a n d l e r , r e s p o n s i b l e f o r c a l l i n g p r o c e s s _ i n t ( )
* /
inthandler1 :
2011-06-22 13:50:44 +10:00
SAVE_ A L L _ I N T
2010-08-30 13:17:17 +02:00
movew % s p @(PT_OFF_FORMATVEC), %d0
2005-04-16 15:20:36 -07:00
and #0x3ff , % d0
movel % s p ,% s p @-
movel #65 ,% s p @- /* put vector # on stack*/
jbsr p r o c e s s _ i n t / * p r o c e s s t h e I R Q * /
3 : addql #8 ,% s p / * p o p p a r a m e t e r s o f f s t a c k * /
2013-11-11 21:01:03 +01: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
inthandler2 :
2011-06-22 13:50:44 +10:00
SAVE_ A L L _ I N T
2010-08-30 13:17:17 +02:00
movew % s p @(PT_OFF_FORMATVEC), %d0
2005-04-16 15:20:36 -07:00
and #0x3ff , % d0
movel % s p ,% s p @-
movel #66 ,% s p @- /* put vector # on stack*/
jbsr p r o c e s s _ i n t / * p r o c e s s t h e I R Q * /
3 : addql #8 ,% s p / * p o p p a r a m e t e r s o f f s t a c k * /
2013-11-11 21:01:03 +01: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
inthandler3 :
2011-06-22 13:50:44 +10:00
SAVE_ A L L _ I N T
2010-08-30 13:17:17 +02:00
movew % s p @(PT_OFF_FORMATVEC), %d0
2005-04-16 15:20:36 -07:00
and #0x3ff , % d0
movel % s p ,% s p @-
movel #67 ,% s p @- /* put vector # on stack*/
jbsr p r o c e s s _ i n t / * p r o c e s s t h e I R Q * /
3 : addql #8 ,% s p / * p o p p a r a m e t e r s o f f s t a c k * /
2013-11-11 21:01:03 +01: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
inthandler4 :
2011-06-22 13:50:44 +10:00
SAVE_ A L L _ I N T
2010-08-30 13:17:17 +02:00
movew % s p @(PT_OFF_FORMATVEC), %d0
2005-04-16 15:20:36 -07:00
and #0x3ff , % d0
movel % s p ,% s p @-
movel #68 ,% s p @- /* put vector # on stack*/
jbsr p r o c e s s _ i n t / * p r o c e s s t h e I R Q * /
3 : addql #8 ,% s p / * p o p p a r a m e t e r s o f f s t a c k * /
2013-11-11 21:01:03 +01: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
inthandler5 :
2011-06-22 13:50:44 +10:00
SAVE_ A L L _ I N T
2010-08-30 13:17:17 +02:00
movew % s p @(PT_OFF_FORMATVEC), %d0
2005-04-16 15:20:36 -07:00
and #0x3ff , % d0
movel % s p ,% s p @-
movel #69 ,% s p @- /* put vector # on stack*/
jbsr p r o c e s s _ i n t / * p r o c e s s t h e I R Q * /
3 : addql #8 ,% s p / * p o p p a r a m e t e r s o f f s t a c k * /
2013-11-11 21:01:03 +01: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
inthandler6 :
2011-06-22 13:50:44 +10:00
SAVE_ A L L _ I N T
2010-08-30 13:17:17 +02:00
movew % s p @(PT_OFF_FORMATVEC), %d0
2005-04-16 15:20:36 -07:00
and #0x3ff , % d0
movel % s p ,% s p @-
movel #70 ,% s p @- /* put vector # on stack*/
jbsr p r o c e s s _ i n t / * p r o c e s s t h e I R Q * /
3 : addql #8 ,% s p / * p o p p a r a m e t e r s o f f s t a c k * /
2013-11-11 21:01:03 +01: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
inthandler7 :
2011-06-22 13:50:44 +10:00
SAVE_ A L L _ I N T
2010-08-30 13:17:17 +02:00
movew % s p @(PT_OFF_FORMATVEC), %d0
2005-04-16 15:20:36 -07:00
and #0x3ff , % d0
movel % s p ,% s p @-
movel #71 ,% s p @- /* put vector # on stack*/
jbsr p r o c e s s _ i n t / * p r o c e s s t h e I R Q * /
3 : addql #8 ,% s p / * p o p p a r a m e t e r s o f f s t a c k * /
2013-11-11 21:01:03 +01: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
inthandler :
2011-06-22 13:50:44 +10:00
SAVE_ A L L _ I N T
2010-08-30 13:17:17 +02:00
movew % s p @(PT_OFF_FORMATVEC), %d0
2005-04-16 15:20:36 -07:00
and #0x3ff , % d0
movel % s p ,% s p @-
movel % d0 ,% s p @- /* put vector # on stack*/
jbsr p r o c e s s _ i n t / * p r o c e s s t h e I R Q * /
3 : addql #8 ,% s p / * p o p p a r a m e t e r s o f f s t a c k * /
2013-11-11 21:01:03 +01: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
/ *
* Handler f o r u n i n i t i a l i z e d a n d s p u r i o u s i n t e r r u p t s .
* /
ENTRY( b a d _ i n t e r r u p t )
2011-07-13 20:29:24 +02:00
addql #1 ,i r q _ e r r _ c o u n t
2005-04-16 15:20:36 -07:00
rte
/ *
* 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
2011-05-05 22:32:12 +10:00
* 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
2005-04-16 15:20:36 -07:00
* 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 .
* /
ENTRY( r e s u m e )
movel % a0 ,% d1 / * s a v e p r e v t h r e a d i n d1 * /
movew % s r ,% a0 @(TASK_THREAD+THREAD_SR) /* save sr */
SAVE_ S W I T C H _ S T A C K
movel % s p ,% a0 @(TASK_THREAD+THREAD_KSP) /* save kernel stack */
2011-05-05 22:32:12 +10:00
movel % u s p ,% a3 / * s a v e u s p * /
movel % a3 ,% a0 @(TASK_THREAD+THREAD_USP)
movel % a1 @(TASK_THREAD+THREAD_USP),%a3 /* restore user stack */
movel % a3 ,% u s p
2005-04-16 15:20:36 -07:00
movel % a1 @(TASK_THREAD+THREAD_KSP),%sp /* restore new thread stack */
RESTORE_ S W I T C H _ S T A C K
movew % a1 @(TASK_THREAD+THREAD_SR),%sr /* restore thread status reg */
rts