sunromvec.h,v
来自「TCP-IP红宝书源代码」· H,V 代码 · 共 361 行
H,V
361 行
head 1.2;
access;
symbols;
locks
dls:1.2; strict;
comment @ * @;
1.2
date 97.09.21.19.26.19; author dls; state Dist;
branches;
next 1.1;
1.1
date 94.05.10.20.48.46; author dls; state Old;
branches;
next ;
desc
@@
1.2
log
@pre-3e code
@
text
@/* @@(#)sunromvec.h 2.30 85/08/13 SMI */
/*
* Copyright (c) 1985 by Sun Microsystems, Inc.
*/
#ifndef MONSTART
/*
* sunromvec.h
*
* This file defines the entire interface between the PROM Monitor
* and programs (or kernels) that run under it.
*
* The main interface is the vector table at the front of the boot rom.
*
* This vector table is the only knowledge the outside world has of this prom.
* It is referenced by hardware (Reset SSP, PC), and software.
* Once located, no entry can be re-located unless you change the world
* that needs it.
*
* The easiest way to reference elements of this vector is to say:
*
* *romp->xxx
*
* as in:
*
* (*romp->v_putchar) (c);
*
* This is pretty cheap as it only generates movl 0xNNNNNNNN:l,a0; jsr a0@@ .
* That's 2 bytes longer, and 4 cycles longer, than a simple subroutine call.
*
* Various entries have been added at various times. As of Rev N PROM
* Monitors, the vector table includes an entry "v_romvec_version" which
* is an integer defining which entries in the table are valid. The
* comments on each entry say which version the entry first appeared in
* with a prefix like "V1:". To determine if the PROMs your program is
* running under contain the entry, you can simply compare the value
* of v_romvec_version to the constant in the comment field, e.g.
*
* if (romp->v_romvec_version >= 1)
* { reference *romp->v_memorybitmap...}
* else
* { running under older prom, punt somehow }
*
* Entries which do not contain a "Vn:" string are in Version 0 of the
* proms (Rev N and onward).
*/
struct sunromvec {
char *v_initsp; /* Initial SSP for hardware */
void (*v_startmon)(); /* Initial PC for hardware */
int *v_diagberr; /* Bus err handler for diags */
/* Configuration information passed to standalone code & Unix */
struct bootparam **v_bootparam; /* Info for bootstrapped pgm */
unsigned *v_memorysize; /* Total phys memory in bytes */
/* Single-character input and output */
unsigned char (*v_getchar)(); /* Get char from input source */
void (*v_putchar)(); /* Put char to output sink */
int (*v_mayget)(); /* Maybe get char, or -1 */
int (*v_mayput)(); /* Maybe put char, or -1 */
unsigned char *v_echo; /* Should getchar echo? */
unsigned char *v_insource; /* Input source selector */
unsigned char *v_outsink; /* Output sink selector */
/* Keyboard input and frame buffer output */
int (*v_getkey)(); /* Get next key if one exists */
void (*v_initgetkey)(); /* Like it says */
unsigned int *v_translation; /* Kbd translation selector */
unsigned char *v_keybid; /* Keyboard ID byte */
int *v_screen_x; /* V2: Screen x pos (R/O) */
int *v_screen_y; /* V2: Screen y pos (R/O) */
struct keybuf *v_keybuf; /* Up/down keycode buffer */
char *v_mon_id; /* Revision level of monitor */
/* Frame buffer output and terminal emulation */
void (*v_fwritechar)(); /* Write a character to FB */
int *v_fbaddr; /* Address of frame buffer */
char **v_font; /* font table for FB */
void (*v_fwritestr)(); /* Quickly write string to FB */
/* Reboot interface routine -- resets and reboots system. No return. */
void (*v_boot_me)(); /* eg boot_me("xy()vmunix") */
/* Line input and parsing */
unsigned char *v_linebuf; /* The line input buffer */
unsigned char **v_lineptr; /* Cur pointer into linebuf */
int *v_linesize; /* length of line in linebuf */
void (*v_getline)(); /* Get line from user */
unsigned char (*v_getone)(); /* Get next char from linebuf */
unsigned char (*v_peekchar)(); /* Peek at next char */
int *v_fbthere; /* =1 if frame buffer there */
int (*v_getnum)(); /* Grab hex num from line */
/* Phrase output to current output sink */
int (*v_printf)(); /* Similar to "Kernel printf" */
void (*v_printhex)(); /* Format N digits in hex */
unsigned char *v_leds; /* RAM copy of LED register */
void (*v_set_leds)(); /* Sets LED's and RAM copy */
/* nmi related information */
void (*v_nmi)(); /* Addr for level 7 vector */
void (*v_abortent)(); /* entry for keyboard abort */
int *v_nmiclock; /* counts up in msec */
int *v_fbtype; /* FB type: see <sun/fbio.h> */
/* Assorted other things */
unsigned v_romvec_version; /* Version # of Romvec */
struct globram *v_gp; /* monitor global variables */
struct zscc_device *v_keybzscc; /* Addr of keyboard in use */
int *v_keyrinit; /* ms before kbd repeat */
unsigned char *v_keyrtick; /* ms between repetitions */
unsigned *v_memoryavail; /* V1: Main mem usable size */
long *v_resetaddr; /* where to jump on a reset */
long *v_resetmap; /* pgmap entry for resetaddr */
/* Really struct pgmapent * */
void (*v_exit_to_mon)(); /* Exit from user program */
unsigned char **v_memorybitmap; /* V1: &{0 or &bits} */
void (*v_setcxsegmap)(); /* Set seg in any context */
void (**v_vector_cmd)(); /* V2: Handler for 'v' cmd */
int dummy1z;
int dummy2z;
int dummy3z;
int dummy4z;
};
/*
* THE FOLLOWING CONSTANT MUST BE CHANGED ANYTIME THE VALUE OF "PROM_BASE"
* IN cpu.addrs.h IS CHANGED. IT IS CONSTANT HERE SO THAT EVERY MODULE
* WHICH NEEDS AN ADDRESS OUT OF SUNROMVEC DOESN'T HAVE TO INCLUDE cpu.addrs.h.
*/
#define romp ((struct sunromvec *)0x0FEF0000)
/*
* Note that the value of romp will be truncated based on the running
* hardware:
* Sun-2 0x00EF0000
* Sun-3 0x0FEF0000
* This was deliberately done for Sun-3 so that programs using this
* header file (with Sun-3 support) will continue to run in Sun-2 systems.
*/
/*
* The currently possible values for *romp->v_insource and *romp->v_outsink:
* Note that these may be extended in the future. Your program should
* cope with this gracefully (e.g. by continuing to vector thru the
* PROM I/O routines if these are set in a way you don't understand).
*/
#define INKEYB 0 /* Input from parallel keyboard */
#define INUARTA 1 /* Input or output to Uart A */
#define INUARTB 2 /* Input or output to Uart B */
#define OUTSCREEN 0 /* Output to frame buffer */
#define OUTUARTA 1 /* Input or output to Uart A */
#define OUTUARTB 2 /* Input or output to Uart B */
/*
* Structure set up by boot command to pass arguments to program booted.
*/
struct bootparam {
char *bp_argv[8]; /* string arguments */
char bp_strings[100];/* string table for string arguments */
char bp_dev[2]; /* device name */
int bp_ctlr; /* controller # */
int bp_unit; /* unit # */
int bp_part; /* partition/file # */
char *bp_name; /* file name, points into bp_strings */
struct boottab *bp_boottab; /* Points to table entry for dev */
};
/*
* This table entry describes a device. It exists in the PROM; a
* pointer to it is passed in bootparam. It can be used to locate
* PROM subroutines for opening, reading, and writing the device.
* NOTE: When using this interface, only ONE device can be open at once.
* You can't open a tape and a disk. Sorry.
*/
struct boottab {
char b_dev[2]; /* Two char name of dev */
int (*b_probe)(); /* probe() --> -1 or found ctlr # */
int (*b_boot)(); /* boot(bp) --> -1 or start address */
int (*b_open)(); /* open(iobp) --> -1 or 0 */
int (*b_close)(); /* close(iobp) --> -1 or 0 */
int (*b_strategy)(); /* strategy(iobp,rw) --> -1 or 0 */
char *b_desc; /* Printable string describing dev */
struct devinfo *b_devinfo; /* Info to configure device */
};
/* This defines the set of map entry types */
enum MAPTYPES {
MAP_MAINMEM, MAP_OBIO, MAP_MBMEM, MAP_MBIO,
MAP_VME16A16D, MAP_VME16A32D,
MAP_VME24A16D, MAP_VME24A32D,
MAP_VME32A16D, MAP_VME32A32D,
};
/*
* This table entry gives information about the resources needed by a
* device. Maybe it should be merged into the struct boottab, but
* then the struct boottab for each dev should be merged into that
* dev's foo.c file rather than some global config file.
*/
struct devinfo {
unsigned d_devbytes; /* Bytes occupied by dev in IO space */
unsigned d_dmabytes; /* Bytes needed by dev in DMA memory */
unsigned d_localbytes; /* Bytes needed by dev for local info */
unsigned d_stdcount; /* How many standard addresses */
unsigned long *d_stdaddrs; /* The vector of standard addresses */
enum MAPTYPES d_devtype; /* What map space dev is in */
unsigned d_maxiobytes; /* Size to break big I/O's into */
};
/*
* This defines the memory map interface between the PROM Monitor
* and the Unix kernel.
*/
/*
* The PROM Monitor requires that nobody mess with parts of virtual
* memory if they expect any PROM Monitor services. These rules
* apply to all the virtual memory between MONSTART and MONEND:
*
* * Do not write to these addresses.
* * Do not read from (depend on the contents of) these addresses, except
* as documented here or in <mon/sunromvec.h>.
* * Do not remap these addresses.
* * Do not change or double-map the pmegs that these addresses
* map through.
* * Do not change or double-map the main memory that these
* addresses map to.
* * You are free to change or double-map I/O devices which these
* addresses map to.
* * These rules apply in all map contexts.
*
* Other than that, you can do whatever you want with them.
*/
#if defined(SUN2) || defined(sun2)
#define MONSTART 0x00E00000
#define MONEND 0x00F00000
#endif
#if defined(SUN3) || defined(sun3)
#define MONSTART 0x0FE00000
#define MONEND 0x0FF00000
#endif
/*
* The one page at MONSHORTPAGE must remain mapped to the same piece
* of main memory. The pmeg used to map it there can be changed if
* desired. This page should not be read from or written in. It is
* used for ROM Monitor globals, since it is addressable with short
* absolute instructions. (We give a 32-bit value below so the
* compiler/assembler will use absolute short addressing. The hardware
* will accept either 0 or 0xF as the top 4 bits.)
*/
#define MONSHORTPAGE 0xFFFFE000
#define MONSHORTSEG 0xFFFE0000
/*
* For virtual addresses outside the above range, you can remap
* the addresses as desired (but see MONSHORTPAGE).
*
* Any pmeg not referenced by segments between MONSTART and MONEND
* can be used freely (but see MONSHORTPAGE).
*
* When a standalone program is booted, available main memory
* will be mapped contiguously, using ascending physical page addresses,
* starting at virtual location 0. The complete set of available
* memory may not be mapped due to a lack of PMEGs. The complete set
* is defined by v_memorysize, v_memoryavail, and v_memorybitmap.
* We guarantee that at least MAINMEM_MAP_SIZE page map entries
* will be available for mapping starting from location 0.
*
* When a standalone program is booted, at least DVMA_MAP_SIZE bytes
* of segment map entries will be allocated, so that pages can be mapped
* into DVMA space.
*/
#if defined(SUN2) || defined(sun2)
#define MAINMEM_MAP_SIZE 0x00600000
#define DVMA_MAP_SIZE 0x00080000
#endif
#if defined(SUN3) || defined(sun3)
#define MAINMEM_MAP_SIZE 0x00600000
#define DVMA_MAP_SIZE 0x00080000
#endif
/*
* The following are included for compatability with previous versions
* of this header file. Names containing capital letters have been
* changed to conform with "Bill Joy Normal Form". This section provides
* the translation between the old and new names. It can go away once
* Sun-1 applications have been converted over.
*/
#define RomVecPtr romp
#define v_SunRev v_mon_id
#define v_MemorySize v_memorysize
#define v_EchoOn v_echo
#define v_InSource v_insource
#define v_OutSink v_outsink
#define v_InitGetkey v_initgetkey
#define v_KeybId v_keybid
#define v_Keybuf v_keybuf
#define v_FBAddr v_fbaddr
#define v_FontTable v_font
#define v_message v_printf
#define v_KeyFrsh v_nmi
#define AbortEnt v_abortent
#define v_RefrCnt v_nmiclock
#define v_GlobPtr v_gp
#define v_KRptInitial v_keyrinit
#define v_KRptTick v_keyrtick
#define v_ExitOp v_exit_to_mon
#define v_fwrstr v_fwritestr
#define v_linbuf v_linebuf
#endif MONSTART
@
1.1
log
@Initial revision
@
text
@@
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?