/* $Id: segmem.h,v 1.3 1993/07/04 04:04:21 root Exp root $ */ /* * Copyright Robert J. Amstadt, 1993 */ #ifndef SEGMEM_H #define SEGMEM_H #ifdef __linux__ #define HAVE_IPC #include #include #endif /* * Array to track selector allocation. */ #define MAX_SELECTORS 512 #define SELECTOR_ISFREE 0x8000 #define SELECTOR_INDEXMASK 0x0fff extern unsigned short SelectorMap[MAX_SELECTORS]; #ifdef HAVE_IPC #define SAFEMAKEPTR(s, o) (((int) (s) << 16) | ((o) & 0xffff)) #define FIXPTR(p) (p) #else #define SAFEMAKEPTR(s, o) \ (((int) SelectorMap[SelectorMap[(s) >> 3] & SELECTOR_INDEXMASK] << 19) \ | 0x70000 | ((o) & 0xffff)) #define FIXPTR(p) SAFEMAKEPTR((unsigned long) (p) >> 16, (p)) #endif /* * Structure to hold info about each selector we create. */ typedef struct segment_descriptor_s { void *base_addr; /* Pointer to segment in flat memory */ unsigned int length; /* Length of segment */ unsigned int flags; /* Segment flags (see neexe.h and below)*/ unsigned short selector; /* Selector used to access this segment */ unsigned short owner; /* Handle of owner program */ unsigned char type; /* DATA or CODE */ #ifdef HAVE_IPC key_t shm_key; /* Shared memory key or IPC_PRIVATE */ #endif } SEGDESC; /* * Additional flags */ #define NE_SEGFLAGS_MALLOCED 0x00010000 /* Memory allocated with malloc() */ /* * Global memory flags */ #define GLOBAL_FLAGS_MOVEABLE 0x0002 #define GLOBAL_FLAGS_ZEROINIT 0x0040 #define GLOBAL_FLAGS_CODE 0x00010000 #define GLOBAL_FLAGS_EXECUTEONLY 0x00020000 #define GLOBAL_FLAGS_READONLY 0x00020000 #define FIRST_SELECTOR 8 static __inline__ int Is16bitAddress(void *address) { return ((int) address >= (((FIRST_SELECTOR << 3) | 0x0007) << 16)); } #endif /* SEGMEM_H */