| /* $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 |
| |
| #include "wine.h" |
| |
| #ifdef __linux__ |
| #define HAVE_IPC |
| #include <sys/ipc.h> |
| #include <sys/shm.h> |
| #endif |
| |
| #if defined(__NetBSD__) || defined(__FreeBSD__) |
| #define HAVE_IPC |
| #include <sys/types.h> |
| #include <sys/ipc.h> |
| #include <sys/shm.h> |
| #define SHMSEG 32 /* XXX SEMMNI /usr/src/sys/conf/param.h */ |
| #define SHM_RANGE_START 0x40000000 |
| #endif |
| |
| /* |
| * Array to track selector allocation. |
| */ |
| #define SELECTOR_ISFREE 0x8000 |
| #define SELECTOR_IS32BIT 0x4000 |
| #define SELECTOR_INDEXMASK 0x0fff |
| |
| #define __AHSHIFT 3 |
| #define __AHINCR (1 << __AHSHIFT) |
| |
| extern unsigned short* SelectorMap; |
| |
| #ifdef HAVE_IPC |
| #define SAFEMAKEPTR(s, o) ((void *)(((int) (s) << 16) | ((o) & 0xffff))) |
| #define FIXPTR(p) (p) |
| #else |
| #define SAFEMAKEPTR(s, o) \ |
| ((void*)(((int)SelectorMap[SelectorMap[(s)>>__AHSHIFT] & SELECTOR_INDEXMASK]\ |
| << (16 + __AHSHIFT)) | 0x70000 | ((o) & 0xffff))) |
| #define FIXPTR(p) SAFEMAKEPTR((unsigned long) (p) >> 16, (p)) |
| #endif |
| |
| #define MAKESELECTOR(fp) ((unsigned short) (fp >> (16 + __AHSHIFT))) |
| |
| |
| /* |
| * 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 -1 */ |
| #endif |
| } SEGDESC; |
| |
| extern int IPCCopySelector(int i_old, unsigned long new, int swap_type); |
| |
| /* |
| * 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 |
| |
| #ifdef __ELF__ |
| #define FIRST_SELECTOR 2 |
| #define IS_16_BIT_ADDRESS(addr) \ |
| (!(SelectorMap[(unsigned int)(addr) >> (16+__AHSHIFT)]& SELECTOR_IS32BIT)) |
| #else |
| #define FIRST_SELECTOR 8 |
| #define IS_16_BIT_ADDRESS(addr) \ |
| ((unsigned int)(addr) >= (((FIRST_SELECTOR << __AHSHIFT) | 7) << 16)) |
| #endif |
| |
| |
| extern SEGDESC* Segments; |
| |
| #endif /* SEGMEM_H */ |