diff options
author | neal <neal> | 2008-02-20 12:38:28 +0000 |
---|---|---|
committer | neal <neal> | 2008-02-20 12:38:28 +0000 |
commit | ca33469aafbf11ef136a9a8459db2674be04926d (patch) | |
tree | 07f54c08ce9c2c28a3159b16a9e08b241086aced /viengoos/server.c | |
parent | 694b8a52d60f1cfd87207e83d980417818a8355e (diff) |
2008-02-20 Neal H. Walfield <neal@gnu.org>
* server.c (server_loop): On a page fault, use cap_to_object_soft
to find the page.
Diffstat (limited to 'viengoos/server.c')
-rw-r--r-- | viengoos/server.c | 41 |
1 files changed, 17 insertions, 24 deletions
diff --git a/viengoos/server.c b/viengoos/server.c index 80ca403..388ea52 100644 --- a/viengoos/server.c +++ b/viengoos/server.c @@ -131,8 +131,8 @@ server_loop (void) bool w = !! (access & L4_FPAGE_WRITABLE); enum cap_type type = w ? cap_page : cap_rpage; - DEBUG (5, "%x.%x page faults at %x (ip = %x)", - l4_thread_no (from), l4_version (from), fault, ip); + DEBUG (5, "page fault at %x.%s (ip = %x)", + fault, w ? "w" : "r", ip); l4_word_t page_addr = fault & ~(PAGESIZE - 1); bool writable; @@ -149,21 +149,11 @@ server_loop (void) || cap.type == cap_page || cap.type == cap_rpage); - struct object_policy policy; - policy = OBJECT_POLICY (writable ? cap.discardable : 0, - cap.priority); + if (! writable) + cap.discardable = false; - page = object_find_soft (activity, cap.oid, policy); - if (page) - /* An object with oid CAP.OID exists and is in memory. If - the version doesn't match, then the object we are - looking for is definitely not on disk. */ - { - struct object_desc *desc = object_to_object_desc (page); - if (desc->version != cap.version) - page = NULL; - } - else if (! page) + page = cap_to_object_soft (activity, &cap); + if (! page && cap.type != cap_void) /* It's not in-memory. See if it was discarded. If not, load it using cap_to_object. */ { @@ -177,20 +167,20 @@ server_loop (void) if (folio_object_discarded (folio, object)) { - debug (0, DEBUG_BOLD ("" OID_FMT " (%s) was discarded"), + debug (5, OID_FMT " (%s) was discarded", OID_PRINTF (cap.oid), - cap_type_string (folio_object_type (folio, object))); + cap_type_string (folio_object_type (folio, + object))); assert (! folio_object_content (folio, object)); raise_fault = true; discarded = true; + + DEBUG (5, "Raising discarded fault at %x", page_addr); } else - { - cap.discardable = policy.discardable; - page = cap_to_object (activity, &cap); - } + page = cap_to_object (activity, &cap); } if (! page) @@ -209,6 +199,9 @@ server_loop (void) if (raise_fault) { + DEBUG (5, "fault (ip: %x; fault: %x.%c%s)!", + ip, fault, w ? 'w' : 'r', discarded ? " discarded" : ""); + l4_word_t c = _L4_XCHG_REGS_DELIVER; l4_thread_id_t targ = thread->tid; l4_word_t sp = 0; @@ -230,8 +223,8 @@ server_loop (void) continue; } - DEBUG (5, "Fault at %x, replying with %p (" OID_FMT ")", - fault, page, OID_PRINTF (cap.oid)); + DEBUG (5, "%s fault at %x, replying with %p (" OID_FMT ")", + w ? "Write" : "Read", fault, page, OID_PRINTF (cap.oid)); l4_map_item_t map_item = l4_map_item (l4_fpage_add_rights (l4_fpage ((uintptr_t) page, PAGESIZE), |