Release 0.6
[wine] / include / segmem.h
1 /* $Id: segmem.h,v 1.3 1993/07/04 04:04:21 root Exp root $
2  */
3 /*
4  * Copyright  Robert J. Amstadt, 1993
5  */
6 #ifndef SEGMEM_H
7 #define SEGMEM_H
8
9 #ifdef __linux__
10 #define HAVE_IPC
11 #include <sys/ipc.h>
12 #include <sys/shm.h>
13 #endif
14
15 /*
16  * Array to track selector allocation.
17  */
18 #define MAX_SELECTORS           512
19 #define SELECTOR_ISFREE         0x8000
20 #define SELECTOR_INDEXMASK      0x0fff
21
22 extern unsigned short SelectorMap[MAX_SELECTORS];
23
24 #ifdef HAVE_IPC
25 #define SAFEMAKEPTR(s, o) (((int) (s) << 16) | ((o) & 0xffff))
26 #define FIXPTR(p)         (p)
27 #else
28 #define SAFEMAKEPTR(s, o) \
29     (((int) SelectorMap[SelectorMap[(s) >> 3] & SELECTOR_INDEXMASK] << 19) \
30      | 0x70000 | ((o) & 0xffff))
31 #define FIXPTR(p)         SAFEMAKEPTR((unsigned long) (p) >> 16, (p))
32 #endif
33
34 /*
35  * Structure to hold info about each selector we create.
36  */
37
38 typedef struct segment_descriptor_s
39 {
40     void          *base_addr;   /* Pointer to segment in flat memory    */
41     unsigned int   length;      /* Length of segment                    */
42     unsigned int   flags;       /* Segment flags (see neexe.h and below)*/
43     unsigned short selector;    /* Selector used to access this segment */
44     unsigned short owner;       /* Handle of owner program              */
45     unsigned char  type;        /* DATA or CODE                         */
46 #ifdef HAVE_IPC
47     key_t          shm_key;     /* Shared memory key or IPC_PRIVATE     */
48 #endif
49 } SEGDESC;
50
51 /*
52  * Additional flags
53  */
54 #define NE_SEGFLAGS_MALLOCED    0x00010000 /* Memory allocated with malloc() */
55
56 /*
57  * Global memory flags
58  */
59 #define GLOBAL_FLAGS_MOVEABLE           0x0002
60 #define GLOBAL_FLAGS_ZEROINIT           0x0040
61 #define GLOBAL_FLAGS_CODE               0x00010000
62 #define GLOBAL_FLAGS_EXECUTEONLY        0x00020000
63 #define GLOBAL_FLAGS_READONLY           0x00020000
64
65 #define FIRST_SELECTOR  8
66
67 static __inline__ int Is16bitAddress(void *address)
68 {
69     return ((int) address >= (((FIRST_SELECTOR << 3) | 0x0007) << 16));
70 }
71
72 #endif /* SEGMEM_H */