#define ANY 0x7ace /* used to indicate 'any process' */
#define NONE 0x6ace /* used to indicate 'no process at all' */
#define SELF 0x8ace /* used to indicate 'own process' */
-/* check if the magic process numbers are valid process table slot numbers */
-#if (ANY < NR_PROCS)
-#error "Magic process number in the process table range"
-#endif
+#define _MAX_MAGIC_PROC (SELF) /* used by <minix/endpoint.h>
+ to determine generation size */
/*===========================================================================*
* Process numbers of processes in the system image *
#define HARDWARE KERNEL /* for hardware interrupt handlers */
/* Number of tasks. Note that NR_PROCS is defined in <minix/config.h>. */
+#define MAX_NR_TASKS 1023
#define NR_TASKS 4
/* User-space processes, that is, device drivers, servers, and INIT. */
* the generation size is big enough to start the next generation
* above the highest magic number.
*/
-#define _ENDPOINT_GENERATION_BITS 16
-#define _ENDPOINT_PNUM_BITS 16
-#define _ENDPOINT_MAX_GENERATION ((1 << _ENDPOINT_GENERATION_BITS)-1)
-#define _ENDPOINT_MAX_PNUM ((1 << _ENDPOINT_PNUM_BITS) - 1)
+#define _ENDPOINT_GENERATION_SIZE (MAX_NR_TASKS+_MAX_MAGIC_PROC+1)
+#define _ENDPOINT_MAX_GENERATION (INT_MAX/_ENDPOINT_GENERATION_SIZE-1)
/* Generation + Process slot number <-> endpoint. */
-#define _ENDPOINT(g, p) ((endpoint_t)(((g) << _ENDPOINT_PNUM_BITS) | (p)))
-#define _ENDPOINT_G(e) ((u16_t)((e) >> _ENDPOINT_PNUM_BITS))
-#define _ENDPOINT_P(e) ((i16_t)((e) & _ENDPOINT_MAX_PNUM))
+#define _ENDPOINT(g, p) ((endpoint_t)((g) * _ENDPOINT_GENERATION_SIZE + (p)))
+#define _ENDPOINT_G(e) (((e)+MAX_NR_TASKS) / _ENDPOINT_GENERATION_SIZE)
+#define _ENDPOINT_P(e) \
+ ((((e)+MAX_NR_TASKS) % _ENDPOINT_GENERATION_SIZE) - MAX_NR_TASKS)
#endif
printf("Test 39 ");
for(g = 0; g <= _ENDPOINT_MAX_GENERATION; g++) {
- for(p = -NR_TASKS; p < _NR_PROCS; p++) {
- int e, mg, mp;
+ for(p = -MAX_NR_TASKS; p < _NR_PROCS; p++) {
+ endpoint_t e;
+ int mg, mp;
e = _ENDPOINT(g, p);
mg = _ENDPOINT_G(e);
mp = _ENDPOINT_P(e);