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:
Norman Feske
2023-06-09 18:08:47 +02:00
parent 65d3b3a32f
commit a4c59c03e3
29 changed files with 638 additions and 444 deletions

View File

@ -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; }
};
/**

View File

@ -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_ */

View File

@ -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;