diff options
author | neal <neal> | 2008-06-18 13:25:13 +0000 |
---|---|---|
committer | neal <neal> | 2008-06-18 13:25:13 +0000 |
commit | 5cd77a92a8d3b4661c35735ff8a34642a45fcb94 (patch) | |
tree | 6904560a5ca328b8e8c8b4e16868fc87bae89c2a | |
parent | 5cffd2274497804769230c3204a9c7a0cc0c0d0c (diff) |
viengoos/
2008-06-18 Neal H. Walfield <neal@gnu.org>
* server.c (server_loop): Implement the cap_rubout method.
* rm.h (rm_method_id_string): Handle RM_cap_rubout.
hurd/
2008-06-18 Neal H. Walfield <neal@gnu.org>
* cap.h (RM_cap_rubout): Define.
(cap_rubout): New method.
-rw-r--r-- | hurd/ChangeLog | 5 | ||||
-rw-r--r-- | hurd/cap.h | 6 | ||||
-rw-r--r-- | viengoos/ChangeLog | 5 | ||||
-rw-r--r-- | viengoos/rm.h | 2 | ||||
-rw-r--r-- | viengoos/server.c | 32 |
5 files changed, 48 insertions, 2 deletions
diff --git a/hurd/ChangeLog b/hurd/ChangeLog index e81e40d..1f50e1d 100644 --- a/hurd/ChangeLog +++ b/hurd/ChangeLog @@ -1,3 +1,8 @@ +2008-06-18 Neal H. Walfield <neal@gnu.org> + + * cap.h (RM_cap_rubout): Define. + (cap_rubout): New method. + 2008-06-17 Neal H. Walfield <neal@gnu.org> * folio.h (folio_object_type): Correctly bound-check OBJECT. @@ -369,6 +369,7 @@ struct cap enum { RM_cap_copy = 300, + RM_cap_rubout, RM_cap_read, RM_object_slot_copy_out = 400, @@ -432,6 +433,11 @@ RPC(cap_copy, 7, 0, addr_t, principal, addr_t, source_address_space, addr_t, source, l4_word_t, flags, struct cap_properties, properties) +/* Overwrite the capability slot TARGET in address space + TARGET_ADDRESS_SPACE with a void capability. */ +RPC(cap_rubout, 3, 0, addr_t, principal, + addr_t, target_address_space, addr_t, target) + /* Returns the public bits of the capability CAP in TYPE and CAP_PROPERTIES. */ RPC(cap_read, 3, 2, addr_t, principal, addr_t, address_space, addr_t, cap, diff --git a/viengoos/ChangeLog b/viengoos/ChangeLog index f57c3e5..dca1afb 100644 --- a/viengoos/ChangeLog +++ b/viengoos/ChangeLog @@ -1,3 +1,8 @@ +2008-06-18 Neal H. Walfield <neal@gnu.org> + + * server.c (server_loop): Implement the cap_rubout method. + * rm.h (rm_method_id_string): Handle RM_cap_rubout. + 2008-06-17 Neal H. Walfield <neal@gnu.org> * server.c (server_loop): In the object_discarded_clear diff --git a/viengoos/rm.h b/viengoos/rm.h index d99909d..4cec40d 100644 --- a/viengoos/rm.h +++ b/viengoos/rm.h @@ -51,6 +51,8 @@ rm_method_id_string (int id) return "folio_object_alloc"; case RM_cap_copy: return "cap_copy"; + case RM_cap_rubout: + return "cap_rubout"; case RM_cap_read: return "cap_read"; case RM_object_slot_copy_out: diff --git a/viengoos/server.c b/viengoos/server.c index 7db0c26..00d82fe 100644 --- a/viengoos/server.c +++ b/viengoos/server.c @@ -274,7 +274,7 @@ server_loop (void) if (raise_fault) { - DEBUG (5, "fault (ip: %x; fault: %x.%c%s)!", + DEBUG (4, "fault (ip: %x; fault: %x.%c%s)!", ip, fault, w ? 'w' : 'r', discarded ? " discarded" : ""); l4_word_t c = _L4_XCHG_REGS_DELIVER; @@ -298,7 +298,7 @@ server_loop (void) continue; } - DEBUG (5, "%s fault at %x (ip=%x), replying with %p (" OID_FMT ")", + DEBUG (4, "%s fault at %x (ip=%x), replying with %p (" OID_FMT ")", w ? "Write" : "Read", fault, ip, page, OID_PRINTF (cap.oid)); l4_map_item_t map_item = l4_map_item (l4_fpage_add_rights (l4_fpage ((uintptr_t) page, @@ -890,6 +890,34 @@ server_loop (void) break; } + case RM_cap_rubout: + { + addr_t target_as_addr; + addr_t target_addr; + + err = rm_cap_rubout_send_unmarshal (&msg, + &principal_addr, + &target_as_addr, + &target_addr); + if (err) + REPLY (err); + + DEBUG (4, ADDR_FMT "@" ADDR_FMT, + ADDR_PRINTF (target_as_addr), + ADDR_PRINTF (target_addr)); + + struct cap *root = ROOT (target_as_addr); + + /* We don't look up the argument directly as we need to + respect any subpag specification for cappages. */ + struct cap *target = SLOT (root, target_addr); + + target->type = cap_void; + + rm_cap_rubout_reply_marshal (&msg); + break; + } + case RM_object_slot_read: { addr_t root_addr; |