hw: use weak pointer when resolving a page-fault

Fix #1674
This commit is contained in:
Stefan Kalkowski
2015-09-02 10:05:35 +02:00
committed by Christian Helmuth
parent be9e157a3d
commit 8c168d7943
4 changed files with 15 additions and 29 deletions

View File

@ -85,7 +85,6 @@ class Genode::Ipc_pager
*/ */
struct Fault_thread_regs struct Fault_thread_regs
{ {
addr_t pd;
addr_t ip; addr_t ip;
addr_t addr; addr_t addr;
addr_t writes; addr_t writes;
@ -215,14 +214,6 @@ class Genode::Pager_entrypoint : public Object_pool<Pager_object>,
*/ */
void dissolve(Pager_object * const obj); void dissolve(Pager_object * const obj);
/**
* Bring current mapping data into effect
*
* \retval 0 succeeded
* \retval -1 failed
*/
int apply_mapping();
/********************** /**********************
** Thread interface ** ** Thread interface **

View File

@ -176,7 +176,7 @@ namespace Genode {
/** /**
* Return the address space to which the thread is bound * Return the address space to which the thread is bound
*/ */
Weak_ptr<Address_space> address_space(); Weak_ptr<Address_space>& address_space();
/** /**
* Return execution time consumed by the thread * Return execution time consumed by the thread

View File

@ -30,7 +30,7 @@ using namespace Genode;
void Platform_thread::_init() { } void Platform_thread::_init() { }
Weak_ptr<Address_space> Platform_thread::address_space() { Weak_ptr<Address_space>& Platform_thread::address_space() {
return _address_space; } return _address_space; }

View File

@ -40,20 +40,6 @@ void Rm_client::unmap(addr_t, addr_t virt_base, size_t size)
** Pager_entrypoint ** ** Pager_entrypoint **
**********************/ **********************/
int Pager_entrypoint::apply_mapping()
{
Page_flags const flags =
Page_flags::apply_mapping(_mapping.writable,
_mapping.cacheable,
_mapping.io_mem);
Platform_pd * const pd = (Platform_pd*)_fault.pd;
return (pd->insert_translation(_mapping.virt_address,
_mapping.phys_address,
1 << _mapping.size_log2, flags)) ? 0 : 1;
}
void Pager_entrypoint::entry() void Pager_entrypoint::entry()
{ {
while (1) while (1)
@ -79,7 +65,6 @@ void Pager_entrypoint::entry()
return; return;
} }
_fault.pd = pt->kernel_object()->fault_pd();
_fault.ip = pt->kernel_object()->ip; _fault.ip = pt->kernel_object()->ip;
_fault.addr = pt->kernel_object()->fault_addr(); _fault.addr = pt->kernel_object()->fault_addr();
_fault.writes = pt->kernel_object()->fault_writes(); _fault.writes = pt->kernel_object()->fault_writes();
@ -89,10 +74,20 @@ void Pager_entrypoint::entry()
if (po->pager(*this)) return; if (po->pager(*this)) return;
/* apply mapping that was determined by the local region managers */ /* apply mapping that was determined by the local region managers */
if (apply_mapping()) { {
PWRN("failed to apply mapping"); Locked_ptr<Address_space> locked_ptr(pt->address_space());
return; if (!locked_ptr.is_valid()) return;
Hw::Address_space * as = static_cast<Hw::Address_space*>(&*locked_ptr);
Page_flags const flags =
Page_flags::apply_mapping(_mapping.writable,
_mapping.cacheable,
_mapping.io_mem);
as->insert_translation(_mapping.virt_address,
_mapping.phys_address,
1 << _mapping.size_log2, flags);
} }
/* let pager object go back to no-fault state */ /* let pager object go back to no-fault state */
po->wake_up(); po->wake_up();
}; };