Kernel: Remove duplicate code in VirtualRange::create_to_vaddr_range
This commit is contained in:
		
							parent
							
								
									d7ecf94347
								
							
						
					
					
						commit
						d9a5e471f5
					
				|  | @ -56,39 +56,14 @@ namespace Kernel | |||
| 		ASSERT(vaddr_start < vaddr_end); | ||||
| 		ASSERT(vaddr_end - vaddr_start + 1 >= size / PAGE_SIZE); | ||||
| 
 | ||||
| 		VirtualRange* result_ptr = new VirtualRange(page_table); | ||||
| 		if (result_ptr == nullptr) | ||||
| 			return BAN::Error::from_errno(ENOMEM); | ||||
| 		auto result = BAN::UniqPtr<VirtualRange>::adopt(result_ptr); | ||||
| 
 | ||||
| 		result->m_kmalloc = false; | ||||
| 		result->m_vaddr = 0; | ||||
| 		result->m_size = size; | ||||
| 		result->m_flags = flags; | ||||
| 
 | ||||
| 		vaddr_t vaddr = page_table.reserve_free_contiguous_pages(size / PAGE_SIZE, vaddr_start, vaddr_end); | ||||
| 		if (vaddr == 0) | ||||
| 			return BAN::Error::from_errno(ENOMEM); | ||||
| 		ASSERT(vaddr + size <= vaddr_end); | ||||
| 		result->m_vaddr = vaddr; | ||||
| 
 | ||||
| 		size_t needed_pages = size / PAGE_SIZE; | ||||
| 
 | ||||
| 		for (size_t i = 0; i < needed_pages; i++) | ||||
| 		{ | ||||
| 			paddr_t paddr = Heap::get().take_free_page(); | ||||
| 			if (paddr == 0) | ||||
| 			{ | ||||
| 				for (size_t j = 0; j < i; j++) | ||||
| 					Heap::get().release_page(page_table.physical_address_of(vaddr + j * PAGE_SIZE)); | ||||
| 				page_table.unmap_range(vaddr, size); | ||||
| 				result->m_vaddr = 0; | ||||
| 				return BAN::Error::from_errno(ENOMEM); | ||||
| 			} | ||||
| 			page_table.map_page_at(paddr, vaddr + i * PAGE_SIZE, flags); | ||||
| 		} | ||||
| 
 | ||||
| 		return result; | ||||
| 		LockGuard _(page_table); | ||||
| 		page_table.unmap_range(vaddr, size); // We have to unmap here to allow reservation in create_to_vaddr()
 | ||||
| 		return create_to_vaddr(page_table, vaddr, size, flags); | ||||
| 	} | ||||
| 
 | ||||
| 	BAN::ErrorOr<BAN::UniqPtr<VirtualRange>> VirtualRange::create_kmalloc(size_t size) | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue