⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpu.map.h

📁 操作系统SunOS 4.1.3版本的源码
💻 H
字号:
/*      @(#)cpu.map.h 1.1 92/07/30 SMI; from UCB X.X XX/XX/XX       *//* * Copyright (c) 1986 by Sun Microsystems, Inc. *//* * Memory Mapping and Paging on the Sun-2 * * This file is used for both standalone code (ROM Monitor,  * Diagnostics, boot programs, etc) and for the Unix kernel.  IF YOU HAVE * TO CHANGE IT to fit your application, MOVE THE CHANGE BACK TO THE PUBLIC * COPY, and make sure the change is upward-compatible.  The last thing we  * need is seventeen different copies of this file, like we have with the * Sun-1 header files. */#ifndef ADRSPC_SIZE/* * The address space available to a single process is 16 Megabytes. */#define	ADRSPC_SIZE	0x1000000/* * The context registers selects among 16 different address spaces.  Each * address space typically corresponds to a process and is 16 megabytes. * Each memory access is translated thru the address space indicated by * one of two context registers -- user or supervisor.  The distinction * is made based on the 68010's FC0-2 (function code) bits and thus can be * deliberately fooled by the "movs" instruction. * * The two context registers each occupy a byte, although only the low * bits are relevant.  The high-order bits are ignored on writes, * and return garbage on reads.  You can mask with CONTEXTMASK. */typedef unsigned char context_t;struct context_regs {	context_t cx_super;		/* Supervisor access context number */	context_t cx_user;		/* User access context number */};#define	NUMCONTEXTS	8#define	CONTEXTMASK	(NUMCONTEXTS-1)	/* Relevant bits on read of cx reg *//* * The segment map determines which large pieces of the 16M address space * are actually in use.  Each chunk of address space is mapped to a set of * PGSPERSEG page map entries.  Chunks which are not in use should all be * mapped to the same set of page map entries, which should prohibit * all accesses. * * There are SEGSPERCONTEXT segment map entries in each logical context. * There are NUMPMEGS total page map entry groups (pmegs) in the physical * page map.  Each segment map entry references a pmeg which contains * the PGSPERSEG pages defining that segment. * * Note that there is twice as much virtual address space (16M) as there * is physical space mappable at one time (8M).  You can't map in 16 megs * at once even if you have that much physical memory, since the page map * is the bottleneck here.  The solution is to "page" the page map entries * in and out of the physical pmegs on demand. */typedef unsigned char segnum_t; /* Segment number */#define	SEGSPERCONTEXT	512#define	NUMPMEGS	256#define	PGSPERSEG	16/* * The following values are valid in the pm_type field of the page map. */enum pm_types {	/*	 * Multibus CPU page types	 */	MPM_MEMORY	= 0,	/* Page is main memory or frame buffer */	MPM_IO		= 1,	/* Page is main I/O */	MPM_BUSMEM	= 2,	/* Page is memory on the Multibus */	MPM_BUSIO	= 3,	/* Page is I/O on the Multibus */	/* Multibus values of 4 thru 7 are reserved for future enhancements */	/*	 * VME CPU page types	 */	VPM_MEMORY	= 0,	/* Page is in main memory */	VPM_IO		= 1,	/* Page is onboard I/O or frame buffer */	VPM_VME0	= 2,	/* Page is in low 8M of VME bus */	VPM_VME8	= 3,	/* Page is in high 8M of VME bus, or VME I/O */		/* VME values of 4 thru 7 are reserved for future enhancements */#define	VPM_VME16	VPM_VME0	/* 16-bit-data.  Doesn't really					   work (for top 8 megs). */};/* * The following are valid in the pm_permissions field. */enum pm_perm {        PMP_RO          = 0,    /* Page is read-only by all */        PMP_RO_SUP      = 1,    /* Page is read-only by supervisor */        PMP_ALL         = 2,    /* Page is read-write by all */        PMP_SUP         = 3,    /* Page is read-write by supervisor */};/* * The page map gives fine-grain control over memory allocation.  Each page * map entry controls BYTESPERPG (a page) of memory.  Each page can be mapped * to memory, I/O, or a global bus (eg, Multibus), or can be inaccessible. * Independent protection against reading, writing, or executing, for the * supervisor and for the user, is provided.  If access is denied, the * page referenced and modified bits will not be changed, nor will the page * number or type fields be used; so they can be used by software. */#define	BYTESPERPG	2048#define	BYTES_PG_SHIFT	11struct pgmapent {	unsigned	pm_valid	:1;	/* This entry is valid */	unsigned	pm_permissions	:6;	/* Access privileges */	enum pm_types	pm_type		:3;	/* Type of page */	unsigned 	pm_accessed	:1;	/* Page has been read */	unsigned	pm_modified	:1;	/* Page has been written */	unsigned	pm_reserved	:4;	/* Reserved: page # expansion */	unsigned	pm_page		:16;	/* Page # in physical memory */};#define	PMREALBITS	0xFFF00FFF	/* Which are actually implemented *//* * The following permissions may be OR-ed together to create the * pm_permissions field. */#define	PMP_SUP_READ		0x20#define	PMP_SUP_WRITE		0x10#define	PMP_SUP_EXECUTE		0x08#define	PMP_USER_READ		0x04#define	PMP_USER_WRITE		0x02#define	PMP_USER_EXECUTE	0x01#define	PMP_NONE		0x00#define	PMP_SUP_ALL		0x38#define	PMP_USER_ALL		0x07/* Equivalents for Sun-3 permissions */#define	PMP_RO			0x2D#define	PMP_RO_SUP		0x28#define	PMP_ALL			0x3F#define	PMP_SUP			0x38/* * When the page type is PM_IO, the page number field selects * which of the main I/O device chips is being selected.  Low-order (non- * mapped) address bits connect to the address lines of the device and * determine which facility of the device is being accessed. * * Multibus I/O pages first. */#define	MIOPG_PROM	0	/* Bootstrap proms */#define	MIOPG_FLOAT	1	/* Intel 80287 Floating Point Processor */#define	MIOPG_DES	2	/* AMD 8068 data ciphering processor */#define	MIOPG_PARALLEL	3	/* Parallel input port (kbd/mouse) */#define	MIOPG_SERIAL0	4	/* Dual serial Z8530 SCC */#define	MIOPG_TIMER	5	/* AMD 9513 System Timing Controller */#define	MIOPG_ROP	6	/* RasterOp Processor */#define	MIOPG_CLOCK	7	/* National 58167 real-time clock *//* * VME I/O pages */#define	VIOPG_VIDEO	0	/* Frame buffer is first 128K of I/O space */#define	VIOPG_VIDEOCTL	0x40	/* Video control register at loc 128K */#define	VIOPG_PROM	0xFE0	/* Bootstrap proms */#define	VIOPG_ETHER	0xFE1	/* Intel 82586 Ethernet interface */#define	VIOPG_DES	0xFE2	/* AMD 8068 data ciphering processor */#define	VIOPG_KBM	0xFE3	/* Dual serial Z8530 SCC for keyboard&mouse */#define	VIOPG_SERIAL0	0xFE4	/* Dual serial Z8530 SCC */#define	VIOPG_TIMER	0xFE5	/* AMD 9513 System Timing Controller *//*			0xFE6	/* unused *//*			0xFE7	/* unused *//* * Other special page numbers -- Multibus *//* Frame buffer board, including buffer, zscc for keyb/mouse, ctrl reg */#define	MEMPG_VIDEO		(0x700000 >> BYTES_PG_SHIFT)#define	MEMPG_VIDEO_ZSCC	(0x780000 >> BYTES_PG_SHIFT)#define MEMPG_VIDEO_CTRL	(0x781800 >> BYTES_PG_SHIFT)/* * Other special page numbers -- VME */#define	VMEPG_16ADDR	0xFE0	/* Base of VME 16-bit address space */				/* Base address (not pg#) of VME color */#define	VME_COLOR_PHYS	0x400000				/* Now do page type and page number */#if VME_COLOR_PHYS < 0x800000#define	VPM_VME_COLOR	VPM_VME0	/* Page type for VME color */#else#define	VPM_VME_COLOR	VPM_VME8	/* Page type for VME color */#endif#define	VMEPG_COLOR	((VME_COLOR_PHYS&0x7FFFFF) >> BYTES_PG_SHIFT)/* * The maps are accessed from supervisor state by using the "movs" (Move * Spacey) instruction.  This moves a byte, word, or longword to/from a * register and a location in another address space.  The Sun-2 hardware * defines one of these address spaces (defined by function code values) * as the "maps address space".  The particular map accessed is determined * by the low-order 3 bits of the address used.  (The other low-order bits * are reserved for future use.)  The particular entry accessed * is determined by the high-order bits of the address used -- * we access the entry that controls that address in user space. * * The following defines the encodings for the various address spaces used * by "movs". */#define	FC_UD	1	/* User Data */#define	FC_UP	2	/* User Program */#define	FC_MAP	3	/* Sun-2 Memory Maps */#define	FC_SD	5	/* Supervisor Data */#define	FC_SP	6	/* Supervisor Program */#define	FC_CPU	7	/* CPU Space (Int Ack, Co-processors) */#define	SEGMAPADR(addr)	(char *)(((int)addr&MAPADDRMASK)+SMAPOFF)#define	PAGEMAPADR(addr)(long *)(((int)addr&MAPADDRMASK)+PMAPOFF)#define	MAPADDRMASK	0xFFFFF800	/* Masks random addresses for mapping */#define	PMAPOFF		0	/* Page map offset within maps */#define	CONTEXTOFF	6	/* Context registers are at loc 6 */#define	SUPCONTEXTOFF	6	/* Supervisor context at loc 6 */#define	USERCONTEXTOFF	7	/* User context just afterward */#define	SMAPOFF		5	/* Segment map offset within maps */#define	IDPROMOFF	8	/* ID Prom at 8, 8+0x800, etc */#define	LEDOFF		0xB	/* LED's for diagnostics -- 0=lit */#define	BUSERROFF	0xD	/* Bus Error Register - tells why */#define	ENABLEOFF	0xF	/* System Enable Reg -- turns me on */#ifdef MENU#define UDMAENABLEOFF   0x5000000      /* User DVMA Enable Reg */#endif MENU/* * The following subroutines accept any address in the mappable range * (16 megs).  They access the map for the current user context.  They * assume that we are currently running in supervisor state. * * We can't declare getpgmap() as returning a struct, because our C compiler * is brain damaged and returns a pointer to a static area if you return a * struct.  We therefore return an int and require the caller to set up * unions and other assorted random hacks because the language * implementation doesn't support structures returned from reentrant routines. */ extern /*struct pgmapent*/ getpgmap();	/* (addr) */extern                     setpgmap();	/* (addr, entry) */extern segnum_t getsegmap();		/* (addr) */extern          setsegmap();		/* (addr, entry) */extern context_t getsupcontext();	/* () */extern           setsupcontext();	/* (entry) */extern context_t getusercontext();	/* () */extern           setusercontext();	/* (entry) */#endif ADRSPC_SIZE

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -