/* $OpenBSD: bugcrt.c,v 1.5 2003/08/20 00:25:08 deraadt Exp $ */ #include #include #include "libbug.h" #include "stand.h" void __main(void); void start(void); struct mvmeprom_args bugargs = { 1 }; /* not in BSS */ asm (".text"); asm (".long _start-0x10"); asm (".long _start"); void start(void) { 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_getbrdid(void); 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; bzero(&edata, (int)&end-(int)&edata); id = mvmeprom_getbrdid(); bugargs.cputyp = id->model; main(); _rtt(); /* NOTREACHED */ } void __main(void) { } void bugexec(void (*addr)(void)) { 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(); }