1
0
mirror of git://projects.qi-hardware.com/iris.git synced 2024-10-01 09:29:48 +03:00
This commit is contained in:
Bas Wijnen 2009-05-27 19:29:21 +02:00
parent 305bc03711
commit 3fc672f50f
2 changed files with 16 additions and 10 deletions

View File

@ -48,9 +48,9 @@ extern "C" {
#define CAP_THREAD_ALL_PRIV_RIGHTS (CAP_THREAD_ALL_RIGHTS | (1 << CAP_THREAD_REGISTER_INTERRUPT) | (1 << CAP_THREAD_GET_TOP_MEMORY)) #define CAP_THREAD_ALL_PRIV_RIGHTS (CAP_THREAD_ALL_RIGHTS | (1 << CAP_THREAD_REGISTER_INTERRUPT) | (1 << CAP_THREAD_GET_TOP_MEMORY))
/* These get/set_info are not arch-specific. */ /* These get/set_info are not arch-specific. */
#define CAP_THREAD_INFO_PC 0 #define CAP_THREAD_INFO_PC ~0
#define CAP_THREAD_INFO_SP 1 #define CAP_THREAD_INFO_SP ~1
#define CAP_THREAD_INFO_FLAGS 2 #define CAP_THREAD_INFO_FLAGS ~2
/* Flag values for processor state */ /* Flag values for processor state */
#define THREAD_FLAG_WAITING 0x80000000 #define THREAD_FLAG_WAITING 0x80000000
#define THREAD_FLAG_RUNNING 0x40000000 #define THREAD_FLAG_RUNNING 0x40000000

View File

@ -202,7 +202,8 @@ static void thread_invoke (unsigned target, unsigned protected_data, Capability
value = &thread->sp value = &thread->sp
break break
case CAP_THREAD_INFO_FLAGS: case CAP_THREAD_INFO_FLAGS:
data[3] &= ~THREAD_FLAG_PRIV // It is not possible to set the PRIV flag, but it can be reset.
data[2] &= ~THREAD_FLAG_PRIV
value = &thread->flags value = &thread->flags
if data[3] & ~THREAD_FLAG_USER: if data[3] & ~THREAD_FLAG_USER:
unsigned v = (*value & data[3]) | (data[2] & data[3]) unsigned v = (*value & data[3]) | (data[2] & data[3])
@ -233,7 +234,7 @@ static void thread_invoke (unsigned target, unsigned protected_data, Capability
default: default:
break break
static void page_invoke (unsigned target, unsigned protected_data, Capability *cap, unsigned request, unsigned data): static void page_invoke (unsigned target, unsigned protected_data, Capability *cap, bool copy, unsigned request, unsigned data):
Page *page Page *page
Cappage *cappage Cappage *cappage
if (target & CAPTYPE_MASK) == CAPTYPE_PAGE: if (target & CAPTYPE_MASK) == CAPTYPE_PAGE:
@ -246,7 +247,8 @@ static void page_invoke (unsigned target, unsigned protected_data, Capability *c
case CAP_PAGE_MAP: case CAP_PAGE_MAP:
if !page: if !page:
return return
// TODO page->address_space->map (page, data, target & CAP_PAGE_WRITE)
break
case CAP_PAGE_SHARE: case CAP_PAGE_SHARE:
// TODO // TODO
case CAP_PAGE_SHARE_COW: case CAP_PAGE_SHARE_COW:
@ -254,9 +256,13 @@ static void page_invoke (unsigned target, unsigned protected_data, Capability *c
case CAP_PAGE_FORGET: case CAP_PAGE_FORGET:
// TODO // TODO
case CAP_CAPPAGE_SET: case CAP_CAPPAGE_SET:
if !cappage: if !cappage || data >= CAPPAGE_SIZE || !(target & CAP_PAGE_WRITE):
return return
// TODO Capability *c = &cappage->page[data]
c->invalidate ()
// clone_capability needs a Memory, but doesn't use it when storage is provided.
top_memory.clone_capability (cap, copy, c)
break
default: default:
break break
@ -315,13 +321,13 @@ static bool kernel_invoke (unsigned target, unsigned protected_data, unsigned d[
thread_invoke (target, protected_data, c[1], d) thread_invoke (target, protected_data, c[1], d)
break break
case CAPTYPE_PAGE: case CAPTYPE_PAGE:
page_invoke (target, protected_data, c[1], d[0], d[1]) page_invoke (target, protected_data, c[1], copy[1], d[0], d[1])
break break
case CAPTYPE_CAPABILITY: case CAPTYPE_CAPABILITY:
capability_invoke (target, protected_data, c[1], d[0], d[1]) capability_invoke (target, protected_data, c[1], d[0], d[1])
break break
case CAPTYPE_CAPPAGE: case CAPTYPE_CAPPAGE:
page_invoke (target, protected_data, c[1], d[0], d[1]) page_invoke (target, protected_data, c[1], copy[1], d[0], d[1])
break break
default: default:
panic (0x99337744, "invalid capability type invoked") panic (0x99337744, "invalid capability type invoked")