mirror of
https://github.com/drasko/codezero.git
synced 2026-02-04 22:13:16 +01:00
Merge branch 'master' into devel
This commit is contained in:
@@ -16,9 +16,10 @@
|
|||||||
#include <l4/api/thread.h>
|
#include <l4/api/thread.h>
|
||||||
|
|
||||||
struct task_ids {
|
struct task_ids {
|
||||||
int tid;
|
l4id_t tid;
|
||||||
int spid;
|
l4id_t spid;
|
||||||
int tgid;
|
l4id_t tgid;
|
||||||
|
l4id_t cid;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline void *
|
static inline void *
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#ifndef __L4LIB_ARM_TYPES_H___
|
#ifndef __L4LIB_ARM_TYPES_H___
|
||||||
#define __L4LIB_ARM_TYPES_H__
|
#define __L4LIB_ARM_TYPES_H__
|
||||||
|
|
||||||
#define TASK_ID_INVALID -1
|
#define TASK_ID_INVALID 0xFFFFFFFF
|
||||||
|
|
||||||
#include <l4/arch/arm/types.h>
|
#include <l4/arch/arm/types.h>
|
||||||
|
|
||||||
|
|||||||
@@ -226,13 +226,11 @@ int read_pager_capabilities()
|
|||||||
/* Set up pointers to important capabilities */
|
/* Set up pointers to important capabilities */
|
||||||
list_foreach_struct(cap, &capability_list.caps, list) {
|
list_foreach_struct(cap, &capability_list.caps, list) {
|
||||||
/* Physical memory bank */
|
/* Physical memory bank */
|
||||||
if ((cap->type & CAP_RTYPE_MASK)
|
if (cap_type(cap) == CAP_TYPE_MAP_PHYSMEM)
|
||||||
== CAP_RTYPE_PHYSMEM)
|
|
||||||
cont_mem_regions.physmem = cap;
|
cont_mem_regions.physmem = cap;
|
||||||
|
|
||||||
/* Virtual regions */
|
/* Virtual regions */
|
||||||
if ((cap->type & CAP_RTYPE_MASK)
|
if (cap_type(cap) == CAP_TYPE_MAP_VIRTMEM) {
|
||||||
== CAP_RTYPE_VIRTMEM) {
|
|
||||||
|
|
||||||
/* Pager address region (get from linker-defined) */
|
/* Pager address region (get from linker-defined) */
|
||||||
if (__pfn_to_addr(cap->start)
|
if (__pfn_to_addr(cap->start)
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ void wait_pager(l4id_t partner)
|
|||||||
}
|
}
|
||||||
|
|
||||||
pid_t parent_of_all;
|
pid_t parent_of_all;
|
||||||
pid_t pagerid;
|
l4id_t pagerid;
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ void wait_pager(l4id_t partner)
|
|||||||
// printf("Pager synced with us.\n");
|
// printf("Pager synced with us.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
pid_t pagerid;
|
l4id_t pagerid;
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -66,12 +66,12 @@ int main(void)
|
|||||||
printf("%s: Container %s started\n",
|
printf("%s: Container %s started\n",
|
||||||
__CONTAINER__, __CONTAINER_NAME__);
|
__CONTAINER__, __CONTAINER_NAME__);
|
||||||
|
|
||||||
//capability_test();
|
capability_test();
|
||||||
|
|
||||||
exit_test();
|
//exit_test();
|
||||||
|
|
||||||
/* Now quit to demo self-paging quit */
|
/* Now quit to demo self-paging quit */
|
||||||
l4_exit(0);
|
//l4_exit(0);
|
||||||
|
|
||||||
/* Now quit by null pointer */
|
/* Now quit by null pointer */
|
||||||
// *((int *)0) = 5;
|
// *((int *)0) = 5;
|
||||||
|
|||||||
@@ -89,9 +89,13 @@ void cap_print(struct capability *cap)
|
|||||||
case CAP_TYPE_EXREGS:
|
case CAP_TYPE_EXREGS:
|
||||||
printf("Capability type:\t\t%s\n", "Exchange Registers");
|
printf("Capability type:\t\t%s\n", "Exchange Registers");
|
||||||
break;
|
break;
|
||||||
case CAP_TYPE_MAP:
|
case CAP_TYPE_MAP_PHYSMEM:
|
||||||
printf("Capability type:\t\t%s\n", "Map");
|
printf("Capability type:\t\t%s\n", "Map/Physmem");
|
||||||
break;
|
break;
|
||||||
|
case CAP_TYPE_MAP_VIRTMEM:
|
||||||
|
printf("Capability type:\t\t%s\n", "Map/Virtmem");
|
||||||
|
break;
|
||||||
|
|
||||||
case CAP_TYPE_IPC:
|
case CAP_TYPE_IPC:
|
||||||
printf("Capability type:\t\t%s\n", "Ipc");
|
printf("Capability type:\t\t%s\n", "Ipc");
|
||||||
break;
|
break;
|
||||||
@@ -119,12 +123,6 @@ void cap_print(struct capability *cap)
|
|||||||
case CAP_RTYPE_CONTAINER:
|
case CAP_RTYPE_CONTAINER:
|
||||||
printf("Capability resource type:\t%s\n", "Container");
|
printf("Capability resource type:\t%s\n", "Container");
|
||||||
break;
|
break;
|
||||||
case CAP_RTYPE_VIRTMEM:
|
|
||||||
printf("Capability resource type:\t%s\n", "Virtual Memory");
|
|
||||||
break;
|
|
||||||
case CAP_RTYPE_PHYSMEM:
|
|
||||||
printf("Capability resource type:\t%s\n", "Physical Memory");
|
|
||||||
break;
|
|
||||||
case CAP_RTYPE_THREADPOOL:
|
case CAP_RTYPE_THREADPOOL:
|
||||||
printf("Capability resource type:\t%s\n", "Thread Pool");
|
printf("Capability resource type:\t%s\n", "Thread Pool");
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
#define __IPC_H__
|
#define __IPC_H__
|
||||||
|
|
||||||
|
|
||||||
#define L4_NILTHREAD -1
|
#define L4_NILTHREAD 0xFFFFFFFF
|
||||||
#define L4_ANYTHREAD -2
|
#define L4_ANYTHREAD 0xFFFFFFFE
|
||||||
|
|
||||||
#define L4_IPC_TAG_MR_OFFSET 0
|
#define L4_IPC_TAG_MR_OFFSET 0
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ typedef signed short s16;
|
|||||||
typedef signed char s8;
|
typedef signed char s8;
|
||||||
|
|
||||||
/* Thread/Space id type */
|
/* Thread/Space id type */
|
||||||
typedef int l4id_t;
|
typedef unsigned int l4id_t;
|
||||||
|
|
||||||
#endif /* !__ASSEMBLY__ */
|
#endif /* !__ASSEMBLY__ */
|
||||||
#endif /* !__ARCH_TYPES_H__ */
|
#endif /* !__ARCH_TYPES_H__ */
|
||||||
|
|||||||
@@ -12,12 +12,13 @@
|
|||||||
#define CAP_TYPE_MASK 0x0000FFFF
|
#define CAP_TYPE_MASK 0x0000FFFF
|
||||||
#define CAP_TYPE_TCTRL (1 << 0)
|
#define CAP_TYPE_TCTRL (1 << 0)
|
||||||
#define CAP_TYPE_EXREGS (1 << 1)
|
#define CAP_TYPE_EXREGS (1 << 1)
|
||||||
#define CAP_TYPE_MAP (1 << 2)
|
#define CAP_TYPE_MAP_PHYSMEM (1 << 2)
|
||||||
#define CAP_TYPE_IPC (1 << 3)
|
#define CAP_TYPE_MAP_VIRTMEM (1 << 3)
|
||||||
#define CAP_TYPE_SCHED (1 << 4)
|
#define CAP_TYPE_IPC (1 << 4)
|
||||||
#define CAP_TYPE_UMUTEX (1 << 5)
|
#define CAP_TYPE_SCHED (1 << 5)
|
||||||
#define CAP_TYPE_QUANTITY (1 << 6)
|
#define CAP_TYPE_UMUTEX (1 << 6)
|
||||||
#define CAP_TYPE_CAP (1 << 7)
|
#define CAP_TYPE_QUANTITY (1 << 7)
|
||||||
|
#define CAP_TYPE_CAP (1 << 8)
|
||||||
#define cap_type(c) ((c)->type & CAP_TYPE_MASK)
|
#define cap_type(c) ((c)->type & CAP_TYPE_MASK)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -29,14 +30,12 @@
|
|||||||
#define CAP_RTYPE_SPACE (1 << 18)
|
#define CAP_RTYPE_SPACE (1 << 18)
|
||||||
#define CAP_RTYPE_CONTAINER (1 << 19)
|
#define CAP_RTYPE_CONTAINER (1 << 19)
|
||||||
#define CAP_RTYPE_PGGROUP (1 << 20) /* Group of paged threads */
|
#define CAP_RTYPE_PGGROUP (1 << 20) /* Group of paged threads */
|
||||||
#define CAP_RTYPE_VIRTMEM (1 << 21)
|
#define CAP_RTYPE_CPUPOOL (1 << 21)
|
||||||
#define CAP_RTYPE_PHYSMEM (1 << 22)
|
#define CAP_RTYPE_THREADPOOL (1 << 22)
|
||||||
#define CAP_RTYPE_CPUPOOL (1 << 23)
|
#define CAP_RTYPE_SPACEPOOL (1 << 23)
|
||||||
#define CAP_RTYPE_THREADPOOL (1 << 24)
|
#define CAP_RTYPE_MUTEXPOOL (1 << 24)
|
||||||
#define CAP_RTYPE_SPACEPOOL (1 << 25)
|
#define CAP_RTYPE_MAPPOOL (1 << 25) /* For pmd spending */
|
||||||
#define CAP_RTYPE_MUTEXPOOL (1 << 26)
|
#define CAP_RTYPE_CAPPOOL (1 << 26) /* For new cap generation */
|
||||||
#define CAP_RTYPE_MAPPOOL (1 << 27) /* For pmd spending */
|
|
||||||
#define CAP_RTYPE_CAPPOOL (1 << 28) /* For new cap generation */
|
|
||||||
|
|
||||||
#define cap_rtype(c) ((c)->type & CAP_RTYPE_MASK)
|
#define cap_rtype(c) ((c)->type & CAP_RTYPE_MASK)
|
||||||
|
|
||||||
|
|||||||
@@ -39,11 +39,21 @@ enum task_state {
|
|||||||
TASK_DEAD = 3,
|
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 {
|
struct task_ids {
|
||||||
l4id_t tid;
|
l4id_t tid;
|
||||||
l4id_t spid;
|
l4id_t spid;
|
||||||
l4id_t tgid;
|
l4id_t tgid;
|
||||||
|
l4id_t cid;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct container;
|
struct container;
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ pager_end = \
|
|||||||
cap_virtmem = \
|
cap_virtmem = \
|
||||||
'''
|
'''
|
||||||
\t\t\t[%(capidx)d] = {
|
\t\t\t[%(capidx)d] = {
|
||||||
\t\t\t\t.type = CAP_TYPE_MAP | CAP_RTYPE_VIRTMEM,
|
\t\t\t\t.type = CAP_TYPE_MAP_VIRTMEM | CAP_RTYPE_CONTAINER,
|
||||||
\t\t\t\t.access = CAP_MAP_READ | CAP_MAP_WRITE | CAP_MAP_EXEC
|
\t\t\t\t.access = CAP_MAP_READ | CAP_MAP_WRITE | CAP_MAP_EXEC
|
||||||
\t\t\t\t\t| CAP_MAP_CACHED | CAP_MAP_UNCACHED | CAP_MAP_UNMAP | CAP_MAP_UTCB,
|
\t\t\t\t\t| CAP_MAP_CACHED | CAP_MAP_UNCACHED | CAP_MAP_UNMAP | CAP_MAP_UTCB,
|
||||||
\t\t\t\t.start = __pfn(CONFIG_CONT%(cn)d_VIRT%(vn)d_START),
|
\t\t\t\t.start = __pfn(CONFIG_CONT%(cn)d_VIRT%(vn)d_START),
|
||||||
@@ -88,7 +88,7 @@ cap_virtmem = \
|
|||||||
cap_physmem = \
|
cap_physmem = \
|
||||||
'''
|
'''
|
||||||
\t\t\t[%(capidx)d] = {
|
\t\t\t[%(capidx)d] = {
|
||||||
\t\t\t\t.type = CAP_TYPE_MAP | CAP_RTYPE_PHYSMEM,
|
\t\t\t\t.type = CAP_TYPE_MAP_PHYSMEM | CAP_RTYPE_CONTAINER,
|
||||||
\t\t\t\t.access = CAP_MAP_READ | CAP_MAP_WRITE | CAP_MAP_EXEC |
|
\t\t\t\t.access = CAP_MAP_READ | CAP_MAP_WRITE | CAP_MAP_EXEC |
|
||||||
\t\t\t\t\tCAP_MAP_CACHED | CAP_MAP_UNCACHED | CAP_MAP_UNMAP | CAP_MAP_UTCB,
|
\t\t\t\t\tCAP_MAP_CACHED | CAP_MAP_UNCACHED | CAP_MAP_UNMAP | CAP_MAP_UTCB,
|
||||||
\t\t\t\t.start = __pfn(CONFIG_CONT%(cn)d_PHYS%(pn)d_START),
|
\t\t\t\t.start = __pfn(CONFIG_CONT%(cn)d_PHYS%(pn)d_START),
|
||||||
|
|||||||
@@ -539,11 +539,14 @@ int sys_ipc(l4id_t to, l4id_t from, unsigned int flags)
|
|||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
/* Check arguments */
|
/* Check arguments */
|
||||||
if (from < L4_ANYTHREAD) {
|
if (task_id_special(from) &&
|
||||||
|
from != L4_ANYTHREAD && from != L4_NILTHREAD) {
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
if (to < L4_ANYTHREAD) {
|
|
||||||
|
if (task_id_special(to) &&
|
||||||
|
to != L4_ANYTHREAD && to != L4_NILTHREAD) {
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ int sys_getid(struct task_ids *ids)
|
|||||||
ids->tid = this->tid;
|
ids->tid = this->tid;
|
||||||
ids->spid = this->space->spid;
|
ids->spid = this->space->spid;
|
||||||
ids->tgid = this->tgid;
|
ids->tgid = this->tgid;
|
||||||
|
ids->cid = this->container->cid;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -497,7 +497,6 @@ struct sys_map_args {
|
|||||||
unsigned long virt;
|
unsigned long virt;
|
||||||
unsigned long npages;
|
unsigned long npages;
|
||||||
unsigned int flags;
|
unsigned int flags;
|
||||||
unsigned int rtype;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -507,11 +506,12 @@ struct capability *cap_match_mem(struct capability *cap,
|
|||||||
void *args_ptr)
|
void *args_ptr)
|
||||||
{
|
{
|
||||||
struct sys_map_args *args = args_ptr;
|
struct sys_map_args *args = args_ptr;
|
||||||
|
struct ktcb *target = args->task;
|
||||||
unsigned long pfn;
|
unsigned long pfn;
|
||||||
unsigned int perms;
|
unsigned int perms;
|
||||||
|
|
||||||
/* Set base according to what type of mem type we're matching */
|
/* Set base according to what type of mem type we're matching */
|
||||||
if (args->rtype == CAP_RTYPE_PHYSMEM)
|
if (cap_type(cap) == CAP_TYPE_MAP_PHYSMEM)
|
||||||
pfn = __pfn(args->phys);
|
pfn = __pfn(args->phys);
|
||||||
else
|
else
|
||||||
pfn = __pfn(args->virt);
|
pfn = __pfn(args->virt);
|
||||||
@@ -542,21 +542,28 @@ struct capability *cap_match_mem(struct capability *cap,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return cap;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FIXME:
|
* We have a target thread, check if capability match
|
||||||
*
|
* any resource fields in target
|
||||||
* Does it make sense to have a meaningful resid field
|
|
||||||
* in a memory resource? E.g. Which resources may I map it to?
|
|
||||||
* It might, as I can map an arbitrary mapping to an arbitrary
|
|
||||||
* thread in my container and break it's memory integrity.
|
|
||||||
*
|
|
||||||
* It seems it would be reasonable for a pager to have memory
|
|
||||||
* capabilities with a resid of its own id, and rtype of
|
|
||||||
* CAP_RTYPE_CONTAINER, effectively allowing it to do map
|
|
||||||
* operations on itself and its group of paged children.
|
|
||||||
*/
|
*/
|
||||||
|
switch (cap_rtype(cap)) {
|
||||||
|
case CAP_RTYPE_THREAD:
|
||||||
|
if (target->tid != cap->resid)
|
||||||
|
return 0;
|
||||||
|
break;
|
||||||
|
case CAP_RTYPE_SPACE:
|
||||||
|
if (target->space->spid != cap->resid)
|
||||||
|
return 0;
|
||||||
|
break;
|
||||||
|
case CAP_RTYPE_CONTAINER:
|
||||||
|
if (target->container->cid != cap->resid)
|
||||||
|
return 0;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
BUG(); /* Unknown cap type is a bug */
|
||||||
|
}
|
||||||
|
|
||||||
|
return cap;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(CONFIG_CAPABILITIES)
|
#if defined(CONFIG_CAPABILITIES)
|
||||||
@@ -601,14 +608,12 @@ int cap_map_check(struct ktcb *target, unsigned long phys, unsigned long virt,
|
|||||||
.flags = flags,
|
.flags = flags,
|
||||||
};
|
};
|
||||||
|
|
||||||
args.rtype = CAP_RTYPE_PHYSMEM;
|
|
||||||
if (!(physmem = cap_find(current, cap_match_mem,
|
if (!(physmem = cap_find(current, cap_match_mem,
|
||||||
&args, CAP_TYPE_MAP)))
|
&args, CAP_TYPE_MAP_PHYSMEM)))
|
||||||
return -ENOCAP;
|
return -ENOCAP;
|
||||||
|
|
||||||
args.rtype = CAP_RTYPE_VIRTMEM;
|
|
||||||
if (!(virtmem = cap_find(current, cap_match_mem,
|
if (!(virtmem = cap_find(current, cap_match_mem,
|
||||||
&args, CAP_TYPE_MAP)))
|
&args, CAP_TYPE_MAP_VIRTMEM)))
|
||||||
return -ENOCAP;
|
return -ENOCAP;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -746,7 +746,7 @@ int process_cap_info(struct cap_info *cap,
|
|||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
switch (cap->type & CAP_RTYPE_MASK) {
|
switch (cap_rtype(cap)) {
|
||||||
case CAP_RTYPE_THREADPOOL:
|
case CAP_RTYPE_THREADPOOL:
|
||||||
bootres->nthreads += cap->size;
|
bootres->nthreads += cap->size;
|
||||||
break;
|
break;
|
||||||
@@ -768,8 +768,10 @@ int process_cap_info(struct cap_info *cap,
|
|||||||
/* Specifies how many new caps can be created */
|
/* Specifies how many new caps can be created */
|
||||||
bootres->ncaps += cap->size;
|
bootres->ncaps += cap->size;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case CAP_RTYPE_VIRTMEM:
|
switch (cap_type(cap)) {
|
||||||
|
case CAP_TYPE_MAP_VIRTMEM:
|
||||||
if ((ret = memcap_unmap(&kres->virtmem_free,
|
if ((ret = memcap_unmap(&kres->virtmem_free,
|
||||||
cap->start, cap->end))) {
|
cap->start, cap->end))) {
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
@@ -787,7 +789,7 @@ int process_cap_info(struct cap_info *cap,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CAP_RTYPE_PHYSMEM:
|
case CAP_TYPE_MAP_PHYSMEM:
|
||||||
if ((ret = memcap_unmap(&kres->physmem_free,
|
if ((ret = memcap_unmap(&kres->physmem_free,
|
||||||
cap->start, cap->end))) {
|
cap->start, cap->end))) {
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
@@ -804,8 +806,8 @@ int process_cap_info(struct cap_info *cap,
|
|||||||
BUG();
|
BUG();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user