Files
Arquivotheca.AIX-4.1.3/bos/kernel/sys/POWER/seg.h
seta75D d6fe8fe829 Init
2021-10-11 22:19:34 -03:00

154 lines
4.9 KiB
C

/* @(#)52 1.31 src/bos/kernel/sys/POWER/seg.h, sysvmm, bos411, 9428A410j 1/20/94 16:19:10 */
/*
* COMPONENT_NAME: (SYSVMM) Virtual Memory Manager
*
* FUNCTIONS:
*
* ORIGINS: 27, 83
*
*
* (C) COPYRIGHT International Business Machines Corp. 1988, 1993
* All Rights Reserved
* Licensed Materials - Property of IBM
* US Government Users Restricted Rights - Use, duplication or
* disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
*/
/*
* LEVEL 1, 5 Years Bull Confidential Information
*/
#ifndef _H_SEG
#define _H_SEG
#include <sys/inode.h>
/*
* Memory management addresses and bits
*/
#ifdef _POWER
/* extract sid from sreg value */
#define SRTOSID(srval) ( (srval) & 0xffffff )
/* extract key from sreg value */
#define SRTOKEY(srval) ( ((srval) >> 30) & 0x1 )
/*
* The SRVAL macro should only be used in the base kernel but the _KERNSYS
* define wasn't used previously to enforce this. Uses of SRVAL outside of
* the base kernel continue to get the old definition.
*/
#ifdef _KERNSYS
extern int key_value;
#define SRVAL(sid,key,special) ( (sid) | ((key) ? key_value : 0) )
#else
#define SRVAL(sid,key,special) ( (sid) | (key) << 30 )
#endif /* _KERNSYS */
#define INVLSID 0x7fffff /* generic invalid sid */
#define INVALIDSID(sid) ((sid) == INVLSID || (sid) == RSVDSID)
/* macro to check invalid sid */
#endif /* _POWER */
#define NSEGS 16 /* number of segment regs */
#define SEGSHIFT 28 /* segment reg shift count */
#define SEGOFFSET(x) (((int)x)& 0x0fffffff) /* mask to get segment offset */
#define SEGSIZE (1<<28) /* segment size */
#define NULLSEGID INVLSID /* generic invalid sid */
#define NULLSEGVAL SRVAL(NULLSEGID,0,0) /* null segreg value */
#define KERNELSEGID 0x0 /* kernel segment ID */
#define KERNELSEGVAL SRVAL(KERNELSEGID,0,0) /* kernel segreg value */
/*
* This is a temporary situation until the loader is sorted out.
*/
/*
* BASE is lowest addr in seg, TOP is highest, 0x?FFFFFFF
*/
#define BASE(seg) ((seg)<<SEGSHIFT)
#define TOP(seg) ((BASE((seg)+1))-1)
#define LASTLONG(seg) ((BASE(seg+1))-4)
#define KERNELORG 0x00000000 /* kernel segment origin */
#define KERNELSEG 0 /* kernel segment register */
#define KSTACKORG 0x10000000 /* extra kstacks seg org */
#define KSTACKSEG 1 /* extra kstacks seg reg */
#define KERNEXORG 0xE0000000 /* kernel extension seg org */
#define KERNEXSEG 14 /* kernel extension seg reg */
#define TEXTORG 0x10000000 /* text segment origin */
#define TEXTSEG 1 /* text segment register */
/* NOTE: PRIVSEG should eventually replace DATASEG */
#define PRIVORG 0x20000000 /* private segment origin */
#define PRIVSEG 2 /* private segment reg. */
#define DATAORG 0x20000000 /* data segment origin */
#define DATASEG 2 /* data segment register */
#define STACKSEG 2 /* stack segment register */
#define BDATASEG 3 /* big data segment number */
#define BDATAORG 0x30000000 /* big data segment origin */
#define BDATASEGMAX 11 /* max seg # for big data */
#define TEMPORG 0xC0000000 /* temp segment origin */
#define TEMPSEG 12 /* temp segment register */
#define SHTEXTORG 0xD0000000 /* shared text segment origin */
#define SHTEXTSEG 13 /* shared text seg reg */
#define IOORG 0xF0000000 /* I/O bus origin */
#define IOSEG 15 /* I/O segment register */
#define SHDATAORG 0xF0000000 /* shared data segment origin */
#define SHDATASEG 15 /* shared data seg reg */
/*
* Masks for creating segments.
*/
#define PRIV_SEG_OPTS 0x80000000 /* process private seg w/ key=R/W */
#define TEXT_SEG_OPTS 0x40000000 /* text seg */
#define READ_ACC 1 /** segment access **/
#define WRITE_ACC 2
/*
* segstate structure is used by the shared memory services to mark
* the ussage of allocated segments. Segments can be used for mapped
* files or shared memory.
*
* mapped files - any size file can be mapped, so up to 8
* consecutive segment registers can be allocated for
* a mapped file. The first segment will have numsegs
* set to the number of segment registers used to map
* the file. All other segments in the mapped file
* will have numsegs set to -1.
*
* shared memory - only one shared memory segment can be attatched
* to with a shmat call.
*/
struct segstate {
ushort segflag; /* type of segment */
ushort num_segs; /* number of segments */
union {
uint mfileno; /* file discreptor */
struct shmid_ds *shmptr; /* shared memory descriptor */
ulong srval;
} u_ptrs;
};
#define shm_ptr u_ptrs.shmptr
#define segfileno u_ptrs.mfileno
#define ss_srval u_ptrs.srval
/*
* segflag values
*/
#define SEG_AVAIL 0x0000 /* unused segment */
#define SEG_SHARED 0x0001 /* shared memory segment */
#define SEG_MAPPED 0x0002 /* mapped file */
#define SEG_MRDWR 0x0004 /* file mapped read write */
#define SEG_DEFER 0x0008 /* defered update */
#define SEG_MMAP 0x0010 /* mmap()'d file */
#define SEG_WORKING 0x0020 /* working storage */
#endif /* _H_SEG */