@@ -310,60 +310,58 @@ PageFaultResponse MemoryManager::handle_page_fault(const PageFault& fault)
310310
311311OwnPtr<Region> MemoryManager::allocate_kernel_region (size_t size, const StringView& name, u8 access, bool user_accessible, bool should_commit, bool cacheable)
312312{
313- InterruptDisabler disabler;
314313 ASSERT (!(size % PAGE_SIZE));
315314 auto range = kernel_page_directory ().range_allocator ().allocate_anywhere (size);
316- ASSERT (range.is_valid ());
315+ if (!range.is_valid ())
316+ return nullptr ;
317317 auto vmobject = AnonymousVMObject::create_with_size (size);
318- OwnPtr<Region> region;
319- if (user_accessible)
320- region = Region::create_user_accessible (range, vmobject, 0 , name, access, cacheable);
321- else
322- region = Region::create_kernel_only (range, vmobject, 0 , name, access, cacheable);
323- region->map (kernel_page_directory ());
318+ auto region = allocate_kernel_region_with_vmobject (range, vmobject, name, access, user_accessible, cacheable);
319+ if (!region)
320+ return nullptr ;
324321 if (should_commit)
325322 region->commit ();
326323 return region;
327324}
328325
329326OwnPtr<Region> MemoryManager::allocate_kernel_region (PhysicalAddress paddr, size_t size, const StringView& name, u8 access, bool user_accessible, bool cacheable)
330327{
331- InterruptDisabler disabler;
332328 ASSERT (!(size % PAGE_SIZE));
333329 auto range = kernel_page_directory ().range_allocator ().allocate_anywhere (size);
334- ASSERT (range.is_valid ());
330+ if (!range.is_valid ())
331+ return nullptr ;
335332 auto vmobject = AnonymousVMObject::create_for_physical_range (paddr, size);
336333 if (!vmobject)
337334 return nullptr ;
338- OwnPtr<Region> region;
339- if (user_accessible)
340- region = Region::create_user_accessible (range, vmobject.release_nonnull (), 0 , name, access, cacheable);
341- else
342- region = Region::create_kernel_only (range, vmobject.release_nonnull (), 0 , name, access, cacheable);
343- region->map (kernel_page_directory ());
344- return region;
335+ return allocate_kernel_region_with_vmobject (range, *vmobject, name, access, user_accessible, cacheable);
345336}
346337
347338OwnPtr<Region> MemoryManager::allocate_user_accessible_kernel_region (size_t size, const StringView& name, u8 access, bool cacheable)
348339{
349340 return allocate_kernel_region (size, name, access, true , true , cacheable);
350341}
351342
352- OwnPtr<Region> MemoryManager::allocate_kernel_region_with_vmobject (VMObject& vmobject, size_t size , const StringView& name, u8 access, bool user_accessible, bool cacheable)
343+ OwnPtr<Region> MemoryManager::allocate_kernel_region_with_vmobject (const Range& range, VMObject& vmobject , const StringView& name, u8 access, bool user_accessible, bool cacheable)
353344{
354345 InterruptDisabler disabler;
355- ASSERT (!(size % PAGE_SIZE));
356- auto range = kernel_page_directory ().range_allocator ().allocate_anywhere (size);
357- ASSERT (range.is_valid ());
358346 OwnPtr<Region> region;
359347 if (user_accessible)
360348 region = Region::create_user_accessible (range, vmobject, 0 , name, access, cacheable);
361349 else
362350 region = Region::create_kernel_only (range, vmobject, 0 , name, access, cacheable);
363- region->map (kernel_page_directory ());
351+ if (region)
352+ region->map (kernel_page_directory ());
364353 return region;
365354}
366355
356+ OwnPtr<Region> MemoryManager::allocate_kernel_region_with_vmobject (VMObject& vmobject, size_t size, const StringView& name, u8 access, bool user_accessible, bool cacheable)
357+ {
358+ ASSERT (!(size % PAGE_SIZE));
359+ auto range = kernel_page_directory ().range_allocator ().allocate_anywhere (size);
360+ if (!range.is_valid ())
361+ return nullptr ;
362+ return allocate_kernel_region_with_vmobject (range, vmobject, name, access, user_accessible, cacheable);
363+ }
364+
367365void MemoryManager::deallocate_user_physical_page (PhysicalPage&& page)
368366{
369367 for (auto & region : m_user_physical_regions) {
0 commit comments