xref: /minix/minix/include/minix/com.h (revision f7df02e7)
1 /* This file defines constants for use in message communication (mostly)
2  * between system processes.
3  *
4  * A number of protocol message request and response types are defined. For
5  * debugging purposes, each protocol is assigned its own unique number range.
6  * The following such message type ranges have been allocated:
7  *
8  *     0x00 -   0xFF	Process Manager (PM) requests (see callnr.h)
9  *    0x100 -  0x1FF	Virtual File System (VFS) requests (see callnr.h)
10  *    0x200 -  0x2FF	Data link layer requests and responses
11  *    0x300 -  0x3FF	Bus controller requests and responses
12  *    0x400 -  0x4FF	Character device requests and responses
13  *    0x500 -  0x5FF	Block device requests and responses
14  *    0x600 -  0x6FF	Kernel calls
15  *    0x700 -  0x7FF	Reincarnation Server (RS) requests
16  *    0x800 -  0x8FF	Data Store (DS) requests
17  *    0x900 -  0x9FF	Requests from PM to VFS, and responses
18  *    0xA00 -  0xAFF	Requests from VFS to file systems (see vfsif.h)
19  *    0xB00 -  0xBFF	Transaction IDs from VFS to file systems (see vfsif.h)
20  *    0xC00 -  0xCFF	Virtual Memory (VM) requests
21  *    0xD00 -  0xDFF	IPC server requests
22  *    0xE00 -  0xEFF	Common system messages (e.g. system signals)
23  *    0xF00 -  0xFFF	Scheduling messages
24  *   0x1000 - 0x10FF	Notify messages
25  *   0x1100 - 0x11FF	USB
26  *   0x1200 - 0x12FF	Devman
27  *   0x1300 - 0x13FF	TTY requests
28  *   0x1400 - 0x14FF	Real Time Clock requests and responses
29  *   0x1500 - 0x15FF	Input server messages
30  *   0x1600 - 0x16FF	VirtualBox (VBOX) requests (see vboxif.h)
31  *   0x1700 - 0x17FF	PTYFS requests
32  *   0x1800 - 0x18FF	Management Information Base (MIB) requests
33  *   0x1900 - 0x19FF	Socket device requests and responses
34  *   0x1A00 - 0x1AFF	Network device requests and responses
35  *
36  * Zero and negative values are widely used for OK and error responses.
37  */
38 
39 #ifndef _MINIX_COM_H
40 #define _MINIX_COM_H
41 
42 /*===========================================================================*
43  *            	Process numbers of processes in the system image	     *
44  *===========================================================================*/
45 
46 /* Kernel tasks. These all run in the same address space. */
47 #define ASYNCM	((endpoint_t) -5) /* notifies about finished async sends */
48 #define IDLE    ((endpoint_t) -4) /* runs when no one else can run */
49 #define CLOCK  	((endpoint_t) -3) /* alarms and other clock functions */
50 #define SYSTEM  ((endpoint_t) -2) /* request system functionality */
51 #define KERNEL  ((endpoint_t) -1) /* pseudo-process for IPC and scheduling */
52 #define HARDWARE     KERNEL	/* for hardware interrupt handlers */
53 
54 /* Number of tasks. Note that NR_PROCS is defined in <minix/config.h>. */
55 #define MAX_NR_TASKS	1023
56 #define NR_TASKS	  5
57 
58 /* User-space processes, that is, device drivers, servers, and INIT. */
59 #define PM_PROC_NR   ((endpoint_t) 0)	/* process manager */
60 #define VFS_PROC_NR  ((endpoint_t) 1)	/* file system */
61 #define RS_PROC_NR   ((endpoint_t) 2)  	/* reincarnation server */
62 #define MEM_PROC_NR  ((endpoint_t) 3)  	/* memory driver (RAM disk, null, etc.) */
63 #define SCHED_PROC_NR ((endpoint_t) 4)	/* scheduler */
64 #define TTY_PROC_NR  ((endpoint_t) 5)	/* terminal (TTY) driver */
65 #define DS_PROC_NR   ((endpoint_t) 6)   /* data store server */
66 #define MIB_PROC_NR  ((endpoint_t) 7)	/* management info base service */
67 #define VM_PROC_NR   ((endpoint_t) 8)   /* memory server */
68 #define PFS_PROC_NR  ((endpoint_t) 9)  /* pipe filesystem */
69 #define MFS_PROC_NR  ((endpoint_t) 10)  /* minix root filesystem */
70 #define LAST_SPECIAL_PROC_NR	11	/* An untyped version for
71                                            computation in macros.*/
72 #define INIT_PROC_NR ((endpoint_t) LAST_SPECIAL_PROC_NR)  /* init
73                                                         -- goes multiuser */
74 #define NR_BOOT_MODULES (INIT_PROC_NR+1)
75 
76 /* Root system process and root user process. */
77 #define ROOT_SYS_PROC_NR  RS_PROC_NR
78 #define ROOT_USR_PROC_NR  INIT_PROC_NR
79 
80 /*===========================================================================*
81  *                	   Kernel notification types                         *
82  *===========================================================================*/
83 
84 /* Kernel notification types. In principle, these can be sent to any process,
85  * so make sure that these types do not interfere with other message types.
86  * Notifications are prioritized because of the way they are unhold() and
87  * blocking notifications are delivered. The lowest numbers go first. The
88  * offset are used for the per-process notification bit maps.
89  */
90 #define NOTIFY_MESSAGE		  0x1000
91 /* FIXME the old is_notify(a) should be replaced by is_ipc_notify(status). */
92 #define is_ipc_notify(ipc_status) (IPC_STATUS_CALL(ipc_status) == NOTIFY)
93 #define is_notify(a)		  ((unsigned) ((a) - NOTIFY_MESSAGE) < 0x100)
94 #define is_ipc_asynch(ipc_status) \
95     (is_ipc_notify(ipc_status) || IPC_STATUS_CALL(ipc_status) == SENDA)
96 
97 /*===========================================================================*
98  *                Messages for BUS controller drivers 			     *
99  *===========================================================================*/
100 #define BUSC_RQ_BASE	0x300	/* base for request types */
101 #define BUSC_RS_BASE	0x380	/* base for response types */
102 
103 #define BUSC_PCI_INIT		(BUSC_RQ_BASE + 0)	/* First message to
104 							 * PCI driver
105 							 */
106 #define BUSC_PCI_FIRST_DEV	(BUSC_RQ_BASE + 1)	/* Get index (and
107 							 * vid/did) of the
108 							 * first PCI device
109 							 */
110 #define BUSC_PCI_NEXT_DEV	(BUSC_RQ_BASE + 2)	/* Get index (and
111 							 * vid/did) of the
112 							 * next PCI device
113 							 */
114 #define BUSC_PCI_FIND_DEV	(BUSC_RQ_BASE + 3)	/* Get index of a
115 							 * PCI device based on
116 							 * bus/dev/function
117 							 */
118 #define BUSC_PCI_IDS		(BUSC_RQ_BASE + 4)	/* Get vid/did from an
119 							 * index
120 							 */
121 #define BUSC_PCI_RESERVE	(BUSC_RQ_BASE + 7)	/* Reserve a PCI dev */
122 #define BUSC_PCI_ATTR_R8	(BUSC_RQ_BASE + 8)	/* Read 8-bit
123 							 * attribute value
124 							 */
125 #define BUSC_PCI_ATTR_R16	(BUSC_RQ_BASE + 9)	/* Read 16-bit
126 							 * attribute value
127 							 */
128 #define BUSC_PCI_ATTR_R32	(BUSC_RQ_BASE + 10)	/* Read 32-bit
129 							 * attribute value
130 							 */
131 #define BUSC_PCI_ATTR_W8	(BUSC_RQ_BASE + 11)	/* Write 8-bit
132 							 * attribute value
133 							 */
134 #define BUSC_PCI_ATTR_W16	(BUSC_RQ_BASE + 12)	/* Write 16-bit
135 							 * attribute value
136 							 */
137 #define BUSC_PCI_ATTR_W32	(BUSC_RQ_BASE + 13)	/* Write 32-bit
138 							 * attribute value
139 							 */
140 #define BUSC_PCI_RESCAN		(BUSC_RQ_BASE + 14)	/* Rescan bus */
141 #define BUSC_PCI_DEV_NAME_S	(BUSC_RQ_BASE + 15)	/* Get the name of a
142 							 * PCI device
143 							 * (safecopy)
144 							 */
145 #define BUSC_PCI_SLOT_NAME_S	(BUSC_RQ_BASE + 16)	/* Get the name of a
146 							 * PCI slot (safecopy)
147 							 */
148 #define BUSC_PCI_SET_ACL	(BUSC_RQ_BASE + 17)	/* Set the ACL for a
149 							 * driver (safecopy)
150 							 */
151 #define BUSC_PCI_DEL_ACL	(BUSC_RQ_BASE + 18)	/* Delete the ACL of a
152 							 * driver
153 							 */
154 #define BUSC_PCI_GET_BAR	(BUSC_RQ_BASE + 19)	/* Get Base Address
155 							 * Register properties
156 							 */
157 #define IOMMU_MAP		(BUSC_RQ_BASE + 32)	/* Ask IOMMU to map
158 							 * a segment of memory
159 							 */
160 
161 #define BUSC_I2C_RESERVE	(BUSC_RQ_BASE + 64)	/* reserve i2c device */
162 #define BUSC_I2C_EXEC		(BUSC_RQ_BASE + 65)	/* perform i2c action */
163 
164 /*===========================================================================*
165  *                  	   Messages for networking layer		     *
166  *===========================================================================*/
167 
168 /* Base type for data link layer requests and responses. */
169 #define DL_RQ_BASE	0x200
170 #define DL_RS_BASE	0x280
171 
172 #define IS_DL_RQ(type) (((type) & ~0x7f) == DL_RQ_BASE)
173 #define IS_DL_RS(type) (((type) & ~0x7f) == DL_RS_BASE)
174 
175 /* Message types for data link layer requests. */
176 #define DL_CONF		(DL_RQ_BASE + 0)
177 #define DL_GETSTAT_S	(DL_RQ_BASE + 1)
178 #define DL_WRITEV_S	(DL_RQ_BASE + 2)
179 #define DL_READV_S	(DL_RQ_BASE + 3)
180 
181 /* Message type for data link layer replies. */
182 #define DL_CONF_REPLY	(DL_RS_BASE + 0)
183 #define DL_STAT_REPLY	(DL_RS_BASE + 1)
184 #define DL_TASK_REPLY	(DL_RS_BASE + 2)
185 
186 /* Bits in 'flags' field of DL replies. */
187 #  define DL_NOFLAGS		0x00
188 #  define DL_PACK_SEND		0x01
189 #  define DL_PACK_RECV		0x02
190 
191 /* Bits in 'DL_MODE' field of DL requests. */
192 #  define DL_NOMODE		0x0
193 #  define DL_PROMISC_REQ	0x1
194 #  define DL_MULTI_REQ		0x2
195 #  define DL_BROAD_REQ		0x4
196 
197 /*===========================================================================*
198  *                  SYSTASK request types and field names                    *
199  *===========================================================================*/
200 
201 /* System library calls are dispatched via a call vector, so be careful when
202  * modifying the system call numbers. The numbers here determine which call
203  * is made from the call vector.
204  */
205 #define KERNEL_CALL	0x600	/* base for kernel calls to SYSTEM */
206 
207 #  define SYS_FORK       (KERNEL_CALL + 0)	/* sys_fork() */
208 #  define SYS_EXEC       (KERNEL_CALL + 1)	/* sys_exec() */
209 #  define SYS_CLEAR	 (KERNEL_CALL + 2)	/* sys_clear() */
210 #  define SYS_SCHEDULE 	 (KERNEL_CALL + 3)	/* sys_schedule() */
211 #  define SYS_PRIVCTL    (KERNEL_CALL + 4)	/* sys_privctl() */
212 #  define SYS_TRACE      (KERNEL_CALL + 5)	/* sys_trace() */
213 #  define SYS_KILL       (KERNEL_CALL + 6)	/* sys_kill() */
214 
215 #  define SYS_GETKSIG    (KERNEL_CALL + 7)	/* sys_getsig() */
216 #  define SYS_ENDKSIG    (KERNEL_CALL + 8)	/* sys_endsig() */
217 #  define SYS_SIGSEND    (KERNEL_CALL + 9)	/* sys_sigsend() */
218 #  define SYS_SIGRETURN  (KERNEL_CALL + 10)	/* sys_sigreturn() */
219 
220 #  define SYS_MEMSET     (KERNEL_CALL + 13)	/* sys_memset() */
221 
222 #  define SYS_UMAP       (KERNEL_CALL + 14)	/* sys_umap() */
223 #  define SYS_VIRCOPY    (KERNEL_CALL + 15)	/* sys_vircopy() */
224 #  define SYS_PHYSCOPY   (KERNEL_CALL + 16) 	/* sys_physcopy() */
225 #  define SYS_UMAP_REMOTE (KERNEL_CALL + 17)	/* sys_umap_remote() */
226 #  define SYS_VUMAP      (KERNEL_CALL + 18)	/* sys_vumap() */
227 
228 #  define SYS_IRQCTL     (KERNEL_CALL + 19)	/* sys_irqctl() */
229 
230 #  define SYS_DEVIO      (KERNEL_CALL + 21)	/* sys_devio() */
231 #  define SYS_SDEVIO     (KERNEL_CALL + 22)	/* sys_sdevio() */
232 #  define SYS_VDEVIO     (KERNEL_CALL + 23)	/* sys_vdevio() */
233 
234 #  define SYS_SETALARM	 (KERNEL_CALL + 24)	/* sys_setalarm() */
235 #  define SYS_TIMES	 (KERNEL_CALL + 25)	/* sys_times() */
236 #  define SYS_GETINFO    (KERNEL_CALL + 26) 	/* sys_getinfo() */
237 #  define SYS_ABORT      (KERNEL_CALL + 27)	/* sys_abort() */
238 #  define SYS_IOPENABLE  (KERNEL_CALL + 28)	/* sys_enable_iop() */
239 #  define SYS_SAFECOPYFROM (KERNEL_CALL + 31)	/* sys_safecopyfrom() */
240 #  define SYS_SAFECOPYTO   (KERNEL_CALL + 32)	/* sys_safecopyto() */
241 #  define SYS_VSAFECOPY  (KERNEL_CALL + 33)	/* sys_vsafecopy() */
242 #  define SYS_SETGRANT   (KERNEL_CALL + 34)	/* sys_setgrant() */
243 #  define SYS_READBIOS   (KERNEL_CALL + 35)	/* sys_readbios() */
244 
245 #  define SYS_SPROF      (KERNEL_CALL + 36)     /* sys_sprof() */
246 
247 #  define SYS_STIME      (KERNEL_CALL + 39)	/* sys_stime() */
248 #  define SYS_SETTIME    (KERNEL_CALL + 40)	/* sys_settime() */
249 
250 #  define SYS_VMCTL      (KERNEL_CALL + 43)	/* sys_vmctl() */
251 
252 #  define SYS_DIAGCTL    (KERNEL_CALL + 44)	/* sys_diagctl() */
253 
254 #  define SYS_VTIMER     (KERNEL_CALL + 45)	/* sys_vtimer() */
255 #  define SYS_RUNCTL     (KERNEL_CALL + 46)	/* sys_runctl() */
256 #  define SYS_GETMCONTEXT (KERNEL_CALL + 50)    /* sys_getmcontext() */
257 #  define SYS_SETMCONTEXT (KERNEL_CALL + 51)    /* sys_setmcontext() */
258 
259 #  define SYS_UPDATE	 (KERNEL_CALL + 52)	/* sys_update() */
260 #  define SYS_EXIT	 (KERNEL_CALL + 53)	/* sys_exit() */
261 
262 #  define SYS_SCHEDCTL (KERNEL_CALL + 54)	/* sys_schedctl() */
263 #  define SYS_STATECTL (KERNEL_CALL + 55)	/* sys_statectl() */
264 
265 #  define SYS_SAFEMEMSET (KERNEL_CALL + 56)	/* sys_safememset() */
266 
267 #  define SYS_PADCONF (KERNEL_CALL + 57)	/* sys_padconf() */
268 
269 /* Total */
270 #define NR_SYS_CALLS	58	/* number of kernel calls */
271 
272 #define SYS_CALL_MASK_SIZE BITMAP_CHUNKS(NR_SYS_CALLS)
273 
274 /* Basic kernel calls allowed to every system process. */
275 #define SYS_BASIC_CALLS \
276     SYS_EXIT, SYS_SAFECOPYFROM, SYS_SAFECOPYTO, SYS_VSAFECOPY, SYS_GETINFO, \
277     SYS_TIMES, SYS_SETALARM, SYS_SETGRANT, \
278     SYS_DIAGCTL, SYS_STATECTL, SYS_SAFEMEMSET
279 
280 /* Field names for SYS_DEVIO, SYS_VDEVIO, SYS_SDEVIO. */
281 #   define _DIO_INPUT		0x001
282 #   define _DIO_OUTPUT		0x002
283 #   define _DIO_DIRMASK		0x00f
284 #   define _DIO_BYTE		0x010
285 #   define _DIO_WORD		0x020
286 #   define _DIO_LONG		0x030
287 #   define _DIO_TYPEMASK	0x0f0
288 #   define _DIO_SAFE		0x100
289 #   define _DIO_SAFEMASK	0xf00
290 #   define DIO_INPUT_BYTE	    (_DIO_INPUT|_DIO_BYTE)
291 #   define DIO_INPUT_WORD	    (_DIO_INPUT|_DIO_WORD)
292 #   define DIO_INPUT_LONG	    (_DIO_INPUT|_DIO_LONG)
293 #   define DIO_OUTPUT_BYTE	    (_DIO_OUTPUT|_DIO_BYTE)
294 #   define DIO_OUTPUT_WORD	    (_DIO_OUTPUT|_DIO_WORD)
295 #   define DIO_OUTPUT_LONG	    (_DIO_OUTPUT|_DIO_LONG)
296 #   define DIO_SAFE_INPUT_BYTE      (_DIO_INPUT|_DIO_BYTE|_DIO_SAFE)
297 #   define DIO_SAFE_INPUT_WORD      (_DIO_INPUT|_DIO_WORD|_DIO_SAFE)
298 #   define DIO_SAFE_INPUT_LONG      (_DIO_INPUT|_DIO_LONG|_DIO_SAFE)
299 #   define DIO_SAFE_OUTPUT_BYTE     (_DIO_OUTPUT|_DIO_BYTE|_DIO_SAFE)
300 #   define DIO_SAFE_OUTPUT_WORD     (_DIO_OUTPUT|_DIO_WORD|_DIO_SAFE)
301 #   define DIO_SAFE_OUTPUT_LONG     (_DIO_OUTPUT|_DIO_LONG|_DIO_SAFE)
302 
303 /* Field names for SYS_IRQCTL. */
304 #  define IRQ_SETPOLICY     1	/* manage a slot of the IRQ table */
305 #  define IRQ_RMPOLICY      2	/* remove a slot of the IRQ table */
306 #  define IRQ_ENABLE        3	/* enable interrupts */
307 #  define IRQ_DISABLE       4	/* disable interrupts */
308 #  define IRQ_REENABLE  0x001	/* reenable IRQ line after interrupt */
309 #  define IRQ_BYTE      0x100	/* byte values */
310 #  define IRQ_WORD      0x200	/* word values */
311 #  define IRQ_LONG      0x400	/* long values */
312 
313 #define CP_FLAG_TRY	0x01	/* do not transparently map */
314 
315 /* Field names for SYS_GETINFO. */
316 #   define GET_KINFO	   0	/* get kernel information structure */
317 #   define GET_IMAGE	   1	/* get system image table */
318 #   define GET_PROCTAB	   2	/* get kernel process table */
319 #   define GET_RANDOMNESS  3	/* get randomness buffer */
320 #   define GET_MONPARAMS   4	/* get monitor parameters */
321 #   define GET_KENV	   5	/* get kernel environment string */
322 #   define GET_IRQHOOKS	   6	/* get the IRQ table */
323 #   define GET_PRIVTAB	   8	/* get kernel privileges table */
324 #   define GET_KADDRESSES  9	/* get various kernel addresses */
325 #   define GET_SCHEDINFO  10	/* get scheduling queues */
326 #   define GET_PROC 	  11	/* get process slot if given process */
327 #   define GET_MACHINE 	  12	/* get machine information */
328 #   define GET_LOCKTIMING 13	/* get lock()/unlock() latency timing */
329 #   define GET_BIOSBUFFER 14	/* get a buffer for BIOS calls */
330 #   define GET_LOADINFO   15	/* get load average information */
331 #   define GET_IRQACTIDS  16	/* get the IRQ masks */
332 #   define GET_PRIV	  17	/* get privilege structure */
333 #   define GET_HZ	  18	/* get HZ value */
334 #   define GET_WHOAMI	  19	/* get own name, endpoint, and privileges */
335 #   define GET_RANDOMNESS_BIN 20 /* get one randomness bin */
336 #   define GET_IDLETSC	  21	/* get cumulative idle time stamp counter */
337 #   define GET_CPUINFO    23    /* get information about cpus */
338 #   define GET_REGS	  24	/* get general process registers */
339 #   define GET_CPUTICKS	  25	/* get per-state ticks for a cpu */
340 
341 /* Subfunctions for SYS_PRIVCTL */
342 #define SYS_PRIV_ALLOW		1	/* Allow process to run */
343 #define SYS_PRIV_DISALLOW	2	/* Disallow process to run */
344 #define SYS_PRIV_SET_SYS	3	/* Set a system privilege structure */
345 #define SYS_PRIV_SET_USER	4	/* Set a user privilege structure */
346 #define SYS_PRIV_ADD_IO 	5	/* Add I/O range (struct io_range) */
347 #define SYS_PRIV_ADD_MEM	6	/* Add memory range (struct mem_range)
348 					 */
349 #define SYS_PRIV_ADD_IRQ	7	/* Add IRQ */
350 #define SYS_PRIV_QUERY_MEM	8	/* Verify memory privilege. */
351 #define SYS_PRIV_UPDATE_SYS	9	/* Update a sys privilege structure. */
352 #define SYS_PRIV_YIELD	       10	/* Allow process to run and suspend */
353 #define SYS_PRIV_CLEAR_IPC_REFS 11	/* Clear pending IPC for the process */
354 
355 /* Constants for exec. FIXME: these do not belong here. */
356 #define PMEF_AUXVECTORS	20
357 #define PMEF_EXECNAMELEN1 PATH_MAX
358 
359 /* Flags for PR_FORK_FLAGS. */
360 #define PFF_VMINHIBIT	0x01	/* Don't schedule until release by VM. */
361 
362 /* SYS_SAFEMEMSET */
363 #define SMS_DST		m2_i1	/* dst endpoint */
364 #define SMS_GID		m2_i3	/* grant id */
365 #define SMS_OFFSET	m2_l1	/* offset within grant */
366 #define SMS_BYTES	m2_l2	/* bytes from offset */
367 #define SMS_PATTERN	m2_i2	/* memset() pattern */
368 
369 /* Field names for SYS_VMCTL. */
370 #define SVMCTL_WHO	m1_i1
371 #define SVMCTL_PARAM	m1_i2	/* All SYS_VMCTL requests. */
372 #define SVMCTL_VALUE	m1_i3
373 #define	SVMCTL_MRG_TARGET	m2_i1	/* MEMREQ_GET reply: target process */
374 #define	SVMCTL_MRG_ADDR		m2_i2	/* MEMREQ_GET reply: address */
375 #define	SVMCTL_MRG_LENGTH	m2_i3	/* MEMREQ_GET reply: length */
376 #define	SVMCTL_MRG_FLAG		m2_s1	/* MEMREQ_GET reply: flag */
377 #define	SVMCTL_MRG_EP2		m2_l1	/* MEMREQ_GET reply: source process */
378 #define	SVMCTL_MRG_ADDR2	m2_l2	/* MEMREQ_GET reply: source address */
379 #define SVMCTL_MRG_REQUESTOR	m2_p1	/* MEMREQ_GET reply: requestor */
380 #define SVMCTL_MAP_VIR_ADDR	m1_p1
381 #define SVMCTL_PTROOT		m1_i3
382 #define SVMCTL_PTROOT_V		m1_p1
383 
384 /* Reply message for VMCTL_KERN_PHYSMAP */
385 #define SVMCTL_MAP_FLAGS	m2_i1	/* VMMF_* */
386 #define SVMCTL_MAP_PHYS_ADDR	m2_l1
387 #define SVMCTL_MAP_PHYS_LEN	m2_l2
388 
389 #define VMMF_UNCACHED		(1L << 0)
390 #define VMMF_USER		(1L << 1)
391 #define VMMF_WRITE		(1L << 2)
392 #define VMMF_GLO		(1L << 3)
393 
394 /* Values for SVMCTL_PARAM. */
395 #define VMCTL_CLEAR_PAGEFAULT	12
396 #define VMCTL_GET_PDBR		13
397 #define VMCTL_MEMREQ_GET 	14
398 #define VMCTL_MEMREQ_REPLY	15
399 #define VMCTL_NOPAGEZERO	18
400 #define VMCTL_I386_KERNELLIMIT	19
401 #define VMCTL_I386_INVLPG	25
402 #define VMCTL_FLUSHTLB		26
403 #define VMCTL_KERN_PHYSMAP	27
404 #define VMCTL_KERN_MAP_REPLY	28
405 #define VMCTL_SETADDRSPACE	29
406 #define VMCTL_VMINHIBIT_SET	30
407 #define VMCTL_VMINHIBIT_CLEAR	31
408 #define VMCTL_CLEARMAPCACHE	32
409 #define VMCTL_BOOTINHIBIT_CLEAR	33
410 
411 /* Codes and field names for SYS_DIAGCTL. */
412 #define DIAGCTL_CODE_DIAG	1	/* Print diagnostics. */
413 #define DIAGCTL_CODE_STACKTRACE	2	/* Print process stack. */
414 #define DIAGCTL_CODE_REGISTER	3	/* Register for diagnostic signals */
415 #define DIAGCTL_CODE_UNREGISTER	4	/* Unregister for diagnostic signals */
416 #define DIAG_BUFSIZE	(80*25)
417 
418 /* Field names for SYS_VTIMER. */
419 #define VT_WHICH	m2_i1	/* which timer to set/retrieve */
420 #  define VT_VIRTUAL        1	/* the ITIMER_VIRTUAL timer */
421 #  define VT_PROF           2	/* the ITIMER_PROF timer */
422 #define VT_SET		m2_i2	/* 1 for setting a timer, 0 retrieval only */
423 #define VT_VALUE	m2_l1	/* new/previous value of the timer */
424 #define VT_ENDPT	m2_l2	/* process to set/retrieve the timer for */
425 
426 /* Field names for SYS_RUNCTL. */
427 #define RC_ENDPT	m1_i1	/* which process to stop or resume */
428 #define RC_ACTION	m1_i2	/* set or clear stop flag */
429 #  define RC_STOP           0	/* stop the process */
430 #  define RC_RESUME         1	/* clear the stop flag */
431 #define RC_FLAGS	m1_i3	/* request flags */
432 #  define RC_DELAY          1	/* delay stop if process is sending */
433 
434 /* Field names for SYS_UPDATE. */
435 #define SYS_UPD_SRC_ENDPT	m1_i1	/* source endpoint */
436 #define SYS_UPD_DST_ENDPT	m1_i2	/* destination endpoint */
437 #define SYS_UPD_FLAGS		m1_i3	/* update flags */
438 #  define SYS_UPD_ROLLBACK        0x1	/* update is rollback */
439 
440 
441 /* Subfunctions for SYS_STATECTL */
442 #define SYS_STATE_CLEAR_IPC_REFS    1	/* clear IPC references */
443 #define SYS_STATE_SET_STATE_TABLE   2	/* set state map */
444 #define SYS_STATE_ADD_IPC_BL_FILTER 3	/* set IPC blacklist filter */
445 #define SYS_STATE_ADD_IPC_WL_FILTER 4	/* set IPC whitelist filter */
446 #define SYS_STATE_CLEAR_IPC_FILTERS 5	/* clear IPC filters */
447 
448 /* Subfunctions for SYS_SCHEDCTL */
449 #  define SCHEDCTL_FLAG_KERNEL	1	/* mark kernel scheduler and remove
450 					 * RTS_NO_QUANTUM; otherwise caller is
451 					 * marked scheduler
452 					 */
453 
454 /* Field names for SYS_PADCONF */
455 #define PADCONF_PADCONF		m2_i1	/* pad to configure */
456 #define PADCONF_MASK		m2_i2	/* mask to apply */
457 #define PADCONF_VALUE		m2_i3	/* value to write */
458 
459 /*===========================================================================*
460  *                Messages for the Reincarnation Server 		     *
461  *===========================================================================*/
462 
463 #define RS_RQ_BASE		0x700
464 
465 #define RS_UP		(RS_RQ_BASE + 0)	/* start system service */
466 #define RS_DOWN		(RS_RQ_BASE + 1)	/* stop system service */
467 #define RS_REFRESH	(RS_RQ_BASE + 2)	/* refresh system service */
468 #define RS_RESTART	(RS_RQ_BASE + 3)	/* restart system service */
469 #define RS_SHUTDOWN	(RS_RQ_BASE + 4)	/* alert about shutdown */
470 #define RS_UPDATE	(RS_RQ_BASE + 5)	/* update system service */
471 #define RS_CLONE	(RS_RQ_BASE + 6)	/* clone system service */
472 #define RS_UNCLONE	(RS_RQ_BASE + 7)	/* unclone system service */
473 
474 #define RS_LOOKUP	(RS_RQ_BASE + 8)	/* lookup server name */
475 
476 #define RS_GETSYSINFO	(RS_RQ_BASE + 9)	/* get system information */
477 
478 #define RS_INIT 	(RS_RQ_BASE + 20)	/* service init message */
479 #define RS_LU_PREPARE	(RS_RQ_BASE + 21)	/* prepare to update message */
480 #define RS_EDIT		(RS_RQ_BASE + 22)	/* edit system service */
481 #define RS_SYSCTL	(RS_RQ_BASE + 23)	/* perform system ctl action */
482 #define RS_FI		(RS_RQ_BASE + 24)	/* inject fault into service */
483 
484 /* Subfunctions for RS_SYSCTL. */
485 #define RS_SYSCTL_SRV_STATUS    1
486 #define RS_SYSCTL_UPD_START     2
487 #define RS_SYSCTL_UPD_RUN       3
488 #define RS_SYSCTL_UPD_STOP      4
489 #define RS_SYSCTL_UPD_STATUS    5
490 
491 /* Subfunctions for RS_FI. */
492 #define RS_FI_CRASH             1
493 
494 /*===========================================================================*
495  *                Messages for the Data Store Server			     *
496  *===========================================================================*/
497 
498 #define DS_RQ_BASE		0x800
499 
500 #define DS_PUBLISH	(DS_RQ_BASE + 0)	/* publish data */
501 #define DS_RETRIEVE	(DS_RQ_BASE + 1)	/* retrieve data by name */
502 #define DS_SUBSCRIBE	(DS_RQ_BASE + 2)	/* subscribe to data updates */
503 #define DS_CHECK	(DS_RQ_BASE + 3)	/* retrieve updated data */
504 #define DS_DELETE	(DS_RQ_BASE + 4)	/* delete data */
505 #define DS_SNAPSHOT	(DS_RQ_BASE + 5)	/* take a snapshot */
506 #define DS_RETRIEVE_LABEL  (DS_RQ_BASE + 6)	/* retrieve label's name */
507 #define DS_GETSYSINFO	(DS_RQ_BASE + 7)	/* get system information */
508 
509 /*===========================================================================*
510  *                Messages used between PM and VFS			     *
511  *===========================================================================*/
512 
513 #define VFS_PM_RQ_BASE	0x900
514 #define VFS_PM_RS_BASE	0x980
515 
516 #define IS_VFS_PM_RQ(type) (((type) & ~0x7f) == VFS_PM_RQ_BASE)
517 #define IS_VFS_PM_RS(type) (((type) & ~0x7f) == VFS_PM_RS_BASE)
518 
519 /* Requests from PM to VFS. */
520 #define VFS_PM_INIT	(VFS_PM_RQ_BASE + 0)	/* Process table exchange */
521 #define VFS_PM_SETUID	(VFS_PM_RQ_BASE + 1)	/* Set new user ID */
522 #define VFS_PM_SETGID	(VFS_PM_RQ_BASE + 2)	/* Set group ID */
523 #define VFS_PM_SETSID	(VFS_PM_RQ_BASE + 3)	/* Set session leader */
524 #define VFS_PM_EXIT	(VFS_PM_RQ_BASE + 4)	/* Process exits */
525 #define VFS_PM_DUMPCORE	(VFS_PM_RQ_BASE + 5)	/* Process is to dump core */
526 #define VFS_PM_EXEC	(VFS_PM_RQ_BASE + 6)	/* Forwarded exec call */
527 #define VFS_PM_FORK	(VFS_PM_RQ_BASE + 7)	/* Newly forked process */
528 #define VFS_PM_SRV_FORK	(VFS_PM_RQ_BASE + 8)	/* fork for system services */
529 #define VFS_PM_UNPAUSE	(VFS_PM_RQ_BASE + 9)	/* Interrupt process call */
530 #define VFS_PM_REBOOT	(VFS_PM_RQ_BASE + 10)	/* System reboot */
531 #define VFS_PM_SETGROUPS	(VFS_PM_RQ_BASE + 11)	/* Set groups */
532 
533 /* Replies from VFS to PM */
534 #define VFS_PM_SETUID_REPLY	(VFS_PM_RS_BASE + 1)
535 #define VFS_PM_SETGID_REPLY	(VFS_PM_RS_BASE + 2)
536 #define VFS_PM_SETSID_REPLY	(VFS_PM_RS_BASE + 3)
537 #define VFS_PM_EXIT_REPLY	(VFS_PM_RS_BASE + 4)
538 #define VFS_PM_CORE_REPLY	(VFS_PM_RS_BASE + 5)
539 #define VFS_PM_EXEC_REPLY	(VFS_PM_RS_BASE + 6)
540 #define VFS_PM_FORK_REPLY	(VFS_PM_RS_BASE + 7)
541 #define VFS_PM_SRV_FORK_REPLY	(VFS_PM_RS_BASE + 8)
542 #define VFS_PM_UNPAUSE_REPLY	(VFS_PM_RS_BASE + 9)
543 #define VFS_PM_REBOOT_REPLY	(VFS_PM_RS_BASE + 10)
544 #define VFS_PM_SETGROUPS_REPLY	(VFS_PM_RS_BASE + 11)
545 
546 /* Standard parameters for all requests and replies, except PM_REBOOT */
547 #  define VFS_PM_ENDPT		m7_i1	/* process endpoint */
548 
549 /* Additional parameters for PM_INIT */
550 #  define VFS_PM_SLOT		m7_i2	/* process slot number */
551 #  define VFS_PM_PID		m7_i3	/* process pid */
552 
553 /* Additional parameters for PM_SETUID and PM_SETGID */
554 #  define VFS_PM_EID		m7_i2	/* effective user/group id */
555 #  define VFS_PM_RID		m7_i3	/* real user/group id */
556 
557 /* Additional parameter for PM_SETGROUPS */
558 #  define VFS_PM_GROUP_NO	m7_i2	/* number of groups */
559 #  define VFS_PM_GROUP_ADDR	m7_p1	/* struct holding group data */
560 
561 /* Additional parameters for PM_EXEC */
562 #  define VFS_PM_PATH		m7_p1	/* executable */
563 #  define VFS_PM_PATH_LEN	m7_i2	/* length of path including
564 					 * terminating null character
565 					 */
566 #  define VFS_PM_FRAME		m7_p2	/* arguments and environment */
567 #  define VFS_PM_FRAME_LEN	m7_i3	/* size of frame */
568 #  define VFS_PM_PS_STR		m7_i5	/* ps_strings pointer */
569 
570 /* Additional parameters for PM_EXEC_REPLY and PM_CORE_REPLY */
571 #  define VFS_PM_STATUS		m7_i2	/* OK or failure */
572 #  define VFS_PM_PC		m7_p1	/* program counter */
573 #  define VFS_PM_NEWSP		m7_p2	/* possibly-changed stack ptr */
574 #  define VFS_PM_NEWPS_STR	m7_i5	/* possibly-changed ps_strings ptr */
575 
576 /* Additional parameters for PM_FORK and PM_SRV_FORK */
577 #  define VFS_PM_PENDPT		m7_i2	/* parent process endpoint */
578 #  define VFS_PM_CPID		m7_i3	/* child pid */
579 #  define VFS_PM_REUID		m7_i4	/* real and effective uid */
580 #  define VFS_PM_REGID		m7_i5	/* real and effective gid */
581 
582 /* Additional parameters for PM_DUMPCORE */
583 #  define VFS_PM_TERM_SIG	m7_i2	/* process's termination signal */
584 
585 /*===========================================================================*
586  *                Messages used from VFS to file servers		     *
587  *===========================================================================*/
588 
589 #define FS_BASE		0xA00		/* Requests sent by VFS to filesystem
590 					 * implementations. See <minix/vfsif.h>
591 					 */
592 
593 /*===========================================================================*
594  *                Common requests and miscellaneous field names		     *
595  *===========================================================================*/
596 
597 #define COMMON_RQ_BASE		0xE00
598 #define COMMON_RS_BASE		0xE80
599 
600 /* Field names for system signals (sent by a signal manager). */
601 #define SIGS_SIGNAL_RECEIVED (COMMON_RQ_BASE+0)
602 
603 /* Common request to all processes: gcov data. */
604 #define COMMON_REQ_GCOV_DATA (COMMON_RQ_BASE+1)
605 
606 /* Common fault injection ctl request to all processes. */
607 #define COMMON_REQ_FI_CTL (COMMON_RQ_BASE+2)
608 
609 /* Process event message from PM. */
610 #define PROC_EVENT		(COMMON_RQ_BASE+3)
611 
612 /* MIB information request for the root node of a registered subtree. */
613 #define COMMON_MIB_INFO		(COMMON_RQ_BASE+4)
614 
615 /* MIB sysctl request on a registered subtree. */
616 #define COMMON_MIB_CALL		(COMMON_RQ_BASE+5)
617 
618 /* Reply to process event message to PM. */
619 #define PROC_EVENT_REPLY	(COMMON_RS_BASE+0)
620 
621 /* Reply to MIB information or sysctl request. */
622 #define COMMON_MIB_REPLY	(COMMON_RS_BASE+1)
623 
624 /*===========================================================================*
625  *                Messages for VM server				     *
626  *===========================================================================*/
627 #define VM_RQ_BASE		0xC00
628 
629 /* Calls from PM */
630 #define VM_EXIT			(VM_RQ_BASE+0)
631 #	define VME_ENDPOINT		m1_i1
632 #define VM_FORK			(VM_RQ_BASE+1)
633 #	define VMF_ENDPOINT		m1_i1
634 #	define VMF_SLOTNO		m1_i2
635 #	define VMF_CHILD_ENDPOINT	m1_i3	/* result */
636 #define VM_BRK			(VM_RQ_BASE+2)
637 #define VM_EXEC_NEWMEM		(VM_RQ_BASE+3)
638 #	define VMEN_ENDPOINT		m1_i1
639 #	define VMEN_ARGSPTR		m1_p1
640 #	define VMEN_ARGSSIZE		m1_i2
641 #	define VMEN_FLAGS		m1_i3	/* result */
642 #	define VMEN_STACK_TOP		m1_p2	/* result */
643 #define VM_WILLEXIT		(VM_RQ_BASE+5)
644 #	define VMWE_ENDPOINT		m1_i1
645 
646 /* General calls. */
647 #define VM_MMAP			(VM_RQ_BASE+10)
648 
649 #define VM_MUNMAP		(VM_RQ_BASE+17)
650 #	define VMUM_ADDR		m_mmap.addr
651 #	define VMUM_LEN			m_mmap.len
652 
653 /* to VM: inform VM about a region of memory that is used for
654  * bus-master DMA
655  */
656 #define VM_ADDDMA	(VM_RQ_BASE+12)
657 #	define VMAD_EP			m2_i1
658 #	define VMAD_START		m2_l1
659 #	define VMAD_SIZE		m2_l2
660 
661 /* to VM: inform VM that a region of memory that is no longer
662  * used for bus-master DMA
663  */
664 #define VM_DELDMA       (VM_RQ_BASE+13)
665 #	define VMDD_EP			m2_i1
666 #	define VMDD_START		m2_l1
667 #	define VMDD_SIZE		m2_l2
668 
669 /* to VM: ask VM for a region of memory that should not
670  * be used for bus-master DMA any longer
671  */
672 #define VM_GETDMA       (VM_RQ_BASE+14)
673 #	define VMGD_PROCP		m2_i1
674 #	define VMGD_BASEP		m2_l1
675 #	define VMGD_SIZEP		m2_l2
676 
677 #define VM_MAP_PHYS		(VM_RQ_BASE+15)
678 
679 #define VM_UNMAP_PHYS		(VM_RQ_BASE+16)
680 
681 /* To VM: map in cache block by FS */
682 #define VM_MAPCACHEPAGE		(VM_RQ_BASE+26)
683 
684 /* To VM: identify cache block in FS */
685 #define VM_SETCACHEPAGE		(VM_RQ_BASE+27)
686 
687 /* To VM: forget cache block in FS */
688 #define VM_FORGETCACHEPAGE	(VM_RQ_BASE+28)
689 
690 /* To VM: clear all cache blocks for a device */
691 #define VM_CLEARCACHE		(VM_RQ_BASE+29)
692 
693 /* To VFS: fields for request from VM. */
694 #	define VFS_VMCALL_REQ		m10_i1
695 #	define VFS_VMCALL_FD		m10_i2
696 #	define VFS_VMCALL_REQID		m10_i3
697 #	define VFS_VMCALL_ENDPOINT	m10_i4
698 #	define VFS_VMCALL_OFFSET	m10_ull1
699 #	define VFS_VMCALL_LENGTH	m10_l3
700 
701 /* Request codes to from VM to VFS */
702 #define VMVFSREQ_FDLOOKUP		101
703 #define VMVFSREQ_FDCLOSE		102
704 #define VMVFSREQ_FDIO			103
705 
706 /* Calls from VFS. */
707 #define VM_VFS_REPLY		(VM_RQ_BASE+30)
708 #	define VMV_ENDPOINT		m10_i1
709 #	define VMV_RESULT		m10_i2
710 #	define VMV_REQID		m10_i3
711 #	define VMV_DEV			m10_i4
712 #	define VMV_INO			m10_l1
713 #	define VMV_FD			m10_l2
714 #	define VMV_SIZE_PAGES		m10_l3
715 
716 #define VM_REMAP		(VM_RQ_BASE+33)
717 
718 #define VM_SHM_UNMAP		(VM_RQ_BASE+34)
719 
720 #define VM_GETPHYS		(VM_RQ_BASE+35)
721 
722 #define VM_GETREF		(VM_RQ_BASE+36)
723 
724 #define VM_RS_SET_PRIV		(VM_RQ_BASE+37)
725 #	define VM_RS_NR			m2_i1
726 #	define VM_RS_BUF		m2_l1
727 #	define VM_RS_SYS		m2_i2
728 
729 #define VM_INFO			(VM_RQ_BASE+40)
730 
731 /* VM_INFO 'what' values. */
732 #define VMIW_STATS			1
733 #define VMIW_USAGE			2
734 #define VMIW_REGION			3
735 
736 #define VM_RS_UPDATE		(VM_RQ_BASE+41)
737 
738 #define VM_RS_MEMCTL		(VM_RQ_BASE+42)
739 #	define VM_RS_CTL_ENDPT		m1_i1
740 #	define VM_RS_CTL_REQ		m1_i2
741 #		define VM_RS_MEM_PIN	    0	/* pin memory */
742 #		define VM_RS_MEM_MAKE_VM    1	/* make VM instance */
743 #		define VM_RS_MEM_HEAP_PREALLOC 2 /* preallocate heap regions */
744 #		define VM_RS_MEM_MAP_PREALLOC  3 /* preallocate mmaped regions */
745 #		define VM_RS_MEM_GET_PREALLOC_MAP  4 /* get preallocated mmaped regions */
746 #	define VM_RS_CTL_ADDR		m2_p1
747 #	define VM_RS_CTL_LEN		m2_i3
748 
749 #define VM_REMAP_RO		(VM_RQ_BASE+44)
750 /* same args as VM_REMAP */
751 
752 #define VM_PROCCTL		(VM_RQ_BASE+45)
753 #define VMPCTL_PARAM		m9_l1
754 #define VMPCTL_WHO		m9_l2
755 #define VMPCTL_M1		m9_l3
756 #define VMPCTL_LEN		m9_l4
757 #define VMPCTL_FLAGS		m9_l5
758 
759 #define VMPPARAM_CLEAR		1	/* values for VMPCTL_PARAM */
760 #define VMPPARAM_HANDLEMEM	2
761 
762 #define VM_VFS_MMAP             (VM_RQ_BASE+46)
763 
764 #define VM_GETRUSAGE		(VM_RQ_BASE+47)
765 
766 #define VM_RS_PREPARE		(VM_RQ_BASE+48)
767 
768 /* Total. */
769 #define NR_VM_CALLS				49
770 #define VM_CALL_MASK_SIZE			BITMAP_CHUNKS(NR_VM_CALLS)
771 
772 /* not handled as a normal VM call, thus at the end of the reserved rage */
773 #define VM_PAGEFAULT		(VM_RQ_BASE+0xff)
774 #	define VPF_ADDR		m1_i1
775 #	define VPF_FLAGS	m1_i2
776 
777 /* Basic vm calls allowed to every process. */
778 #define VM_BASIC_CALLS \
779     VM_BRK, VM_MMAP, VM_MUNMAP, VM_MAP_PHYS, VM_UNMAP_PHYS, VM_INFO, \
780     VM_GETRUSAGE /* VM_GETRUSAGE is to be removed from this list ASAP */
781 
782 /*===========================================================================*
783  *                Messages for IPC server				     *
784  *===========================================================================*/
785 #define IPC_BASE	0xD00
786 
787 /* Shared Memory */
788 #define IPC_SHMGET	(IPC_BASE+1)
789 #define IPC_SHMAT	(IPC_BASE+2)
790 #define IPC_SHMDT	(IPC_BASE+3)
791 #define IPC_SHMCTL	(IPC_BASE+4)
792 
793 /* Semaphore */
794 #define IPC_SEMGET	(IPC_BASE+5)
795 #define IPC_SEMCTL	(IPC_BASE+6)
796 #define IPC_SEMOP	(IPC_BASE+7)
797 
798 /*===========================================================================*
799  *                Messages for Scheduling				     *
800  *===========================================================================*/
801 #define SCHEDULING_BASE	0xF00
802 
803 #define SCHEDULING_NO_QUANTUM	(SCHEDULING_BASE+1)
804 #define SCHEDULING_START	(SCHEDULING_BASE+2)
805 #define SCHEDULING_STOP		(SCHEDULING_BASE+3)
806 #define SCHEDULING_SET_NICE	(SCHEDULING_BASE+4)
807 #define SCHEDULING_INHERIT	(SCHEDULING_BASE+5)
808 
809 /*===========================================================================*
810  *              Messages for USB                                             *
811  *===========================================================================*/
812 
813 #define USB_BASE 0x1100
814 
815 /* those are from driver to USBD */
816 #define USB_RQ_INIT          (USB_BASE +  0) /* First message to HCD driver */
817 #define USB_RQ_DEINIT        (USB_BASE +  1) /* Quit the session */
818 #define USB_RQ_SEND_URB      (USB_BASE +  2) /* Send URB */
819 #define USB_RQ_CANCEL_URB    (USB_BASE +  3) /* Cancel URB */
820 #define USB_RQ_SEND_INFO     (USB_BASE +  4) /* Sends various information */
821 #define USB_REPLY            (USB_BASE +  5)
822 
823 
824 /* those are from USBD to driver */
825 #define USB_COMPLETE_URB    (USB_BASE +  6)
826 #define USB_ANNOUCE_DEV     (USB_BASE +  7) /* Announce a new USB Device */
827 #define USB_WITHDRAW_DEV    (USB_BASE +  8) /* Withdraw a allready anncounced
828                                               USB device*/
829 #   define USB_GRANT_ID     m4_l1
830 #   define USB_GRANT_SIZE   m4_l2
831 
832 #   define USB_URB_ID       m4_l1
833 #   define USB_RESULT       m4_l2
834 #   define USB_DEV_ID       m4_l1
835 #   define USB_DRIVER_EP    m4_l2
836 #   define USB_INTERFACES   m4_l3
837 #   define USB_RB_INIT_NAME m3_ca1
838 
839 #   define USB_INFO_TYPE    m4_l1
840 #   define USB_INFO_VALUE   m4_l2
841 
842 /*===========================================================================*
843  *              Messages for DeviceManager (s/t like SysFS)                  *
844  *===========================================================================*/
845 
846 #define DEVMAN_BASE 0x1200
847 
848 #define DEVMAN_ADD_DEV     (DEVMAN_BASE + 0)
849 #define DEVMAN_DEL_DEV     (DEVMAN_BASE + 1)
850 #define DEVMAN_ADD_BUS     (DEVMAN_BASE + 2)
851 #define DEVMAN_DEL_BUS     (DEVMAN_BASE + 3)
852 #define DEVMAN_ADD_DEVFILE (DEVMAN_BASE + 4)
853 #define DEVMAN_DEL_DEVFILE (DEVMAN_BASE + 5)
854 
855 #define DEVMAN_REQUEST     (DEVMAN_BASE + 6)
856 #define DEVMAN_REPLY       (DEVMAN_BASE + 7)
857 
858 #define DEVMAN_BIND        (DEVMAN_BASE + 8)
859 #define DEVMAN_UNBIND      (DEVMAN_BASE + 9)
860 
861 #   define DEVMAN_GRANT_ID       m4_l1
862 #   define DEVMAN_GRANT_SIZE     m4_l2
863 
864 #   define DEVMAN_ENDPOINT       m4_l3
865 #   define DEVMAN_DEVICE_ID      m4_l2
866 #   define DEVMAN_RESULT         m4_l1
867 
868 /*===========================================================================*
869  *			Messages for TTY				     *
870  *===========================================================================*/
871 
872 #define TTY_RQ_BASE 0x1300
873 
874 #define TTY_FKEY_CONTROL	(TTY_RQ_BASE + 1) /* control an F-key at TTY */
875 #  define    FKEY_MAP		10	/* observe function key */
876 #  define    FKEY_UNMAP		11	/* stop observing function key */
877 #  define    FKEY_EVENTS	12	/* request open key presses */
878 
879 #define TTY_INPUT_UP		(TTY_RQ_BASE + 2) /* input server is up */
880 #define TTY_INPUT_EVENT		(TTY_RQ_BASE + 3) /* relayed input event */
881 
882 /*===========================================================================*
883  *			Messages for input server and drivers		     *
884  *===========================================================================*/
885 
886 /* The input protocol has no real replies. All messages are one-way. */
887 #define INPUT_RQ_BASE 0x1500	/* from TTY to server, or server to driver */
888 #define INPUT_RS_BASE 0x1580	/* from input driver to input server */
889 
890 #define INPUT_CONF		(INPUT_RQ_BASE + 0)	/* configure driver */
891 #define INPUT_SETLEDS		(INPUT_RQ_BASE + 1)	/* set keyboard LEDs */
892 
893 #define INPUT_EVENT		(INPUT_RS_BASE + 0)	/* send input event */
894 
895 /*===========================================================================*
896  *			Messages for PTYFS				     *
897  *===========================================================================*/
898 
899 #define PTYFS_BASE 0x1700
900 
901 #define PTYFS_SET		(PTYFS_BASE + 0)	/* add/update node */
902 #define PTYFS_CLEAR		(PTYFS_BASE + 1)	/* delete node */
903 #define PTYFS_NAME		(PTYFS_BASE + 2)	/* get node name */
904 
905 /*===========================================================================*
906  *			VFS-FS TRANSACTION IDs				     *
907  *===========================================================================*/
908 
909 #define VFS_TRANSACTION_BASE 0xB00
910 
911 #define VFS_TRANSID	(VFS_TRANSACTION_BASE + 1)
912 #define IS_VFS_FS_TRANSID(type) (((type) & ~0xff) == VFS_TRANSACTION_BASE)
913 
914 /*===========================================================================*
915  *			Messages for character devices			     *
916  *===========================================================================*/
917 
918 /* Base type for character device requests and responses. */
919 #define CDEV_RQ_BASE	0x400
920 #define CDEV_RS_BASE	0x480
921 
922 #define IS_CDEV_RQ(type) (((type) & ~0x7f) == CDEV_RQ_BASE)
923 #define IS_CDEV_RS(type) (((type) & ~0x7f) == CDEV_RS_BASE)
924 
925 /* Message types for character device requests. */
926 #define CDEV_OPEN	(CDEV_RQ_BASE + 0)	/* open a minor device */
927 #define CDEV_CLOSE	(CDEV_RQ_BASE + 1)	/* close a minor device */
928 #define CDEV_READ	(CDEV_RQ_BASE + 2)	/* read into a buffer */
929 #define CDEV_WRITE	(CDEV_RQ_BASE + 3)	/* write from a buffer */
930 #define CDEV_IOCTL	(CDEV_RQ_BASE + 4)	/* I/O control operation */
931 #define CDEV_CANCEL	(CDEV_RQ_BASE + 5)	/* cancel suspended request */
932 #define CDEV_SELECT	(CDEV_RQ_BASE + 6)	/* test for ready operations */
933 
934 /* Message types for character device responses. */
935 #define CDEV_REPLY	(CDEV_RS_BASE + 0)	/* general reply code */
936 #define CDEV_SEL1_REPLY	(CDEV_RS_BASE + 1)	/* immediate select reply */
937 #define CDEV_SEL2_REPLY	(CDEV_RS_BASE + 2)	/* select notification reply */
938 
939 /* Bits in 'CDEV_ACCESS' field of block device open requests. */
940 #  define CDEV_R_BIT		0x01	/* open with read access */
941 #  define CDEV_W_BIT		0x02	/* open with write access */
942 #  define CDEV_NOCTTY		0x04	/* not to become the controlling TTY */
943 
944 /* Bits in 'CDEV_FLAGS' field of block device transfer requests. */
945 #  define CDEV_NOFLAGS		0x00	/* no flags are set */
946 #  define CDEV_NONBLOCK		0x01	/* do not suspend I/O request */
947 
948 /* Bits in 'CDEV_OPS', 'CDEV_STATUS' fields of block device select messages. */
949 #  define CDEV_OP_RD		0x01	/* selected for read operation */
950 #  define CDEV_OP_WR		0x02	/* selected for write operation */
951 #  define CDEV_OP_ERR		0x04	/* selected for error operation */
952 #  define CDEV_NOTIFY		0x08	/* notification requested */
953 
954 /* Bits in 'CDEV_STATUS' field of block device open responses. */
955 #  define CDEV_CLONED		0x20000000	/* device is cloned */
956 #  define CDEV_CTTY		0x40000000	/* device is controlling TTY */
957 
958 /*===========================================================================*
959  *			Messages for block devices			     *
960  *===========================================================================*/
961 
962 /* Base type for block device requests and responses. */
963 #define BDEV_RQ_BASE	0x500
964 #define BDEV_RS_BASE	0x580
965 
966 #define IS_BDEV_RQ(type) (((type) & ~0x7f) == BDEV_RQ_BASE)
967 #define IS_BDEV_RS(type) (((type) & ~0x7f) == BDEV_RS_BASE)
968 
969 /* Message types for block device requests. */
970 #define BDEV_OPEN	(BDEV_RQ_BASE + 0)	/* open a minor device */
971 #define BDEV_CLOSE	(BDEV_RQ_BASE + 1)	/* close a minor device */
972 #define BDEV_READ	(BDEV_RQ_BASE + 2)	/* read into a buffer */
973 #define BDEV_WRITE	(BDEV_RQ_BASE + 3)	/* write from a buffer */
974 #define BDEV_GATHER	(BDEV_RQ_BASE + 4)	/* read into a vector */
975 #define BDEV_SCATTER	(BDEV_RQ_BASE + 5)	/* write from a vector */
976 #define BDEV_IOCTL	(BDEV_RQ_BASE + 6)	/* I/O control operation */
977 
978 /* Message types for block device responses. */
979 #define BDEV_REPLY	(BDEV_RS_BASE + 0)	/* general reply code */
980 
981 /* Bits in 'BDEV_ACCESS' field of block device open requests. */
982 #  define BDEV_R_BIT		0x01	/* open with read access */
983 #  define BDEV_W_BIT		0x02	/* open with write access */
984 
985 /* Bits in 'BDEV_FLAGS' field of block device transfer requests. */
986 #  define BDEV_NOFLAGS		0x00	/* no flags are set */
987 #  define BDEV_FORCEWRITE	0x01	/* force write to disk immediately */
988 #  define BDEV_NOPAGE		0x02	/* eeprom: don't send page address */
989 
990 /*===========================================================================*
991  *			Messages for Real Time Clocks			     *
992  *===========================================================================*/
993 
994 /* Base type for real time clock requests and responses. */
995 #define RTCDEV_RQ_BASE	0x1400
996 #define RTCDEV_RS_BASE	0x1480
997 
998 #define IS_RTCDEV_RQ(type) (((type) & ~0x7f) == RTCDEV_RQ_BASE)
999 #define IS_RTCDEV_RS(type) (((type) & ~0x7f) == RTCDEV_RS_BASE)
1000 
1001 /* Message types for real time clock requests. */
1002 #define RTCDEV_GET_TIME	(RTCDEV_RQ_BASE + 0)	/* get time from hw clock */
1003 #define RTCDEV_SET_TIME	(RTCDEV_RQ_BASE + 1)	/* set time in hw clock */
1004 #define RTCDEV_PWR_OFF	(RTCDEV_RQ_BASE + 2)	/* set time to cut the power */
1005 
1006 /* Same as GET/SET above but using grants */
1007 #define RTCDEV_GET_TIME_G (RTCDEV_RQ_BASE + 3)	/* get time from hw clock */
1008 #define RTCDEV_SET_TIME_G (RTCDEV_RQ_BASE + 4)	/* set time in hw clock */
1009 
1010 /* Message types for real time clock responses. */
1011 #define RTCDEV_REPLY	(RTCDEV_RS_BASE + 0)	/* general reply code */
1012 
1013 /* Bits in 'lc_readclock_rtcdev.flags' field of real time clock requests. */
1014 #define RTCDEV_NOFLAGS	0x00	/* no flags are set */
1015 #define RTCDEV_Y2KBUG	0x01	/* Interpret 1980 as 2000 for RTC w/Y2K bug */
1016 #define RTCDEV_CMOSREG	0x02	/* Also set the CMOS clock register bits. */
1017 
1018 /*===========================================================================*
1019  *				Calls to MIB				     *
1020  *===========================================================================*/
1021 
1022 #define MIB_BASE		0x1800
1023 
1024 #define IS_MIB_CALL(type)	(((type) & ~0xff) == MIB_BASE)
1025 
1026 #define MIB_SYSCTL		(MIB_BASE + 0)		/* sysctl(2) */
1027 #define MIB_REGISTER		(MIB_BASE + 1)		/* mount subtree */
1028 #define MIB_DEREGISTER		(MIB_BASE + 2)		/* unmount subtree */
1029 
1030 #define NR_MIB_CALLS		3	/* highest number from base plus one */
1031 
1032 /*===========================================================================*
1033  *			Messages for socket devices			     *
1034  *===========================================================================*/
1035 
1036 /* Base type for socket device requests and responses. */
1037 #define SDEV_RQ_BASE		0x1900
1038 #define SDEV_RS_BASE		0x1980
1039 
1040 #define IS_SDEV_RQ(type)	(((type) & ~0x7f) == SDEV_RQ_BASE)
1041 #define IS_SDEV_RS(type)	(((type) & ~0x7f) == SDEV_RS_BASE)
1042 
1043 /* Message types for socket device requests. */
1044 #define SDEV_SOCKET		(SDEV_RQ_BASE + 0)	/* create socket */
1045 #define SDEV_SOCKETPAIR		(SDEV_RQ_BASE + 1)	/* make socket pair */
1046 #define SDEV_BIND		(SDEV_RQ_BASE + 2)	/* bind to address */
1047 #define SDEV_CONNECT		(SDEV_RQ_BASE + 3)	/* start connection */
1048 #define SDEV_LISTEN		(SDEV_RQ_BASE + 4)	/* enter listen mode */
1049 #define SDEV_ACCEPT		(SDEV_RQ_BASE + 5)	/* accept connection */
1050 #define SDEV_SEND		(SDEV_RQ_BASE + 6)	/* send data */
1051 #define SDEV_RECV		(SDEV_RQ_BASE + 7)	/* receive data */
1052 #define SDEV_IOCTL		(SDEV_RQ_BASE + 8)	/* I/O control */
1053 #define SDEV_SETSOCKOPT		(SDEV_RQ_BASE + 9)	/* set socket option */
1054 #define SDEV_GETSOCKOPT		(SDEV_RQ_BASE + 10)	/* get socket option */
1055 #define SDEV_GETSOCKNAME	(SDEV_RQ_BASE + 11)	/* get socket name */
1056 #define SDEV_GETPEERNAME	(SDEV_RQ_BASE + 12)	/* get peer name */
1057 #define SDEV_SHUTDOWN		(SDEV_RQ_BASE + 13)	/* shut down I/O */
1058 #define SDEV_CLOSE		(SDEV_RQ_BASE + 14)	/* close socket */
1059 #define SDEV_CANCEL		(SDEV_RQ_BASE + 15)	/* cancel request */
1060 #define SDEV_SELECT		(SDEV_RQ_BASE + 16)	/* select on socket */
1061 
1062 /* Message types for socket device responses. */
1063 #define SDEV_REPLY		(SDEV_RS_BASE + 0)	/* generic reply */
1064 #define SDEV_SOCKET_REPLY	(SDEV_RS_BASE + 1)	/* socket reply */
1065 #define SDEV_ACCEPT_REPLY	(SDEV_RS_BASE + 2)	/* accept reply */
1066 #define SDEV_RECV_REPLY		(SDEV_RS_BASE + 3)	/* receive reply */
1067 #define SDEV_SELECT1_REPLY	(SDEV_RS_BASE + 4)	/* select reply 1 */
1068 #define SDEV_SELECT2_REPLY	(SDEV_RS_BASE + 5)	/* select reply 2 */
1069 
1070 /* Bits in the 'sflags' field of socket device transfer requests. */
1071 #  define SDEV_NOFLAGS		0x00	/* no flags are set */
1072 #  define SDEV_NONBLOCK		0x01	/* do not suspend I/O request */
1073 
1074 /* Bits in the 'ops', 'status' fields of socket device select messages. */
1075 #  define SDEV_OP_RD		0x01	/* selected for read operation */
1076 #  define SDEV_OP_WR		0x02	/* selected for write operation */
1077 #  define SDEV_OP_ERR		0x04	/* selected for error operation */
1078 #  define SDEV_NOTIFY		0x08	/* notification requested */
1079 
1080 /*===========================================================================*
1081  *			Messages for network devices			     *
1082  *===========================================================================*/
1083 
1084 /* Base type for network device requests and responses. */
1085 #define NDEV_RQ_BASE		0x1A00		/* ndev -> netdriver */
1086 #define NDEV_RS_BASE		0x1A80		/* netdriver -> ndev */
1087 
1088 #define IS_NDEV_RQ(type)	(((type) & ~0x7f) == NDEV_RQ_BASE)
1089 #define IS_NDEV_RS(type)	(((type) & ~0x7f) == NDEV_RS_BASE)
1090 
1091 /*
1092  * Status requests and responses travel in the opposite direction, so we group
1093  * them with their sending party, so that the IS_NDEV_R[QS] macros can be used
1094  * by either side to see whether the message is indeed for them.
1095  */
1096 #define NDEV_INIT		(NDEV_RQ_BASE + 0)	/* initialize driver */
1097 #define NDEV_CONF		(NDEV_RQ_BASE + 1)	/* configure driver */
1098 #define NDEV_SEND		(NDEV_RQ_BASE + 2)	/* send a packet */
1099 #define NDEV_RECV		(NDEV_RQ_BASE + 3)	/* receive a packet */
1100 #define NDEV_IOCTL		(NDEV_RQ_BASE + 4)	/* (reserved) */
1101 #define NDEV_STATUS_REPLY	(NDEV_RQ_BASE + 5)	/* status reply */
1102 
1103 #define NDEV_INIT_REPLY		(NDEV_RS_BASE + 0)	/* initialize reply */
1104 #define NDEV_CONF_REPLY		(NDEV_RS_BASE + 1)	/* configure reply */
1105 #define NDEV_SEND_REPLY		(NDEV_RS_BASE + 2)	/* send reply */
1106 #define NDEV_RECV_REPLY		(NDEV_RS_BASE + 3)	/* receive reply */
1107 #define NDEV_IOCTL_REPLY	(NDEV_RS_BASE + 4)	/* (reserved) */
1108 #define NDEV_STATUS		(NDEV_RS_BASE + 5)	/* status report */
1109 
1110 /* Bits in the 'set' field of configuration requests. */
1111 #  define NDEV_SET_MODE		0x01	/* set I/O mode and multicast list */
1112 #  define NDEV_SET_CAPS		0x02	/* enable or disable capabilities */
1113 #  define NDEV_SET_FLAGS	0x04	/* set driver-specific flags */
1114 #  define NDEV_SET_MEDIA	0x08	/* set media type */
1115 #  define NDEV_SET_HWADDR	0x10	/* change the hardware address */
1116 
1117 /* Bits in the 'mode' field of configuration requests. */
1118 #  define NDEV_MODE_DOWN	0x00	/* transmission and receipt disabled */
1119 #  define NDEV_MODE_UP		0x01	/* receive unicast packets for me */
1120 #  define NDEV_MODE_BCAST	0x02	/* receive broadcast packets */
1121 #  define NDEV_MODE_MCAST_LIST	0x04	/* receive certain multicast packets */
1122 #  define NDEV_MODE_MCAST_ALL	0x08	/* receive all multicast packets */
1123 #  define NDEV_MODE_PROMISC	0x10	/* receive all packets */
1124 
1125 /* Bits in the 'caps' field of initialization and configuration requests. */
1126 #  define NDEV_CAP_CS_IP4_TX	0x01	/* IPv4 header checksum generation */
1127 #  define NDEV_CAP_CS_IP4_RX	0x02	/* IPv4 header checksum verification */
1128 #  define NDEV_CAP_CS_UDP_TX	0x04	/* UDP header checksum generation */
1129 #  define NDEV_CAP_CS_UDP_RX	0x08	/* UDP header checksum verification */
1130 #  define NDEV_CAP_CS_TCP_TX	0x10	/* TCP header checksum generation */
1131 #  define NDEV_CAP_CS_TCP_RX	0x20	/* TCP header checksum verification */
1132 #  define NDEV_CAP_MCAST	0x20000000	/* init only: mcast capable */
1133 #  define NDEV_CAP_BCAST	0x40000000	/* init only: bcast capable */
1134 #  define NDEV_CAP_HWADDR	0x80000000	/* init only: can set hwaddr */
1135 
1136 /* Values for the 'flags' field of configuration requests. */
1137 #  define NDEV_FLAG_DEBUG	0x01	/* enable driver-specific debug mode */
1138 #  define NDEV_FLAG_LINK0	0x02	/* enable driver-specific LINK0 flag */
1139 #  define NDEV_FLAG_LINK1	0x04	/* enable driver-specific LINK1 flag */
1140 #  define NDEV_FLAG_LINK2	0x08	/* enable driver-specific LINK2 flag */
1141 
1142 /* Values for the 'link' field of initialization and status replies. */
1143 #  define NDEV_LINK_UNKNOWN	0	/* link status is unknown, assume up */
1144 #  define NDEV_LINK_UP		1	/* link is up */
1145 #  define NDEV_LINK_DOWN	2	/* link is down */
1146 
1147 /*===========================================================================*
1148  *		Internal codes used by several services			     *
1149  *===========================================================================*/
1150 
1151 #define SUSPEND 	 -998 	/* status to suspend caller, reply later */
1152 
1153 #endif /* !_MINIX_COM_H */
1154