root/sys/arch/x68k/stand/loadbsd/trampoline.S
|
|       copy binary image and execute
|
|       written by ITOH Yasufumi
|       public domain
|
|       $NetBSD: trampoline.S,v 1.3 2011/02/21 02:31:59 itohy Exp $

#include <machine/asm.h>
#include "trampoline.h"

|    arg+0              bsr trampoline
|       +4      %a3+0   temporary stack address
|       +8      %a3+4   processor type
|       +12     %a3+8   struct execkern_arg
|       +52             trampoline

ENTRY_NOPROFILE(trampoline)
        oriw    #0x0700,%sr             | keep out interrupts

        moveal  %sp@+,%a3
        moveal  %a3@+,%sp               | set temporary stack

        movel   %a3@+,%d2               | MPU type

        |
        | turn off MMU
        |
        moveq   #MPU_68030,%d0
        cmpl    %d2,%d0
        bccs    Lmmu030
        | 040/060
        moveq   #0,%d0
        .long   0x4E7B0003              | movec %d0,%tc
        .long   0x4E7B0004              | movec %d0,%itt0
        .long   0x4E7B0005              | movec %d0,%itt1
        .long   0x4E7B0006              | movec %d0,%dtt0
        .long   0x4E7B0007              | movec %d0,%dtt1
        .long   0x4E7B0806              | movec %d0,%urp
        .long   0x4E7B0807              | movec %d0,%srp
        bras    Lmmudone
Lmmu030:
        | 020/030
        clrl    %sp@-
        .long   0xF0174000              | pmove %sp@,%tc
        cmpl    %d0,%d2
        bnes    Lmmu020                 | 68851 has no tt regs
        .long   0xF0170800              | pmove %sp@,%tt0
        .long   0xF0170C00              | pmove %sp@,%tt1
Lmmu020:
        movel   #0x7fff0001,%sp@-       | null root pointer
        .long   0xF0174C00              | pmove %sp@,%crp
        .long   0xF0174800              | pmove %sp@,%srp
        addql   #8,%sp
Lmmudone:

        | minimize supervisor protection
        clrb    AREA_SET_REG

        | reset VBR (for compatibility)
        subal   %a1,%a1
        .long   0x4E7B9801              | movec %a1,%vbr

        | then transfer and exec kernel

#define XK_NO_C_INTERFACE               /* pass arg with %a3 */
#include "../common/execkern.S"

GLOBAL(end_trampoline)