From aeef546544304933622034981296aaf5d0d27b52 Mon Sep 17 00:00:00 2001 From: Bahadir Balban Date: Wed, 4 Nov 2009 16:39:04 +0200 Subject: [PATCH] Changed l4id_t type to unsigned integer. Expanded task_ids to have cid Task ids are now unsigned as the container ids will need to be encoded in the id fields as well. For requests who require even more comprehensive id input, (such as thread creation) also added is the container id so that threads _could_ potentially be created in other containers as well. --- conts/libl4/include/l4lib/arch-arm/syscalls.h | 7 ++++--- conts/libl4/include/l4lib/arch-arm/types.h | 2 +- conts/posix/mm0/mm/init.c | 6 ++---- conts/posix/test0/main.c | 2 +- conts/posix/test0/src/test_exec/test_exec.c | 2 +- conts/test/main.c | 6 +++--- include/l4/api/ipc.h | 4 ++-- include/l4/arch/arm/types.h | 2 +- include/l4/generic/tcb.h | 12 +++++++++++- src/api/ipc.c | 7 +++++-- src/api/syscall.c | 1 + 11 files changed, 32 insertions(+), 19 deletions(-) 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; }