diff --git a/headers/private/kernel/vm/VMTranslationMap.h b/headers/private/kernel/vm/VMTranslationMap.h index bbb493426c..45c72ce3cb 100644 --- a/headers/private/kernel/vm/VMTranslationMap.h +++ b/headers/private/kernel/vm/VMTranslationMap.h @@ -39,9 +39,6 @@ public: vm_page_reservation* reservation) = 0; virtual status_t Unmap(addr_t start, addr_t end) = 0; - virtual status_t DebugMarkRangePresent(addr_t start, addr_t end, - bool markPresent); - // map not locked virtual status_t UnmapPage(VMArea* area, addr_t address, bool updatePageQueue, diff --git a/headers/private/kernel/vm/vm.h b/headers/private/kernel/vm/vm.h index 6dad380b05..b52cce3f0d 100644 --- a/headers/private/kernel/vm/vm.h +++ b/headers/private/kernel/vm/vm.h @@ -84,10 +84,6 @@ const char* vm_cache_type_to_string(int32 type); void vm_free_page_mapping(page_num_t page, vm_page_mapping* mapping, uint32 flags); -status_t vm_prepare_kernel_area_debug_protection(area_id id, void** cookie); -status_t vm_set_kernel_area_debug_protection(void* cookie, void* _address, - size_t size, uint32 protection); - status_t vm_block_address_range(const char* name, void* address, addr_t size); status_t vm_unreserve_address_range(team_id team, void *address, addr_t size); status_t vm_reserve_address_range(team_id team, void **_address, diff --git a/src/system/kernel/arch/arm/paging/32bit/ARMVMTranslationMap32Bit.cpp b/src/system/kernel/arch/arm/paging/32bit/ARMVMTranslationMap32Bit.cpp index 3378c249bd..41a53b7220 100644 --- a/src/system/kernel/arch/arm/paging/32bit/ARMVMTranslationMap32Bit.cpp +++ b/src/system/kernel/arch/arm/paging/32bit/ARMVMTranslationMap32Bit.cpp @@ -279,62 +279,6 @@ ARMVMTranslationMap32Bit::Unmap(addr_t start, addr_t end) } -status_t -ARMVMTranslationMap32Bit::DebugMarkRangePresent(addr_t start, addr_t end, - bool markPresent) -{ -#if 0 - start = ROUNDDOWN(start, B_PAGE_SIZE); - if (start >= end) - return B_OK; - - page_directory_entry *pd = fPagingStructures->pgdir_virt; - - do { - int index = VADDR_TO_PDENT(start); - if ((pd[index] & X86_PDE_PRESENT) == 0) { - // no page table here, move the start up to access the next page - // table - start = ROUNDUP(start + 1, kPageTableAlignment); - continue; - } - - Thread* thread = thread_get_current_thread(); - ThreadCPUPinner pinner(thread); - - page_table_entry* pt = (page_table_entry*)fPageMapper->GetPageTableAt( - pd[index] & X86_PDE_ADDRESS_MASK); - - for (index = VADDR_TO_PTENT(start); (index < 1024) && (start < end); - index++, start += B_PAGE_SIZE) { - if ((pt[index] & X86_PTE_PRESENT) == 0) { - if (!markPresent) - continue; - - X86PagingMethod32Bit::SetPageTableEntryFlags(&pt[index], - X86_PTE_PRESENT); - } else { - if (markPresent) - continue; - - page_table_entry oldEntry - = X86PagingMethod32Bit::ClearPageTableEntryFlags(&pt[index], - X86_PTE_PRESENT); - - if ((oldEntry & ARM_MMU_L2_FLAG_AP0) != 0) { - // Note, that we only need to invalidate the address, if the - // accessed flags was set, since only then the entry could - // have been in any TLB. - InvalidatePage(start); - } - } - } - } while (start != 0 && start < end); -#endif - return B_OK; -} - - status_t ARMVMTranslationMap32Bit::UnmapPage(VMArea* area, addr_t address, bool updatePageQueue, bool deletingAddressSpace, uint32* _flags) diff --git a/src/system/kernel/arch/arm/paging/32bit/ARMVMTranslationMap32Bit.h b/src/system/kernel/arch/arm/paging/32bit/ARMVMTranslationMap32Bit.h index 997161df53..0bd7caeb04 100644 --- a/src/system/kernel/arch/arm/paging/32bit/ARMVMTranslationMap32Bit.h +++ b/src/system/kernel/arch/arm/paging/32bit/ARMVMTranslationMap32Bit.h @@ -27,9 +27,6 @@ struct ARMVMTranslationMap32Bit : ARMVMTranslationMap { vm_page_reservation* reservation); virtual status_t Unmap(addr_t start, addr_t end); - virtual status_t DebugMarkRangePresent(addr_t start, addr_t end, - bool markPresent); - virtual status_t UnmapPage(VMArea* area, addr_t address, bool updatePageQueue, bool deletingAddressSpace, uint32* _flags); diff --git a/src/system/kernel/arch/ppc/paging/460/PPCVMTranslationMap460.cpp b/src/system/kernel/arch/ppc/paging/460/PPCVMTranslationMap460.cpp index e05bce0845..ee55bbbc55 100644 --- a/src/system/kernel/arch/ppc/paging/460/PPCVMTranslationMap460.cpp +++ b/src/system/kernel/arch/ppc/paging/460/PPCVMTranslationMap460.cpp @@ -585,65 +585,6 @@ PPCVMTranslationMap460::RemapAddressRange(addr_t *_virtualAddress, } -status_t -PPCVMTranslationMap460::DebugMarkRangePresent(addr_t start, addr_t end, - bool markPresent) -{ - panic("%s: UNIMPLEMENTED", __FUNCTION__); - return B_ERROR; -#if 0//X86 - start = ROUNDDOWN(start, B_PAGE_SIZE); - if (start >= end) - return B_OK; - - page_directory_entry *pd = fPagingStructures->pgdir_virt; - - do { - int index = VADDR_TO_PDENT(start); - if ((pd[index] & PPC_PDE_PRESENT) == 0) { - // no page table here, move the start up to access the next page - // table - start = ROUNDUP(start + 1, kPageTableAlignment); - continue; - } - - Thread* thread = thread_get_current_thread(); - ThreadCPUPinner pinner(thread); - - page_table_entry* pt = (page_table_entry*)fPageMapper->GetPageTableAt( - pd[index] & PPC_PDE_ADDRESS_MASK); - - for (index = VADDR_TO_PTENT(start); (index < 1024) && (start < end); - index++, start += B_PAGE_SIZE) { - if ((pt[index] & PPC_PTE_PRESENT) == 0) { - if (!markPresent) - continue; - - PPCPagingMethod460::SetPageTableEntryFlags(&pt[index], - PPC_PTE_PRESENT); - } else { - if (markPresent) - continue; - - page_table_entry oldEntry - = PPCPagingMethod460::ClearPageTableEntryFlags(&pt[index], - PPC_PTE_PRESENT); - - if ((oldEntry & PPC_PTE_ACCESSED) != 0) { - // Note, that we only need to invalidate the address, if the - // accessed flags was set, since only then the entry could - // have been in any TLB. - InvalidatePage(start); - } - } - } - } while (start != 0 && start < end); - - return B_OK; -#endif -} - - status_t PPCVMTranslationMap460::UnmapPage(VMArea* area, addr_t address, bool updatePageQueue, bool deletingAddressSpace, uint32* _flags) diff --git a/src/system/kernel/arch/ppc/paging/460/PPCVMTranslationMap460.h b/src/system/kernel/arch/ppc/paging/460/PPCVMTranslationMap460.h index f8889e263b..fe6781ac25 100644 --- a/src/system/kernel/arch/ppc/paging/460/PPCVMTranslationMap460.h +++ b/src/system/kernel/arch/ppc/paging/460/PPCVMTranslationMap460.h @@ -38,9 +38,6 @@ struct PPCVMTranslationMap460 : PPCVMTranslationMap { virtual status_t RemapAddressRange(addr_t *_virtualAddress, size_t size, bool unmap); - virtual status_t DebugMarkRangePresent(addr_t start, addr_t end, - bool markPresent); - virtual status_t UnmapPage(VMArea* area, addr_t address, bool updatePageQueue, bool deletingAddressSpace, uint32* _flags); diff --git a/src/system/kernel/arch/ppc/paging/classic/PPCVMTranslationMapClassic.cpp b/src/system/kernel/arch/ppc/paging/classic/PPCVMTranslationMapClassic.cpp index 1c8b861738..7c3bb815c1 100644 --- a/src/system/kernel/arch/ppc/paging/classic/PPCVMTranslationMapClassic.cpp +++ b/src/system/kernel/arch/ppc/paging/classic/PPCVMTranslationMapClassic.cpp @@ -585,65 +585,6 @@ PPCVMTranslationMapClassic::RemapAddressRange(addr_t *_virtualAddress, } -status_t -PPCVMTranslationMapClassic::DebugMarkRangePresent(addr_t start, addr_t end, - bool markPresent) -{ - panic("%s: UNIMPLEMENTED", __FUNCTION__); - return B_ERROR; -#if 0//X86 - start = ROUNDDOWN(start, B_PAGE_SIZE); - if (start >= end) - return B_OK; - - page_directory_entry *pd = fPagingStructures->pgdir_virt; - - do { - int index = VADDR_TO_PDENT(start); - if ((pd[index] & PPC_PDE_PRESENT) == 0) { - // no page table here, move the start up to access the next page - // table - start = ROUNDUP(start + 1, kPageTableAlignment); - continue; - } - - Thread* thread = thread_get_current_thread(); - ThreadCPUPinner pinner(thread); - - page_table_entry* pt = (page_table_entry*)fPageMapper->GetPageTableAt( - pd[index] & PPC_PDE_ADDRESS_MASK); - - for (index = VADDR_TO_PTENT(start); (index < 1024) && (start < end); - index++, start += B_PAGE_SIZE) { - if ((pt[index] & PPC_PTE_PRESENT) == 0) { - if (!markPresent) - continue; - - PPCPagingMethodClassic::SetPageTableEntryFlags(&pt[index], - PPC_PTE_PRESENT); - } else { - if (markPresent) - continue; - - page_table_entry oldEntry - = PPCPagingMethodClassic::ClearPageTableEntryFlags(&pt[index], - PPC_PTE_PRESENT); - - if ((oldEntry & PPC_PTE_ACCESSED) != 0) { - // Note, that we only need to invalidate the address, if the - // accessed flags was set, since only then the entry could - // have been in any TLB. - InvalidatePage(start); - } - } - } - } while (start != 0 && start < end); - - return B_OK; -#endif -} - - status_t PPCVMTranslationMapClassic::UnmapPage(VMArea* area, addr_t address, bool updatePageQueue, bool deletingAddressSpace, uint32* _flags) diff --git a/src/system/kernel/arch/ppc/paging/classic/PPCVMTranslationMapClassic.h b/src/system/kernel/arch/ppc/paging/classic/PPCVMTranslationMapClassic.h index 86bb41a6c5..061707cf29 100644 --- a/src/system/kernel/arch/ppc/paging/classic/PPCVMTranslationMapClassic.h +++ b/src/system/kernel/arch/ppc/paging/classic/PPCVMTranslationMapClassic.h @@ -38,9 +38,6 @@ struct PPCVMTranslationMapClassic : PPCVMTranslationMap { virtual status_t RemapAddressRange(addr_t *_virtualAddress, size_t size, bool unmap); - virtual status_t DebugMarkRangePresent(addr_t start, addr_t end, - bool markPresent); - virtual status_t UnmapPage(VMArea* area, addr_t address, bool updatePageQueue, bool deletingAddressSpace, uint32* _flags); diff --git a/src/system/kernel/arch/riscv64/RISCV64VMTranslationMap.cpp b/src/system/kernel/arch/riscv64/RISCV64VMTranslationMap.cpp index 718cf5c892..639a882ef9 100644 --- a/src/system/kernel/arch/riscv64/RISCV64VMTranslationMap.cpp +++ b/src/system/kernel/arch/riscv64/RISCV64VMTranslationMap.cpp @@ -311,15 +311,6 @@ RISCV64VMTranslationMap::Unmap(addr_t start, addr_t end) } -status_t -RISCV64VMTranslationMap::DebugMarkRangePresent(addr_t start, addr_t end, - bool markPresent) -{ - NOT_IMPLEMENTED_PANIC(); - return B_NOT_SUPPORTED; -} - - status_t RISCV64VMTranslationMap::UnmapPage(VMArea* area, addr_t address, bool updatePageQueue, bool deletingAddressSpace, uint32* _flags) diff --git a/src/system/kernel/arch/riscv64/RISCV64VMTranslationMap.h b/src/system/kernel/arch/riscv64/RISCV64VMTranslationMap.h index ff3ce86595..f0cfa055bf 100644 --- a/src/system/kernel/arch/riscv64/RISCV64VMTranslationMap.h +++ b/src/system/kernel/arch/riscv64/RISCV64VMTranslationMap.h @@ -39,9 +39,6 @@ struct RISCV64VMTranslationMap: public VMTranslationMap { vm_page_reservation* reservation); virtual status_t Unmap(addr_t start, addr_t end); - virtual status_t DebugMarkRangePresent(addr_t start, addr_t end, - bool markPresent); - virtual status_t UnmapPage(VMArea* area, addr_t address, bool updatePageQueue, bool deletingAddressSpace, uint32* _flags); diff --git a/src/system/kernel/arch/x86/paging/32bit/X86VMTranslationMap32Bit.cpp b/src/system/kernel/arch/x86/paging/32bit/X86VMTranslationMap32Bit.cpp index 52d0f49f48..d5460849e8 100644 --- a/src/system/kernel/arch/x86/paging/32bit/X86VMTranslationMap32Bit.cpp +++ b/src/system/kernel/arch/x86/paging/32bit/X86VMTranslationMap32Bit.cpp @@ -263,61 +263,6 @@ X86VMTranslationMap32Bit::Unmap(addr_t start, addr_t end) } -status_t -X86VMTranslationMap32Bit::DebugMarkRangePresent(addr_t start, addr_t end, - bool markPresent) -{ - start = ROUNDDOWN(start, B_PAGE_SIZE); - if (start >= end) - return B_OK; - - page_directory_entry *pd = fPagingStructures->pgdir_virt; - - do { - int index = VADDR_TO_PDENT(start); - if ((pd[index] & X86_PDE_PRESENT) == 0) { - // no page table here, move the start up to access the next page - // table - start = ROUNDUP(start + 1, kPageTableAlignment); - continue; - } - - Thread* thread = thread_get_current_thread(); - ThreadCPUPinner pinner(thread); - - page_table_entry* pt = (page_table_entry*)fPageMapper->GetPageTableAt( - pd[index] & X86_PDE_ADDRESS_MASK); - - for (index = VADDR_TO_PTENT(start); (index < 1024) && (start < end); - index++, start += B_PAGE_SIZE) { - if ((pt[index] & X86_PTE_PRESENT) == 0) { - if (!markPresent) - continue; - - X86PagingMethod32Bit::SetPageTableEntryFlags(&pt[index], - X86_PTE_PRESENT); - } else { - if (markPresent) - continue; - - page_table_entry oldEntry - = X86PagingMethod32Bit::ClearPageTableEntryFlags(&pt[index], - X86_PTE_PRESENT); - - if ((oldEntry & X86_PTE_ACCESSED) != 0) { - // Note, that we only need to invalidate the address, if the - // accessed flags was set, since only then the entry could - // have been in any TLB. - InvalidatePage(start); - } - } - } - } while (start != 0 && start < end); - - return B_OK; -} - - status_t X86VMTranslationMap32Bit::UnmapPage(VMArea* area, addr_t address, bool updatePageQueue, bool deletingAddressSpace, uint32* _flags) diff --git a/src/system/kernel/arch/x86/paging/32bit/X86VMTranslationMap32Bit.h b/src/system/kernel/arch/x86/paging/32bit/X86VMTranslationMap32Bit.h index f43ed4885b..7ed98572b6 100644 --- a/src/system/kernel/arch/x86/paging/32bit/X86VMTranslationMap32Bit.h +++ b/src/system/kernel/arch/x86/paging/32bit/X86VMTranslationMap32Bit.h @@ -27,9 +27,6 @@ struct X86VMTranslationMap32Bit final : X86VMTranslationMap { vm_page_reservation* reservation); virtual status_t Unmap(addr_t start, addr_t end); - virtual status_t DebugMarkRangePresent(addr_t start, addr_t end, - bool markPresent); - virtual status_t UnmapPage(VMArea* area, addr_t address, bool updatePageQueue, bool deletingAddressSpace, uint32* _flags); diff --git a/src/system/kernel/arch/x86/paging/64bit/X86VMTranslationMap64Bit.cpp b/src/system/kernel/arch/x86/paging/64bit/X86VMTranslationMap64Bit.cpp index 4e6ae4cc23..fee1cd53a7 100644 --- a/src/system/kernel/arch/x86/paging/64bit/X86VMTranslationMap64Bit.cpp +++ b/src/system/kernel/arch/x86/paging/64bit/X86VMTranslationMap64Bit.cpp @@ -316,59 +316,6 @@ X86VMTranslationMap64Bit::Unmap(addr_t start, addr_t end) } -status_t -X86VMTranslationMap64Bit::DebugMarkRangePresent(addr_t start, addr_t end, - bool markPresent) -{ - start = ROUNDDOWN(start, B_PAGE_SIZE); - if (start >= end) - return B_OK; - - TRACE("X86VMTranslationMap64Bit::DebugMarkRangePresent(%#" B_PRIxADDR - ", %#" B_PRIxADDR ")\n", start, end); - - ThreadCPUPinner pinner(thread_get_current_thread()); - - do { - uint64* pageTable = X86PagingMethod64Bit::PageTableForAddress( - fPagingStructures->VirtualPMLTop(), start, fIsKernelMap, false, - NULL, fPageMapper, fMapCount); - if (pageTable == NULL) { - // Move on to the next page table. - start = ROUNDUP(start + 1, k64BitPageTableRange); - continue; - } - - for (uint32 index = start / B_PAGE_SIZE % k64BitTableEntryCount; - index < k64BitTableEntryCount && start < end; - index++, start += B_PAGE_SIZE) { - if ((pageTable[index] & X86_64_PTE_PRESENT) == 0) { - if (!markPresent) - continue; - - X86PagingMethod64Bit::SetTableEntryFlags(&pageTable[index], - X86_64_PTE_PRESENT); - } else { - if (markPresent) - continue; - - uint64 oldEntry = X86PagingMethod64Bit::ClearTableEntryFlags( - &pageTable[index], X86_64_PTE_PRESENT); - - if ((oldEntry & X86_64_PTE_ACCESSED) != 0) { - // Note, that we only need to invalidate the address, if the - // accessed flags was set, since only then the entry could - // have been in any TLB. - InvalidatePage(start); - } - } - } - } while (start != 0 && start < end); - - return B_OK; -} - - status_t X86VMTranslationMap64Bit::UnmapPage(VMArea* area, addr_t address, bool updatePageQueue, bool deletingAddressSpace, uint32* _flags) diff --git a/src/system/kernel/arch/x86/paging/64bit/X86VMTranslationMap64Bit.h b/src/system/kernel/arch/x86/paging/64bit/X86VMTranslationMap64Bit.h index 44747f93a9..15cfdaf7cd 100644 --- a/src/system/kernel/arch/x86/paging/64bit/X86VMTranslationMap64Bit.h +++ b/src/system/kernel/arch/x86/paging/64bit/X86VMTranslationMap64Bit.h @@ -28,9 +28,6 @@ struct X86VMTranslationMap64Bit final : X86VMTranslationMap { vm_page_reservation* reservation); virtual status_t Unmap(addr_t start, addr_t end); - virtual status_t DebugMarkRangePresent(addr_t start, addr_t end, - bool markPresent); - virtual status_t UnmapPage(VMArea* area, addr_t address, bool updatePageQueue, bool deletingAddressSpace, uint32* _flags); diff --git a/src/system/kernel/arch/x86/paging/pae/X86VMTranslationMapPAE.cpp b/src/system/kernel/arch/x86/paging/pae/X86VMTranslationMapPAE.cpp index 0f25e0b115..62d141db08 100644 --- a/src/system/kernel/arch/x86/paging/pae/X86VMTranslationMapPAE.cpp +++ b/src/system/kernel/arch/x86/paging/pae/X86VMTranslationMapPAE.cpp @@ -499,64 +499,6 @@ X86VMTranslationMapPAE::Unmap(addr_t start, addr_t end) } -status_t -X86VMTranslationMapPAE::DebugMarkRangePresent(addr_t start, addr_t end, - bool markPresent) -{ - start = ROUNDDOWN(start, B_PAGE_SIZE); - if (start >= end) - return B_OK; - - do { - pae_page_directory_entry* pageDirEntry - = X86PagingMethodPAE::PageDirEntryForAddress( - fPagingStructures->VirtualPageDirs(), start); - if ((*pageDirEntry & X86_PAE_PDE_PRESENT) == 0) { - // no page table here, move the start up to access the next page - // table - start = ROUNDUP(start + 1, kPAEPageTableRange); - continue; - } - - Thread* thread = thread_get_current_thread(); - ThreadCPUPinner pinner(thread); - - pae_page_table_entry* pageTable - = (pae_page_table_entry*)fPageMapper->GetPageTableAt( - *pageDirEntry & X86_PAE_PDE_ADDRESS_MASK); - - uint32 index = start / B_PAGE_SIZE % kPAEPageTableEntryCount; - for (; index < kPAEPageTableEntryCount && start < end; - index++, start += B_PAGE_SIZE) { - - if ((pageTable[index] & X86_PAE_PTE_PRESENT) == 0) { - if (!markPresent) - continue; - - X86PagingMethodPAE::SetTableEntryFlags( - &pageTable[index], X86_PAE_PTE_PRESENT); - } else { - if (markPresent) - continue; - - pae_page_table_entry oldEntry - = X86PagingMethodPAE::ClearTableEntryFlags( - &pageTable[index], X86_PAE_PTE_PRESENT); - - if ((oldEntry & X86_PAE_PTE_ACCESSED) != 0) { - // Note, that we only need to invalidate the address, if the - // accessed flags was set, since only then the entry could - // have been in any TLB. - InvalidatePage(start); - } - } - } - } while (start != 0 && start < end); - - return B_OK; -} - - status_t X86VMTranslationMapPAE::UnmapPage(VMArea* area, addr_t address, bool updatePageQueue, bool deletingAddressSpace, uint32* _flags) diff --git a/src/system/kernel/arch/x86/paging/pae/X86VMTranslationMapPAE.h b/src/system/kernel/arch/x86/paging/pae/X86VMTranslationMapPAE.h index c55422486f..7330f3e48f 100644 --- a/src/system/kernel/arch/x86/paging/pae/X86VMTranslationMapPAE.h +++ b/src/system/kernel/arch/x86/paging/pae/X86VMTranslationMapPAE.h @@ -30,9 +30,6 @@ struct X86VMTranslationMapPAE final : X86VMTranslationMap { vm_page_reservation* reservation); virtual status_t Unmap(addr_t start, addr_t end); - virtual status_t DebugMarkRangePresent(addr_t start, addr_t end, - bool markPresent); - virtual status_t UnmapPage(VMArea* area, addr_t address, bool updatePageQueue, bool deletingAddressSpace, uint32* _flags); diff --git a/src/system/kernel/vm/VMTranslationMap.cpp b/src/system/kernel/vm/VMTranslationMap.cpp index e01bef0083..d20bc2815c 100644 --- a/src/system/kernel/vm/VMTranslationMap.cpp +++ b/src/system/kernel/vm/VMTranslationMap.cpp @@ -31,14 +31,6 @@ VMTranslationMap::~VMTranslationMap() } -status_t -VMTranslationMap::DebugMarkRangePresent(addr_t start, addr_t end, - bool markPresent) -{ - return B_NOT_SUPPORTED; -} - - /*! Unmaps a range of pages of an area. The default implementation just iterates over all virtual pages of the diff --git a/src/system/kernel/vm/vm.cpp b/src/system/kernel/vm/vm.cpp index 27e77900fe..ae59ebf406 100644 --- a/src/system/kernel/vm/vm.cpp +++ b/src/system/kernel/vm/vm.cpp @@ -1452,95 +1452,6 @@ wait_if_address_range_is_wired(VMAddressSpace* addressSpace, addr_t base, } -/*! Prepares an area to be used for vm_set_kernel_area_debug_protection(). - It must be called in a situation where the kernel address space may be - locked. -*/ -status_t -vm_prepare_kernel_area_debug_protection(area_id id, void** cookie) -{ - AddressSpaceReadLocker locker; - VMArea* area; - status_t status = locker.SetFromArea(id, area); - if (status != B_OK) - return status; - - if (area->page_protections == NULL) { - status = allocate_area_page_protections(area); - if (status != B_OK) - return status; - } - - *cookie = (void*)area; - return B_OK; -} - - -/*! This is a debug helper function that can only be used with very specific - use cases. - Sets protection for the given address range to the protection specified. - If \a protection is 0 then the involved pages will be marked non-present - in the translation map to cause a fault on access. The pages aren't - actually unmapped however so that they can be marked present again with - additional calls to this function. For this to work the area must be - fully locked in memory so that the pages aren't otherwise touched. - This function does not lock the kernel address space and needs to be - supplied with a \a cookie retrieved from a successful call to - vm_prepare_kernel_area_debug_protection(). -*/ -status_t -vm_set_kernel_area_debug_protection(void* cookie, void* _address, size_t size, - uint32 protection) -{ - // check address range - addr_t address = (addr_t)_address; - size = PAGE_ALIGN(size); - - if ((address % B_PAGE_SIZE) != 0 - || (addr_t)address + size < (addr_t)address - || !IS_KERNEL_ADDRESS(address) - || !IS_KERNEL_ADDRESS((addr_t)address + size)) { - return B_BAD_VALUE; - } - - // Translate the kernel protection to user protection as we only store that. - if ((protection & B_KERNEL_READ_AREA) != 0) - protection |= B_READ_AREA; - if ((protection & B_KERNEL_WRITE_AREA) != 0) - protection |= B_WRITE_AREA; - - VMAddressSpace* addressSpace = VMAddressSpace::GetKernel(); - VMTranslationMap* map = addressSpace->TranslationMap(); - VMArea* area = (VMArea*)cookie; - - addr_t offset = address - area->Base(); - if (area->Size() - offset < size) { - panic("protect range not fully within supplied area"); - return B_BAD_VALUE; - } - - if (area->page_protections == NULL) { - panic("area has no page protections"); - return B_BAD_VALUE; - } - - // Invalidate the mapping entries so any access to them will fault or - // restore the mapping entries unchanged so that lookup will success again. - map->Lock(); - map->DebugMarkRangePresent(address, address + size, protection != 0); - map->Unlock(); - - // And set the proper page protections so that the fault case will actually - // fail and not simply try to map a new page. - for (addr_t pageAddress = address; pageAddress < address + size; - pageAddress += B_PAGE_SIZE) { - set_area_page_protection(area, pageAddress, protection); - } - - return B_OK; -} - - status_t vm_block_address_range(const char* name, void* address, addr_t size) {