mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-01-22 23:17:28 +08:00
573458e7fc
Set symbol '__jvt_base$' as weak. So if the symbol is not set in the
linker script, the address would be 0. We initialize jvt CSR only if
the address is not 0.
Also use csr number directly instead of using symbolic name to prevent the
backward incompatible issue.
psabi reference:
2d770815dc/riscv-elf.adoc (table-jump-relaxation)
68 lines
2.0 KiB
ArmAsm
68 lines
2.0 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.
|
|
*/
|
|
|
|
#include "newlib.h"
|
|
|
|
#=========================================================================
|
|
# 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
|
|
|
|
/* Initialize jvt CSR (reg addr: 0x0017) */
|
|
.weak __jvt_base$
|
|
lla a0, __jvt_base$
|
|
beqz a0, .Ljvt_init_end
|
|
.option push
|
|
.option norelax
|
|
.option arch, +zicsr
|
|
csrw 0x17, a0
|
|
.option pop
|
|
.Ljvt_init_end:
|
|
|
|
# Clear the bss segment
|
|
la a0, __bss_start
|
|
la a2, _end
|
|
sub a2, a2, a0
|
|
li a1, 0
|
|
call memset
|
|
#ifdef _LITE_EXIT
|
|
# Make reference to atexit weak to avoid unconditionally pulling in
|
|
# support code. Refer to comments in __atexit.c for more details.
|
|
.weak atexit
|
|
la a0, atexit
|
|
beqz a0, .Lweak_atexit
|
|
.weak __libc_fini_array
|
|
#endif
|
|
|
|
la a0, __libc_fini_array # Register global termination functions
|
|
call atexit # to be called upon exit
|
|
#ifdef _LITE_EXIT
|
|
.Lweak_atexit:
|
|
#endif
|
|
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
|