OpenCores
URL https://opencores.org/ocsvn/s1_core/s1_core/trunk

Subversion Repositories s1_core

[/] [s1_core/] [trunk/] [tests/] [boot/] [boot.s] - Rev 114

Compare with Previous | Blame | View Log

/*
 * S1 Core - Boot code
 *
 * Cutdown version from the original OpenSPARC T1:
 *
 *   $T1_ROOT/verif/diag/assembly/include/hred_reset_handler.s
 *
 * Main changes:
 * - L1 and L2 cache handling are not enabled;
 * - Interrupt Queues handling currently commented out since causes troubles in S1 Core.
 *
 * Sun Microsystems' copyright notices follow:
 */
 
/*
* ========== Copyright Header Begin ==========================================
* 
* OpenSPARC T1 Processor File: hred_reset_handler.s
* Copyright (c) 2006 Sun Microsystems, Inc.  All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES.
* 
* The above named program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License version 2 as published by the Free Software Foundation.
* 
* The above named program is distributed in the hope that it will be 
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
* General Public License for more details.
* 
* You should have received a copy of the GNU General Public
* License along with this work; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
* 
* ========== Copyright Header End ============================================
*/
 
	/* Base address for Power-On Reser is 0xFFF0000020, adding 8 NOPs to artificially create the 0x20 offset */
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
 
	/* Initialize windowed local, output and input GPRs */
	wrpr %g0, %g0, %cwp 		!! CWP = 0
	wrpr %g0, 0x6, %cansave 	!! CANSAVE = 6
	wrpr %g0, %g0, %canrestore 	!! CANRESTORE = 0
	wrpr %g0, %g0, %otherwin 	!! OTHERWIN = 0
	wrpr %g0, 0x7, %cleanwin 	!! CLEANWIN = 7
	wrpr %g0, 0x7, %wstate 		!! WSTATE = (b)000_111
	add %g0, 0x1, %l1 		!! l1 = 1
	add %g0, 0x1, %o1 		!! o1 = 1
	add %g0, 0x1, %i1 		!! i1 = 1
	add %l1, 0x1, %l2 		!! l1 = 2
	add %o1, 0x1, %o2 		!! o1 = 2
	add %i1, 0x1, %i2 		!! i1 = 2
	add %l2, 0x1, %l3 		!! l1 = 3
	add %o2, 0x1, %o3 		!! o1 = 3
	add %i2, 0x1, %i3 		!! i1 = 3
	nop; nop; nop; nop
 
	/* Set the LSU Diagnostic Register to enable all ways for L1-icache and L1-dcache and using the "random replacement" algorithm */
	clr %l1 			!! Clear l1
	mov 0x10, %g1
	stxa %l1, [%g1] (66) 		!! LSU_DIAG_REG = b00
 
	/* Set the LSU Control Register to enable L1-icache and L1-dcache */
!	mov 3, %l1
!	stxa %l1, [%g0] (69)
 
	/* Set hpstate.red = 0 and hpstate.enb = 1 */
	rdhpr %hpstate, %l1
	wrhpr %l1, 0x820, %hpstate
 
	/* Clear L1-icache and L1-dcache SFSR */
	mov 0x18, %g1
	stxa %g0, [%g0 + %g1] 0x50	!! IMMU Synchronous Fault Status (SFS) register=0
	stxa %g0, [%g0 + %g1] 0x58	!! DMMU Synchronous Fault Status (SFS) register=0
 
	/* SPARC Error Enable Reg. */
	!! in file defines.h constant cregs_sparc_error_en_reg_r64:=3
	!! so the effect should be "trap on correctable error" and "trap on uncorrectable error"
	or %g0, 0x3, %l1 		!! l1 = 3
	stxa %l1, [%g0] (75) 		!! SPARC_Error_Enable_reg = 3
 
	/* Set HTBA: HTBA[63:14] = 0x12 */
	mov 1, %g1 			!! g1 = 1
	sllx %g1, 18, %l1 		!! l1 = 40000
	sllx %g1, 15, %g1 		!! g1 = 8000
	or %l1, %g1, %l1 		!! l1 = 48000
	wrhpr %l1, %g0, %htba 		!! bits 63-14 select Hpriv trap vector
 
	/**************************************************/
	/* Instructions merged from file hboot_tlb_init.s */
	/**************************************************/
 
	/* Init all itlb entries */
	mov	0x30, %g1
	mov	%g0, %g2
itlb_init_loop:                  
        stxa	%g0, [%g1] 0x50  	!! IMMU TLB Tag Access register=0
        stxa	%g0, [%g2] 0x55  	!! IMMU TLB Data Access register=0, g2 values from 0x000 to 0x7f8
	add	%g2, 8, %g2    		!! increment the g2 register 8 bytes every time (64 bits)
	cmp	%g2, 0x200 		!! compare g2 with 512 (512*8=4096=0x1000), but max VA=0x7F8
	bne	itlb_init_loop  	!! if (g2!=512) then run another loop
	nop
 
	/* Init all dtlb entries */
        mov	0x30, %g1  
	mov	%g0, %g2
dtlb_init_loop:
        stxa	%g0, [%g1] 0x58  	!! DMMU TLB Tag Access register=0
        stxa	%g0, [%g2] 0x5d  	!! DMMU TLB Data Access register=0, g2 values from 0x000 to 0x7f8
	add	%g2, 8, %g2 		!! increment the g2 register 64 bits each time
	cmp	%g2, 0x200  		!! compare g2 with 512
	bne	dtlb_init_loop 		!! if (g2!=512) then run another loop
	nop
 
	/* Clear itlb/dtlb valid */
	stxa	%g0, [%g0] 0x60		!! ASI_ITLB_INVALIDATE_ALL(IMMU TLB Invalidate register)=0
	mov	0x8, %g1
	stxa	%g0, [%g0 + %g1] 0x60	!! ASI_DTLB_INVALIDATE_ALL(DMMU TLB Invalidate register)=0
 
	/********************************/
	/* End of inserted instructions */
	/********************************/
 
	/* Initialize primary context register = 0 */
	mov 0x8, %l1
	stxa %g0, [%l1] 0x21
	/* Initialize secondary context register = 0 */
	mov 0x10, %l1
	stxa %g0, [%l1] 0x21
 
	/* LSU_CTL_REG[3]=1 (DMMU enabled)
	   LSU_CTL_REG[2]=1 (IMMU enabled)
	   LSU_CTL_REG[1]=0 (L1-dcache disabled)
	   LSU_CTL_REG[0]=0 (L1-icache disabled) */
	mov 0xC, %l1 			!! all enabled
	stxa %l1, [%g0] (69)
 
	/* Jump to program in RAM */
	sethi %hi(0), %g1
	sethi %hi(0x40000), %g2 	!! Jump address in RAM
	mov %g1, %g1
	mov %g2, %g2
	sllx %g1, 0x20, %g1
	or %g2, %g1, %g2
 
	/* HTSTATE[TL=1] */
	rdhpr %hpstate, %g3
	wrpr 1, %tl 			!! current trap level = 1
	mov 0x0, %l1 			!! l1 = 0
	wrhpr %g3, %g0, %htstate 	!! reset HTSTATE reg that store hyperpriviliged state after a trap
	wrpr 0, %tl 			!! current trap level = 0 (No Trap)
	mov 0x0, %o0 			!! please don’t delete since used in customized IMMU miss trap
 
	/* Jump in RAM */
	jmp %g2 			!! jump to 0x40000
!!	wrhpr %g0, 0x804, %hpstate	!! ensure bit 11 of the HPSTATE register is set
	nop
	nop

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.