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:
parent
ab196b484a
commit
578d45b480
3 changed files with 4 additions and 2 deletions
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue