mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 13:38:11 +00:00
Kernel: Fix GDT and segment selectors to make userland work on x86_64
Userland faulted on the very first instruction before because the PML4T/PDPT/etc. weren't marked as user-accessible. For some reason x86 doesn't care about that. Also, we need to provide an appropriate userspace stack segment selector to iretq.
This commit is contained in:
parent
04fc7d708c
commit
b5aad1c81d
4 changed files with 16 additions and 9 deletions
|
@ -95,7 +95,7 @@ PageDirectory::PageDirectory(const RangeAllocator* parent_range_allocator)
|
|||
#if ARCH(X86_64)
|
||||
{
|
||||
auto& table = *(PageDirectoryPointerTable*)MM.quickmap_page(*m_pml4t);
|
||||
table.raw[0] = (FlatPtr)m_directory_table->paddr().as_ptr() | 3;
|
||||
table.raw[0] = (FlatPtr)m_directory_table->paddr().as_ptr() | 7;
|
||||
MM.unquickmap_page();
|
||||
}
|
||||
#endif
|
||||
|
@ -108,10 +108,10 @@ PageDirectory::PageDirectory(const RangeAllocator* parent_range_allocator)
|
|||
table.raw[2] = (FlatPtr)m_directory_pages[2]->paddr().as_ptr() | 1;
|
||||
table.raw[3] = (FlatPtr)m_directory_pages[3]->paddr().as_ptr() | 1;
|
||||
#else
|
||||
table.raw[0] = (FlatPtr)m_directory_pages[0]->paddr().as_ptr() | 3;
|
||||
table.raw[1] = (FlatPtr)m_directory_pages[1]->paddr().as_ptr() | 3;
|
||||
table.raw[2] = (FlatPtr)m_directory_pages[2]->paddr().as_ptr() | 3;
|
||||
table.raw[3] = (FlatPtr)m_directory_pages[3]->paddr().as_ptr() | 3;
|
||||
table.raw[0] = (FlatPtr)m_directory_pages[0]->paddr().as_ptr() | 7;
|
||||
table.raw[1] = (FlatPtr)m_directory_pages[1]->paddr().as_ptr() | 7;
|
||||
table.raw[2] = (FlatPtr)m_directory_pages[2]->paddr().as_ptr() | 7;
|
||||
table.raw[3] = (FlatPtr)m_directory_pages[3]->paddr().as_ptr() | 7;
|
||||
#endif
|
||||
|
||||
// 2 ** MAXPHYADDR - 1
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue