summaryrefslogtreecommitdiff
path: root/viengoos
diff options
context:
space:
mode:
authorneal <neal>2007-12-25 20:06:06 +0000
committerneal <neal>2007-12-25 20:06:06 +0000
commit7497724fdbd887029f3d70a691db27a34926e64a (patch)
tree0a5384b105bfedc8e61b5f87d2b18a1124c4dbf4 /viengoos
parent4744b703dc58a704e43a88f9af45042b9700fc32 (diff)
hurd/
2007-12-25 Neal H. Walfield <neal@gnu.org> * cap.h: Include <stdint.h>. (OBJECT_PRIORITY_BITS): Define. (OBJECT_PRIORITY_MAX): Likewise. (OBJECT_PRIORITY_LRU): Likewise. (OBJECT_PRIORITY_MIN): Likewise. (struct object_policy): New structure. (OBJECT_POLICY_INIT): Define. (OBJECT_POLICY): Likewise. (OBJECT_POLICY_VOID): Likewise. (OBJECT_POLICY_DEFAULT): Likewise. (struct cap_properties): New structure. (CAP_PROPERTIES_INIT): Define. (CAP_PROPERTIES): Likewise. (CAP_PROPERTIES_VOID): Likewise. (CAP_PROPERTIES_DEFAULT): Likewise. (struct cap): Add fields discardable and priority. [RM_INTERN]: Reduce OID to 54 bits. [! RM_INTERN]: Allow the shadow field an entire word. (CAP_PROPERTIES_GET): Define. (CAP_PROPERTIES_SET): Likewise. (CAP_COPY_DISCARDABLE_SET): Likewise. (CAP_COPY_PRIORITY_SET): Likewise. (cap_copy): Remove the stuct cap_addr_trans parameter and replace with a struct cap_properties. Update callers. (cap_read): Likewise. (object_slot_copy_out): Likewise. (object_slot_copy_in): Likewise. (object_slot_read): Likewise. (cap_copy_x): Likewise. Save the object policies in the shadow capability. (cap_get_shadow): Don't munge the address. (cap_set_shadow): Likewise. * thread.h: Include <hurd/cap.h>. (struct hurd_thread_exregs_in): Remove field aspace_addr_trans. Add field aspace_cap_properties. Rename field aspace_addr_trans_flags to aspace_cap_properties_flags. * folio.h (struct folio): Remove field discardable. Add field policy. (folio_object_alloc): Take an additional argument, a struct object_policy. Update users. * cap.h (cap_is_a): Remove dead code. (cap_is_a_page): Remove dead code. libhurd-mm/ 2007-12-25 Neal H. Walfield <neal@gnu.org> * as.h: Change VISIT's signature: pass a struct cap_properties instead of a struct cap_addr_trans. Update callers. * as.c (as_walk): Change VISIT's signature: pass a struct cap_properties instead of a struct cap_addr_trans. Call VISIT appropriately. (as_alloc_slow): Update rm_cap_read use to reflect API changes. (as_init): Update rm_cap_read use to reflect API changes. Use CAP_PROPERTIES_SET to set shadow capability properties. * storage.c (shadow_setup): Update rm_folio_object_alloc use to reflect API changes. Also save the object policy in the shadow capability. (storage_alloc_): Likewise. (storage_free_): Likewise. viengoos/ 2007-12-25 Neal H. Walfield <neal@gnu.org> * object.h (struct object_desc): Add field policy. (object_desc_to_cap): Also return the discardable bit and the priority. (folio_object_alloc): Take additional parameter, the object's policy. Update callers. * object.c (folio_object_alloc): Take additional parameter, the object policy. Save it in the folio header. * as.c (as_build_internal): Update cap_copy_x use to reflect API changes. * thread.h: Remove parameter addr_trans and replace with a parameter that includes it and the object policy. Update users. * thread.c (thread_exregs): Remove parameter addr_trans and replace with a parameter that includes it and the object policy. Pass it to cap_copy_x as appropriate. * server.c: Include "output.h". (server_loop): Update the folio_object_alloc, object_slot_copy_out, object_slot_copy_in, and cap_copy implementations to set the allocated object's policy consistent with the API changes. Update the object_slot_read and cap_read implementations to return the object policy consistent with the API changes. Update the thread_exregs implementation to handle the address space capability's object policy consistent with the API changes. ruth/ 2007-12-25 Neal H. Walfield <neal@gnu.org> * ruth.c (main): Change visit to be consistent with as_walk's expected function signature. Update rm_folio_object_alloc use to reflect API changes.
Diffstat (limited to 'viengoos')
-rw-r--r--viengoos/ChangeLog26
-rw-r--r--viengoos/as.c10
-rw-r--r--viengoos/object.c3
-rw-r--r--viengoos/object.h8
-rw-r--r--viengoos/server.c124
-rw-r--r--viengoos/t-activity.c9
-rw-r--r--viengoos/t-as.c3
-rw-r--r--viengoos/thread.c4
-rw-r--r--viengoos/thread.h2
-rw-r--r--viengoos/viengoos.c5
10 files changed, 124 insertions, 70 deletions
diff --git a/viengoos/ChangeLog b/viengoos/ChangeLog
index 8ec837d..c6229ae 100644
--- a/viengoos/ChangeLog
+++ b/viengoos/ChangeLog
@@ -1,3 +1,29 @@
+2007-12-25 Neal H. Walfield <neal@gnu.org>
+
+ * object.h (struct object_desc): Add field policy.
+ (object_desc_to_cap): Also return the discardable bit and the
+ priority.
+ (folio_object_alloc): Take additional parameter, the object's
+ policy. Update callers.
+ * object.c (folio_object_alloc): Take additional parameter, the
+ object policy. Save it in the folio header.
+ * as.c (as_build_internal): Update cap_copy_x use to reflect API
+ changes.
+ * thread.h: Remove parameter addr_trans and replace with a
+ parameter that includes it and the object policy. Update users.
+ * thread.c (thread_exregs): Remove parameter addr_trans and
+ replace with a parameter that includes it and the object policy.
+ Pass it to cap_copy_x as appropriate.
+ * server.c: Include "output.h".
+ (server_loop): Update the folio_object_alloc,
+ object_slot_copy_out, object_slot_copy_in, and cap_copy
+ implementations to set the allocated object's policy consistent
+ with the API changes. Update the object_slot_read and cap_read
+ implementations to return the object policy consistent with the
+ API changes. Update the thread_exregs implementation to handle
+ the address space capability's object policy consistent with the
+ API changes.
+
2007-12-24 Neal H. Walfield <neal@gnu.org>
* as.c (as_build_internal): Include "output.h".
diff --git a/viengoos/as.c b/viengoos/as.c
index 047c548..2f4572f 100644
--- a/viengoos/as.c
+++ b/viengoos/as.c
@@ -365,7 +365,9 @@ as_build_internal (activity_t activity,
bool r = cap_copy_x (activity,
&cappage->caps[pivot_idx], pivot_addr,
*root, root_addr,
- CAP_COPY_COPY_ADDR_TRANS_GUARD, addr_trans);
+ CAP_COPY_COPY_ADDR_TRANS_GUARD,
+ CAP_PROPERTIES (OBJECT_POLICY_DEFAULT,
+ addr_trans));
assert (r);
/* Finally, set the slot at ROOT to point to CAPPAGE. */
@@ -383,7 +385,8 @@ as_build_internal (activity_t activity,
r = cap_copy_x (activity, root, root_addr, rt.cap, rt.storage,
CAP_COPY_COPY_ADDR_TRANS_SUBPAGE
| CAP_COPY_COPY_ADDR_TRANS_GUARD,
- addr_trans);
+ CAP_PROPERTIES (OBJECT_POLICY_DEFAULT, addr_trans));
+
assert (r);
}
@@ -419,7 +422,8 @@ as_build_internal (activity_t activity,
assert (r);
r = cap_copy_x (activity, root, addr_chop (a, gbits),
*root, addr_chop (a, gbits),
- CAP_COPY_COPY_ADDR_TRANS_GUARD, addr_trans);
+ CAP_COPY_COPY_ADDR_TRANS_GUARD,
+ CAP_PROPERTIES (OBJECT_POLICY_DEFAULT, addr_trans));
assert (r);
}
diff --git a/viengoos/object.c b/viengoos/object.c
index 95f78b5..ba11055 100644
--- a/viengoos/object.c
+++ b/viengoos/object.c
@@ -462,6 +462,7 @@ folio_object_alloc (struct activity *activity,
struct folio *folio,
int idx,
enum cap_type type,
+ struct object_policy policy,
struct object **objectp)
{
debug (4, "allocating %s at %d", cap_type_string (type), idx);
@@ -552,6 +553,8 @@ folio_object_alloc (struct activity *activity,
/* Mark it as being empty. */
folio->objects[idx].content = 0;
+ folio->objects[idx].policy = policy;
+
switch (type)
{
case cap_activity_control:
diff --git a/viengoos/object.h b/viengoos/object.h
index ed3a7ea..8ea385e 100644
--- a/viengoos/object.h
+++ b/viengoos/object.h
@@ -127,6 +127,8 @@ struct object_desc
l4_word_t dirty: 1;
+ struct object_policy policy;
+
/* The object's age. */
unsigned short age;
@@ -222,6 +224,8 @@ object_desc_to_cap (struct object_desc *desc)
cap.oid = desc->oid;
cap.version = desc->version;
cap.addr_trans = CAP_ADDR_TRANS_VOID;
+ cap.discardable = desc->policy.discardable;
+ cap.priority = desc->policy.priority;
return cap;
}
@@ -408,6 +412,7 @@ extern void folio_free (struct activity *activity, struct folio *folio);
extern void folio_object_alloc (struct activity *activity,
struct folio *folio, int page,
enum cap_type type,
+ struct object_policy policy,
struct object **objectp);
/* Deallocate the object stored in page PAGE of folio FOLIO. */
@@ -415,7 +420,8 @@ static inline void
folio_object_free (struct activity *activity,
struct folio *folio, int page)
{
- folio_object_alloc (activity, folio, page, cap_void, NULL);
+ folio_object_alloc (activity, folio, page, cap_void,
+ OBJECT_POLICY_VOID, NULL);
}
/* Deallocate the object OBJECT. */
diff --git a/viengoos/server.c b/viengoos/server.c
index b0f341c..d76027e 100644
--- a/viengoos/server.c
+++ b/viengoos/server.c
@@ -30,6 +30,7 @@
#include "rm.h"
+#include "output.h"
#include "cap.h"
#include "object.h"
#include "thread.h"
@@ -358,7 +359,7 @@ server_loop (void)
addr_t target_addr;
struct cap *target;
l4_word_t flags;
- struct cap_addr_trans addr_trans;
+ struct cap_properties properties;
DEBUG (5, "");
@@ -400,56 +401,63 @@ server_loop (void)
break;
case RM_folio_object_alloc:
- err = rm_folio_object_alloc_send_unmarshal (&msg, &principal_addr,
- &folio_addr, &idx,
- &type, &object_addr,
- &object_weak_addr);
- if (err)
- REPLY (err);
+ {
+ struct object_policy policy;
+
+ err = rm_folio_object_alloc_send_unmarshal (&msg, &principal_addr,
+ &folio_addr, &idx,
+ &type,
+ &policy,
+ &object_addr,
+ &object_weak_addr);
+ if (err)
+ REPLY (err);
- folio = (struct folio *) OBJECT (folio_addr, cap_folio, true);
+ folio = (struct folio *) OBJECT (folio_addr, cap_folio, true);
- if (idx >= FOLIO_OBJECTS)
- REPLY (EINVAL);
+ if (idx >= FOLIO_OBJECTS)
+ REPLY (EINVAL);
- if (! (CAP_TYPE_MIN <= type && type <= CAP_TYPE_MAX))
- REPLY (EINVAL);
+ if (! (CAP_TYPE_MIN <= type && type <= CAP_TYPE_MAX))
+ REPLY (EINVAL);
- object_slot = NULL;
- if (! ADDR_IS_VOID (object_addr))
- object_slot = SLOT (object_addr);
+ object_slot = NULL;
+ if (! ADDR_IS_VOID (object_addr))
+ object_slot = SLOT (object_addr);
- object_weak_slot = NULL;
- if (! ADDR_IS_VOID (object_weak_addr))
- object_weak_slot = SLOT (object_weak_addr);
+ object_weak_slot = NULL;
+ if (! ADDR_IS_VOID (object_weak_addr))
+ object_weak_slot = SLOT (object_weak_addr);
- DEBUG (4, "(folio: %llx/%d, idx: %d, type: %s, target: %llx/%d)",
- addr_prefix (folio_addr), addr_depth (folio_addr),
- idx, cap_type_string (type),
- addr_prefix (object_addr), addr_depth (object_addr));
+ DEBUG (4, "(folio: %llx/%d, idx: %d, type: %s, target: %llx/%d)",
+ addr_prefix (folio_addr), addr_depth (folio_addr),
+ idx, cap_type_string (type),
+ addr_prefix (object_addr), addr_depth (object_addr));
- folio_object_alloc (principal, folio, idx, type,
- type == cap_void ? NULL : &object);
+ folio_object_alloc (principal, folio, idx, type, policy,
+ type == cap_void ? NULL : &object);
- if (type != cap_void)
- {
- if (object_slot)
- {
- r = cap_set (principal, object_slot, object_to_cap (object));
- assert (r);
- }
- if (object_weak_slot)
- {
- r = cap_set (principal, object_weak_slot,
- object_to_cap (object));
- assert (r);
- object_weak_slot->type
- = cap_type_weaken (object_weak_slot->type);
- }
- }
+ if (type != cap_void)
+ {
+ if (object_slot)
+ {
+ r = cap_set (principal,
+ object_slot, object_to_cap (object));
+ assert (r);
+ }
+ if (object_weak_slot)
+ {
+ r = cap_set (principal, object_weak_slot,
+ object_to_cap (object));
+ assert (r);
+ object_weak_slot->type
+ = cap_type_weaken (object_weak_slot->type);
+ }
+ }
- rm_folio_object_alloc_reply_marshal (&msg);
- break;
+ rm_folio_object_alloc_reply_marshal (&msg);
+ break;
+ }
case RM_folio_policy:
{
@@ -473,7 +481,7 @@ server_loop (void)
case RM_object_slot_copy_out:
err = rm_object_slot_copy_out_send_unmarshal
(&msg, &principal_addr,
- &source_addr, &idx, &target_addr, &flags, &addr_trans);
+ &source_addr, &idx, &target_addr, &flags, &properties);
if (err)
REPLY (err);
@@ -486,7 +494,7 @@ server_loop (void)
{
err = rm_object_slot_copy_in_send_unmarshal
(&msg, &principal_addr,
- &target_addr, &idx, &source_addr, &flags, &addr_trans);
+ &target_addr, &idx, &source_addr, &flags, &properties);
if (err)
REPLY (err);
@@ -532,7 +540,7 @@ server_loop (void)
case RM_cap_copy:
err = rm_cap_copy_send_unmarshal (&msg, &principal_addr,
&target_addr, &source_addr,
- &flags, &addr_trans);
+ &flags, &properties);
if (err)
REPLY (err);
@@ -544,7 +552,9 @@ server_loop (void)
if ((flags & ~(CAP_COPY_COPY_ADDR_TRANS_SUBPAGE
| CAP_COPY_COPY_ADDR_TRANS_GUARD
| CAP_COPY_COPY_SOURCE_GUARD
- | CAP_COPY_WEAKEN)))
+ | CAP_COPY_WEAKEN
+ | CAP_COPY_DISCARDABLE_SET
+ | CAP_COPY_PRIORITY_SET)))
REPLY (EINVAL);
DEBUG (4, "(target: %llx/%d, source: %llx/%d, "
@@ -557,15 +567,14 @@ server_loop (void)
flags & CAP_COPY_COPY_ADDR_TRANS_SUBPAGE ? "copy"
: "preserve",
flags & CAP_COPY_WEAKEN ? "weaken" : "no weaken",
- CAP_ADDR_TRANS_GUARD (addr_trans),
- CAP_ADDR_TRANS_GUARD_BITS (addr_trans),
- CAP_ADDR_TRANS_SUBPAGE (addr_trans),
- CAP_ADDR_TRANS_SUBPAGES (addr_trans));
+ CAP_ADDR_TRANS_GUARD (properties.addr_trans),
+ CAP_ADDR_TRANS_GUARD_BITS (properties.addr_trans),
+ CAP_ADDR_TRANS_SUBPAGE (properties.addr_trans),
+ CAP_ADDR_TRANS_SUBPAGES (properties.addr_trans));
bool r = cap_copy_x (principal,
- target, ADDR_VOID,
- source, ADDR_VOID,
- flags, addr_trans);
+ target, ADDR_VOID, source, ADDR_VOID,
+ flags, properties);
if (! r)
REPLY (EINVAL);
@@ -613,7 +622,7 @@ server_loop (void)
source = ((struct cap *) object)[idx];
rm_object_slot_read_reply_marshal (&msg, source.type,
- source.addr_trans);
+ CAP_PROPERTIES_GET (source));
break;
@@ -623,7 +632,8 @@ server_loop (void)
source = CAP (source_addr, -1, false);
- rm_cap_read_reply_marshal (&msg, source.type, source.addr_trans);
+ rm_cap_read_reply_marshal (&msg, source.type,
+ CAP_PROPERTIES_GET (source));
break;
case RM_thread_exregs:
@@ -691,8 +701,8 @@ server_loop (void)
out.user_handle = in.user_handle;
err = thread_exregs (principal, t, control,
- aspace, in.aspace_addr_trans_flags,
- in.aspace_addr_trans, a, exception_page,
+ aspace, in.aspace_cap_properties_flags,
+ in.aspace_cap_properties, a, exception_page,
&out.sp, &out.ip,
&out.eflags, &out.user_handle,
aspace_out, activity_out,
diff --git a/viengoos/t-activity.c b/viengoos/t-activity.c
index ac30023..4382606 100644
--- a/viengoos/t-activity.c
+++ b/viengoos/t-activity.c
@@ -26,7 +26,8 @@ allocate_object (enum cap_type type, addr_t addr)
}
struct object *o;
- folio_object_alloc (root_activity, folio, object ++, type, &o);
+ folio_object_alloc (root_activity, folio, object ++,
+ type, OBJECT_POLICY_DEFAULT, &o);
struct as_insert_rt rt;
rt.cap = object_to_cap (o);
@@ -80,14 +81,16 @@ test (void)
/* Allocate a new activity. */
folio_object_alloc (activity, folio, obj ++,
- cap_activity_control, &object);
+ cap_activity_control, OBJECT_POLICY_DEFAULT,
+ &object);
a[i].child = (struct activity *) object;
/* Allocate a folio against the activity and use it. */
a[i].folio = folio_alloc (a[i].child, FOLIO_POLICY_DEFAULT);
assert (a[i].folio);
- folio_object_alloc (a[i].child, a[i].folio, 0, cap_page, &a[i].page);
+ folio_object_alloc (a[i].child, a[i].folio, 0,
+ cap_page, OBJECT_POLICY_DEFAULT, &a[i].page);
assert (object_type (a[i].page) == cap_page);
}
diff --git a/viengoos/t-as.c b/viengoos/t-as.c
index 4797b20..9425c4d 100644
--- a/viengoos/t-as.c
+++ b/viengoos/t-as.c
@@ -26,7 +26,8 @@ allocate_object (enum cap_type type, addr_t addr)
}
struct object *o;
- folio_object_alloc (root_activity, folio, object ++, type, &o);
+ folio_object_alloc (root_activity, folio, object ++,
+ type, OBJECT_POLICY_DEFAULT, &o);
struct as_insert_rt rt;
rt.cap = object_to_cap (o);
diff --git a/viengoos/thread.c b/viengoos/thread.c
index 73768df..6e5c168 100644
--- a/viengoos/thread.c
+++ b/viengoos/thread.c
@@ -237,7 +237,7 @@ error_t
thread_exregs (struct activity *principal,
struct thread *thread, l4_word_t control,
struct cap *aspace,
- l4_word_t flags, struct cap_addr_trans addr_trans,
+ l4_word_t flags, struct cap_properties properties,
struct cap *activity,
struct cap *exception_page,
l4_word_t *sp, l4_word_t *ip,
@@ -260,7 +260,7 @@ thread_exregs (struct activity *principal,
if ((control & HURD_EXREGS_SET_ASPACE))
cap_copy_x (principal, &thread->aspace, ADDR_VOID, *aspace, ADDR_VOID,
- flags, addr_trans);
+ flags, properties);
if ((control & HURD_EXREGS_GET_REGS) && activity_out)
cap_copy (principal, activity_out, ADDR_VOID, thread->activity, ADDR_VOID);
diff --git a/viengoos/thread.h b/viengoos/thread.h
index db0b5ca..f99a0cc 100644
--- a/viengoos/thread.h
+++ b/viengoos/thread.h
@@ -92,7 +92,7 @@ extern void thread_decommission (struct thread *thread);
extern error_t thread_exregs (struct activity *principal,
struct thread *thread, l4_word_t control,
struct cap *aspace,
- l4_word_t flags, struct cap_addr_trans addr_trans,
+ l4_word_t flags, struct cap_properties properties,
struct cap *activity,
struct cap *exception_page,
l4_word_t *sp, l4_word_t *ip,
diff --git a/viengoos/viengoos.c b/viengoos/viengoos.c
index b4ddf57..7c50336 100644
--- a/viengoos/viengoos.c
+++ b/viengoos/viengoos.c
@@ -253,7 +253,8 @@ system_task_load (void)
struct object *object;
int index = folio_index ++;
- folio_object_alloc (root_activity, folio, index, type, &object);
+ folio_object_alloc (root_activity, folio, index, type,
+ OBJECT_POLICY_VOID, &object);
if (! (desc_count < desc_max))
panic ("Initial task too large.");
@@ -371,7 +372,7 @@ system_task_load (void)
err = thread_exregs (root_activity, thread,
HURD_EXREGS_SET_SP_IP
| HURD_EXREGS_START | HURD_EXREGS_ABORT_IPC,
- NULL, 0, (struct cap_addr_trans) CAP_ADDR_TRANS_VOID,
+ NULL, 0, CAP_PROPERTIES_VOID,
NULL, NULL, &thread->sp, &thread->ip, NULL, NULL,
NULL, NULL, NULL);
if (err)