Fixed minor issues on capability list sharing.

This commit is contained in:
Bahadir Balban
2009-12-13 18:02:47 +02:00
parent 8fe15ba811
commit c7069a8e8e
9 changed files with 86 additions and 22 deletions

View File

@@ -36,7 +36,7 @@ cap_strings = { 'ipc' : \
\t\t\t[${idx}] = { \t\t\t[${idx}] = {
\t\t\t\t.target = ${cid}, \t\t\t\t.target = ${cid},
\t\t\t\t.type = CAP_TYPE_IRQCTRL | ${target_rtype}, \t\t\t\t.type = CAP_TYPE_IRQCTRL | ${target_rtype},
\t\t\t\t.access = CAP_IRQCTRL_REGISTER \t\t\t\t.access = CAP_IRQCTRL_REGISTER | CAP_IRQCTRL_WAIT
\t\t\t\t | CAP_CHANGEABLE | CAP_REPLICABLE \t\t\t\t | CAP_CHANGEABLE | CAP_REPLICABLE
\t\t\t\t | CAP_TRANSFERABLE, \t\t\t\t | CAP_TRANSFERABLE,
\t\t\t\t.start = 0, .end = 0, .size = 0, \t\t\t\t.start = 0, .end = 0, .size = 0,
@@ -146,7 +146,8 @@ cap_strings = { 'ipc' : \
\t\t\t\t.target = ${cid}, \t\t\t\t.target = ${cid},
\t\t\t\t.type = CAP_TYPE_MAP_PHYSMEM | CAP_RTYPE_CONTAINER, \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, \t\t\t\t\tCAP_MAP_CACHED | CAP_MAP_UNCACHED | CAP_MAP_UNMAP |
\t\t\t\t\tCAP_IRQCTRL_REGISTER,
\t\t\t\t.start = __pfn(PLATFORM_${devname}_BASE), \t\t\t\t.start = __pfn(PLATFORM_${devname}_BASE),
\t\t\t\t.end = __pfn(PLATFORM_${devname}_BASE + PLATFORM_${devname}_SIZE), \t\t\t\t.end = __pfn(PLATFORM_${devname}_BASE + PLATFORM_${devname}_SIZE),
\t\t\t\t.size = 1, \t\t\t\t.size = 1,

View File

@@ -512,6 +512,10 @@ CONT%(cn)d_CAP_CAPCTRL_USE 'Enable this Capability'
CONT%(cn)d_CAP_CAPCTRL_TARGET_CURRENT_CONTAINER 'Capability Targets Current Container' CONT%(cn)d_CAP_CAPCTRL_TARGET_CURRENT_CONTAINER 'Capability Targets Current Container'
CONT%(cn)d_CAP_CAPCTRL_TARGET_CURRENT_PAGER_SPACE 'Capability Targets Current Pager`s Space' CONT%(cn)d_CAP_CAPCTRL_TARGET_CURRENT_PAGER_SPACE 'Capability Targets Current Pager`s Space'
CONT%(cn)d_CAP_IRQCTRL_USE 'Enable this Capability'
CONT%(cn)d_CAP_IRQCTRL_TARGET_CURRENT_CONTAINER 'Capability Targets Current Container'
CONT%(cn)d_CAP_IRQCTRL_TARGET_CURRENT_PAGER_SPACE 'Capability Targets Current Pager`s Space'
CONT%(cn)d_CAP_UMUTEX_USE 'Enable this Capability' CONT%(cn)d_CAP_UMUTEX_USE 'Enable this Capability'
CONT%(cn)d_CAP_UMUTEX_TARGET_CURRENT_CONTAINER 'Capability Targets Current Container' CONT%(cn)d_CAP_UMUTEX_TARGET_CURRENT_CONTAINER 'Capability Targets Current Container'
CONT%(cn)d_CAP_UMUTEX_TARGET_CURRENT_PAGER_SPACE 'Capability Targets Current Pager`s Space' CONT%(cn)d_CAP_UMUTEX_TARGET_CURRENT_PAGER_SPACE 'Capability Targets Current Pager`s Space'
@@ -539,6 +543,7 @@ cont%(cn)d_cap_tctrl 'Container %(cn)d Thread Control Capability'
cont%(cn)d_cap_exregs 'Container %(cn)d Exchange Registers Capability' cont%(cn)d_cap_exregs 'Container %(cn)d Exchange Registers Capability'
cont%(cn)d_cap_ipc 'Container %(cn)d IPC Capability' cont%(cn)d_cap_ipc 'Container %(cn)d IPC Capability'
cont%(cn)d_cap_capctrl 'Container %(cn)d Capability Control Capability' cont%(cn)d_cap_capctrl 'Container %(cn)d Capability Control Capability'
cont%(cn)d_cap_irqctrl 'Container %(cn)d IRQ Control Capability'
cont%(cn)d_cap_umutex 'Container %(cn)d Userspace Mutex Control Capability' cont%(cn)d_cap_umutex 'Container %(cn)d Userspace Mutex Control Capability'
cont%(cn)d_cap_custom0 'Container %(cn)d Custom Capability 0 Parameters' cont%(cn)d_cap_custom0 'Container %(cn)d Custom Capability 0 Parameters'
cont%(cn)d_cap_custom1 'Container %(cn)d Custom Capability 1 Parameters' cont%(cn)d_cap_custom1 'Container %(cn)d Custom Capability 1 Parameters'
@@ -589,6 +594,10 @@ when CONT%(cn)d_CAP_CAPCTRL_USE == n
suppress CONT%(cn)d_CAP_CAPCTRL_TARGET_CURRENT_CONTAINER suppress CONT%(cn)d_CAP_CAPCTRL_TARGET_CURRENT_CONTAINER
CONT%(cn)d_CAP_CAPCTRL_TARGET_CURRENT_PAGER_SPACE CONT%(cn)d_CAP_CAPCTRL_TARGET_CURRENT_PAGER_SPACE
when CONT%(cn)d_CAP_IRQCTRL_USE == n
suppress CONT%(cn)d_CAP_IRQCTRL_TARGET_CURRENT_CONTAINER
CONT%(cn)d_CAP_IRQCTRL_TARGET_CURRENT_PAGER_SPACE
when CONT%(cn)d_CAP_UMUTEX_USE == n when CONT%(cn)d_CAP_UMUTEX_USE == n
suppress CONT%(cn)d_CAP_UMUTEX_TARGET_CURRENT_CONTAINER suppress CONT%(cn)d_CAP_UMUTEX_TARGET_CURRENT_CONTAINER
CONT%(cn)d_CAP_UMUTEX_TARGET_CURRENT_PAGER_SPACE CONT%(cn)d_CAP_UMUTEX_TARGET_CURRENT_PAGER_SPACE
@@ -615,6 +624,10 @@ choicegroup CONT%(cn)d_CAP_CAPCTRL_TARGET_CURRENT_CONTAINER
CONT%(cn)d_CAP_CAPCTRL_TARGET_CURRENT_PAGER_SPACE CONT%(cn)d_CAP_CAPCTRL_TARGET_CURRENT_PAGER_SPACE
default CONT%(cn)d_CAP_CAPCTRL_TARGET_CURRENT_CONTAINER from y default CONT%(cn)d_CAP_CAPCTRL_TARGET_CURRENT_CONTAINER from y
choicegroup CONT%(cn)d_CAP_IRQCTRL_TARGET_CURRENT_CONTAINER
CONT%(cn)d_CAP_IRQCTRL_TARGET_CURRENT_PAGER_SPACE
default CONT%(cn)d_CAP_IRQCTRL_TARGET_CURRENT_CONTAINER from y
choicegroup CONT%(cn)d_CAP_UMUTEX_TARGET_CURRENT_CONTAINER choicegroup CONT%(cn)d_CAP_UMUTEX_TARGET_CURRENT_CONTAINER
CONT%(cn)d_CAP_UMUTEX_TARGET_CURRENT_PAGER_SPACE CONT%(cn)d_CAP_UMUTEX_TARGET_CURRENT_PAGER_SPACE
default CONT%(cn)d_CAP_UMUTEX_TARGET_CURRENT_CONTAINER from y default CONT%(cn)d_CAP_UMUTEX_TARGET_CURRENT_CONTAINER from y
@@ -623,6 +636,7 @@ default CONT%(cn)d_CAP_TCTRL_USE from y
default CONT%(cn)d_CAP_EXREGS_USE from y default CONT%(cn)d_CAP_EXREGS_USE from y
default CONT%(cn)d_CAP_IPC_USE from y default CONT%(cn)d_CAP_IPC_USE from y
default CONT%(cn)d_CAP_CAPCTRL_USE from y default CONT%(cn)d_CAP_CAPCTRL_USE from y
default CONT%(cn)d_CAP_IRQCTRL_USE from y
default CONT%(cn)d_CAP_UMUTEX_USE from y default CONT%(cn)d_CAP_UMUTEX_USE from y
default CONT%(cn)d_CAP_IPC_TARGET from 0 default CONT%(cn)d_CAP_IPC_TARGET from 0
@@ -648,6 +662,11 @@ menu cont%(cn)d_cap_umutex
CONT%(cn)d_CAP_UMUTEX_TARGET_CURRENT_CONTAINER CONT%(cn)d_CAP_UMUTEX_TARGET_CURRENT_CONTAINER
CONT%(cn)d_CAP_UMUTEX_TARGET_CURRENT_PAGER_SPACE CONT%(cn)d_CAP_UMUTEX_TARGET_CURRENT_PAGER_SPACE
menu cont%(cn)d_cap_irqctrl
CONT%(cn)d_CAP_IRQCTRL_USE
CONT%(cn)d_CAP_IRQCTRL_TARGET_CURRENT_CONTAINER
CONT%(cn)d_CAP_IRQCTRL_TARGET_CURRENT_PAGER_SPACE
menu cont%(cn)d_cap_ipc menu cont%(cn)d_cap_ipc
CONT%(cn)d_CAP_IPC_USE CONT%(cn)d_CAP_IPC_USE
CONT%(cn)d_CAP_IPC_TARGET_CURRENT_CONTAINER CONT%(cn)d_CAP_IPC_TARGET_CURRENT_CONTAINER
@@ -687,6 +706,7 @@ menu cont%(cn)d_capability_list
cont%(cn)d_cap_ipc cont%(cn)d_cap_ipc
cont%(cn)d_cap_capctrl cont%(cn)d_cap_capctrl
cont%(cn)d_cap_umutex cont%(cn)d_cap_umutex
cont%(cn)d_cap_irqctrl
cont%(cn)d_cap_custom0 cont%(cn)d_cap_custom0
cont%(cn)d_cap_custom1 cont%(cn)d_cap_custom1
cont%(cn)d_cap_custom2 cont%(cn)d_cap_custom2

View File

@@ -3,6 +3,7 @@
/* Capability printing generic routines */ /* Capability printing generic routines */
#include <l4lib/capability/cap_print.h> #include <l4lib/capability/cap_print.h>
#include <stdio.h>
void cap_dev_print(struct capability *cap) void cap_dev_print(struct capability *cap)
{ {
@@ -58,8 +59,12 @@ void cap_print(struct capability *cap)
case CAP_TYPE_QUANTITY: case CAP_TYPE_QUANTITY:
printf("Capability type:\t\t%s\n", "Quantitative"); printf("Capability type:\t\t%s\n", "Quantitative");
break; break;
case CAP_TYPE_CAP:
printf("Capability type:\t\t%s\n", "Capability Control");
break;
default: default:
printf("Capability type:\t\t%s\n", "Unknown"); printf("Capability type:\t\t%s, cap_type=0x%x\n",
"Unknown", cap_type(cap));
break; break;
} }
@@ -92,7 +97,8 @@ void cap_print(struct capability *cap)
printf("Capability resource type:\t%s\n", "Capability Pool"); printf("Capability resource type:\t%s\n", "Capability Pool");
break; break;
default: default:
printf("Capability resource type:\t%s\n", "Unknown"); printf("Capability resource type:\t%s, id=0x%x\n", "Unknown",
cap_rtype(cap));
break; break;
} }
printf("\n"); printf("\n");

View File

@@ -47,9 +47,9 @@ Shares a single capability or list of capabilities with a collection entity such
.B CAP_SHARE_SINGLE .B CAP_SHARE_SINGLE
is specified in is specified in
.IR "flag", .IR "flag",
a single capability is shared. Currently no method has been defined for sharing a larger entity than a single capability at a time, i.e. a list of capabilities. To achieve this, a a single capability is shared.
.B CAP_SHARE_ALL .BR "CAP_SHARE_ALL_CONTAINER " "makes the caller thread share all of its thread-level and address space-level capability lists with its container. The caller must also be the owner of all of the capabilities, in case of the address space.
flag is planned for a future release. .BR "CAP_SHARE_ALL_SPACE " "makes the caller thread share all of its thread-level capabilities with its address space."
The sharing must be made with a thread collection entity that contains the capability owner. For example, a capability possessed by a thread may be shared with the thread's address space, or the thread's container. However it is not possible to share a capability in one container with another container. See The sharing must be made with a thread collection entity that contains the capability owner. For example, a capability possessed by a thread may be shared with the thread's address space, or the thread's container. However it is not possible to share a capability in one container with another container. See
.B CAP_CONTROL_REPLICATE .B CAP_CONTROL_REPLICATE

View File

@@ -19,8 +19,10 @@
#define CAP_CONTROL_DEDUCE 0x00000006 #define CAP_CONTROL_DEDUCE 0x00000006
#define CAP_CONTROL_DESTROY 0x00000007 #define CAP_CONTROL_DESTROY 0x00000007
#define CAP_SHARE_MASK 0x00000003 #define CAP_SHARE_MASK 0x0000000F
#define CAP_SHARE_SINGLE 0x00000001 #define CAP_SHARE_SINGLE 0x00000001
#define CAP_SHARE_ALL_CONTAINER 0x00000002
#define CAP_SHARE_ALL_SPACE 0x00000003
#define CAP_GRANT_MASK 0x0000000F #define CAP_GRANT_MASK 0x0000000F
#define CAP_GRANT_SINGLE 0x00000001 #define CAP_GRANT_SINGLE 0x00000001

View File

@@ -104,12 +104,17 @@
/* /*
* IRQ Control capability * IRQ Control capability
* */
#define CAP_IRQCTRL_WAIT (1 << 8)
/*
* This is a common one and it applies to both * This is a common one and it applies to both
* CAP_TYPE_IRQCTRL and CAP_TYPE_MAP_PHYSMEM * CAP_TYPE_IRQCTRL and CAP_TYPE_MAP_PHYSMEM
*/ */
#define CAP_IRQCTRL_REGISTER (1 << 7) #define CAP_IRQCTRL_REGISTER (1 << 7)
/* Ipc capability */ /* Ipc capability */
#define CAP_IPC_SEND (1 << 0) #define CAP_IPC_SEND (1 << 0)
#define CAP_IPC_RECV (1 << 1) #define CAP_IPC_RECV (1 << 1)

View File

@@ -55,7 +55,12 @@ static inline void cap_list_remove(struct capability *cap,
static inline struct capability * static inline struct capability *
cap_list_detach(struct cap_list *clist) cap_list_detach(struct cap_list *clist)
{ {
struct link *list = list_detach(&clist->caps); struct link *list;
if (!clist->ncaps)
return 0;
list = list_detach(&clist->caps);
clist->ncaps = 0; clist->ncaps = 0;
return link_to_struct(list, struct capability, list); return link_to_struct(list, struct capability, list);
} }
@@ -75,6 +80,9 @@ static inline void cap_list_attach(struct capability *cap,
static inline void cap_list_move(struct cap_list *to, static inline void cap_list_move(struct cap_list *to,
struct cap_list *from) struct cap_list *from)
{ {
if (!from->ncaps)
return;
struct capability *cap_head = cap_list_detach(from); struct capability *cap_head = cap_list_detach(from);
cap_list_attach(cap_head, to); cap_list_attach(cap_head, to);
} }

View File

@@ -61,7 +61,7 @@ do { \
(wqh)->sleepers++; \ (wqh)->sleepers++; \
list_insert_tail(&wq.task_list, \ list_insert_tail(&wq.task_list, \
&(wqh)->task_list); \ &(wqh)->task_list); \
/* printk("(%d) waiting...\n", current->tid); */\ printk("(%d) waiting...\n", current->tid); \
sched_prepare_sleep(); \ sched_prepare_sleep(); \
spin_unlock_irq(&(wqh)->slock, irqsave); \ spin_unlock_irq(&(wqh)->slock, irqsave); \
schedule(); \ schedule(); \

View File

@@ -69,24 +69,43 @@ int cap_share_single(struct capability *user)
return 0; return 0;
} }
#if 0 /*
/* Shares the whole list */ * Shares the whole capability list.
int cap_share_all(void) *
* FIXME: Make sure each and every capability has its
* share right set!
*/
int cap_share_all(unsigned int flags)
{ {
cap_list_move(&curcont->cap_list, if (flags == CAP_SHARE_ALL_CONTAINER) {
&current->space->cap_list);
/* Move all private caps to container */
cap_list_move(&curcont->cap_list,
&current->cap_list);
/*
* Move all space caps to container, also.
*
* FIXME: Make sure all space capabilities
* are owned by the sharer!!!
*/
cap_list_move(&curcont->cap_list,
&current->space->cap_list);
} else if (flags == CAP_SHARE_ALL_SPACE) {
/* Move all private caps to space */
cap_list_move(&current->space->cap_list,
&current->cap_list);
}
return 0; return 0;
} }
#endif
int cap_share(struct capability *cap, unsigned int flags) int cap_share(struct capability *cap, unsigned int flags)
{ {
if (flags & CAP_SHARE_SINGLE) if (flags == CAP_SHARE_SINGLE)
cap_share_single(cap); return cap_share_single(cap);
else else
return -EINVAL; return cap_share_all(flags);
return 0;
} }
#if 0 #if 0
@@ -665,6 +684,9 @@ int sys_capability_control(unsigned int req, unsigned int flags, void *userbuf)
return err; return err;
break; break;
case CAP_CONTROL_SHARE: case CAP_CONTROL_SHARE:
if (flags == CAP_SHARE_ALL_CONTAINER ||
flags == CAP_SHARE_ALL_SPACE)
break;
case CAP_CONTROL_GRANT: case CAP_CONTROL_GRANT:
case CAP_CONTROL_SPLIT: case CAP_CONTROL_SPLIT:
case CAP_CONTROL_REPLICATE: case CAP_CONTROL_REPLICATE: