summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorneal <neal>2008-06-18 13:25:13 +0000
committerneal <neal>2008-06-18 13:25:13 +0000
commit5cd77a92a8d3b4661c35735ff8a34642a45fcb94 (patch)
tree6904560a5ca328b8e8c8b4e16868fc87bae89c2a
parent5cffd2274497804769230c3204a9c7a0cc0c0d0c (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/ChangeLog5
-rw-r--r--hurd/cap.h6
-rw-r--r--viengoos/ChangeLog5
-rw-r--r--viengoos/rm.h2
-rw-r--r--viengoos/server.c32
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.
diff --git a/hurd/cap.h b/hurd/cap.h
index 572909b..8527b35 100644
--- a/hurd/cap.h
+++ b/hurd/cap.h
@@ -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;