/* Copyright (c) 2017  SiFive Inc. All rights reserved.
 * Copyright (c) 2019  ETH Zürich and University of Bologna
 * Copyright (c) 2023  Silicon Laboratories Inc.
 * 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.
 */
/* Make sure the vector table gets linked into the binary.  */
.global vector_table

/* Make sure the NMI handler gets linked into the binary. */
.global nmi_handler

/* Entry point for bare metal programs */
.section .text.start
.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)

// /* initialize vector table pointer */
// 1:auipc a0, %pcrel_hi(__jvt_base$)
//   addi  a0, a0, %pcrel_lo(1b)
//   csrw  jvt, a0
.option pop

/* initialize stack pointer */
  la sp, __stack_start

/* set vector table address */
  la a0, __vector_start
  ori a0, a0, 1 /*vector mode = vectored */
  csrw mtvec, a0

/* clear the bss segment */
  la a0, _edata
  la a2, _end
  sub a2, a2, a0
  li a1, 0
  call memset

/* new-style constructors and destructors */
  la a0, __libc_fini_array
  call atexit
  call __libc_init_array

/* call main */
//  lw a0, 0(sp)                    /* a0 = argc */
//  addi a1, sp, __SIZEOF_POINTER__ /* a1 = argv */
//  li a2, 0                        /* a2 = envp = NULL */
// Initialize these variables to 0. Cannot use argc or argv
// since the stack is not initialized
  li a0, 0
  li a1, 0
  li a2, 0

  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. Prevent
    missing symbol error */
  ret
.size  _init, .-_init
.size _fini, .-_fini
