@ -257,11 +257,18 @@ wiminit:
set W I M _ I N I T , % g 3
mov % g 3 , % w i m
stackp :
stackinit :
set C O N F I G _ S Y S _ I N I T _ S P _ O F F S E T , % f p
andn % f p , 0 x0 f , % f p
sub % f p , 6 4 , % s p
tbrinit :
set C O N F I G _ S Y S _ T E X T _ B A S E , % g 2
wr % g 0 , % g 2 , % t b r
nop
nop
nop
/* Obtain the address of _GLOBAL_OFFSET_TABLE_ */
SPARC_ P I C _ T H U N K _ C A L L ( l 7 )
@ -298,25 +305,50 @@ cpu_init_unreloc:
call c p u _ i n i t _ f
nop
/* un relocated start address of monitor */
# define T E X T _ S T A R T _ t e x t
board_init_unreloc :
call b o a r d _ i n i t _ f
clr % o 0 ! b o o t _ f l a g s
dead_unreloc :
mov 1 , % g 1 ! F o r G R M O N 2 t o e x i t n o r m a l l y .
ta 0 ! I f b o a r d _ i n i t _ f c a l l r e t u r n s . . ( u n l i k e l y )
nop
nop
ba d e a d _ u n r e l o c ! i n f i n t e l o o p
nop
/* un relocated end address of monitor */
# define D A T A _ E N D _ _ i n i t _ e n d
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/ * void r e l o c a t e _ c o d e ( a d d r _ s p , g d , a d d r _ m o n i )
*
* This " f u n c t i o n " d o e s n o t r e t u r n , i n s t e a d i t c o n t i n u e s i n R A M a f t e r
* relocating t h e m o n i t o r c o d e .
*
* % o0 = R e l o c a t e d s t a c k p o i n t e r
* % o1 = R e l o c a t e d g l o b a l d a t a p o i n t e r
* % o2 = R e l o c a t e d t e x t p o i n t e r
*
* % l7 = _ G L O B A L _ O F F S E T _ T A B L E _ a d d r e s s
* /
.globl relocate_code
.type relocate_ c o d e , #f u n c t i o n
.align 4
relocate_code :
! SPARC_ P I C _ T H U N K _ C A L L ( l 7 )
reloc :
SPARC_ L O A D _ A D D R E S S ( T E X T _ S T A R T , l 7 , g 2 )
SPARC_ L O A D _ A D D R E S S ( D A T A _ E N D , l 7 , g 3 )
set C O N F I G _ S Y S _ R E L O C _ M O N I T O R _ B A S E ,% g 4
reloc_loop :
ldd [ % g 2 ] ,% l 0
ldd [ % g 2 + 8 ] ,% l 2
std % l 0 ,[ % g 4 ]
std % l 2 ,[ % g 4 + 8 ]
inc 1 6 ,% g 2
subcc % g 3 ,% g 2 ,% g 0
bne r e l o c _ l o o p
inc 1 6 ,% g 4
SPARC_ L O A D _ A D D R E S S ( _ t e x t , l 7 , g 2 ) ! s t a r t a d d r e s s o f m o n i t o r
SPARC_ L O A D _ A D D R E S S ( _ _ i n i t _ e n d , l 7 , g 3 ) ! e n d a d d r e s s o f m o n i t o r
mov % o 2 , % g 4 ! r e l o c a t i o n a d d r e s s
sub % g 4 , % g 2 , % g 6 ! r e l o c a t i o n o f f s e t
/* copy .text & .data to relocated address */
10 : ldd [ % g 2 ] , % l 0
ldd [ % g 2 + 8 ] , % l 2
std % l 0 , [ % g 4 ]
std % l 2 , [ % g 4 + 8 ]
inc 1 6 , % g 2 ! s r c + = 1 6
cmp % g 2 , % g 3
bcs 1 0 b ! w h i l e ( s r c < e n d )
inc 1 6 , % g 4 ! d s t + = 1 6
clr % l 0
clr % l 1
@ -331,49 +363,42 @@ reloc_loop:
*
* /
/* clear the relocated .bss area */
clr_bss :
/* clear bss area (the relocated) */
SPARC_ L O A D _ A D D R E S S ( _ _ b s s _ s t a r t , l 7 , g 2 )
SPARC_ L O A D _ A D D R E S S ( _ _ b s s _ e n d , l 7 , g 3 )
sub % g 3 ,% g 2 ,% g 3
sub % g 3 ,% g 2 ,% g 3 ! l e n g t h o f . b s s a r e a
add % g 3 ,% g 4 ,% g 3
/* clearing 16byte a time ==> linker script need to align to 16 byte offset */
clr % g 1 / * s t d % g 0 u s e s g 0 a n d g 1 * /
/* clearing 16byte a time ==> linker script need to align to 16 byte offset */
clr_bss_16 :
std % g 0 ,[ % g 4 ]
std % g 0 ,[ % g 4 + 8 ]
inc 1 6 ,% g 4
cmp % g 3 ,% g 4
bne c l r _ b s s _ 1 6
20 :
std % g 0 , [ % g 4 ]
std % g 0 , [ % g 4 + 8 ]
inc 1 6 , % g 4 ! p t r + = 1 6
cmp % g 4 , % g 3
bcs 2 0 b ! w h i l e ( p t r < e n d )
nop
/* add offsets to GOT table */
/* add offsets to GOT table */
fixup_got :
SPARC_ L O A D _ A D D R E S S ( _ _ g o t _ s t a r t , l 7 , g 4 )
add % g 4 , % g 6 , % g 4
SPARC_ L O A D _ A D D R E S S ( _ _ g o t _ e n d , l 7 , g 3 )
/ *
* new g o t o f f s e t = ( o l d G O T - P T R ( r e a d w i t h l d ) -
* CONFIG_ S Y S _ R E L O C _ M O N I T O R _ B A S E ( f r o m d e f i n e ) ) +
* Destination A d d r e s s ( f r o m d e f i n e )
* /
set C O N F I G _ S Y S _ R E L O C _ M O N I T O R _ B A S E ,% g 2
SPARC_ L O A D _ A D D R E S S ( T E X T _ S T A R T , l 7 , g 1 )
add % g 4 ,% g 2 ,% g 4
sub % g 4 ,% g 1 ,% g 4
add % g 3 ,% g 2 ,% g 3
sub % g 3 ,% g 1 ,% g 3
sub % g 2 ,% g 1 ,% g 2 ! p r e p a r e r e g i s t e r w i t h ( n e w b a s e a d d r e s s ) -
! ( old b a s e a d d r e s s )
got_loop :
ld [ % g 4 ] ,% l 0 ! l o a d o l d G O T - P T R
add % l 0 ,% g 2 ,% l 0 ! i n c r e a s e w i t h ( n e w b a s e a d d r e s s ) -
! ( old b a s e )
st % l 0 ,[ % g 4 ]
inc 4 ,% g 4
cmp % g 3 ,% g 4
bne g o t _ l o o p
add % g 3 , % g 6 , % g 3
30 : ld [ % g 4 ] , % l 0
# ifdef C O N F I G _ R E L O C _ G O T _ S K I P _ N U L L
cmp % l 0 , 0
be 3 2 f
# endif
add % l 0 , % g 6 , % l 0 ! r e l o c a t e G O T p o i n t e r
st % l 0 , [ % g 4 ]
32 : inc 4 , % g 4 ! p t r + = 4
cmp % g 4 , % g 3
bcs 3 0 b ! w h i l e ( p t r < e n d )
nop
# if 0 / * F I X M E : R e l o c a t e d P R O M a d d r e s s s h o u l d b e c a l c u l a t e d ! * /
prom_relocate :
SPARC_ L O A D _ A D D R E S S ( _ _ p r o m _ s t a r t , l 7 , g 2 )
SPARC_ L O A D _ A D D R E S S ( _ _ p r o m _ e n d , l 7 , g 3 )
@ -389,35 +414,46 @@ prom_relocate_loop:
bne p r o m _ r e l o c a t e _ l o o p
inc 1 6 ,% g 4
# endif
! % o0 = s t a c k p o i n t e r ( r e l o c a t e d )
! % o1 = g l o b a l d a t a p o i n t e r ( r e l o c a t e d )
! % o2 = t e x t p o i n t e r ( r e l o c a t e d )
! % g6 = r e l o c a t i o n o f f s e t
! % l7 = _ G L O B A L _ O F F S E T _ T A B L E _
/ * Trap t a b l e h a s b e e n m o v e d , l e t s t e l l C P U a b o u t
* the n e w t r a p t a b l e a d d r e s s
* /
set C O N F I G _ S Y S _ R E L O C _ M O N I T O R _ B A S E , % g 2
wr % g 0 , % g 2 , % t b r
update_trap_table_address :
wr % g 0 , % o 2 , % t b r
nop
nop
nop
/* Call relocated init functions */
jump :
SPARC_ L O A D _ A D D R E S S ( c p u _ i n i t _ f2 , l 7 , o 1 )
set C O N F I G _ S Y S _ R E L O C _ M O N I T O R _ B A S E ,% o 2
add % o 1 ,% o 2 ,% o 1
sub % o 1 ,% g 1 ,% o 1
call % o 1
clr % o 0
update_stack_pointers :
mov % o 0 , % f p
andn % f p , 0 x0 f , % f p ! a l i g n t o 1 6 b y t e s
add % f p , - 6 4 , % f p ! m a k e s p a c e f o r a w i n d o w p u s h
mov % f p , % s p ! s e t u p s t a c k p o i n t e r
jump_board_init_r :
mov % o 1 , % o 0 ! r e l o c a t e d g l o b a l d a t a p o i n t e r
mov % o 2 , % o 1 ! r e l o c a t e d t e x t p o i n t e r
SPARC_ L O A D _ A D D R E S S ( b o a r d _ i n i t _ r , l 7 , o 3 )
add % o 3 , % g 6 , % o 3 ! a d d r e l o c a t i o n o f f s e t
call % o 3
nop
SPARC_ L O A D _ A D D R E S S ( b o a r d _ i n i t _ f , l 7 , o 1 )
set C O N F I G _ S Y S _ R E L O C _ M O N I T O R _ B A S E ,% o 2
SPARC_ L O A D _ A D D R E S S ( T E X T _ S T A R T , l 7 , g 1 )
add % o 1 ,% o 2 ,% o 1
sub % o 1 ,% g 1 ,% o 1
call % o 1
clr % o 0
dead :
mov 1 , % g 1 ! F o r G R M O N 2 t o e x i t n o r m a l l y .
ta 0 ! i f c a l l r e t u r n s . . ( u n l i k e l y )
nop
b d e a d ! i n f i n t e l o o p
nop
dead : ta 0 ! i f c a l l r e t u r n s . . .
nop
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/ * Interrupt h a n d l e r c a l l e r ,
* reg L 7 : i n t e r r u p t n u m b e r
@ -446,54 +482,56 @@ _irq_entry:
RESTORE_ A L L
! Window o v e r f l o w t r a p h a n d l e r .
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/ *
* Window o v e r f l o w t r a p h a n d l e r
* /
.global _window_overflow
_window_overflow :
mov % w i m , % l 3 ! C a l c u l a t e n e x t W I M
mov % g 1 , % l 7
srl % l 3 , 1 , % g 1
sll % l 3 , ( C O N F I G _ S Y S _ S P A R C _ N W I N D O W S - 1 ) , % l 4
or % l 4 , % g 1 , % g 1
mov % g 1 , % l 7
srl % l 3 , 1 , % g 1
sll % l 3 , ( C O N F I G _ S Y S _ S P A R C _ N W I N D O W S - 1 ) , % l 4
or % g 1 , % l 4 , % g 1
save ! G e t i n t o w i n d o w t o b e s a v e d .
mov % g 1 , % w i m
nop;
nop;
nop
st % l 0 , [ % s p + 0 ] ;
st % l 1 , [ % s p + 4 ] ;
st % l 2 , [ % s p + 8 ] ;
st % l 3 , [ % s p + 1 2 ] ;
st % l 4 , [ % s p + 1 6 ] ;
st % l 5 , [ % s p + 2 0 ] ;
st % l 6 , [ % s p + 2 4 ] ;
st % l 7 , [ % s p + 2 8 ] ;
st % i 0 , [ % s p + 3 2 ] ;
st % i 1 , [ % s p + 3 6 ] ;
st % i 2 , [ % s p + 4 0 ] ;
st % i 3 , [ % s p + 4 4 ] ;
st % i 4 , [ % s p + 4 8 ] ;
st % i 5 , [ % s p + 5 2 ] ;
st % i 6 , [ % s p + 5 6 ] ;
st % i 7 , [ % s p + 6 0 ] ;
mov % g 1 , % w i m
nop; nop; nop
st % l 0 , [ % s p + 0 ] ! S a v e w i n d o w t o t h e s t a c k
st % l 1 , [ % s p + 4 ]
st % l 2 , [ % s p + 8 ]
st % l 3 , [ % s p + 1 2 ]
st % l 4 , [ % s p + 1 6 ]
st % l 5 , [ % s p + 2 0 ]
st % l 6 , [ % s p + 2 4 ]
st % l 7 , [ % s p + 2 8 ]
st % i 0 , [ % s p + 3 2 ]
st % i 1 , [ % s p + 3 6 ]
st % i 2 , [ % s p + 4 0 ]
st % i 3 , [ % s p + 4 4 ]
st % i 4 , [ % s p + 4 8 ]
st % i 5 , [ % s p + 5 2 ]
st % i 6 , [ % s p + 5 6 ]
st % i 7 , [ % s p + 6 0 ]
restore ! G o b a c k t o t r a p w i n d o w .
mov % l 7 , % g 1
mov % l 7 , % g 1
jmp % l 1 ! R e - e x e c u t e s a v e .
rett % l 2
/* Window underflow trap handler. */
rett % l 2
/ *
* Window u n d e r f l o w t r a p h a n d l e r
* /
.global _window_underflow
_window_underflow :
mov % w i m , % l 3 ! C a l c u l a t e n e x t W I M
sll % l 3 , 1 , % l 4
srl % l 3 , ( C O N F I G _ S Y S _ S P A R C _ N W I N D O W S - 1 ) , % l 5
or % l 5 , % l 4 , % l 5
mov % l 5 , % w i m
mov % w i m , % l 3 ! C a l c u l a t e n e x t W I M
srl % l 3 , ( C O N F I G _ S Y S _ S P A R C _ N W I N D O W S - 1 ) , % l 5
sll % l 3 , 1 , % l 4
or % l 5 , % l 4 , % l 5
mov % l 5 , % w i m
nop; nop; nop
restore ! T w o r e s t o r e s t o g e t i n t o t h e
restore ! w i n d o w t o r e s t o r e
@ -516,9 +554,9 @@ _window_underflow:
save ! G e t b a c k t o t h e t r a p w i n d o w .
save
jmp % l 1 ! R e - e x e c u t e r e s t o r e .
rett % l 2
rett % l 2
retl
! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
_nmi_trap :
nop