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 / 6 8 3 2 8 / 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
* /
# 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 / 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 ret_from_interrupt
.globl bad_interrupt
.globl inthandler1
.globl inthandler2
.globl inthandler3
.globl inthandler4
.globl inthandler5
.globl inthandler6
.globl inthandler7
badsys :
movel #- E N O S Y S , % s p @ ( P T _ D 0 )
jra r e t _ f r o m _ e x c e p t i o n
do_trace :
movel #- E N O S Y S , % s p @ ( P T _ D 0 ) / * n e e d e d f o r s t r a c e * /
subql #4 ,% s p
SAVE_ S W I T C H _ S T A C K
jbsr s y s c a l l _ t r a c e
RESTORE_ S W I T C H _ S T A C K
addql #4 ,% s p
movel % s p @(PT_ORIG_D0),%d1
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)
1 : movel % d0 ,% s p @(PT_D0) /* save the return value */
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
jbsr s y s c a l l _ t r a c e
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 )
SAVE_ A L L
/* save top of frame*/
pea % s p @
jbsr s e t _ e s p0
addql #4 ,% s p
movel % s p @(PT_ORIG_D0),%d0
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
btst #T I F _ S Y S C A L L _ T R A C E , % a 2 @(TI_FLAGS)
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 @
movel % d0 ,% s p @(PT_D0) /* save the return value*/
ret_from_exception :
btst #5 ,% s p @(PT_SR) /* check if returning to kernel*/
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
move % a2 @(TI_FLAGS),%d1 /* thread_info->flags */
andl #_ T I F _ W O R K _ M A S K , % d 1
jne L w o r k _ t o _ d o
RESTORE_ A L L
Lwork_to_do :
movel % a2 @(TI_FLAGS),%d1 /* thread_info->flags */
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)
clrl % s p @-
bsrw d o _ s i g n a l
addql #8 ,% s p
RESTORE_ S W I T C H _ S T A C K
addql #4 ,% s p
Lreturn :
RESTORE_ A L L
/ *
* 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 :
SAVE_ A L L
movew % s p @(PT_VECTOR), %d0
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 * /
bra r e t _ f r o m _ i n t e r r u p t
inthandler2 :
SAVE_ A L L
movew % s p @(PT_VECTOR), %d0
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 * /
bra r e t _ f r o m _ i n t e r r u p t
inthandler3 :
SAVE_ A L L
movew % s p @(PT_VECTOR), %d0
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 * /
bra r e t _ f r o m _ i n t e r r u p t
inthandler4 :
SAVE_ A L L
movew % s p @(PT_VECTOR), %d0
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 * /
bra r e t _ f r o m _ i n t e r r u p t
inthandler5 :
SAVE_ A L L
movew % s p @(PT_VECTOR), %d0
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 * /
bra r e t _ f r o m _ i n t e r r u p t
inthandler6 :
SAVE_ A L L
movew % s p @(PT_VECTOR), %d0
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 * /
bra r e t _ f r o m _ i n t e r r u p t
inthandler7 :
SAVE_ A L L
movew % s p @(PT_VECTOR), %d0
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 * /
bra r e t _ f r o m _ i n t e r r u p t
inthandler :
SAVE_ A L L
movew % s p @(PT_VECTOR), %d0
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 * /
bra r e t _ f r o m _ i n t e r r u p t
ret_from_interrupt :
jeq 1 f
2 :
RESTORE_ A L L
1 :
moveb % s p @(PT_SR), %d0
and #7 , % d0
jhi 2 b
/* check if we need to do software interrupts */
jeq r e t _ f r o m _ e x c e p t i o n
pea r e t _ f r o m _ e x c e p t i o n
jra d o _ s o f t i r q
/ *
* 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 )
addql #1 ,n u m _ s p u r i o u s
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
* 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 .
* /
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 */
movel % u s p ,% a2 / * s a v e u s p * /
movel % a2 ,% a0 @(TASK_THREAD+THREAD_USP)
SAVE_ S W I T C H _ S T A C K
movel % s p ,% a0 @(TASK_THREAD+THREAD_KSP) /* save kernel stack */
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 user stack */
movel % a0 ,% u s p
movew % a1 @(TASK_THREAD+THREAD_SR),%sr /* restore thread status reg */
rts