@ -33,12 +33,6 @@
# undef D E B U G
/* The size of a state save frame. */
# define S T A T E _ S A V E _ S I Z E ( P T _ S I Z E + S T A T E _ S A V E _ A R G _ S P A C E )
/* The offset of the struct pt_regs in a `state save frame' on the stack. */
# define P T O S T A T E _ S A V E _ A R G _ S P A C E / * 2 4 t h e s p a c e f o r a r g s * /
# ifdef D E B U G
/* Create space for syscalls counting. */
.section .data
@ -181,72 +175,72 @@ syscall_debug_table:
1 :
# define S A V E _ R E G S \
swi r2 , r1 , P T O + P T _ R 2 ; /* Save SDA */ \
swi r3 , r1 , P T O + P T _ R 3 ; \
swi r4 , r1 , P T O + P T _ R 4 ; \
swi r5 , r1 , P T O + P T _ R 5 ; \
swi r6 , r1 , P T O + P T _ R 6 ; \
swi r7 , r1 , P T O + P T _ R 7 ; \
swi r8 , r1 , P T O + P T _ R 8 ; \
swi r9 , r1 , P T O + P T _ R 9 ; \
swi r10 , r1 , P T O + P T _ R 1 0 ; \
swi r11 , r1 , P T O + P T _ R 1 1 ; /* save clobbered regs after rval */\
swi r12 , r1 , P T O + P T _ R 1 2 ; \
swi r13 , r1 , P T O + P T _ R 1 3 ; /* Save SDA2 */ \
swi r14 , r1 , P T O + P T _ P C ; /* PC, before IRQ/trap */ \
swi r15 , r1 , P T O + P T _ R 1 5 ; /* Save LP */ \
swi r16 , r1 , P T O + P T _ R 1 6 ; \
swi r17 , r1 , P T O + P T _ R 1 7 ; \
swi r18 , r1 , P T O + P T _ R 1 8 ; /* Save asm scratch reg */ \
swi r19 , r1 , P T O + P T _ R 1 9 ; \
swi r20 , r1 , P T O + P T _ R 2 0 ; \
swi r21 , r1 , P T O + P T _ R 2 1 ; \
swi r22 , r1 , P T O + P T _ R 2 2 ; \
swi r23 , r1 , P T O + P T _ R 2 3 ; \
swi r24 , r1 , P T O + P T _ R 2 4 ; \
swi r25 , r1 , P T O + P T _ R 2 5 ; \
swi r26 , r1 , P T O + P T _ R 2 6 ; \
swi r27 , r1 , P T O + P T _ R 2 7 ; \
swi r28 , r1 , P T O + P T _ R 2 8 ; \
swi r29 , r1 , P T O + P T _ R 2 9 ; \
swi r30 , r1 , P T O + P T _ R 3 0 ; \
swi r31 , r1 , P T O + P T _ R 3 1 ; /* Save current task reg */ \
swi r2 , r1 , P T _ R 2 ; /* Save SDA */ \
swi r3 , r1 , P T _ R 3 ; \
swi r4 , r1 , P T _ R 4 ; \
swi r5 , r1 , P T _ R 5 ; \
swi r6 , r1 , P T _ R 6 ; \
swi r7 , r1 , P T _ R 7 ; \
swi r8 , r1 , P T _ R 8 ; \
swi r9 , r1 , P T _ R 9 ; \
swi r10 , r1 , P T _ R 1 0 ; \
swi r11 , r1 , P T _ R 1 1 ; /* save clobbered regs after rval */\
swi r12 , r1 , P T _ R 1 2 ; \
swi r13 , r1 , P T _ R 1 3 ; /* Save SDA2 */ \
swi r14 , r1 , P T _ P C ; /* PC, before IRQ/trap */ \
swi r15 , r1 , P T _ R 1 5 ; /* Save LP */ \
swi r16 , r1 , P T _ R 1 6 ; \
swi r17 , r1 , P T _ R 1 7 ; \
swi r18 , r1 , P T _ R 1 8 ; /* Save asm scratch reg */ \
swi r19 , r1 , P T _ R 1 9 ; \
swi r20 , r1 , P T _ R 2 0 ; \
swi r21 , r1 , P T _ R 2 1 ; \
swi r22 , r1 , P T _ R 2 2 ; \
swi r23 , r1 , P T _ R 2 3 ; \
swi r24 , r1 , P T _ R 2 4 ; \
swi r25 , r1 , P T _ R 2 5 ; \
swi r26 , r1 , P T _ R 2 6 ; \
swi r27 , r1 , P T _ R 2 7 ; \
swi r28 , r1 , P T _ R 2 8 ; \
swi r29 , r1 , P T _ R 2 9 ; \
swi r30 , r1 , P T _ R 3 0 ; \
swi r31 , r1 , P T _ R 3 1 ; /* Save current task reg */ \
mfs r11 , r m s r ; /* save MSR */ \
swi r11 , r1 , P T O + P T _ M S R ;
swi r11 , r1 , P T _ M S R ;
# define R E S T O R E _ R E G S \
lwi r11 , r1 , P T O + P T _ M S R ; \
lwi r11 , r1 , P T _ M S R ; \
mts r m s r , r11 ; \
lwi r2 , r1 , P T O + P T _ R 2 ; /* restore SDA */ \
lwi r3 , r1 , P T O + P T _ R 3 ; \
lwi r4 , r1 , P T O + P T _ R 4 ; \
lwi r5 , r1 , P T O + P T _ R 5 ; \
lwi r6 , r1 , P T O + P T _ R 6 ; \
lwi r7 , r1 , P T O + P T _ R 7 ; \
lwi r8 , r1 , P T O + P T _ R 8 ; \
lwi r9 , r1 , P T O + P T _ R 9 ; \
lwi r10 , r1 , P T O + P T _ R 1 0 ; \
lwi r11 , r1 , P T O + P T _ R 1 1 ; /* restore clobbered regs after rval */\
lwi r12 , r1 , P T O + P T _ R 1 2 ; \
lwi r13 , r1 , P T O + P T _ R 1 3 ; /* restore SDA2 */ \
lwi r14 , r1 , P T O + P T _ P C ; /* RESTORE_LINK PC, before IRQ/trap */\
lwi r15 , r1 , P T O + P T _ R 1 5 ; /* restore LP */ \
lwi r16 , r1 , P T O + P T _ R 1 6 ; \
lwi r17 , r1 , P T O + P T _ R 1 7 ; \
lwi r18 , r1 , P T O + P T _ R 1 8 ; /* restore asm scratch reg */ \
lwi r19 , r1 , P T O + P T _ R 1 9 ; \
lwi r20 , r1 , P T O + P T _ R 2 0 ; \
lwi r21 , r1 , P T O + P T _ R 2 1 ; \
lwi r22 , r1 , P T O + P T _ R 2 2 ; \
lwi r23 , r1 , P T O + P T _ R 2 3 ; \
lwi r24 , r1 , P T O + P T _ R 2 4 ; \
lwi r25 , r1 , P T O + P T _ R 2 5 ; \
lwi r26 , r1 , P T O + P T _ R 2 6 ; \
lwi r27 , r1 , P T O + P T _ R 2 7 ; \
lwi r28 , r1 , P T O + P T _ R 2 8 ; \
lwi r29 , r1 , P T O + P T _ R 2 9 ; \
lwi r30 , r1 , P T O + P T _ R 3 0 ; \
lwi r31 , r1 , P T O + P T _ R 3 1 ; /* Restore cur task reg */
lwi r2 , r1 , P T _ R 2 ; /* restore SDA */ \
lwi r3 , r1 , P T _ R 3 ; \
lwi r4 , r1 , P T _ R 4 ; \
lwi r5 , r1 , P T _ R 5 ; \
lwi r6 , r1 , P T _ R 6 ; \
lwi r7 , r1 , P T _ R 7 ; \
lwi r8 , r1 , P T _ R 8 ; \
lwi r9 , r1 , P T _ R 9 ; \
lwi r10 , r1 , P T _ R 1 0 ; \
lwi r11 , r1 , P T _ R 1 1 ; /* restore clobbered regs after rval */\
lwi r12 , r1 , P T _ R 1 2 ; \
lwi r13 , r1 , P T _ R 1 3 ; /* restore SDA2 */ \
lwi r14 , r1 , P T _ P C ; /* RESTORE_LINK PC, before IRQ/trap */\
lwi r15 , r1 , P T _ R 1 5 ; /* restore LP */ \
lwi r16 , r1 , P T _ R 1 6 ; \
lwi r17 , r1 , P T _ R 1 7 ; \
lwi r18 , r1 , P T _ R 1 8 ; /* restore asm scratch reg */ \
lwi r19 , r1 , P T _ R 1 9 ; \
lwi r20 , r1 , P T _ R 2 0 ; \
lwi r21 , r1 , P T _ R 2 1 ; \
lwi r22 , r1 , P T _ R 2 2 ; \
lwi r23 , r1 , P T _ R 2 3 ; \
lwi r24 , r1 , P T _ R 2 4 ; \
lwi r25 , r1 , P T _ R 2 5 ; \
lwi r26 , r1 , P T _ R 2 6 ; \
lwi r27 , r1 , P T _ R 2 7 ; \
lwi r28 , r1 , P T _ R 2 8 ; \
lwi r29 , r1 , P T _ R 2 9 ; \
lwi r30 , r1 , P T _ R 3 0 ; \
lwi r31 , r1 , P T _ R 3 1 ; /* Restore cur task reg */
# define S A V E _ S T A T E \
swi r1 , r0 , T O P H Y S ( P E R _ C P U ( E N T R Y _ S P ) ) ; /* save stack */ \
@ -259,11 +253,11 @@ syscall_debug_table:
lwi r1 , r0 , T O P H Y S ( P E R _ C P U ( E N T R Y _ S P ) ) ; \
/* FIXME: I can add these two lines to one */ \
/* tophys(r1,r1); */ \
/* addik r1, r1, -STATE_SAVE_SIZE; */ \
addik r1 , r1 , C O N F I G _ K E R N E L _ B A S E _ A D D R - C O N F I G _ K E R N E L _ S T A R T - S T A T E _ S A V E _ S I Z E ; \
/* addik r1, r1, -PT_SIZE; */ \
addik r1 , r1 , C O N F I G _ K E R N E L _ B A S E _ A D D R - C O N F I G _ K E R N E L _ S T A R T - P T _ S I Z E ; \
SAVE_ R E G S \
brid 2 f ; \
swi r1 , r1 , P T O + P T _ M O D E ; \
swi r1 , r1 , P T _ M O D E ; \
1 : /* User-mode state save. */ \
lwi r1 , r0 , T O P H Y S ( P E R _ C P U ( C U R R E N T _ S A V E ) ) ; /* get saved current */\
tophys( r1 ,r1 ) ; \
@ -271,12 +265,12 @@ syscall_debug_table:
/* MS these three instructions can be added to one */ \
/* addik r1, r1, THREAD_SIZE; */ \
/* tophys(r1,r1); */ \
/* addik r1, r1, -STATE_SAVE _SIZE; */ \
addik r1 , r1 , T H R E A D _ S I Z E + C O N F I G _ K E R N E L _ B A S E _ A D D R - C O N F I G _ K E R N E L _ S T A R T - S T A T E _ S A V E _ S I Z E ; \
/* addik r1, r1, -PT _SIZE; */ \
addik r1 , r1 , T H R E A D _ S I Z E + C O N F I G _ K E R N E L _ B A S E _ A D D R - C O N F I G _ K E R N E L _ S T A R T - P T _ S I Z E ; \
SAVE_ R E G S \
lwi r11 , r0 , T O P H Y S ( P E R _ C P U ( E N T R Y _ S P ) ) ; \
swi r11 , r1 , P T O + P T _ R 1 ; /* Store user SP. */ \
swi r0 , r1 , P T O + P T _ M O D E ; /* Was in user-mode. */ \
swi r11 , r1 , P T _ R 1 ; /* Store user SP. */ \
swi r0 , r1 , P T _ M O D E ; /* Was in user-mode. */ \
/* MS: I am clearing UMS even in case when I come from kernel space */ \
clear_ u m s ; \
2 : lwi C U R R E N T _ T A S K , r0 , T O P H Y S ( P E R _ C P U ( C U R R E N T _ S A V E ) ) ;
@ -308,10 +302,10 @@ C_ENTRY(_user_exception):
lwi r1 , r0 , T O P H Y S ( P E R _ C P U ( E N T R Y _ S P ) ) ; /* Reload kernel stack-ptr*/
tophys( r1 ,r1 ) ;
addik r1 , r1 , - S T A T E _ S A V E _ S I Z E ; /* Make room on the stack. */
addik r1 , r1 , - P T _ S I Z E ; /* Make room on the stack. */
SAVE_ R E G S
swi r1 , r1 , P T O + P T _ M O D E ; /* pt_regs -> kernel mode */
swi r1 , r1 , P T _ M O D E ; /* pt_regs -> kernel mode */
brid 2 f ;
nop; /* Fill delay slot */
@ -324,18 +318,18 @@ C_ENTRY(_user_exception):
addik r1 , r1 , T H R E A D _ S I Z E ;
tophys( r1 ,r1 ) ;
addik r1 , r1 , - S T A T E _ S A V E _ S I Z E ; /* Make room on the stack. */
addik r1 , r1 , - P T _ S I Z E ; /* Make room on the stack. */
SAVE_ R E G S
swi r0 , r1 , P T O + P T _ R 3
swi r0 , r1 , P T O + P T _ R 4
swi r0 , r1 , P T _ R 3
swi r0 , r1 , P T _ R 4
swi r0 , r1 , P T O + P T _ M O D E ; /* Was in user-mode. */
swi r0 , r1 , P T _ M O D E ; /* Was in user-mode. */
lwi r11 , r0 , T O P H Y S ( P E R _ C P U ( E N T R Y _ S P ) ) ;
swi r11 , r1 , P T O + P T _ R 1 ; /* Store user SP. */
swi r11 , r1 , P T _ R 1 ; /* Store user SP. */
clear_ u m s ;
2 : lwi C U R R E N T _ T A S K , r0 , T O P H Y S ( P E R _ C P U ( C U R R E N T _ S A V E ) ) ;
/* Save away the syscall number. */
swi r12 , r1 , P T O + P T _ R 0 ;
swi r12 , r1 , P T _ R 0 ;
tovirt( r1 ,r1 )
/* where the trap should return need -8 to adjust for rtsd r15, 8*/
@ -354,18 +348,18 @@ C_ENTRY(_user_exception):
beqi r11 , 4 f
addik r3 , r0 , - E N O S Y S
swi r3 , r1 , P T O + P T _ R 3
swi r3 , r1 , P T _ R 3
brlid r15 , d o _ s y s c a l l _ t r a c e _ e n t e r
addik r5 , r1 , P T O + P T _ R 0
addik r5 , r1 , P T _ R 0
# do_ s y s c a l l _ t r a c e _ e n t e r r e t u r n s t h e n e w s y s c a l l n r .
addk r12 , r0 , r3
lwi r5 , r1 , P T O + P T _ R 5 ;
lwi r6 , r1 , P T O + P T _ R 6 ;
lwi r7 , r1 , P T O + P T _ R 7 ;
lwi r8 , r1 , P T O + P T _ R 8 ;
lwi r9 , r1 , P T O + P T _ R 9 ;
lwi r10 , r1 , P T O + P T _ R 1 0 ;
lwi r5 , r1 , P T _ R 5 ;
lwi r6 , r1 , P T _ R 6 ;
lwi r7 , r1 , P T _ R 7 ;
lwi r8 , r1 , P T _ R 8 ;
lwi r9 , r1 , P T _ R 9 ;
lwi r10 , r1 , P T _ R 1 0 ;
4 :
/ * Jump t o t h e a p p r o p r i a t e f u n c t i o n f o r t h e s y s t e m c a l l n u m b e r i n r12
* ( r1 2 i s n o t p r e s e r v e d ) , o r r e t u r n a n e r r o r i f r12 i s n o t v a l i d .
@ -404,10 +398,10 @@ C_ENTRY(_user_exception):
/* Entry point used to return from a syscall/trap */
/* We re-enable BIP bit before state restore */
C_ E N T R Y ( r e t _ f r o m _ t r a p ) :
swi r3 , r1 , P T O + P T _ R 3
swi r4 , r1 , P T O + P T _ R 4
swi r3 , r1 , P T _ R 3
swi r4 , r1 , P T _ R 4
lwi r11 , r1 , P T O + P T _ M O D E ;
lwi r11 , r1 , P T _ M O D E ;
/* See if returning to kernel mode, if so, skip resched &c. */
bnei r11 , 2 f ;
/ * We' r e r e t u r n i n g t o u s e r m o d e , s o c h e c k f o r v a r i o u s c o n d i t i o n s t h a t
@ -419,7 +413,7 @@ C_ENTRY(ret_from_trap):
beqi r11 , 1 f
brlid r15 , d o _ s y s c a l l _ t r a c e _ l e a v e
addik r5 , r1 , P T O + P T _ R 0
addik r5 , r1 , P T _ R 0
1 :
/ * We' r e r e t u r n i n g t o u s e r m o d e , s o c h e c k f o r v a r i o u s c o n d i t i o n s t h a t
* trigger r e s c h e d u l i n g . * /
@ -439,7 +433,7 @@ C_ENTRY(ret_from_trap):
andi r11 , r11 , _ T I F _ S I G P E N D I N G ;
beqi r11 , 1 f ; /* Signals to handle, handle them */
addik r5 , r1 , P T O ; /* Arg 1: struct pt_regs *regs */
addik r5 , r1 , 0 ; /* Arg 1: struct pt_regs *regs */
addi r7 , r0 , 1 ; /* Arg 3: int in_syscall */
bralid r15 , d o _ s i g n a l ; /* Handle any signals */
add r6 , r0 , r0 ; /* Arg 2: sigset_t *oldset */
@ -450,7 +444,7 @@ C_ENTRY(ret_from_trap):
VM_ O F F ;
tophys( r1 ,r1 ) ;
RESTORE_ R E G S ;
addik r1 , r1 , S T A T E _ S A V E _ S I Z E / * C l e a n u p s t a c k s p a c e . * /
addik r1 , r1 , P T _ S I Z E / * C l e a n u p s t a c k s p a c e . * /
lwi r1 , r1 , P T _ R 1 - P T _ S I Z E ;/* Restore user stack pointer. */
bri 6 f ;
@ -459,7 +453,7 @@ C_ENTRY(ret_from_trap):
VM_ O F F ;
tophys( r1 ,r1 ) ;
RESTORE_ R E G S ;
addik r1 , r1 , S T A T E _ S A V E _ S I Z E / * C l e a n u p s t a c k s p a c e . * /
addik r1 , r1 , P T _ S I Z E / * C l e a n u p s t a c k s p a c e . * /
tovirt( r1 ,r1 ) ;
6 :
TRAP_return : /* Make global symbol for debugging */
@ -472,8 +466,8 @@ TRAP_return: /* Make global symbol for debugging */
C_ E N T R Y ( s y s _ f o r k _ w r a p p e r ) :
addi r5 , r0 , S I G C H L D / * A r g 0 : f l a g s * /
lwi r6 , r1 , P T O + P T _ R 1 / * A r g 1 : c h i l d S P ( u s e p a r e n t ' s ) * /
addik r7 , r1 , P T O / * A r g 2 : p a r e n t c o n t e x t * /
lwi r6 , r1 , P T _ R 1 / * A r g 1 : c h i l d S P ( u s e p a r e n t ' s ) * /
addik r7 , r1 , 0 / * A r g 2 : p a r e n t c o n t e x t * /
add r8 . r0 , r0 / * A r g 3 : ( u n u s e d ) * /
add r9 , r0 , r0 ; /* Arg 4: (unused) */
brid d o _ f o r k / * D o r e a l w o r k ( t a i l - c a l l ) * /
@ -493,12 +487,12 @@ C_ENTRY(ret_from_fork):
C_ E N T R Y ( s y s _ v f o r k ) :
brid m i c r o b l a z e _ v f o r k / * D o r e a l w o r k ( t a i l - c a l l ) * /
addik r5 , r1 , P T O
addik r5 , r1 , 0
C_ E N T R Y ( s y s _ c l o n e ) :
bnei r6 , 1 f ; /* See if child SP arg (arg 1) is 0. */
lwi r6 , r1 , P T O + P T _ R 1 ; /* If so, use paret's stack ptr */
1 : addik r7 , r1 , P T O ; /* Arg 2: parent context */
lwi r6 , r1 , P T _ R 1 ; /* If so, use paret's stack ptr */
1 : addik r7 , r1 , 0 ; /* Arg 2: parent context */
add r8 , r0 , r0 ; /* Arg 3: (unused) */
add r9 , r0 , r0 ; /* Arg 4: (unused) */
brid d o _ f o r k / * D o r e a l w o r k ( t a i l - c a l l ) * /
@ -506,11 +500,11 @@ C_ENTRY(sys_clone):
C_ E N T R Y ( s y s _ e x e c v e ) :
brid m i c r o b l a z e _ e x e c v e ; /* Do real work (tail-call).*/
addik r8 , r1 , P T O ; /* add user context as 4th arg */
addik r8 , r1 , 0 ; /* add user context as 4th arg */
C_ E N T R Y ( s y s _ r t _ s i g r e t u r n _ w r a p p e r ) :
brid s y s _ r t _ s i g r e t u r n / * D o r e a l w o r k * /
addik r5 , r1 , P T O ; /* add user context as 1st arg */
addik r5 , r1 , 0 ; /* add user context as 1st arg */
/ *
* HW E X C E P T I O N r u t i n e s t a r t
@ -521,7 +515,7 @@ C_ENTRY(full_exception_trap):
addik r17 , r17 , - 4
SAVE_ S T A T E / * S a v e r e g i s t e r s * /
/* PC, before IRQ/trap - this is one instruction above */
swi r17 , r1 , P T O + P T _ P C ;
swi r17 , r1 , P T _ P C ;
tovirt( r1 ,r1 )
/ * FIXME t h i s c a n b e s t o r e d i r e c t l y i n P T _ E S R r e g .
* I t e s t e d i t b u t t h e r e i s a f a u l t * /
@ -531,7 +525,7 @@ C_ENTRY(full_exception_trap):
mfs r7 , r f s r ; /* save FSR */
mts r f s r , r0 ; /* Clear sticky fsr */
rted r0 , f u l l _ e x c e p t i o n
addik r5 , r1 , P T O / * p a r a m e t e r s t r u c t p t _ r e g s * r e g s * /
addik r5 , r1 , 0 / * p a r a m e t e r s t r u c t p t _ r e g s * r e g s * /
/ *
* Unaligned d a t a t r a p .
@ -557,14 +551,14 @@ C_ENTRY(unaligned_data_trap):
lwi r11 , r0 , T O P H Y S ( P E R _ C P U ( E N T R Y _ S P ) ) ;
SAVE_ S T A T E / * S a v e r e g i s t e r s . * /
/* PC, before IRQ/trap - this is one instruction above */
swi r17 , r1 , P T O + P T _ P C ;
swi r17 , r1 , P T _ P C ;
tovirt( r1 ,r1 )
/* where the trap should return need -8 to adjust for rtsd r15, 8 */
addik r15 , r0 , r e t _ f r o m _ e x c - 8
mfs r3 , r e s r / * E S R * /
mfs r4 , r e a r / * E A R * /
rtbd r0 , _ u n a l i g n e d _ d a t a _ e x c e p t i o n
addik r7 , r1 , P T O / * p a r a m e t e r s t r u c t p t _ r e g s * r e g s * /
addik r7 , r1 , 0 / * p a r a m e t e r s t r u c t p t _ r e g s * r e g s * /
/ *
* Page f a u l t t r a p s .
@ -587,30 +581,30 @@ C_ENTRY(unaligned_data_trap):
C_ E N T R Y ( p a g e _ f a u l t _ d a t a _ t r a p ) :
SAVE_ S T A T E / * S a v e r e g i s t e r s . * /
/* PC, before IRQ/trap - this is one instruction above */
swi r17 , r1 , P T O + P T _ P C ;
swi r17 , r1 , P T _ P C ;
tovirt( r1 ,r1 )
/* where the trap should return need -8 to adjust for rtsd r15, 8 */
addik r15 , r0 , r e t _ f r o m _ e x c - 8
mfs r6 , r e a r / * p a r a m e t e r u n s i g n e d l o n g a d d r e s s * /
mfs r7 , r e s r / * p a r a m e t e r u n s i g n e d l o n g e r r o r _ c o d e * /
rted r0 , d o _ p a g e _ f a u l t
addik r5 , r1 , P T O / * p a r a m e t e r s t r u c t p t _ r e g s * r e g s * /
addik r5 , r1 , 0 / * p a r a m e t e r s t r u c t p t _ r e g s * r e g s * /
C_ E N T R Y ( p a g e _ f a u l t _ i n s t r _ t r a p ) :
SAVE_ S T A T E / * S a v e r e g i s t e r s . * /
/* PC, before IRQ/trap - this is one instruction above */
swi r17 , r1 , P T O + P T _ P C ;
swi r17 , r1 , P T _ P C ;
tovirt( r1 ,r1 )
/* where the trap should return need -8 to adjust for rtsd r15, 8 */
addik r15 , r0 , r e t _ f r o m _ e x c - 8
mfs r6 , r e a r / * p a r a m e t e r u n s i g n e d l o n g a d d r e s s * /
ori r7 , r0 , 0 / * p a r a m e t e r u n s i g n e d l o n g e r r o r _ c o d e * /
rted r0 , d o _ p a g e _ f a u l t
addik r5 , r1 , P T O / * p a r a m e t e r s t r u c t p t _ r e g s * r e g s * /
addik r5 , r1 , 0 / * p a r a m e t e r s t r u c t p t _ r e g s * r e g s * /
/* Entry point used to return from an exception. */
C_ E N T R Y ( r e t _ f r o m _ e x c ) :
lwi r11 , r1 , P T O + P T _ M O D E ;
lwi r11 , r1 , P T _ M O D E ;
bnei r11 , 2 f ; /* See if returning to kernel mode, */
/* ... if so, skip resched &c. */
@ -642,7 +636,7 @@ C_ENTRY(ret_from_exc):
* complete r e g i s t e r s t a t e . H e r e w e s a v e a n y t h i n g n o t s a v e d b y
* the n o r m a l e n t r y s e q u e n c e , s o t h a t i t m a y b e s a f e l y r e s t o r e d
* ( in a p o s s i b l y m o d i f i e d f o r m ) a f t e r d o _ s i g n a l r e t u r n s . * /
addik r5 , r1 , P T O ; /* Arg 1: struct pt_regs *regs */
addik r5 , r1 , 0 ; /* Arg 1: struct pt_regs *regs */
addi r7 , r0 , 0 ; /* Arg 3: int in_syscall */
bralid r15 , d o _ s i g n a l ; /* Handle any signals */
add r6 , r0 , r0 ; /* Arg 2: sigset_t *oldset */
@ -654,7 +648,7 @@ C_ENTRY(ret_from_exc):
tophys( r1 ,r1 ) ;
RESTORE_ R E G S ;
addik r1 , r1 , S T A T E _ S A V E _ S I Z E / * C l e a n u p s t a c k s p a c e . * /
addik r1 , r1 , P T _ S I Z E / * C l e a n u p s t a c k s p a c e . * /
lwi r1 , r1 , P T _ R 1 - P T _ S I Z E ; /* Restore user stack pointer. */
bri 6 f ;
@ -663,7 +657,7 @@ C_ENTRY(ret_from_exc):
VM_ O F F ;
tophys( r1 ,r1 ) ;
RESTORE_ R E G S ;
addik r1 , r1 , S T A T E _ S A V E _ S I Z E / * C l e a n u p s t a c k s p a c e . * /
addik r1 , r1 , P T _ S I Z E / * C l e a n u p s t a c k s p a c e . * /
tovirt( r1 ,r1 ) ;
6 :
@ -696,10 +690,10 @@ C_ENTRY(_interrupt):
tophys( r1 ,r1 ) ; /* MS: I have in r1 physical address where stack is */
/* save registers */
/* MS: Make room on the stack -> activation record */
addik r1 , r1 , - S T A T E _ S A V E _ S I Z E ;
addik r1 , r1 , - P T _ S I Z E ;
SAVE_ R E G S
brid 2 f ;
swi r1 , r1 , P T O + P T _ M O D E ; /* 0 - user mode, 1 - kernel mode */
swi r1 , r1 , P T _ M O D E ; /* 0 - user mode, 1 - kernel mode */
1 :
/* User-mode state save. */
/* MS: get the saved current */
@ -709,23 +703,23 @@ C_ENTRY(_interrupt):
addik r1 , r1 , T H R E A D _ S I Z E ;
tophys( r1 ,r1 ) ;
/* save registers */
addik r1 , r1 , - S T A T E _ S A V E _ S I Z E ;
addik r1 , r1 , - P T _ S I Z E ;
SAVE_ R E G S
/* calculate mode */
swi r0 , r1 , P T O + P T _ M O D E ;
swi r0 , r1 , P T _ M O D E ;
lwi r11 , r0 , T O P H Y S ( P E R _ C P U ( E N T R Y _ S P ) ) ;
swi r11 , r1 , P T O + P T _ R 1 ;
swi r11 , r1 , P T _ R 1 ;
clear_ u m s ;
2 :
lwi C U R R E N T _ T A S K , r0 , T O P H Y S ( P E R _ C P U ( C U R R E N T _ S A V E ) ) ;
tovirt( r1 ,r1 )
addik r15 , r0 , i r q _ c a l l ;
irq_call : rtbd r0 , d o _ I R Q ;
addik r5 , r1 , P T O ;
addik r5 , r1 , 0 ;
/* MS: we are in virtual mode */
ret_from_irq :
lwi r11 , r1 , P T O + P T _ M O D E ;
lwi r11 , r1 , P T _ M O D E ;
bnei r11 , 2 f ;
lwi r11 , C U R R E N T _ T A S K , T S _ T H R E A D _ I N F O ;
@ -742,7 +736,7 @@ ret_from_irq:
beqid r11 , n o _ i n t r _ r e s c h e d
/* Handle a signal return; Pending signals should be in r18. */
addi r7 , r0 , 0 ; /* Arg 3: int in_syscall */
addik r5 , r1 , P T O ; /* Arg 1: struct pt_regs *regs */
addik r5 , r1 , 0 ; /* Arg 1: struct pt_regs *regs */
bralid r15 , d o _ s i g n a l ; /* Handle any signals */
add r6 , r0 , r0 ; /* Arg 2: sigset_t *oldset */
@ -754,7 +748,7 @@ no_intr_resched:
VM_ O F F ;
tophys( r1 ,r1 ) ;
RESTORE_ R E G S
addik r1 , r1 , S T A T E _ S A V E _ S I Z E / * M S : C l e a n u p s t a c k s p a c e . * /
addik r1 , r1 , P T _ S I Z E / * M S : C l e a n u p s t a c k s p a c e . * /
lwi r1 , r1 , P T _ R 1 - P T _ S I Z E ;
bri 6 f ;
/* MS: Return to kernel state. */
@ -782,7 +776,7 @@ restore:
VM_ O F F / * M S : t u r n o f f M M U * /
tophys( r1 ,r1 )
RESTORE_ R E G S
addik r1 , r1 , S T A T E _ S A V E _ S I Z E / * M S : C l e a n u p s t a c k s p a c e . * /
addik r1 , r1 , P T _ S I Z E / * M S : C l e a n u p s t a c k s p a c e . * /
tovirt( r1 ,r1 ) ;
6 :
IRQ_return : /* MS: Make global symbol for debugging */
@ -805,28 +799,28 @@ C_ENTRY(_debug_exception):
lwi r1 , r0 , T O P H Y S ( P E R _ C P U ( E N T R Y _ S P ) ) ; /* Reload kernel stack-ptr*/
/* BIP bit is set on entry, no interrupts can occur */
addik r1 , r1 , C O N F I G _ K E R N E L _ B A S E _ A D D R - C O N F I G _ K E R N E L _ S T A R T - S T A T E _ S A V E _ S I Z E ;
addik r1 , r1 , C O N F I G _ K E R N E L _ B A S E _ A D D R - C O N F I G _ K E R N E L _ S T A R T - P T _ S I Z E ;
SAVE_ R E G S ;
/* save all regs to pt_reg structure */
swi r0 , r1 , P T O + P T _ R 0 ; /* R0 must be saved too */
swi r14 , r1 , P T O + P T _ R 1 4 / * r e w r i t e s a v e d R 1 4 v a l u e * /
swi r16 , r1 , P T O + P T _ P C ; /* PC and r16 are the same */
swi r0 , r1 , P T _ R 0 ; /* R0 must be saved too */
swi r14 , r1 , P T _ R 1 4 / * r e w r i t e s a v e d R 1 4 v a l u e * /
swi r16 , r1 , P T _ P C ; /* PC and r16 are the same */
/* save special purpose registers to pt_regs */
mfs r11 , r e a r ;
swi r11 , r1 , P T O + P T _ E A R ;
swi r11 , r1 , P T _ E A R ;
mfs r11 , r e s r ;
swi r11 , r1 , P T O + P T _ E S R ;
swi r11 , r1 , P T _ E S R ;
mfs r11 , r f s r ;
swi r11 , r1 , P T O + P T _ F S R ;
swi r11 , r1 , P T _ F S R ;
/ * stack p o i n t e r i s i n p h y s i c a l a d d r e s s a t i t i s d e c r e a s e
* by S T A T E _ S A V E _ S I Z E b u t w e n e e d t o g e t c o r r e c t R 1 v a l u e * /
addik r11 , r1 , C O N F I G _ K E R N E L _ S T A R T - C O N F I G _ K E R N E L _ B A S E _ A D D R + S T A T E _ S A V E _ S I Z E ;
swi r11 , r1 , P T O + P T _ R 1
* by P T _ S I Z E b u t w e n e e d t o g e t c o r r e c t R 1 v a l u e * /
addik r11 , r1 , C O N F I G _ K E R N E L _ S T A R T - C O N F I G _ K E R N E L _ B A S E _ A D D R + P T _ S I Z E ;
swi r11 , r1 , P T _ R 1
/* MS: r31 - current pointer isn't changed */
tovirt( r1 ,r1 )
# ifdef C O N F I G _ K G D B
addi r5 , r1 , P T O / * p a s s p t _ r e g a d d r e s s a s t h e f i r s t a r g * /
addi r5 , r1 , 0 / * p a s s p t _ r e g a d d r e s s a s t h e f i r s t a r g * /
la r15 , r0 , d b t r a p _ c a l l ; /* return address */
rtbd r0 , m i c r o b l a z e _ k g d b _ b r e a k
nop;
@ -842,16 +836,16 @@ C_ENTRY(_debug_exception):
addik r1 , r1 , T H R E A D _ S I Z E ; /* calculate kernel stack pointer */
tophys( r1 ,r1 ) ;
addik r1 , r1 , - S T A T E _ S A V E _ S I Z E ; /* Make room on the stack. */
addik r1 , r1 , - P T _ S I Z E ; /* Make room on the stack. */
SAVE_ R E G S ;
swi r16 , r1 , P T O + P T _ P C ; /* Save LP */
swi r0 , r1 , P T O + P T _ M O D E ; /* Was in user-mode. */
swi r16 , r1 , P T _ P C ; /* Save LP */
swi r0 , r1 , P T _ M O D E ; /* Was in user-mode. */
lwi r11 , r0 , T O P H Y S ( P E R _ C P U ( E N T R Y _ S P ) ) ;
swi r11 , r1 , P T O + P T _ R 1 ; /* Store user SP. */
swi r11 , r1 , P T _ R 1 ; /* Store user SP. */
lwi C U R R E N T _ T A S K , r0 , T O P H Y S ( P E R _ C P U ( C U R R E N T _ S A V E ) ) ;
tovirt( r1 ,r1 )
set_ v m s ;
addik r5 , r1 , P T O ;
addik r5 , r1 , 0 ;
addik r15 , r0 , d b t r a p _ c a l l ;
dbtrap_call : /* Return point for kernel/user entry + 8 because of rtsd r15, 8 */
rtbd r0 , s w _ e x c e p t i o n
@ -859,7 +853,7 @@ dbtrap_call: /* Return point for kernel/user entry + 8 because of rtsd r15, 8 */
/* MS: The first instruction for the second part of the gdb/kgdb */
set_ b i p ; /* Ints masked for state restore */
lwi r11 , r1 , P T O + P T _ M O D E ;
lwi r11 , r1 , P T _ M O D E ;
bnei r11 , 2 f ;
/* MS: Return to user space - gdb */
/* Get current task ptr into r11 */
@ -878,7 +872,7 @@ dbtrap_call: /* Return point for kernel/user entry + 8 because of rtsd r15, 8 */
andi r11 , r11 , _ T I F _ S I G P E N D I N G ;
beqi r11 , 1 f ; /* Signals to handle, handle them */
addik r5 , r1 , P T O ; /* Arg 1: struct pt_regs *regs */
addik r5 , r1 , 0 ; /* Arg 1: struct pt_regs *regs */
addi r7 , r0 , 0 ; /* Arg 3: int in_syscall */
bralid r15 , d o _ s i g n a l ; /* Handle any signals */
add r6 , r0 , r0 ; /* Arg 2: sigset_t *oldset */
@ -889,7 +883,7 @@ dbtrap_call: /* Return point for kernel/user entry + 8 because of rtsd r15, 8 */
tophys( r1 ,r1 ) ;
/* MS: Restore all regs */
RESTORE_ R E G S
addik r1 , r1 , S T A T E _ S A V E _ S I Z E / * C l e a n u p s t a c k s p a c e * /
addik r1 , r1 , P T _ S I Z E / * C l e a n u p s t a c k s p a c e * /
lwi r1 , r1 , P T _ R 1 - P T _ S I Z E ; /* Restore user stack pointer */
DBTRAP_return_user : /* MS: Make global symbol for debugging */
rtbd r16 , 0 ; /* MS: Instructions to return from a debug trap */
@ -900,9 +894,9 @@ DBTRAP_return_user: /* MS: Make global symbol for debugging */
tophys( r1 ,r1 ) ;
/* MS: Restore all regs */
RESTORE_ R E G S
lwi r14 , r1 , P T O + P T _ R 1 4 ;
lwi r16 , r1 , P T O + P T _ P C ;
addik r1 , r1 , S T A T E _ S A V E _ S I Z E ; /* MS: Clean up stack space */
lwi r14 , r1 , P T _ R 1 4 ;
lwi r16 , r1 , P T _ P C ;
addik r1 , r1 , P T _ S I Z E ; /* MS: Clean up stack space */
tovirt( r1 ,r1 ) ;
DBTRAP_return_kernel : /* MS: Make global symbol for debugging */
rtbd r16 , 0 ; /* MS: Instructions to return from a debug trap */