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();
}
|