[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     ! 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