mirror of
https://github.com/genodelabs/genode.git
synced 2025-06-23 01:08:55 +00:00
core: rework page-fault resolution
The change "core: allow offset-attached managed dataspaces" addressed a corner case of the use of nested region maps. Apparently, this change negatively affects other scenarios (tool_chain_auto). In order to confidently cover all the differnt situations, this patch reworks the page-fault resolution code for improved clarity and safety, by introducing dedicated result types, reducing the use of basic types, choosing expressive names, and fostering constness. It also introduces a number of 'print' hooks that greatly ease manual instrumentation and streamlines the error messages printed by core. Those messages no longer appear when a user-level page-fault handler is reistered for the faulted-at region map. So the monitor component produces less noise on the attempt to dump non-existing memory. Issue #4917 Fixes #4920
This commit is contained in:
@ -55,7 +55,8 @@ class Core::Platform : public Platform_generic
|
||||
*/
|
||||
Sigma0(Cap_index*);
|
||||
|
||||
int pager(Ipc_pager &) override { /* never called */ return -1; }
|
||||
/* never called */
|
||||
Pager_result pager(Ipc_pager &) override { return Pager_result::STOP; }
|
||||
};
|
||||
|
||||
/*
|
||||
@ -132,7 +133,8 @@ class Core::Platform : public Platform_generic
|
||||
*/
|
||||
Core_pager(Platform_pd &core_pd, Sigma0 &);
|
||||
|
||||
int pager(Ipc_pager &) override { /* never called */ return -1; }
|
||||
/* never called */
|
||||
Pager_result pager(Ipc_pager &) override { return Pager_result::STOP; }
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -73,7 +73,7 @@ namespace Core {
|
||||
inline addr_t map_src_addr(addr_t core_local_addr, addr_t) {
|
||||
return core_local_addr; }
|
||||
|
||||
inline size_t constrain_map_size_log2(size_t size_log2) { return size_log2; }
|
||||
inline Log2 kernel_constrained_map_size(Log2 size) { return size; }
|
||||
}
|
||||
|
||||
#endif /* _CORE__INCLUDE__UTIL_H_ */
|
||||
|
@ -60,12 +60,7 @@ void Pager_entrypoint::entry()
|
||||
}
|
||||
|
||||
/* handle request */
|
||||
if (obj->pager(_pager)) {
|
||||
/* could not resolv - leave thread in pagefault */
|
||||
warning("page-fault, ", *obj,
|
||||
" ip=", Hex(_pager.fault_ip()),
|
||||
" pf-addr=", Hex(_pager.fault_addr()));
|
||||
} else {
|
||||
if (obj->pager(_pager) == Pager_object::Pager_result::CONTINUE) {
|
||||
_pager.set_reply_dst(Native_thread(obj->badge()));
|
||||
reply_pending = true;
|
||||
return;
|
||||
|
Reference in New Issue
Block a user