diff options
Diffstat (limited to 'sys/arch/mvmeppc/stand/bugcrt/bugcrt.c')
-rw-r--r-- | sys/arch/mvmeppc/stand/bugcrt/bugcrt.c | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/sys/arch/mvmeppc/stand/bugcrt/bugcrt.c b/sys/arch/mvmeppc/stand/bugcrt/bugcrt.c new file mode 100644 index 00000000000..edb48124f98 --- /dev/null +++ b/sys/arch/mvmeppc/stand/bugcrt/bugcrt.c @@ -0,0 +1,126 @@ +/* $OpenBSD: bugcrt.c,v 1.1 2001/06/26 21:58:02 smurph Exp $ */ + +/* + * This is the startup file for single stage bootstraps or the first + * stage of a two stage bootstrap. It includes code to enable the + * SFU1. + */ + +#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(); + +#ifdef STAGE1 + /* 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(" xor r25,r25,0x8"); + asm(" stcr r25,cr1"); +#endif + + 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; + + /* + * 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"); + } + */ + 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(); +} + |