/* Generic simplistic start-up-stub for CRIS/CRISv32.
   Copyright (C) 1993-2005, 2007, 2017 Axis Communications.
   All rights reserved.

   Redistribution and use in source and binary forms, with or without
   modification, are permitted provided that the following conditions
   are met:

   1. Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.

   2. Neither the name of Axis Communications nor the names of its
      contributors may be used to endorse or promote products derived
      from this software without specific prior written permission.

   THIS SOFTWARE IS PROVIDED BY AXIS COMMUNICATIONS AND ITS CONTRIBUTORS
   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL AXIS
   COMMUNICATIONS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
   IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   POSSIBILITY OF SUCH DAMAGE.  */

#include "newlib.h"

#undef cris
#undef L
#ifdef __NO_UNDERSCORES__
#define L(x) x
#else
#define L(x) _ ## x
#endif

#ifdef HAVE_INITFINI_ARRAY
#define _init __libc_init_array
#define _fini __libc_fini_array
#endif

; Rudimentary v0..v32-compatible startup stub.

#ifdef __ELF__
 .section .startup,"ax"
#endif
 .global __start
 nop
__start:
 move.d 0f,$r9
 jump $r9
 setf

#ifndef __ELF__

; For a.out, everything read-only and code-wise goes into a
; single section, so we can't separate the interrupt table from
; the startup code if we want to have files in-between.
#define IN_CRT0
#include "irqtable.S"

#else

; The interrupt table (at offset 12, irq #3) is expected here.
; The simplest way to make sure we link it in, is to sacrifice
; some memory and refer to it with a relocation.
 .text
 .dword __irqtable_at_irq3

#endif /* __ELF__ */

0:
 move.d __setup,$r9
 jsr $r9
 nop
#ifdef __ELF__
 jsr L(_init)
 nop
 move.d L(_fini),$r10
 jsr L(atexit)
 nop
#endif
 jsr L(main)
 nop
 jsr L(exit)
 nop
0:
 nop
 ba 0b
 nop
