mirror of
				https://github.com/marqs85/ossc
				synced 2025-10-31 07:56:03 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			104 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| // Copyright 2017 ETH Zurich and University of Bologna.
 | |
| // Copyright and related rights are licensed under the Solderpad Hardware
 | |
| // License, Version 0.51 (the “License”); you may not use this file except in
 | |
| // compliance with the License.  You may obtain a copy of the License at
 | |
| // http://solderpad.org/licenses/SHL-0.51. Unless required by applicable law
 | |
| // or agreed to in writing, software, hardware and materials distributed under
 | |
| // this License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR
 | |
| // CONDITIONS OF ANY KIND, either express or implied. See the License for the
 | |
| // specific language governing permissions and limitations under the License.
 | |
| 
 | |
| #include "pulpino.h"
 | |
| 
 | |
| #define EXCEPTION_STACK_SIZE 72
 | |
| 
 | |
| 
 | |
| /* ========================================================= [ entry ] === */
 | |
|   .section .text
 | |
| 
 | |
| default_exc_handler:
 | |
|   jal x0, default_exc_handler
 | |
| 
 | |
| reset_handler:
 | |
|   /* set all registers to zero */
 | |
|   mv  x1, x0
 | |
|   mv  x2, x1
 | |
|   mv  x3, x1
 | |
|   mv  x4, x1
 | |
|   mv  x5, x1
 | |
|   mv  x6, x1
 | |
|   mv  x7, x1
 | |
|   mv  x8, x1
 | |
|   mv  x9, x1
 | |
|   mv x10, x1
 | |
|   mv x11, x1
 | |
|   mv x12, x1
 | |
|   mv x13, x1
 | |
|   mv x14, x1
 | |
|   mv x15, x1
 | |
|   mv x16, x1
 | |
|   mv x17, x1
 | |
|   mv x18, x1
 | |
|   mv x19, x1
 | |
|   mv x20, x1
 | |
|   mv x21, x1
 | |
|   mv x22, x1
 | |
|   mv x23, x1
 | |
|   mv x24, x1
 | |
|   mv x25, x1
 | |
|   mv x26, x1
 | |
|   mv x27, x1
 | |
|   mv x28, x1
 | |
|   mv x29, x1
 | |
|   mv x30, x1
 | |
|   mv x31, x1
 | |
| 
 | |
|   /* stack initilization */
 | |
|   la   x2, _stack_start
 | |
| 
 | |
| _start:
 | |
|   .global _start
 | |
| 
 | |
|   /* clear BSS */
 | |
|   la x26, _bss_start
 | |
|   la x27, _bss_end
 | |
| 
 | |
|   bge x26, x27, zero_loop_end
 | |
| 
 | |
| zero_loop:
 | |
|   sw x0, 0(x26)
 | |
|   addi x26, x26, 4
 | |
|   ble x26, x27, zero_loop
 | |
| zero_loop_end:
 | |
| 
 | |
| 
 | |
| main_entry:
 | |
|   /* jump to alt_main program entry point */
 | |
|   jal alt_main
 | |
| 
 | |
| /* =================================================== [ exceptions ] === */
 | |
| /* This section has to be down here, since we have to disable rvc for it  */
 | |
| 
 | |
|   .section .vectors, "ax"
 | |
|   .option norvc;
 | |
| 
 | |
|   // external interrupts are handled by the same callback
 | |
|   // until compiler supports IRQ routines
 | |
|   .org 0x00
 | |
|   .rept 31
 | |
|   nop
 | |
|   .endr
 | |
|   jal x0, default_exc_handler
 | |
| 
 | |
|   // reset vector
 | |
|   .org 0x80
 | |
|   jal x0, reset_handler
 | |
| 
 | |
|   // illegal instruction exception
 | |
|   .org 0x84
 | |
|   jal x0, default_exc_handler
 | |
| 
 | |
|   // ecall handler
 | |
|   .org 0x88
 | |
|   jal x0, default_exc_handler
 | 
