mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 20:12:43 +00:00 
			
		
		
		
	 d0e3065ced
			
		
	
	
		d0e3065ced
		
	
	
	
	
		
			
			Multiple fields in sstatus are defined as WPRI "Reserved Writes Preserve Values, Reads Ignore Values", which means we have to preserve their values when writing to other fields in the same CSR. We don't really need to touch any fields except SIE. Interrupts are probably already disabled, but just to be safe, disable them explicitly.
		
			
				
	
	
		
			74 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2023, Sönke Holz <sholz830@gmail.com>
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
| // In a specially-named text section so that the linker script can put it first in .text.
 | |
| .section ".text.first"
 | |
| 
 | |
| .global start
 | |
| .type start, @function
 | |
| start:
 | |
|   // We expect that only one hart jumps here and that we are running in supervisor mode.
 | |
|   // We also expect that an implementation of the RISC-V Supervisor Binary Interface is available.
 | |
| 
 | |
|   // Don't touch a0/a1 as we expect those registers to contain the hart ID
 | |
|   // and a pointer to the Flattened Fevice Tree.
 | |
| 
 | |
|   // Clear sstatus.SIE, which disables all interrupts in supervisor mode.
 | |
|   csrci sstatus, 1 << 1
 | |
| 
 | |
|   // Also, disable all interrupts sources and mark them as non-pending.
 | |
|   csrw sie, zero
 | |
|   csrw sip, zero
 | |
| 
 | |
|   // TODO: maybe load the gp register here?
 | |
| 
 | |
|   // Clear the BSS.
 | |
|   lla t0, start_of_bss
 | |
|   lla t1, end_of_bss
 | |
|   bgeu t0, t1, Lclear_bss_done
 | |
| Lclear_bss_loop:
 | |
|   sd zero, (t0)
 | |
|   addi t0, t0, 8
 | |
|   bltu t0, t1, Lclear_bss_loop
 | |
| Lclear_bss_done:
 | |
| 
 | |
|   // Let the stack start before .text for now.
 | |
|   lla sp, start
 | |
| 
 | |
|   // Zero all registers except sp, a0 and a1.
 | |
|   li ra, 0
 | |
|   // sp
 | |
|   li gp, 0
 | |
|   li tp, 0
 | |
|   li t0, 0
 | |
|   li t1, 0
 | |
|   li t2, 0
 | |
|   li fp, 0
 | |
|   li s1, 0
 | |
|   // a0
 | |
|   // a1
 | |
|   li a2, 0
 | |
|   li a3, 0
 | |
|   li a4, 0
 | |
|   li a5, 0
 | |
|   li a6, 0
 | |
|   li a7, 0
 | |
|   li s2, 0
 | |
|   li s3, 0
 | |
|   li s4, 0
 | |
|   li s5, 0
 | |
|   li s6, 0
 | |
|   li s7, 0
 | |
|   li s8, 0
 | |
|   li s9, 0
 | |
|   li s10, 0
 | |
|   li s11, 0
 | |
|   li t3, 0
 | |
|   li t4, 0
 | |
|   li t5, 0
 | |
|   li t6, 0
 | |
| 
 | |
|   tail pre_init
 |