Annotation of researchv9/sys/sun3/sunromvec.h, revision 1.1

1.1     ! root        1: /*     @(#)sunromvec.h 2.30 85/08/13 SMI       */
        !             2: 
        !             3: /*
        !             4:  * Copyright (c) 1985 by Sun Microsystems, Inc.
        !             5:  */
        !             6: 
        !             7: #ifndef MONSTART
        !             8: /*
        !             9:  * sunromvec.h
        !            10:  *
        !            11:  * This file defines the entire interface between the PROM Monitor
        !            12:  * and programs (or kernels) that run under it.
        !            13:  *
        !            14:  * The main interface is the vector table at the front of the boot rom.
        !            15:  *
        !            16:  * This vector table is the only knowledge the outside world has of this prom.
        !            17:  * It is referenced by hardware (Reset SSP, PC), and software.
        !            18:  * Once located, no entry can be re-located unless you change the world
        !            19:  * that needs it.
        !            20:  * 
        !            21:  * The easiest way to reference elements of this vector is to say:
        !            22:  *
        !            23:  *     *romp->xxx
        !            24:  *
        !            25:  * as in:
        !            26:  *
        !            27:  *     (*romp->v_putchar) (c);
        !            28:  *
        !            29:  * This is pretty cheap as it only generates   movl 0xNNNNNNNN:l,a0; jsr a0@ .
        !            30:  * That's 2 bytes longer, and 4 cycles longer, than a simple subroutine call.
        !            31:  *
        !            32:  * Various entries have been added at various times.  As of Rev N PROM
        !            33:  * Monitors, the vector table includes an entry "v_romvec_version" which
        !            34:  * is an integer defining which entries in the table are valid.  The
        !            35:  * comments on each entry say which version the entry first appeared in
        !            36:  * with a prefix like "V1:".  To determine if the PROMs your program is
        !            37:  * running under contain the entry, you can simply compare the value
        !            38:  * of v_romvec_version to the constant in the comment field, e.g.
        !            39:  *
        !            40:  *     if (romp->v_romvec_version >= 1)
        !            41:  *             { reference *romp->v_memorybitmap...}
        !            42:  *     else
        !            43:  *             { running under older prom, punt somehow }
        !            44:  *
        !            45:  * Entries which do not contain a "Vn:" string are in Version 0 of the
        !            46:  * proms (Rev N and onward).
        !            47:  */
        !            48: 
        !            49: struct sunromvec {
        !            50:        char            *v_initsp;              /* Initial SSP for hardware */
        !            51:        void            (*v_startmon)();        /* Initial PC  for hardware */
        !            52:        int             *v_diagberr;            /* Bus err handler for diags */
        !            53: 
        !            54: /* Configuration information passed to standalone code & Unix */
        !            55:        struct bootparam        **v_bootparam;  /* Info for bootstrapped pgm */
        !            56:        unsigned        *v_memorysize;          /* Total phys memory in bytes */
        !            57: 
        !            58: /* Single-character input and output */
        !            59:        unsigned char   (*v_getchar)();         /* Get char from input source */
        !            60:        void            (*v_putchar)();         /* Put char to output sink */
        !            61:        int             (*v_mayget)();          /* Maybe get char, or -1 */
        !            62:        int             (*v_mayput)();          /* Maybe put char, or -1 */
        !            63:        unsigned char   *v_echo;                /* Should getchar echo? */
        !            64:        unsigned char   *v_insource;            /* Input source selector */
        !            65:        unsigned char   *v_outsink;             /* Output sink selector */
        !            66: 
        !            67: /* Keyboard input and frame buffer output */
        !            68:        int             (*v_getkey)();          /* Get next key if one exists */
        !            69:        void            (*v_initgetkey)();      /* Like it says */
        !            70:        unsigned int    *v_translation;         /* Kbd translation selector */
        !            71:        unsigned char   *v_keybid;              /* Keyboard ID byte */
        !            72:        int             *v_screen_x;            /* V2: Screen x pos (R/O) */
        !            73:        int             *v_screen_y;            /* V2: Screen y pos (R/O) */
        !            74:        struct keybuf   *v_keybuf;              /* Up/down keycode buffer */
        !            75: 
        !            76:        char            *v_mon_id;              /* Revision level of monitor */
        !            77: 
        !            78: /* Frame buffer output and terminal emulation */
        !            79:        void            (*v_fwritechar)();      /* Write a character to FB */
        !            80:        int             *v_fbaddr;              /* Address of frame buffer */
        !            81:        char            **v_font;               /* font table for FB */
        !            82:        void            (*v_fwritestr)();       /* Quickly write string to FB */
        !            83: 
        !            84: /* Reboot interface routine -- resets and reboots system.  No return. */
        !            85:        void            (*v_boot_me)();         /* eg boot_me("xy()vmunix") */
        !            86: 
        !            87: /* Line input and parsing */
        !            88:        unsigned char   *v_linebuf;             /* The line input buffer */
        !            89:        unsigned char   **v_lineptr;            /* Cur pointer into linebuf */
        !            90:        int             *v_linesize;            /* length of line in linebuf */
        !            91:        void            (*v_getline)();         /* Get line from user */
        !            92:        unsigned char   (*v_getone)();          /* Get next char from linebuf */
        !            93:        unsigned char   (*v_peekchar)();        /* Peek at next char */
        !            94:        int             *v_fbthere;             /* =1 if frame buffer there */
        !            95:        int             (*v_getnum)();          /* Grab hex num from line */
        !            96: 
        !            97: /* Phrase output to current output sink */
        !            98:        int             (*v_printf)();          /* Similar to "Kernel printf" */
        !            99:        void            (*v_printhex)();        /* Format N digits in hex */
        !           100: 
        !           101:        unsigned char   *v_leds;                /* RAM copy of LED register */
        !           102:        void            (*v_set_leds)();        /* Sets LED's and RAM copy */
        !           103: 
        !           104: /* nmi related information */
        !           105:        void            (*v_nmi)();             /* Addr for level 7 vector */
        !           106:        void            (*v_abortent)();        /* entry for keyboard abort */
        !           107:        int             *v_nmiclock;            /* counts up in msec */
        !           108: 
        !           109:        int             *v_fbtype;              /* FB type: see <sun/fbio.h> */
        !           110: 
        !           111: /* Assorted other things */
        !           112:        unsigned        v_romvec_version;       /* Version # of Romvec */ 
        !           113:        struct globram  *v_gp;                  /* monitor global variables */
        !           114:        struct zscc_device      *v_keybzscc;    /* Addr of keyboard in use */
        !           115: 
        !           116:        int             *v_keyrinit;            /* ms before kbd repeat */
        !           117:        unsigned char   *v_keyrtick;            /* ms between repetitions */
        !           118:        unsigned        *v_memoryavail;         /* V1: Main mem usable size */
        !           119:        long            *v_resetaddr;           /* where to jump on a reset */
        !           120:        long            *v_resetmap;            /* pgmap entry for resetaddr */
        !           121:                                                /* Really struct pgmapent *  */
        !           122:        void            (*v_exit_to_mon)();     /* Exit from user program */
        !           123: 
        !           124:        unsigned char   **v_memorybitmap;       /* V1: &{0 or &bits} */
        !           125:        void            (*v_setcxsegmap)();     /* Set seg in any context */
        !           126:        void            (**v_vector_cmd)();     /* V2: Handler for 'v' cmd */
        !           127:        int             dummy1z;
        !           128:        int             dummy2z;
        !           129:        int             dummy3z;
        !           130:        int             dummy4z;
        !           131: };
        !           132: 
        !           133: /*
        !           134:  * THE FOLLOWING CONSTANT MUST BE CHANGED ANYTIME THE VALUE OF "PROM_BASE"
        !           135:  * IN cpu.addrs.h IS CHANGED.  IT IS CONSTANT HERE SO THAT EVERY MODULE
        !           136:  * WHICH NEEDS AN ADDRESS OUT OF SUNROMVEC DOESN'T HAVE TO INCLUDE cpu.addrs.h.
        !           137:  */
        !           138: #define        romp    ((struct sunromvec *)0x0FEF0000)
        !           139: /*
        !           140:  * Note that the value of romp will be truncated based on the running
        !           141:  * hardware:
        !           142:  *             Sun-2   0x00EF0000
        !           143:  *             Sun-3   0x0FEF0000
        !           144:  * This was deliberately done for Sun-3 so that programs using this
        !           145:  * header file (with Sun-3 support) will continue to run in Sun-2 systems.
        !           146:  */
        !           147: 
        !           148: /*
        !           149:  * The currently possible values for *romp->v_insource and *romp->v_outsink:
        !           150:  * Note that these may be extended in the future.  Your program should
        !           151:  * cope with this gracefully (e.g. by continuing to vector thru the
        !           152:  * PROM I/O routines if these are set in a way you don't understand).
        !           153:  */
        !           154: #define        INKEYB          0               /* Input from parallel keyboard */
        !           155: #define        INUARTA         1               /* Input or output to Uart A */
        !           156: #define        INUARTB         2               /* Input or output to Uart B */
        !           157: 
        !           158: #define        OUTSCREEN       0               /* Output to frame buffer */
        !           159: #define        OUTUARTA        1               /* Input or output to Uart A */
        !           160: #define        OUTUARTB        2               /* Input or output to Uart B */
        !           161: 
        !           162: /*
        !           163:  * Structure set up by boot command to pass arguments to program booted.
        !           164:  */
        !           165: struct bootparam {
        !           166:        char            *bp_argv[8];    /* string arguments */
        !           167:        char            bp_strings[100];/* string table for string arguments */
        !           168:        char            bp_dev[2];      /* device name */
        !           169:        int             bp_ctlr;        /* controller # */
        !           170:        int             bp_unit;        /* unit # */
        !           171:        int             bp_part;        /* partition/file # */
        !           172:        char            *bp_name;       /* file name, points into bp_strings */
        !           173:        struct boottab  *bp_boottab;    /* Points to table entry for dev */
        !           174: };
        !           175: 
        !           176: 
        !           177: /*
        !           178:  * This table entry describes a device.  It exists in the PROM; a
        !           179:  * pointer to it is passed in bootparam.  It can be used to locate
        !           180:  * PROM subroutines for opening, reading, and writing the device.
        !           181:  * NOTE: When using this interface, only ONE device can be open at once.
        !           182:  * You can't open a tape and a disk.  Sorry.
        !           183:  */
        !           184: struct boottab {
        !           185:        char    b_dev[2];               /* Two char name of dev */
        !           186:        int     (*b_probe)();           /* probe() --> -1 or found ctlr # */
        !           187:        int     (*b_boot)();            /* boot(bp) --> -1 or start address */
        !           188:        int     (*b_open)();            /* open(iobp) --> -1 or 0 */
        !           189:        int     (*b_close)();           /* close(iobp) --> -1 or 0 */
        !           190:        int     (*b_strategy)();        /* strategy(iobp,rw) --> -1 or 0 */
        !           191:        char    *b_desc;                /* Printable string describing dev */
        !           192:        struct devinfo *b_devinfo;      /* Info to configure device */
        !           193: };
        !           194: 
        !           195: /* This defines the set of map entry types */
        !           196: enum MAPTYPES {
        !           197:        MAP_MAINMEM, MAP_OBIO, MAP_MBMEM, MAP_MBIO,
        !           198:        MAP_VME16A16D, MAP_VME16A32D,
        !           199:        MAP_VME24A16D, MAP_VME24A32D,
        !           200:        MAP_VME32A16D, MAP_VME32A32D,
        !           201: };
        !           202: 
        !           203: /*
        !           204:  * This table entry gives information about the resources needed by a
        !           205:  * device.  Maybe it should be merged into the struct boottab, but
        !           206:  * then the struct boottab for each dev should be merged into that
        !           207:  * dev's foo.c file rather than some global config file.
        !           208:  */
        !           209: struct devinfo {
        !           210:        unsigned        d_devbytes;     /* Bytes occupied by dev in IO space */
        !           211:        unsigned        d_dmabytes;     /* Bytes needed by dev in DMA memory */
        !           212:        unsigned        d_localbytes;   /* Bytes needed by dev for local info */
        !           213:        unsigned        d_stdcount;     /* How many standard addresses */
        !           214:        unsigned long   *d_stdaddrs;    /* The vector of standard addresses */
        !           215:        enum MAPTYPES   d_devtype;      /* What map space dev is in */
        !           216:        unsigned        d_maxiobytes;   /* Size to break big I/O's into */
        !           217: };
        !           218: 
        !           219: /*
        !           220:  * This defines the memory map interface between the PROM Monitor
        !           221:  * and the Unix kernel.
        !           222:  */
        !           223: 
        !           224: /*
        !           225:  * The PROM Monitor requires that nobody mess with parts of virtual
        !           226:  * memory if they expect any PROM Monitor services.  These rules
        !           227:  * apply to all the virtual memory between MONSTART and MONEND:
        !           228:  *
        !           229:  *   * Do not write to these addresses.
        !           230:  *   *  Do not read from (depend on the contents of) these addresses, except
        !           231:  *     as documented here or in <mon/sunromvec.h>.
        !           232:  *   * Do not remap these addresses.
        !           233:  *   * Do not change or double-map the pmegs that these addresses
        !           234:  *     map through.
        !           235:  *   * Do not change or double-map the main memory that these
        !           236:  *     addresses map to.
        !           237:  *   * You are free to change or double-map I/O devices which these
        !           238:  *     addresses map to.
        !           239:  *   * These rules apply in all map contexts.
        !           240:  * 
        !           241:  * Other than that, you can do whatever you want with them.
        !           242:  */
        !           243: #if defined(SUN2) || defined(sun2)
        !           244: #define        MONSTART        0x00E00000
        !           245: #define        MONEND          0x00F00000
        !           246: #endif
        !           247: 
        !           248: #if defined(SUN3) || defined(sun3)
        !           249: #define        MONSTART        0x0FE00000
        !           250: #define        MONEND          0x0FF00000
        !           251: #endif
        !           252: 
        !           253: /*
        !           254:  * The one page at MONSHORTPAGE must remain mapped to the same piece
        !           255:  * of main memory.  The pmeg used to map it there can be changed if
        !           256:  * desired.  This page should not be read from or written in.  It is
        !           257:  * used for ROM Monitor globals, since it is addressable with short
        !           258:  * absolute instructions.  (We give a 32-bit value below so the
        !           259:  * compiler/assembler will use absolute short addressing.  The hardware
        !           260:  * will accept either 0 or 0xF as the top 4 bits.)
        !           261:  */
        !           262: #define        MONSHORTPAGE    0xFFFFE000
        !           263: #define        MONSHORTSEG     0xFFFE0000
        !           264: 
        !           265: /*
        !           266:  * For virtual addresses outside the above range, you can remap
        !           267:  * the addresses as desired (but see MONSHORTPAGE).
        !           268:  *
        !           269:  * Any pmeg not referenced by segments between MONSTART and MONEND
        !           270:  * can be used freely (but see MONSHORTPAGE).
        !           271:  *
        !           272:  * When a standalone program is booted, available main memory
        !           273:  * will be mapped contiguously, using ascending physical page addresses,
        !           274:  * starting at virtual location 0.  The complete set of available
        !           275:  * memory may not be mapped due to a lack of PMEGs.  The complete set
        !           276:  * is defined by v_memorysize, v_memoryavail, and v_memorybitmap.
        !           277:  * We guarantee that at least MAINMEM_MAP_SIZE page map entries
        !           278:  * will be available for mapping starting from location 0.
        !           279:  * 
        !           280:  * When a standalone program is booted, at least DVMA_MAP_SIZE bytes
        !           281:  * of segment map entries will be allocated, so that pages can be mapped
        !           282:  * into DVMA space.
        !           283:  */
        !           284: #if defined(SUN2) || defined(sun2)
        !           285: #define        MAINMEM_MAP_SIZE        0x00600000
        !           286: #define        DVMA_MAP_SIZE           0x00080000
        !           287: #endif
        !           288: 
        !           289: #if defined(SUN3) || defined(sun3)
        !           290: #define        MAINMEM_MAP_SIZE        0x00600000
        !           291: #define        DVMA_MAP_SIZE           0x00080000
        !           292: #endif
        !           293: 
        !           294: /*
        !           295:  * The following are included for compatability with previous versions
        !           296:  * of this header file.  Names containing capital letters have been
        !           297:  * changed to conform with "Bill Joy Normal Form".  This section provides
        !           298:  * the translation between the old and new names.  It can go away once
        !           299:  * Sun-1 applications have been converted over.
        !           300:  */
        !           301: #define        RomVecPtr       romp
        !           302: #define        v_SunRev        v_mon_id
        !           303: #define        v_MemorySize    v_memorysize
        !           304: #define        v_EchoOn        v_echo
        !           305: #define        v_InSource      v_insource
        !           306: #define        v_OutSink       v_outsink
        !           307: #define        v_InitGetkey    v_initgetkey
        !           308: #define        v_KeybId        v_keybid
        !           309: #define        v_Keybuf        v_keybuf
        !           310: #define        v_FBAddr        v_fbaddr
        !           311: #define        v_FontTable     v_font
        !           312: #define        v_message       v_printf
        !           313: #define        v_KeyFrsh       v_nmi
        !           314: #define        AbortEnt        v_abortent
        !           315: #define        v_RefrCnt       v_nmiclock
        !           316: #define        v_GlobPtr       v_gp
        !           317: #define        v_KRptInitial   v_keyrinit
        !           318: #define        v_KRptTick      v_keyrtick
        !           319: #define        v_ExitOp        v_exit_to_mon
        !           320: #define        v_fwrstr        v_fwritestr
        !           321: #define        v_linbuf        v_linebuf
        !           322: 
        !           323: #endif MONSTART

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.