1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 20:47:45 +00:00

Kernel: Create and use USER_RANGE_CEILING

We had an inconsistency in valid user addresses. is_user_range() was
checking against the kernel base address, but previous changes caused
the maximum valid user addressable range to be 32 MiB below that.

This patch stops mmap(MAP_FIXED) of a range between these two bounds
from panic-ing the kernel in RangeAllocator::allocate_specific.
This commit is contained in:
Andrew Kaster 2021-07-06 20:25:22 -06:00 committed by Andreas Kling
parent ab196b484a
commit 578d45b480
3 changed files with 4 additions and 2 deletions

View file

@ -19,3 +19,5 @@
#define KERNEL_QUICKMAP_PD (KERNEL_PT1024_BASE + 0x7000) #define KERNEL_QUICKMAP_PD (KERNEL_PT1024_BASE + 0x7000)
#define KERNEL_QUICKMAP_PER_CPU_BASE (KERNEL_PT1024_BASE + 0x8000) #define KERNEL_QUICKMAP_PER_CPU_BASE (KERNEL_PT1024_BASE + 0x8000)
#define KERNEL_PHYSICAL_PAGES_BASE (KERNEL_BASE + KERNEL_PD_OFFSET) #define KERNEL_PHYSICAL_PAGES_BASE (KERNEL_BASE + KERNEL_PD_OFFSET)
#define USER_RANGE_CEILING 0xBE000000

View file

@ -278,7 +278,7 @@ void VMObject::for_each_region(Callback callback)
inline bool is_user_address(VirtualAddress vaddr) inline bool is_user_address(VirtualAddress vaddr)
{ {
return vaddr.get() < KERNEL_BASE; return vaddr.get() < USER_RANGE_CEILING;
} }
inline bool is_user_range(VirtualAddress vaddr, size_t size) inline bool is_user_range(VirtualAddress vaddr, size_t size)

View file

@ -63,7 +63,7 @@ UNMAP_AFTER_INIT void PageDirectory::allocate_kernel_directory()
PageDirectory::PageDirectory(const RangeAllocator* parent_range_allocator) PageDirectory::PageDirectory(const RangeAllocator* parent_range_allocator)
{ {
constexpr FlatPtr userspace_range_base = 0x00800000; constexpr FlatPtr userspace_range_base = 0x00800000;
constexpr FlatPtr userspace_range_ceiling = 0xbe000000; constexpr FlatPtr userspace_range_ceiling = USER_RANGE_CEILING;
ScopedSpinLock lock(s_mm_lock); ScopedSpinLock lock(s_mm_lock);
if (parent_range_allocator) { if (parent_range_allocator) {