summaryrefslogtreecommitdiff
path: root/sys/arch/mvme88k/stand/bugcrt/crt.c
blob: e24b5597a96217afbaffc5f906ac393a8df8ee28 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/*	$OpenBSD: crt.c,v 1.3 2001/12/13 08:55:52 smurph Exp $ */

#include <sys/types.h>
#include <machine/prom.h>

struct mvmeprom_args bugargs = { 1};	       /* not BSS */

asm (".text");
/* pseudo reset vector */
asm (STACK_ASM_OP);	/* initial sp value */
asm (".long _start");	/* initial ip value */
start()
{
	register int dev_lun asm (MVMEPROM_REG_DEVLUN);
	register int ctrl_lun asm (MVMEPROM_REG_CTRLLUN);
	register int flags asm (MVMEPROM_REG_FLAGS);
	register int ctrl_addr asm (MVMEPROM_REG_CTRLADDR);
	register int entry asm (MVMEPROM_REG_ENTRY);
	register int conf_blk asm (MVMEPROM_REG_CONFBLK);
	register char *arg_start asm (MVMEPROM_REG_ARGSTART);
	register char *arg_end asm (MVMEPROM_REG_ARGEND);
	register char *nbarg_start asm (MVMEPROM_REG_NBARGSTART);
	register char *nbarg_end asm (MVMEPROM_REG_NBARGEND);
	extern int edata, end;
	struct mvmeprom_brdid *id, *mvmeprom_brdid();

	/* 
	 * This code enables the SFU1 and is used for single stage 
	 * bootstraps or the first stage of a two stage bootstrap.
	 * Do not use r10 to enable the SFU1. This wipes out
	 * the netboot args.  Not cool at all... r25 seems free. 
	 */
	asm("|	enable SFU1");
	asm("	ldcr	r25,cr1");
	asm("	clr	r25,r25,1<3>"); /* bit 3 is SFU1D */
	asm("	set	r25,r25,1<25>"); /* bit 25 is Serialize */
	asm("	set	r25,r25,1<29>"); /* bit 29 is Serial mode execution */
	asm("	stcr	r25,cr1");

	bugargs.dev_lun = dev_lun;
	bugargs.ctrl_lun = ctrl_lun;
	bugargs.flags = flags;
	bugargs.ctrl_addr = ctrl_addr;
	bugargs.entry = entry;
	bugargs.conf_blk = conf_blk;
	bugargs.arg_start = arg_start;
	bugargs.arg_end = arg_end;
	bugargs.nbarg_start = nbarg_start;
	bugargs.nbarg_end = nbarg_end;
	*bugargs.arg_end = 0;      

	id = mvmeprom_brdid();
	bugargs.cputyp = id->model;

#ifdef notyet /* STAGE1 */
	/* 
	 * Initialize PSR and CMMU to a known, stable state. 
	 * This has to be done early for MVME197.
	 * Per EB162 mc88110 engineering bulletin.
	 */
	if (bugargs.cputyp == 0x197) {
		asm("|	init MVME197");
		asm("|	1. PSR");
		asm("or.u   r2,r0,0xA200");
		asm("or     r2,r2,0x03E2");
		asm("stcr   r2,cr1");
		asm("|	2. ICTL");
		asm("or     r2,r0,r0");
		asm("or     r2,r2,0x8000");
		asm("or     r2,r2,0x0040");
		asm("stcr   r2,cr26");
		asm("|	3. DCTL");
		asm("or     r2,r0,r0");
		asm("or     r2,r2,0x2000");
		asm("or     r2,r2,0x0040");
		asm("stcr   r2,cr41");
		asm("|	4. init cache");
		asm("or     r2,r0,0x01");
		asm("stcr   r2,cr25");
		asm("stcr   r2,cr40");
	}
#endif

	memset(&edata, 0, ((int)&end - (int)&edata));

	asm  ("|	main()");
	main();
	mvmeprom_return();
	/* NOTREACHED */
}

__main()
{
}

void
bugexec(addr)

void (*addr)();

{
	register int dev_lun asm (MVMEPROM_REG_DEVLUN);
	register int ctrl_lun asm (MVMEPROM_REG_CTRLLUN);
	register int flags asm (MVMEPROM_REG_FLAGS);
	register int ctrl_addr asm (MVMEPROM_REG_CTRLADDR);
	register int entry asm (MVMEPROM_REG_ENTRY);
	register int conf_blk asm (MVMEPROM_REG_CONFBLK);
	register char *arg_start asm (MVMEPROM_REG_ARGSTART);
	register char *arg_end asm (MVMEPROM_REG_ARGEND);

	dev_lun = bugargs.dev_lun;
	ctrl_lun = bugargs.ctrl_lun;
	flags = bugargs.flags;
	ctrl_addr = bugargs.ctrl_addr;
	entry = bugargs.entry;
	conf_blk = bugargs.conf_blk;
	arg_start = bugargs.arg_start;
	arg_end = bugargs.arg_end;

	(*addr)();
	printf("bugexec: 0x%x returned!\n", addr);

	_rtt();
}