forked from Bananymous/banan-os
				
			
			update main #1
			
				
			
		
		
		
	| 
						 | 
					@ -27,6 +27,8 @@ namespace LibELF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	LoadableELF::~LoadableELF()
 | 
						LoadableELF::~LoadableELF()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
							if (!m_loaded)
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
		for (const auto& program_header : m_program_headers)
 | 
							for (const auto& program_header : m_program_headers)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			switch (program_header.p_type)
 | 
								switch (program_header.p_type)
 | 
				
			||||||
| 
						 | 
					@ -155,6 +157,29 @@ namespace LibELF
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool LoadableELF::is_address_space_free() const
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							for (const auto& program_header : m_program_headers)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								switch (program_header.p_type)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									case PT_NULL:
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
									case PT_LOAD:
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										vaddr_t page_vaddr = program_header.p_vaddr & PAGE_ADDR_MASK;
 | 
				
			||||||
 | 
										size_t pages = range_page_count(program_header.p_vaddr, program_header.p_memsz);
 | 
				
			||||||
 | 
										if (!m_page_table.is_range_free(page_vaddr, pages * PAGE_SIZE))
 | 
				
			||||||
 | 
											return false;
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									default:
 | 
				
			||||||
 | 
										ASSERT_NOT_REACHED();
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void LoadableELF::reserve_address_space()
 | 
						void LoadableELF::reserve_address_space()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		for (const auto& program_header : m_program_headers)
 | 
							for (const auto& program_header : m_program_headers)
 | 
				
			||||||
| 
						 | 
					@ -174,6 +199,7 @@ namespace LibELF
 | 
				
			||||||
					ASSERT_NOT_REACHED();
 | 
										ASSERT_NOT_REACHED();
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							m_loaded = true;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	BAN::ErrorOr<void> LoadableELF::load_page_to_memory(vaddr_t address)
 | 
						BAN::ErrorOr<void> LoadableELF::load_page_to_memory(vaddr_t address)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,6 +27,7 @@ namespace LibELF
 | 
				
			||||||
		Kernel::vaddr_t entry_point() const;
 | 
							Kernel::vaddr_t entry_point() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		bool contains(Kernel::vaddr_t address) const;
 | 
							bool contains(Kernel::vaddr_t address) const;
 | 
				
			||||||
 | 
							bool is_address_space_free() const;
 | 
				
			||||||
		void reserve_address_space();
 | 
							void reserve_address_space();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		BAN::ErrorOr<void> load_page_to_memory(Kernel::vaddr_t address);
 | 
							BAN::ErrorOr<void> load_page_to_memory(Kernel::vaddr_t address);
 | 
				
			||||||
| 
						 | 
					@ -47,6 +48,7 @@ namespace LibELF
 | 
				
			||||||
		BAN::Vector<ElfNativeProgramHeader>	m_program_headers;
 | 
							BAN::Vector<ElfNativeProgramHeader>	m_program_headers;
 | 
				
			||||||
		size_t m_virtual_page_count = 0;
 | 
							size_t m_virtual_page_count = 0;
 | 
				
			||||||
		size_t m_physical_page_count = 0;
 | 
							size_t m_physical_page_count = 0;
 | 
				
			||||||
 | 
							bool m_loaded { false };
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -123,6 +123,11 @@ namespace Kernel
 | 
				
			||||||
		TRY(process->m_cmdline.back().append(path));
 | 
							TRY(process->m_cmdline.back().append(path));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		process->m_loadable_elf = TRY(load_elf_for_exec(credentials, path, "/"sv, process->page_table()));
 | 
							process->m_loadable_elf = TRY(load_elf_for_exec(credentials, path, "/"sv, process->page_table()));
 | 
				
			||||||
 | 
							if (!process->m_loadable_elf->is_address_space_free())
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								dprintln("Could not load ELF address space");
 | 
				
			||||||
 | 
								return BAN::Error::from_errno(ENOEXEC);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		process->m_loadable_elf->reserve_address_space();
 | 
							process->m_loadable_elf->reserve_address_space();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		process->m_is_userspace = true;
 | 
							process->m_is_userspace = true;
 | 
				
			||||||
| 
						 | 
					@ -460,6 +465,11 @@ namespace Kernel
 | 
				
			||||||
			m_loadable_elf.clear();
 | 
								m_loadable_elf.clear();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			m_loadable_elf = TRY(load_elf_for_exec(m_credentials, executable_path, m_working_directory, page_table()));
 | 
								m_loadable_elf = TRY(load_elf_for_exec(m_credentials, executable_path, m_working_directory, page_table()));
 | 
				
			||||||
 | 
								if (!m_loadable_elf->is_address_space_free())
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									dprintln("ELF has unloadable address space");
 | 
				
			||||||
 | 
									MUST(sys_raise(SIGKILL));
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			m_loadable_elf->reserve_address_space();
 | 
								m_loadable_elf->reserve_address_space();
 | 
				
			||||||
			m_userspace_info.entry = m_loadable_elf->entry_point();
 | 
								m_userspace_info.entry = m_loadable_elf->entry_point();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue