root/sys/arch/x68k/stand/boot/srt0.S
/*      $NetBSD: srt0.S,v 1.3 2024/01/07 07:58:33 isaki Exp $   */

/*-
 * Copyright (c) 2001 Minoura Makoto
 * 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.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND 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 THE AUTHOR OR 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 <m68k/asm.h>

ASENTRY(start)
        bra             start0
        .ascii          BOOT
        .byte           0x20
        .asciz          BOOT_VERS
        .even

/*
 * via stack:   (firstpa, physsize, esym)
 * via regs:    %d6:    bootdev
 *              %d7:    boothowto
 *  for /boot, only %d6 is used.
 */
start0:
        moveml          %sp@+,%d0-%d2
        lea             %pc@(start),%sp

        movl            %d6,%sp@-
        jbsr            _C_LABEL(bootmain)

ENTRY_NOPROFILE(_rtt)
        pea             %pc@(reboot_msg)
        jbsr            _C_LABEL(printf)
        jbsr            _C_LABEL(getchar)
        trap            #10

reboot_msg:     .asciz  "\n[Hit key to reboot]"
                .even

/*
 * Detect MPU type.  From locore.s.
 * Note we've already confirmed it is not 68000/010.
 */
ENTRY_NOPROFILE(detectmpu)
        movl    #0x200,%d0              | data freeze bit
        movc    %d0,%cacr               |   only exists on 68030
        movc    %cacr,%d0               | read it back
        tstl    %d0                     | zero?
        jeq     Lnot68030               | yes, we have 68020/68040/68060
        moveq   #3,%d0
        jra     Lgo                     | no, we have 68030
Lnot68030:
        bset    #31,%d0                 | data cache enable bit
        movc    %d0,%cacr               |   only exists on 68040/68060
        movc    %cacr,%d0               | read it back
        tstl    %d0                     | zero?
        jeq     Lis68020                | yes, we have 68020
        moveq   #0,%d0                  | now turn it back off
        movec   %d0,%cacr               |   before we access any data
        .word   0xf4d8                  | cinva bc - invalidate caches XXX
        bset    #30,%d0                 | data cache no allocate mode bit
        movc    %d0,%cacr               |   only exists on 68060
        movc    %cacr,%d0               | read it back
        tstl    %d0                     | zero?
        jeq     Lis68040                | yes, we have 68040
        moveq   #6,%d0
        jra     Lgo
Lis68040:
        moveq   #4,%d0
        jra     Lgo
Lis68020:
        movl    #2,%d0                  | and a 68020 CPU
Lgo:
        rts

/*
 * Check if the given address is valid for byte read.
 * From boot_ufs/boot.S.
 */
ENTRY_NOPROFILE(badbaddr)
                lea     0x0008:W,%a1            | MPU Bus Error vector
                moveq   #1,%d0
                lea     %pc@(badr1),%a0
                movew   %sr,%sp@-
                oriw    #0x0700,%sr             | keep out interrupts
                movel   %a1@,%sp@-
                movel   %a0,%a1@                | set bus error vector
                movel   %sp,%d1                 | save sp
                moveal  %sp@(10),%a0
                tstb    %a0@                    | try read...
                moveq   #0,%d0                  | this is skipped on bus error
badr1:          moveal  %d1,%sp                 | restore sp
                movel   %sp@+,%a1@
                movew   %sp@+,%sr
                rts