mirror of
https://github.com/drasko/codezero.git
synced 2026-03-15 00:31:50 +01:00
Inter-container ipc tests working.
This commit is contained in:
@@ -517,7 +517,7 @@ int cap_find_replicate_reduce_grant(struct capability *cap)
|
|||||||
if ((err =
|
if ((err =
|
||||||
l4_capability_control(CAP_CONTROL_DESTROY,
|
l4_capability_control(CAP_CONTROL_DESTROY,
|
||||||
0, 0, 0, &new_cap)) < 0) {
|
0, 0, 0, &new_cap)) < 0) {
|
||||||
printf("l4_capability_control() replication of "
|
printf("l4_capability_control() destruction of "
|
||||||
"capability failed.\n Could not "
|
"capability failed.\n Could not "
|
||||||
"complete CAP_CONTROL_DESTROY request "
|
"complete CAP_CONTROL_DESTROY request "
|
||||||
" on cap (%d), err = %d.\n",
|
" on cap (%d), err = %d.\n",
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ int task_delete_utcb_desc(struct tcb *task, struct utcb_desc *d)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Upon fork, the utcb descriptor list is origaced by a new one, since it is a new
|
* Upon fork, the utcb descriptor list is replaced by a new one, since it is a new
|
||||||
* address space. A new utcb is allocated and mmap'ed for the child task
|
* address space. A new utcb is allocated and mmap'ed for the child task
|
||||||
* running in the newly created address space.
|
* running in the newly created address space.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -94,7 +94,6 @@ int init_pager(struct pager *pager,
|
|||||||
struct ktcb *task;
|
struct ktcb *task;
|
||||||
struct address_space *space;
|
struct address_space *space;
|
||||||
int first = !!current_pgd;
|
int first = !!current_pgd;
|
||||||
struct capability *cap;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set up dummy current cap_list so that cap accounting
|
* Set up dummy current cap_list so that cap accounting
|
||||||
@@ -140,6 +139,7 @@ int init_pager(struct pager *pager,
|
|||||||
/* Add the address space to container space list */
|
/* Add the address space to container space list */
|
||||||
address_space_add(task->space);
|
address_space_add(task->space);
|
||||||
|
|
||||||
|
#if 0
|
||||||
/* Initialize uninitialized capability fields while on dummy */
|
/* Initialize uninitialized capability fields while on dummy */
|
||||||
list_foreach_struct(cap, ¤t->cap_list.caps, list) {
|
list_foreach_struct(cap, ¤t->cap_list.caps, list) {
|
||||||
/* Initialize owner */
|
/* Initialize owner */
|
||||||
@@ -158,8 +158,9 @@ int init_pager(struct pager *pager,
|
|||||||
else
|
else
|
||||||
cap->resid = CAP_RESID_NONE;
|
cap->resid = CAP_RESID_NONE;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
printk("%s: Mapping 0x%lx bytes (0x%lx pages) from 0x%lx to 0x%lx for %s\n",
|
printk("%s: Mapping 0x%lx bytes (%lu pages) from 0x%lx to 0x%lx for %s\n",
|
||||||
__KERNELNAME__, pager->memsize,
|
__KERNELNAME__, pager->memsize,
|
||||||
__pfn(page_align_up(pager->memsize)),
|
__pfn(page_align_up(pager->memsize)),
|
||||||
pager->start_lma, pager->start_vma, cont->name);
|
pager->start_lma, pager->start_vma, cont->name);
|
||||||
@@ -184,6 +185,93 @@ int init_pager(struct pager *pager,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* All first-level dynamically allocated resources
|
||||||
|
* are initialized, which includes the pager thread ids
|
||||||
|
* and pager space ids.
|
||||||
|
*
|
||||||
|
* Update all capability target ids that target such
|
||||||
|
* run-time allocated resources.
|
||||||
|
*/
|
||||||
|
int update_dynamic_capids(struct kernel_resources *kres)
|
||||||
|
{
|
||||||
|
struct ktcb *pager, *tpager;
|
||||||
|
struct container *cont, *tcont;
|
||||||
|
struct capability *cap;
|
||||||
|
|
||||||
|
/* Containers */
|
||||||
|
list_foreach_struct(cont, &kres->containers.list, list) {
|
||||||
|
/* Pagers */
|
||||||
|
list_foreach_struct(pager, &cont->ktcb_list.list, task_list) {
|
||||||
|
/* Capabilities */
|
||||||
|
list_foreach_struct(cap,
|
||||||
|
&pager->space->cap_list.caps,
|
||||||
|
list) {
|
||||||
|
|
||||||
|
/* They all shall be owned by their pager */
|
||||||
|
cap->owner = pager->tid;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Pager Space/Thread targets need updating
|
||||||
|
* from the given static container id to their
|
||||||
|
* run-time allocated ids.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Quantity caps don't have target ids */
|
||||||
|
if (cap_type(cap) == CAP_TYPE_QUANTITY)
|
||||||
|
cap->resid = CAP_RESID_NONE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Space _always_ denotes current pager's
|
||||||
|
* space. Other containers are not addressable
|
||||||
|
* by space ids.
|
||||||
|
*/
|
||||||
|
if (cap_rtype(cap) == CAP_RTYPE_SPACE)
|
||||||
|
cap->resid = pager->space->spid;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Thread _always_denotes another container's
|
||||||
|
* pager. There is simply no other reasonable
|
||||||
|
* thread target in the system.
|
||||||
|
*/
|
||||||
|
if (cap_rtype(cap) == CAP_RTYPE_THREAD) {
|
||||||
|
|
||||||
|
/* Find target container */
|
||||||
|
if (!(tcont =
|
||||||
|
container_find(kres,
|
||||||
|
cap->resid))) {
|
||||||
|
printk("FATAL: Capability "
|
||||||
|
"configured to target "
|
||||||
|
"non-existent "
|
||||||
|
"container.\n");
|
||||||
|
BUG();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Find its pager */
|
||||||
|
if (list_empty(&tcont->ktcb_list.list)) {
|
||||||
|
printk("FATAL: Pager"
|
||||||
|
"does not exist in "
|
||||||
|
"container %d.\n",
|
||||||
|
tcont->cid);
|
||||||
|
BUG();
|
||||||
|
}
|
||||||
|
|
||||||
|
tpager =
|
||||||
|
link_to_struct(
|
||||||
|
tcont->ktcb_list.list.next,
|
||||||
|
struct ktcb, task_list);
|
||||||
|
|
||||||
|
/* Assign pager's thread id to cap */
|
||||||
|
cap->resid = tpager->tid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialize all containers with their initial set of tasks,
|
* Initialize all containers with their initial set of tasks,
|
||||||
* spaces, scheduler parameters such that they can be started.
|
* spaces, scheduler parameters such that they can be started.
|
||||||
@@ -209,6 +297,12 @@ int container_init_pagers(struct kernel_resources *kres,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Update any capability fields that were dynamically allocated */
|
||||||
|
update_dynamic_capids(kres);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -430,6 +430,7 @@ int copy_pager_info(struct pager *pager, struct pager_info *pinfo)
|
|||||||
|
|
||||||
cap_info = &pinfo->caps[i];
|
cap_info = &pinfo->caps[i];
|
||||||
|
|
||||||
|
cap->resid = cap_info->target;
|
||||||
cap->type = cap_info->type;
|
cap->type = cap_info->type;
|
||||||
cap->access = cap_info->access;
|
cap->access = cap_info->access;
|
||||||
cap->start = cap_info->start;
|
cap->start = cap_info->start;
|
||||||
@@ -527,8 +528,8 @@ void setup_kernel_resources(struct boot_resources *bootres,
|
|||||||
* See how many containers we have. Assign next
|
* See how many containers we have. Assign next
|
||||||
* unused container id for kernel resources
|
* unused container id for kernel resources
|
||||||
*/
|
*/
|
||||||
//kres->cid = id_get(&kres->container_ids, bootres->nconts + 1);
|
kres->cid = id_get(&kres->container_ids, bootres->nconts + 1);
|
||||||
kres->cid = id_get(&kres->container_ids, 0);
|
// kres->cid = id_get(&kres->container_ids, 0); // Gets id 0
|
||||||
|
|
||||||
/* First initialize the list of non-memory capabilities */
|
/* First initialize the list of non-memory capabilities */
|
||||||
cap = boot_capability_create();
|
cap = boot_capability_create();
|
||||||
|
|||||||
Reference in New Issue
Block a user