forked from Bananymous/banan-os
				
			Kernel: Move current page table to Processor
APs can now map kernel page table and print current time!
This commit is contained in:
		
							parent
							
								
									f0105cb7fb
								
							
						
					
					
						commit
						54f64e7618
					
				| 
						 | 
				
			
			@ -20,7 +20,6 @@ namespace Kernel
 | 
			
		|||
	RecursiveSpinLock PageTable::s_fast_page_lock;
 | 
			
		||||
 | 
			
		||||
	static PageTable* s_kernel = nullptr;
 | 
			
		||||
	static PageTable* s_current = nullptr;
 | 
			
		||||
	static bool s_has_nxe = false;
 | 
			
		||||
	static bool s_has_pge = false;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -71,40 +70,51 @@ namespace Kernel
 | 
			
		|||
	void PageTable::initialize()
 | 
			
		||||
	{
 | 
			
		||||
		if (CPUID::has_nxe())
 | 
			
		||||
		{
 | 
			
		||||
			asm volatile(
 | 
			
		||||
				"movl $0xC0000080, %ecx;"
 | 
			
		||||
				"rdmsr;"
 | 
			
		||||
				"orl $0x800, %eax;"
 | 
			
		||||
				"wrmsr"
 | 
			
		||||
			);
 | 
			
		||||
			s_has_nxe = true;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		uint32_t ecx, edx;
 | 
			
		||||
		CPUID::get_features(ecx, edx);
 | 
			
		||||
		if (edx & CPUID::EDX_PGE)
 | 
			
		||||
		{
 | 
			
		||||
			asm volatile(
 | 
			
		||||
				"movq %cr4, %rax;"
 | 
			
		||||
				"orq $0x80, %rax;"
 | 
			
		||||
				"movq %rax, %cr4;"
 | 
			
		||||
			);
 | 
			
		||||
		if (CPUID::has_pge())
 | 
			
		||||
			s_has_pge = true;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// enable write protect to kernel
 | 
			
		||||
		asm volatile(
 | 
			
		||||
			"movq %cr0, %rax;"
 | 
			
		||||
			"orq $0x10000, %rax;"
 | 
			
		||||
			"movq %rax, %cr0;"
 | 
			
		||||
		);
 | 
			
		||||
 | 
			
		||||
		ASSERT(s_kernel == nullptr);
 | 
			
		||||
		s_kernel = new PageTable();
 | 
			
		||||
		ASSERT(s_kernel);
 | 
			
		||||
 | 
			
		||||
		s_kernel->initialize_kernel();
 | 
			
		||||
		s_kernel->load();
 | 
			
		||||
		s_kernel->initial_load();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void PageTable::initial_load()
 | 
			
		||||
	{
 | 
			
		||||
		if (s_has_nxe)
 | 
			
		||||
		{
 | 
			
		||||
			asm volatile(
 | 
			
		||||
				"movl $0xC0000080, %%ecx;"
 | 
			
		||||
				"rdmsr;"
 | 
			
		||||
				"orl $0x800, %%eax;"
 | 
			
		||||
				"wrmsr"
 | 
			
		||||
				::: "eax", "ecx", "edx", "memory"
 | 
			
		||||
			);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (s_has_pge)
 | 
			
		||||
		{
 | 
			
		||||
			asm volatile(
 | 
			
		||||
				"movq %%cr4, %%rax;"
 | 
			
		||||
				"orq $0x80, %%rax;"
 | 
			
		||||
				"movq %%rax, %%cr4;"
 | 
			
		||||
				::: "rax"
 | 
			
		||||
			);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// enable write protect
 | 
			
		||||
		asm volatile(
 | 
			
		||||
			"movq %%cr0, %%rax;"
 | 
			
		||||
			"orq $0x10000, %%rax;"
 | 
			
		||||
			"movq %%rax, %%cr0;"
 | 
			
		||||
			::: "rax"
 | 
			
		||||
		);
 | 
			
		||||
 | 
			
		||||
		load();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	PageTable& PageTable::kernel()
 | 
			
		||||
| 
						 | 
				
			
			@ -113,12 +123,6 @@ namespace Kernel
 | 
			
		|||
		return *s_kernel;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	PageTable& PageTable::current()
 | 
			
		||||
	{
 | 
			
		||||
		ASSERT(s_current);
 | 
			
		||||
		return *s_current;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	bool PageTable::is_valid_pointer(uintptr_t pointer)
 | 
			
		||||
	{
 | 
			
		||||
		if (!is_canonical(pointer))
 | 
			
		||||
| 
						 | 
				
			
			@ -308,7 +312,7 @@ namespace Kernel
 | 
			
		|||
	{
 | 
			
		||||
		SpinLockGuard _(m_lock);
 | 
			
		||||
		asm volatile("movq %0, %%cr3" :: "r"(m_highest_paging_struct));
 | 
			
		||||
		s_current = this;
 | 
			
		||||
		Processor::current().m_current_page_table = this;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void PageTable::invalidate(vaddr_t vaddr)
 | 
			
		||||
| 
						 | 
				
			
			@ -367,8 +371,6 @@ namespace Kernel
 | 
			
		|||
	{
 | 
			
		||||
		ASSERT(vaddr);
 | 
			
		||||
		ASSERT(vaddr != fast_page());
 | 
			
		||||
		if (vaddr >= KERNEL_OFFSET && s_current)
 | 
			
		||||
			ASSERT(vaddr >= (vaddr_t)g_kernel_start);
 | 
			
		||||
		if ((vaddr >= KERNEL_OFFSET) != (this == s_kernel))
 | 
			
		||||
			Kernel::panic("mapping {8H} to {8H}, kernel: {}", paddr, vaddr, this == s_kernel);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -78,5 +78,6 @@ namespace CPUID
 | 
			
		|||
	void get_features(uint32_t& ecx, uint32_t& edx);
 | 
			
		||||
	bool is_64_bit();
 | 
			
		||||
	bool has_nxe();
 | 
			
		||||
	bool has_pge();
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,7 +40,7 @@ namespace Kernel
 | 
			
		|||
		static void initialize();
 | 
			
		||||
 | 
			
		||||
		static PageTable& kernel();
 | 
			
		||||
		static PageTable& current();
 | 
			
		||||
		static PageTable& current() { return *reinterpret_cast<PageTable*>(Processor::current().m_current_page_table); }
 | 
			
		||||
 | 
			
		||||
		static constexpr vaddr_t fast_page() { return KERNEL_OFFSET; }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -109,6 +109,7 @@ namespace Kernel
 | 
			
		|||
		vaddr_t reserve_free_contiguous_pages(size_t page_count, vaddr_t first_address, vaddr_t last_address = UINTPTR_MAX);
 | 
			
		||||
 | 
			
		||||
		void load();
 | 
			
		||||
		void initial_load();
 | 
			
		||||
 | 
			
		||||
		InterruptState lock() const { return m_lock.lock(); }
 | 
			
		||||
		void unlock(InterruptState state) const { m_lock.unlock(state); }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -87,7 +87,10 @@ namespace Kernel
 | 
			
		|||
		GDT* m_gdt { nullptr };
 | 
			
		||||
		IDT* m_idt { nullptr };
 | 
			
		||||
 | 
			
		||||
		void* m_current_page_table { nullptr };
 | 
			
		||||
 | 
			
		||||
		friend class BAN::Vector<Processor>;
 | 
			
		||||
		friend class PageTable;
 | 
			
		||||
	};
 | 
			
		||||
#else
 | 
			
		||||
	#error
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -50,6 +50,13 @@ namespace CPUID
 | 
			
		|||
		return buffer[3] & (1 << 20);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	bool has_pge()
 | 
			
		||||
	{
 | 
			
		||||
		uint32_t ecx, edx;
 | 
			
		||||
		get_features(ecx, edx);
 | 
			
		||||
		return edx & CPUID::EDX_PGE;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	const char* feature_string_ecx(uint32_t feat)
 | 
			
		||||
	{
 | 
			
		||||
		switch (feat)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -107,6 +107,7 @@ extern "C" void kernel_main(uint32_t boot_magic, uint32_t boot_info)
 | 
			
		|||
	dprintln("BSP initialized");
 | 
			
		||||
 | 
			
		||||
	PageTable::initialize();
 | 
			
		||||
	PageTable::kernel().initial_load();
 | 
			
		||||
	dprintln("PageTable initialized");
 | 
			
		||||
 | 
			
		||||
	Heap::initialize();
 | 
			
		||||
| 
						 | 
				
			
			@ -211,8 +212,10 @@ extern "C" void ap_main()
 | 
			
		|||
	using namespace Kernel;
 | 
			
		||||
 | 
			
		||||
	Processor::current().initialize();
 | 
			
		||||
	PageTable::kernel().initial_load();
 | 
			
		||||
 | 
			
		||||
	dprintln("ap{} initialized", Processor::current_id());
 | 
			
		||||
 | 
			
		||||
	for (;;)
 | 
			
		||||
		asm volatile("");
 | 
			
		||||
		asm volatile("hlt");
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue