- For prevent confuse about what BSD license variant we used, 2- or 3-clause license, we change the license to FreeBSD license to make it unambiguously refers to the 2-clause license.
		
			
				
	
	
		
			55 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
/* Copyright (c) 2017  SiFive Inc. All rights reserved.
 | 
						|
 | 
						|
   This copyrighted material is made available to anyone wishing to use,
 | 
						|
   modify, copy, or redistribute it subject to the terms and conditions
 | 
						|
   of the FreeBSD License.   This program is distributed in the hope that
 | 
						|
   it will be useful, but WITHOUT ANY WARRANTY expressed or implied,
 | 
						|
   including the implied warranties of MERCHANTABILITY or FITNESS FOR
 | 
						|
   A PARTICULAR PURPOSE.  A copy of this license is available at
 | 
						|
   http://www.opensource.org/licenses.
 | 
						|
*/
 | 
						|
 | 
						|
#=========================================================================
 | 
						|
# crt0.S : Entry point for RISC-V user programs
 | 
						|
#=========================================================================
 | 
						|
 | 
						|
  .text
 | 
						|
  .global _start
 | 
						|
  .type   _start, @function
 | 
						|
_start:
 | 
						|
  # Initialize global pointer
 | 
						|
.option push
 | 
						|
.option norelax
 | 
						|
1:auipc gp, %pcrel_hi(__global_pointer$)
 | 
						|
  addi  gp, gp, %pcrel_lo(1b)
 | 
						|
.option pop
 | 
						|
 | 
						|
  # Clear the bss segment
 | 
						|
  la      a0, _edata
 | 
						|
  la      a2, _end
 | 
						|
  sub     a2, a2, a0
 | 
						|
  li      a1, 0
 | 
						|
  call    memset
 | 
						|
 | 
						|
  la      a0, __libc_fini_array   # Register global termination functions
 | 
						|
  call    atexit                  #  to be called upon exit
 | 
						|
  call    __libc_init_array       # Run global initialization functions
 | 
						|
 | 
						|
  lw      a0, 0(sp)                  # a0 = argc
 | 
						|
  addi    a1, sp, __SIZEOF_POINTER__ # a1 = argv
 | 
						|
  li      a2, 0                      # a2 = envp = NULL
 | 
						|
  call    main
 | 
						|
  tail    exit
 | 
						|
  .size  _start, .-_start
 | 
						|
 | 
						|
  .global _init
 | 
						|
  .type   _init, @function
 | 
						|
  .global _fini
 | 
						|
  .type   _fini, @function
 | 
						|
_init:
 | 
						|
_fini:
 | 
						|
  # These don't have to do anything since we use init_array/fini_array.
 | 
						|
  ret
 | 
						|
  .size  _init, .-_init
 | 
						|
  .size  _fini, .-_fini
 |