/*      $NetBSD: srt0.s,v 1.3 2023/02/04 14:38:09 tsutsui Exp $ */
/*
* Copyright (c) 1994 Rolf Grossmann
* 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. Redistributions in binary form must reproduce the above copyright
*    notice, this list of conditions and the following disclaimer in the
*    documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
*    must display the following acknowledgement:
*      This product includes software developed by Rolf Grossmann.
* 4. The name of the author may not be used to endorse or promote products
*    derived from this software without specific prior written permission
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 THE AUTHOR 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 <machine/asm.h>

/*
* Startup code for standalone system
*/

       .text
ASENTRY_NOPROFILE(start)
       || clear bss (this should not hurt us i.e. cause an exception)
       movel   #_C_LABEL(edata),%a2    | start of BSS
       movel   #_C_LABEL(end),%a3      | end
Lclr:
       clrb    %a2@+                   | clear BSS
       cmpl    %a2,%a3                 | done?
       bne     Lclr                    | no, keep going

       movl    #0x0808,%d0
       movc    %d0,%cacr               | clear and disable on-chip cache(s)

       || catch exceptions myself
       movec   %vbr,%a3
       movel   %a3,save_vbr            | save register for restoration
       lea     vectbl,%a4
       movel   %a3@(4),%a4@(4)         | copy mg, just for sure
       movel   %a3@(180),%a4@(180)     | copy vector for trap #13
       movel   %a3@(124),%a4@(124)     | copy vector for int 7
       movec   %a4,%vbr                | use the new table

       || save mg as pi
       movel   %a3@(4),_C_LABEL(mg)

       || make sure we disallow interrupts
       movew   #0x2600,%sr

       || away we go
       movel   %sp@(4),%sp@-           | copy the argument we got
       jsr     _C_LABEL(main)          | call C
       addql   #4,%sp

       || restore prom vectors
       movel   save_vbr,%a0
       movec   %a0,%vbr

       || return kernel start address (still in d0)
       rts

ENTRY(_halt)
       movel   save_vbr,%a0
       movec   %a0,%vbr                | restore prom vbr
hloop:
       movel   #halt,%d0
       trap    #13                     | halt the system
       bra     hloop                   | and do not allow continuation

ASENTRY_NOPROFILE(astrap)
       moveml  %d0-%d7/%a0-%a7,%sp@-   | save all registers

       movel   %sp,%sp@-               | push pointer to registers
       jsr     _C_LABEL(trap)          | call C to handle things (dump regs)
       addql   #4,%sp
       tstl    %d0
       jeq     Lstop
       moveml  %sp@+,%d0-%d7/%a0-%a7
       rte
Lstop:
       bra     Lstop                   | stay here

       .data
save_vbr:
       .long 0
halt:
       .asciz "-h"

#define TRAP16 \
       VECTOR(astrap); VECTOR(astrap); VECTOR(astrap); VECTOR(astrap); \
       VECTOR(astrap); VECTOR(astrap); VECTOR(astrap); VECTOR(astrap); \
       VECTOR(astrap); VECTOR(astrap); VECTOR(astrap); VECTOR(astrap); \
       VECTOR(astrap); VECTOR(astrap); VECTOR(astrap); VECTOR(astrap);

vectbl:
       TRAP16
       TRAP16
       TRAP16
       TRAP16
       TRAP16
       TRAP16
       TRAP16
       TRAP16
       TRAP16
       TRAP16
       TRAP16
       TRAP16
       TRAP16
       TRAP16
       TRAP16
       TRAP16