kernel: pae paging: align *TableEntry() with 64bit paging

use SetTableEntry() in PutPageTableInPageDir() and PutPageTableEntryInTable().
This commit is contained in:
Jérôme Duval
2018-04-21 10:06:51 +00:00
parent 6675afbae2
commit dde876f9f8
3 changed files with 35 additions and 41 deletions
@@ -792,10 +792,10 @@ X86PagingMethodPAE::IsKernelPageAccessible(addr_t virtualAddress,
X86PagingMethodPAE::PutPageTableInPageDir(pae_page_directory_entry* entry, X86PagingMethodPAE::PutPageTableInPageDir(pae_page_directory_entry* entry,
phys_addr_t physicalTable, uint32 attributes) phys_addr_t physicalTable, uint32 attributes)
{ {
*entry = (physicalTable & X86_PAE_PDE_ADDRESS_MASK) SetTableEntry(entry, (physicalTable & X86_PAE_PDE_ADDRESS_MASK)
| X86_PAE_PDE_PRESENT | X86_PAE_PDE_PRESENT
| X86_PAE_PDE_WRITABLE | X86_PAE_PDE_WRITABLE
| X86_PAE_PDE_USER; | X86_PAE_PDE_USER);
// TODO: We ignore the attributes of the page table -- for compatibility // TODO: We ignore the attributes of the page table -- for compatibility
// with BeOS we allow having user accessible areas in the kernel address // with BeOS we allow having user accessible areas in the kernel address
// space. This is currently being used by some drivers, mainly for the // space. This is currently being used by some drivers, mainly for the
@@ -830,7 +830,7 @@ X86PagingMethodPAE::PutPageTableEntryInTable(pae_page_table_entry* entry,
page |= X86_PAE_PTE_WRITABLE; page |= X86_PAE_PTE_WRITABLE;
// put it in the page table // put it in the page table
*(volatile pae_page_table_entry*)entry = page; SetTableEntry(entry, page);
} }
@@ -74,18 +74,15 @@ public:
phys_addr_t physicalAddress, phys_addr_t physicalAddress,
uint32 attributes, uint32 memoryType, uint32 attributes, uint32 memoryType,
bool globalPage); bool globalPage);
static pae_page_table_entry SetPageTableEntry(pae_page_table_entry* entry, static uint64_t SetTableEntry(uint64_t* entry,
pae_page_table_entry newEntry); uint64_t newEntry);
static pae_page_table_entry SetPageTableEntryFlags( static uint64_t SetTableEntryFlags(uint64_t* entry,
pae_page_table_entry* entry, uint64 flags); uint64_t flags);
static pae_page_table_entry TestAndSetPageTableEntry( static uint64_t TestAndSetTableEntry(uint64_t* entry,
pae_page_table_entry* entry, uint64_t newEntry, uint64_t oldEntry);
pae_page_table_entry newEntry, static uint64_t ClearTableEntry(uint64_t* entry);
pae_page_table_entry oldEntry); static uint64_t ClearTableEntryFlags(uint64_t* entry,
static pae_page_table_entry ClearPageTableEntry( uint64_t flags);
pae_page_table_entry* entry);
static pae_page_table_entry ClearPageTableEntryFlags(
pae_page_table_entry* entry, uint64 flags);
static pae_page_directory_entry* PageDirEntryForAddress( static pae_page_directory_entry* PageDirEntryForAddress(
pae_page_directory_entry* const* pdpt, pae_page_directory_entry* const* pdpt,
@@ -156,40 +153,37 @@ X86PagingMethodPAE::PageDirEntryForAddress(
} }
/*static*/ inline pae_page_table_entry /*static*/ inline uint64_t
X86PagingMethodPAE::SetPageTableEntry(pae_page_table_entry* entry, X86PagingMethodPAE::SetTableEntry(uint64_t* entry, uint64_t newEntry)
pae_page_table_entry newEntry)
{ {
return atomic_get_and_set64((int64*)entry, newEntry); return atomic_get_and_set64((int64*)entry, newEntry);
} }
/*static*/ inline pae_page_table_entry /*static*/ inline uint64_t
X86PagingMethodPAE::SetPageTableEntryFlags(pae_page_table_entry* entry, X86PagingMethodPAE::SetTableEntryFlags(uint64_t* entry, uint64_t flags)
uint64 flags)
{ {
return atomic_or64((int64*)entry, flags); return atomic_or64((int64*)entry, flags);
} }
/*static*/ inline pae_page_table_entry /*static*/ inline uint64_t
X86PagingMethodPAE::TestAndSetPageTableEntry(pae_page_table_entry* entry, X86PagingMethodPAE::TestAndSetTableEntry(uint64_t* entry,
pae_page_table_entry newEntry, pae_page_table_entry oldEntry) uint64_t newEntry, uint64_t oldEntry)
{ {
return atomic_test_and_set64((int64*)entry, newEntry, oldEntry); return atomic_test_and_set64((int64*)entry, newEntry, oldEntry);
} }
/*static*/ inline pae_page_table_entry /*static*/ inline uint64_t
X86PagingMethodPAE::ClearPageTableEntry(pae_page_table_entry* entry) X86PagingMethodPAE::ClearTableEntry(uint64_t* entry)
{ {
return SetPageTableEntry(entry, 0); return SetTableEntry(entry, 0);
} }
/*static*/ inline pae_page_table_entry /*static*/ inline uint64_t
X86PagingMethodPAE::ClearPageTableEntryFlags(pae_page_table_entry* entry, X86PagingMethodPAE::ClearTableEntryFlags(uint64_t* entry, uint64_t flags)
uint64 flags)
{ {
return atomic_and64((int64*)entry, ~flags); return atomic_and64((int64*)entry, ~flags);
} }
@@ -477,7 +477,7 @@ X86VMTranslationMapPAE::Unmap(addr_t start, addr_t end)
B_PRIxADDR "\n", start); B_PRIxADDR "\n", start);
pae_page_table_entry oldEntry pae_page_table_entry oldEntry
= X86PagingMethodPAE::ClearPageTableEntryFlags( = X86PagingMethodPAE::ClearTableEntryFlags(
&pageTable[index], X86_PAE_PTE_PRESENT); &pageTable[index], X86_PAE_PTE_PRESENT);
T(Unmap(this, start, oldEntry)); T(Unmap(this, start, oldEntry));
@@ -531,14 +531,14 @@ X86VMTranslationMapPAE::DebugMarkRangePresent(addr_t start, addr_t end,
if (!markPresent) if (!markPresent)
continue; continue;
X86PagingMethodPAE::SetPageTableEntryFlags( X86PagingMethodPAE::SetTableEntryFlags(
&pageTable[index], X86_PAE_PTE_PRESENT); &pageTable[index], X86_PAE_PTE_PRESENT);
} else { } else {
if (markPresent) if (markPresent)
continue; continue;
pae_page_table_entry oldEntry pae_page_table_entry oldEntry
= X86PagingMethodPAE::ClearPageTableEntryFlags( = X86PagingMethodPAE::ClearTableEntryFlags(
&pageTable[index], X86_PAE_PTE_PRESENT); &pageTable[index], X86_PAE_PTE_PRESENT);
if ((oldEntry & X86_PAE_PTE_ACCESSED) != 0) { if ((oldEntry & X86_PAE_PTE_ACCESSED) != 0) {
@@ -581,7 +581,7 @@ X86VMTranslationMapPAE::UnmapPage(VMArea* area, addr_t address,
= (pae_page_table_entry*)fPageMapper->GetPageTableAt( = (pae_page_table_entry*)fPageMapper->GetPageTableAt(
*pageDirEntry & X86_PAE_PDE_ADDRESS_MASK); *pageDirEntry & X86_PAE_PDE_ADDRESS_MASK);
pae_page_table_entry oldEntry = X86PagingMethodPAE::ClearPageTableEntry( pae_page_table_entry oldEntry = X86PagingMethodPAE::ClearTableEntry(
&pageTable[address / B_PAGE_SIZE % kPAEPageTableEntryCount]); &pageTable[address / B_PAGE_SIZE % kPAEPageTableEntryCount]);
T(Unmap(this, address, oldEntry)); T(Unmap(this, address, oldEntry));
@@ -665,7 +665,7 @@ X86VMTranslationMapPAE::UnmapPages(VMArea* area, addr_t base, size_t size,
for (; index < kPAEPageTableEntryCount && start < end; for (; index < kPAEPageTableEntryCount && start < end;
index++, start += B_PAGE_SIZE) { index++, start += B_PAGE_SIZE) {
pae_page_table_entry oldEntry pae_page_table_entry oldEntry
= X86PagingMethodPAE::ClearPageTableEntry(&pageTable[index]); = X86PagingMethodPAE::ClearTableEntry(&pageTable[index]);
if ((oldEntry & X86_PAE_PTE_PRESENT) == 0) if ((oldEntry & X86_PAE_PTE_PRESENT) == 0)
continue; continue;
@@ -799,7 +799,7 @@ X86VMTranslationMapPAE::UnmapArea(VMArea* area, bool deletingAddressSpace,
= (pae_page_table_entry*)fPageMapper->GetPageTableAt( = (pae_page_table_entry*)fPageMapper->GetPageTableAt(
*pageDirEntry & X86_PAE_PDE_ADDRESS_MASK); *pageDirEntry & X86_PAE_PDE_ADDRESS_MASK);
pae_page_table_entry oldEntry pae_page_table_entry oldEntry
= X86PagingMethodPAE::ClearPageTableEntry( = X86PagingMethodPAE::ClearTableEntry(
&pageTable[address / B_PAGE_SIZE &pageTable[address / B_PAGE_SIZE
% kPAEPageTableEntryCount]); % kPAEPageTableEntryCount]);
@@ -1039,7 +1039,7 @@ X86VMTranslationMapPAE::Protect(addr_t start, addr_t end, uint32 attributes,
// without changing the accessed or dirty flag // without changing the accessed or dirty flag
pae_page_table_entry oldEntry; pae_page_table_entry oldEntry;
while (true) { while (true) {
oldEntry = X86PagingMethodPAE::TestAndSetPageTableEntry( oldEntry = X86PagingMethodPAE::TestAndSetTableEntry(
&pageTable[index], &pageTable[index],
(entry & ~(X86_PAE_PTE_PROTECTION_MASK (entry & ~(X86_PAE_PTE_PROTECTION_MASK
| X86_PAE_PTE_MEMORY_TYPE_MASK)) | X86_PAE_PTE_MEMORY_TYPE_MASK))
@@ -1092,7 +1092,7 @@ X86VMTranslationMapPAE::ClearFlags(addr_t address, uint32 flags)
// clear out the flags we've been requested to clear // clear out the flags we've been requested to clear
pae_page_table_entry oldEntry pae_page_table_entry oldEntry
= X86PagingMethodPAE::ClearPageTableEntryFlags(entry, flagsToClear); = X86PagingMethodPAE::ClearTableEntryFlags(entry, flagsToClear);
pinner.Unlock(); pinner.Unlock();
@@ -1143,7 +1143,7 @@ X86VMTranslationMapPAE::ClearAccessedAndModified(VMArea* area, addr_t address,
if (oldEntry & X86_PAE_PTE_ACCESSED) { if (oldEntry & X86_PAE_PTE_ACCESSED) {
// page was accessed -- just clear the flags // page was accessed -- just clear the flags
oldEntry = X86PagingMethodPAE::ClearPageTableEntryFlags(entry, oldEntry = X86PagingMethodPAE::ClearTableEntryFlags(entry,
X86_PAE_PTE_ACCESSED | X86_PAE_PTE_DIRTY); X86_PAE_PTE_ACCESSED | X86_PAE_PTE_DIRTY);
T(ClearFlags(this, address, oldEntry, T(ClearFlags(this, address, oldEntry,
X86_PAE_PTE_ACCESSED | X86_PAE_PTE_DIRTY)); X86_PAE_PTE_ACCESSED | X86_PAE_PTE_DIRTY));
@@ -1151,7 +1151,7 @@ X86VMTranslationMapPAE::ClearAccessedAndModified(VMArea* area, addr_t address,
} }
// page hasn't been accessed -- unmap it // page hasn't been accessed -- unmap it
if (X86PagingMethodPAE::TestAndSetPageTableEntry(entry, 0, oldEntry) if (X86PagingMethodPAE::TestAndSetTableEntry(entry, 0, oldEntry)
== oldEntry) { == oldEntry) {
T(ClearFlagsUnmap(this, address, oldEntry)); T(ClearFlagsUnmap(this, address, oldEntry));
break; break;
@@ -1160,7 +1160,7 @@ X86VMTranslationMapPAE::ClearAccessedAndModified(VMArea* area, addr_t address,
// something changed -- check again // something changed -- check again
} }
} else { } else {
oldEntry = X86PagingMethodPAE::ClearPageTableEntryFlags(entry, oldEntry = X86PagingMethodPAE::ClearTableEntryFlags(entry,
X86_PAE_PTE_ACCESSED | X86_PAE_PTE_DIRTY); X86_PAE_PTE_ACCESSED | X86_PAE_PTE_DIRTY);
T(ClearFlags(this, address, oldEntry, T(ClearFlags(this, address, oldEntry,
X86_PAE_PTE_ACCESSED | X86_PAE_PTE_DIRTY)); X86_PAE_PTE_ACCESSED | X86_PAE_PTE_DIRTY));