From 7497724fdbd887029f3d70a691db27a34926e64a Mon Sep 17 00:00:00 2001 From: neal Date: Tue, 25 Dec 2007 20:06:06 +0000 Subject: hurd/ 2007-12-25 Neal H. Walfield * cap.h: Include . (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 . (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 * 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 * 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 * 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. --- viengoos/ChangeLog | 26 +++++++++++ viengoos/as.c | 10 ++-- viengoos/object.c | 3 ++ viengoos/object.h | 8 +++- viengoos/server.c | 124 +++++++++++++++++++++++++++----------------------- viengoos/t-activity.c | 9 ++-- viengoos/t-as.c | 3 +- viengoos/thread.c | 4 +- viengoos/thread.h | 2 +- viengoos/viengoos.c | 5 +- 10 files changed, 124 insertions(+), 70 deletions(-) (limited to 'viengoos') 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 + + * 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 * 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) -- cgit v1.2.3