[BACK]Return to crt.c CVS log [TXT][DIR] Up to [local] / sys / arch / mvme88k / stand / bugcrt

Annotation of sys/arch/mvme88k/stand/bugcrt/crt.c, Revision 1.1.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