2.9BSD/usr/include/sys/seg.h
/*
* Addresses and bits for DEC's KT-11
* and macros for remapping kernel data space.
*/
#define UISD ((u_short *) 0177600) /* first user I-space descriptor */
#ifdef ENABLE34
# define DEC_UISA7 ((u_short *) 0177656)
extern u_short *UISA, *UDSA, *KISA0, *KDSA1, *KDSA2, *KDSA5, *KDSA6;
#else
# define UISA ((u_short *) 0177640) /* first user I-space address */
# define UDSA ((u_short *) 0177660) /* first user D-space address */
#endif ENABLE34
/*
* Access abilities
*/
#define RO 02 /* Read only */
#define RW 06 /* Read and write */
#define NOACC 0 /* Abort all accesses */
#define ACCESS 07 /* Mask for access field */
#define ED 010 /* Extension direction */
#define TX 020 /* Software: text segment */
#define ABS 040 /* Software: absolute address */
u_short *ka6; /* nonseparate: KISA6; separate: KDSA6 */
#ifndef ENABLE34
# define KISA0 ((u_short *) 0172340)
# define KISA1 ((u_short *) 0172342)
# define KISA5 ((u_short *) 0172352)
# define KISA6 ((u_short *) 0172354)
# define SSR3 ((u_short *) 0172516)
#endif ENABLE34
#define KISD1 ((u_short *) 0172302)
#define KISD5 ((u_short *) 0172312)
#define KISD6 ((u_short *) 0172314)
#ifdef KERN_NONSEP
# ifndef ENABLE34
# define KDSA5 KISA5
# define KDSA6 KISA6
# endif ENABLE34
# define KDSD5 KISD5
# define KDSD6 KISD6
#else
# ifndef ENABLE34
# define KDSA5 ((u_short *) 0172372)
# define KDSA6 ((u_short *) 0172374)
# endif ENABLE34
# define KDSD5 ((u_short *) 0172332)
# define KDSD6 ((u_short *) 0172334)
#endif
#define SEG5 ((caddr_t) 0120000)
/*
* Macros for resetting the kernel segmentation registers to map in
* out-of-address space data.
* If KDSA5 is used for kernel data space (NOKA5 not defined),
* only proc, file and text tables are allowed in that range.
* Routines can repoint KDSA5 to map in data such as buffers or clists
* without raising processor priority by calling these macros.
* Copy (in mch.s) uses two registers, KDSA5 and 6. If KDSA6 is in use,
* the prototype register kdsa6 will be non-zero, and the kernel will
* be running on a temporary stack in bss.
* Interrupt routines that access any of the structures in this range
* or the u. must call savemap (in machdep.c) to save the current mapping
* information in a local structure and restore it before returning.
* If KDSA5 is not used for static kernel data, only KDSA6 need be
* saved and restored to access all static data at interrupt time.
*
* USAGE:
* To repoint KDSA5 from the top level,
* mapseg5(addr, desc); * KDSA5 now points at addr *
* ...
* normalseg5(); * normal mapping *
* To repoint KDSA5 from interrupt or top level,
* segm saveregs;
* saveseg5(saveregs); * save previous mapping of segment 5 *
* mapseg5(addr, desc); * KDSA5 now points at addr *
* ...
* restorseg5(saveregs); * restore previous mapping *
* To access proc, text, file or user structures from interrupt level,
* mapinfo map;
* savemap(map); * save ALL mapping information, *
* * restore normal mapping of KA5 and 6 *
* ...
* restormap(map); * restore previous mapping *
*/
/*
* Structure to hold a saved PAR/PDR pair.
*/
struct segm_reg {
unsigned se_desc;
unsigned se_addr;
};
typedef struct segm_reg segm;
unsigned kdsa6; /* saved KDSA6, if any */
#define KD6 (((USIZE-1)<<8) | RW) /* prototype descriptor for u. */
#define NOMAP 65535 /* invalid PDR value */
/*
* remap_area is a dummy var at start of possibly-mapped area,
* for consistency check. Only proc, text and file tables are after it,
* and it must lie at <= 0120000, or other kernel data will be mapped out.
*/
extern int remap_area;
#ifndef NOKA5
segm seg5; /* prototype KDSA5, KDSD5 */
typedef struct segm_reg mapinfo[2]; /* KA5, KA6 */
/* Restore normal kernel map for seg5. */
#define normalseg5() restorseg5(seg5)
/* save previous mapping information and restore normal mapping. */
#define savemap(map) {if (*KDSA5 != seg5.se_addr) Savemap(map); \
else map[0].se_desc = NOMAP; }
/* Restore previous mapping on return from interrupt. */
#define restormap(map) {if (map[0].se_desc != NOMAP) Restormap(map); }
#else NOKA5
typedef struct segm_reg mapinfo[1]; /* KDSA6 only */
/*
* Restore normal kernel map for seg5: unneeded,
* since no kernel data are in this range.
*/
#define normalseg5() /* not needed */
/* save previous mapping information and restore normal mapping. */
#define savemap(map) if (kdsa6) { \
map[0].se_addr = *KDSA6; \
map[0].se_desc = *KDSD6; \
*KDSD6 = KD6; \
*KDSA6 = kdsa6; \
} else map[0].se_desc = NOMAP;
/* Restore previous mapping on return from interrupt. */
#define restormap(map) if (map[0].se_desc != NOMAP) { \
*KDSD6 = map[0].se_desc; \
*KDSA6 = map[0].se_addr; \
}
#endif NOKA5
/* Use segment 5 to access the given address. */
#define mapseg5(addr,desc) {*KDSA5 = addr; *KDSD5 = desc;}
/* Save the previous contents of KDSA5/KDSD5. */
#define saveseg5(save) {save.se_addr = *KDSA5; save.se_desc = *KDSD5;}
/* Restore the previous contents of KDSA5/KDSD5. */
#define restorseg5(save) {*KDSD5 = save.se_desc; *KDSA5 = save.se_addr;}