70 lines
1.4 KiB
ArmAsm
70 lines
1.4 KiB
ArmAsm
|
|
|
| copy binary image and execute
|
|
|
|
|
| written by Yasha (ITOH Yasufumi)
|
|
| public domain
|
|
|
|
|
| $NetBSD: trampoline.S,v 1.1 1998/09/01 19:55:33 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)
|