|
|	copy binary image and execute
|
|	written by ITOH Yasufumi
|	public domain
|
|	$NetBSD: trampoline.S,v 1.2.160.1 2011/03/05 15:10:09 bouyer 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)
