diff options
Diffstat (limited to 'viengoos/server.c')
-rw-r--r-- | viengoos/server.c | 124 |
1 files changed, 67 insertions, 57 deletions
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, |