diff --git a/conts/libl4/include/l4lib/arch-arm/syscalls.h b/conts/libl4/include/l4lib/arch-arm/syscalls.h index 09b1c62..584da7a 100644 --- a/conts/libl4/include/l4lib/arch-arm/syscalls.h +++ b/conts/libl4/include/l4lib/arch-arm/syscalls.h @@ -16,9 +16,10 @@ #include struct task_ids { - int tid; - int spid; - int tgid; + l4id_t tid; + l4id_t spid; + l4id_t tgid; + l4id_t cid; }; static inline void * diff --git a/conts/libl4/include/l4lib/arch-arm/types.h b/conts/libl4/include/l4lib/arch-arm/types.h index f01616b..76dc5ba 100644 --- a/conts/libl4/include/l4lib/arch-arm/types.h +++ b/conts/libl4/include/l4lib/arch-arm/types.h @@ -1,7 +1,7 @@ #ifndef __L4LIB_ARM_TYPES_H___ #define __L4LIB_ARM_TYPES_H__ -#define TASK_ID_INVALID -1 +#define TASK_ID_INVALID 0xFFFFFFFF #include diff --git a/conts/posix/mm0/mm/init.c b/conts/posix/mm0/mm/init.c index aa1eda8..51e65a6 100644 --- a/conts/posix/mm0/mm/init.c +++ b/conts/posix/mm0/mm/init.c @@ -226,13 +226,11 @@ int read_pager_capabilities() /* Set up pointers to important capabilities */ list_foreach_struct(cap, &capability_list.caps, list) { /* Physical memory bank */ - if ((cap->type & CAP_RTYPE_MASK) - == CAP_RTYPE_PHYSMEM) + if (cap_type(cap) == CAP_TYPE_MAP_PHYSMEM) cont_mem_regions.physmem = cap; /* Virtual regions */ - if ((cap->type & CAP_RTYPE_MASK) - == CAP_RTYPE_VIRTMEM) { + if (cap_type(cap) == CAP_TYPE_MAP_VIRTMEM) { /* Pager address region (get from linker-defined) */ if (__pfn_to_addr(cap->start) diff --git a/conts/posix/test0/main.c b/conts/posix/test0/main.c index eeba774..fdd97b9 100644 --- a/conts/posix/test0/main.c +++ b/conts/posix/test0/main.c @@ -26,7 +26,7 @@ void wait_pager(l4id_t partner) } pid_t parent_of_all; -pid_t pagerid; +l4id_t pagerid; int main(int argc, char *argv[]) { diff --git a/conts/posix/test0/src/test_exec/test_exec.c b/conts/posix/test0/src/test_exec/test_exec.c index 3eb42b2..41695a1 100644 --- a/conts/posix/test0/src/test_exec/test_exec.c +++ b/conts/posix/test0/src/test_exec/test_exec.c @@ -24,7 +24,7 @@ void wait_pager(l4id_t partner) // printf("Pager synced with us.\n"); } -pid_t pagerid; +l4id_t pagerid; int main(int argc, char *argv[]) { diff --git a/conts/test/main.c b/conts/test/main.c index 12ea2b7..aaa03ed 100644 --- a/conts/test/main.c +++ b/conts/test/main.c @@ -66,12 +66,12 @@ int main(void) printf("%s: Container %s started\n", __CONTAINER__, __CONTAINER_NAME__); - //capability_test(); + capability_test(); - exit_test(); + //exit_test(); /* Now quit to demo self-paging quit */ - l4_exit(0); + //l4_exit(0); /* Now quit by null pointer */ // *((int *)0) = 5; diff --git a/include/l4/api/ipc.h b/include/l4/api/ipc.h index 22be162..08ffedf 100644 --- a/include/l4/api/ipc.h +++ b/include/l4/api/ipc.h @@ -2,8 +2,8 @@ #define __IPC_H__ -#define L4_NILTHREAD -1 -#define L4_ANYTHREAD -2 +#define L4_NILTHREAD 0xFFFFFFFF +#define L4_ANYTHREAD 0xFFFFFFFE #define L4_IPC_TAG_MR_OFFSET 0 diff --git a/include/l4/arch/arm/types.h b/include/l4/arch/arm/types.h index 4c5df35..3106d6c 100644 --- a/include/l4/arch/arm/types.h +++ b/include/l4/arch/arm/types.h @@ -12,7 +12,7 @@ typedef signed short s16; typedef signed char s8; /* Thread/Space id type */ -typedef int l4id_t; +typedef unsigned int l4id_t; #endif /* !__ASSEMBLY__ */ #endif /* !__ARCH_TYPES_H__ */ diff --git a/include/l4/generic/tcb.h b/include/l4/generic/tcb.h index 4dceb95..ab707d0 100644 --- a/include/l4/generic/tcb.h +++ b/include/l4/generic/tcb.h @@ -39,11 +39,21 @@ enum task_state { TASK_DEAD = 3, }; -#define TASK_ID_INVALID -1 +#define TASK_CID_MASK 0xFF000000 +#define TASK_ID_MASK 0x00FFFFFF + +static inline int task_id_special(l4id_t id) +{ + /* Special ids have top 2 nibbles all set */ + return (id & TASK_CID_MASK) == TASK_CID_MASK; +} + +#define TASK_ID_INVALID 0xFFFFFFFF struct task_ids { l4id_t tid; l4id_t spid; l4id_t tgid; + l4id_t cid; }; struct container; diff --git a/src/api/ipc.c b/src/api/ipc.c index 0b99f19..020ee14 100644 --- a/src/api/ipc.c +++ b/src/api/ipc.c @@ -539,11 +539,14 @@ int sys_ipc(l4id_t to, l4id_t from, unsigned int flags) int ret = 0; /* Check arguments */ - if (from < L4_ANYTHREAD) { + if (task_id_special(from) && + from != L4_ANYTHREAD && from != L4_NILTHREAD) { ret = -EINVAL; goto error; } - if (to < L4_ANYTHREAD) { + + if (task_id_special(to) && + to != L4_ANYTHREAD && to != L4_NILTHREAD) { ret = -EINVAL; goto error; } diff --git a/src/api/syscall.c b/src/api/syscall.c index 1ff2769..94fea02 100644 --- a/src/api/syscall.c +++ b/src/api/syscall.c @@ -48,6 +48,7 @@ int sys_getid(struct task_ids *ids) ids->tid = this->tid; ids->spid = this->space->spid; ids->tgid = this->tgid; + ids->cid = this->container->cid; return 0; }