nova: interpret write page fault correctly

Fixes #1722
This commit is contained in:
Alexander Boettcher 2015-10-07 15:16:03 +02:00 committed by Christian Helmuth
parent 78e18981fb
commit 6c30bf2667
3 changed files with 19 additions and 34 deletions

View File

@ -77,21 +77,24 @@ namespace Genode {
{ {
private: private:
/**
* Page-fault type
*/
enum Pf_type {
TYPE_READ = 0x4,
TYPE_WRITE = 0x2,
TYPE_EXEC = 0x1,
};
addr_t _fault_ip; addr_t _fault_ip;
addr_t _fault_addr; addr_t _fault_addr;
Pf_type _fault_type; uint8_t _fault_type;
public: public:
/*
* Intel manual: 6.15 EXCEPTION AND INTERRUPT REFERENCE
* Interrupt 14Page-Fault Exception (#PF)
*/
enum {
ERR_I = 1 << 4,
ERR_R = 1 << 3,
ERR_U = 1 << 2,
ERR_W = 1 << 1,
ERR_P = 1 << 0,
};
/** /**
* Wait for page-fault info * Wait for page-fault info
* *
@ -123,7 +126,7 @@ namespace Genode {
/** /**
* Return true if fault was a write fault * Return true if fault was a write fault
*/ */
bool is_write_fault() const { return _fault_type == TYPE_WRITE; } bool is_write_fault() const { return _fault_type & ERR_W; }
/** /**
* Return true if last fault was an exception * Return true if last fault was an exception

View File

@ -21,24 +21,8 @@
#include <nova/syscalls.h> #include <nova/syscalls.h>
enum { verbose_page_fault = false };
using namespace Genode; using namespace Genode;
/**
* Print page-fault information in a human-readable form
*/
inline void print_page_fault(unsigned type, addr_t addr, addr_t ip)
{
enum { TYPE_READ = 0x4, TYPE_WRITE = 0x2, TYPE_EXEC = 0x1, };
printf("page (%s%s%s) fault at fault_addr=%lx, fault_ip=%lx\n",
type & TYPE_READ ? "r" : "-",
type & TYPE_WRITE ? "w" : "-",
type & TYPE_EXEC ? "x" : "-",
addr, ip);
}
void Ipc_pager::wait_for_fault() void Ipc_pager::wait_for_fault()
{ {
/* /*
@ -47,12 +31,9 @@ void Ipc_pager::wait_for_fault()
* page-fault information from our UTCB. * page-fault information from our UTCB.
*/ */
Nova::Utcb *utcb = (Nova::Utcb *)Thread_base::myself()->utcb(); Nova::Utcb *utcb = (Nova::Utcb *)Thread_base::myself()->utcb();
_fault_type = (Pf_type)utcb->qual[0]; _fault_type = utcb->qual[0];
_fault_addr = utcb->qual[1]; _fault_addr = utcb->qual[1];
_fault_ip = utcb->ip; _fault_ip = utcb->ip;
if (verbose_page_fault)
print_page_fault(_fault_type, _fault_addr, _fault_ip);
} }

View File

@ -17,14 +17,15 @@
#include <base/printf.h> #include <base/printf.h>
#include <base/sleep.h> #include <base/sleep.h>
#include <base/thread.h> #include <base/thread.h>
#include <base/snprintf.h>
#include <trace/source_registry.h>
/* core includes */ /* core includes */
#include <core_parent.h> #include <core_parent.h>
#include <platform.h> #include <platform.h>
#include <nova_util.h> #include <nova_util.h>
#include <util.h> #include <util.h>
#include <trace/source_registry.h> #include <ipc_pager.h>
#include <base/snprintf.h>
/* NOVA includes */ /* NOVA includes */
#include <nova/syscalls.h> #include <nova/syscalls.h>
@ -115,7 +116,7 @@ static void page_fault_handler()
addr_t pf_type = utcb->qual[0]; addr_t pf_type = utcb->qual[0];
print_page_fault("\nPAGE-FAULT IN CORE", pf_addr, pf_ip, print_page_fault("\nPAGE-FAULT IN CORE", pf_addr, pf_ip,
(Genode::Rm_session::Fault_type)pf_type, 0); (pf_type & Ipc_pager::ERR_W) ? Rm_session::WRITE_FAULT : Rm_session::READ_FAULT, 0);
/* dump stack trace */ /* dump stack trace */
struct Core_img struct Core_img