summaryrefslogtreecommitdiff
path: root/Kernel/CMOS.cpp
diff options
context:
space:
mode:
authorAndreas Kling <awesomekling@gmail.com>2019-11-27 12:40:42 +0100
committerAndreas Kling <awesomekling@gmail.com>2019-11-27 12:40:42 +0100
commit2d1bcce34af870228165a894d9e0200255ec1ba5 (patch)
tree388852f4fc050c7f238c37faa50f8dd6d65cd734 /Kernel/CMOS.cpp
parent5b8cf2ee234c708f1bca3df9abf49a8625b227cc (diff)
downloadserenity-2d1bcce34af870228165a894d9e0200255ec1ba5.zip
Kernel: Fix triple-fault when clicking on SystemServer in SystemMonitor
The fault was happening when retrieving a current backtrace for the SystemServer process. To generate a backtrace, we go into the paging scope of the process, meaning we temporarily switch to using its page directory as our own. Because kernel VM is allocated on demand, it's possible for a process's mappings above the 3GB mark to be out-of-date. Normally this just gets fixed up transparently by the page fault handler (which simply copies the PDE from the canonical MM.kernel_page_directory() into the current process.) However, if the current kernel *stack* is in a piece of memory that the backtraced process lacks up-to-date PDE's for, we still get a page fault, but are unable to handle it, since the CPU wants to push to the stack as part of calling the page fault handler. So we're screwed and it's a triple-fault. Fix this by always updating the kernel VM mappings before switching into a paging scope. In practical terms, this is a 1KB memcpy() that happens when generating a backtrace, or doing exec().
Diffstat (limited to 'Kernel/CMOS.cpp')
0 files changed, 0 insertions, 0 deletions