mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 08:58:11 +00:00
Kernel: Make ProcessPagingScope restore CR3 properly
Instead of restoring CR3 to the current process's paging scope when a ProcessPagingScope goes out of scope, we now restore exactly whatever the CR3 value was when we created the ProcessPagingScope. This fixes breakage in situations where a process ends up with nested ProcessPagingScopes. This was making profiling very fragile, and with this change it's now possible to profile g++! :^)
This commit is contained in:
parent
ad3f931707
commit
6eab7b398d
3 changed files with 16 additions and 7 deletions
|
@ -682,10 +682,15 @@ void MemoryManager::dump_kernel_regions()
|
|||
ProcessPagingScope::ProcessPagingScope(Process& process)
|
||||
{
|
||||
ASSERT(current);
|
||||
asm("movl %%cr3, %%eax"
|
||||
: "=a"(m_previous_cr3));
|
||||
MM.enter_process_paging_scope(process);
|
||||
}
|
||||
|
||||
ProcessPagingScope::~ProcessPagingScope()
|
||||
{
|
||||
MM.enter_process_paging_scope(current->process());
|
||||
InterruptDisabler disabler;
|
||||
current->tss().cr3 = m_previous_cr3;
|
||||
asm volatile("movl %%eax, %%cr3" ::"a"(m_previous_cr3)
|
||||
: "memory");
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue