Annotation of sys/arch/mvme88k/stand/bugcrt/crt.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: crt.c,v 1.6 2006/05/16 22:51:30 miod Exp $ */
! 2:
! 3: #include <sys/types.h>
! 4: #include <machine/prom.h>
! 5:
! 6: #include "stand.h"
! 7: #include "libbug.h"
! 8:
! 9: struct mvmeprom_args bugargs;
! 10:
! 11: __asm__ (".text");
! 12: __asm__ (STACK_ASM_OP); /* initial sp value */
! 13: __asm__ (".long _start"); /* initial ip value */
! 14:
! 15: extern void main(void);
! 16:
! 17: void
! 18: start(u_int dev_lun, u_int ctrl_lun, u_int flags, u_int ctrl_addr, u_int entry,
! 19: u_int conf_blk, char *arg_start, char *arg_end)
! 20: {
! 21: extern u_int edata, end;
! 22: char *nbarg_start;
! 23: char *nbarg_end;
! 24: u_int dummy;
! 25:
! 26: /*
! 27: * Save r10 and r11 first. We can't put declare them as arguments
! 28: * since the normal calling convention would put them on the stack.
! 29: */
! 30: __asm__ __volatile__ ("or %0, r0, r10" : "=r" (nbarg_start) : :
! 31: "r10", "r11");
! 32: __asm__ __volatile__ ("or %0, r0, r11" : "=r" (nbarg_end) : :
! 33: "r10", "r11");
! 34:
! 35: /*
! 36: * This code enables the SFU1 and is used for single stage
! 37: * bootstraps or the first stage of a two stage bootstrap.
! 38: * Do not use lower registers to enable the SFU1. This wipes out
! 39: * the args. Not cool at all... r25 seems free.
! 40: */
! 41: __asm__ __volatile__ ("ldcr %0, cr1" : "=r" (dummy));
! 42: __asm__ __volatile__ ("clr %0, %0, 1<3>; stcr %0, cr1" : "+r" (dummy));
! 43:
! 44: memset(&edata, 0, ((int)&end - (int)&edata));
! 45:
! 46: bugargs.dev_lun = dev_lun;
! 47: bugargs.ctrl_lun = ctrl_lun;
! 48: bugargs.flags = flags;
! 49: bugargs.ctrl_addr = ctrl_addr;
! 50: bugargs.entry = entry;
! 51: bugargs.conf_blk = conf_blk;
! 52: bugargs.arg_start = arg_start;
! 53: bugargs.arg_end = arg_end;
! 54: bugargs.nbarg_start = nbarg_start;
! 55: bugargs.nbarg_end = nbarg_end;
! 56: *bugargs.arg_end = '\0';
! 57:
! 58: main();
! 59: _rtt();
! 60: /* NOTREACHED */
! 61: }
! 62:
! 63: void
! 64: __main()
! 65: {
! 66: }
! 67:
! 68: void
! 69: bugexec(void (*addr)())
! 70: {
! 71: (*addr)(bugargs.dev_lun, bugargs.ctrl_lun, bugargs.flags,
! 72: bugargs.ctrl_addr, bugargs.entry, bugargs.conf_blk,
! 73: bugargs.arg_start, bugargs.arg_end);
! 74:
! 75: printf("bugexec: %p returned!\n", addr);
! 76:
! 77: _rtt();
! 78: }
CVSweb