Kernel/LibC: add flag to enable/disable sse support
SSE support is very experimental and causes GP. I decided to make SSE not default until I get to fixing it :)
This commit is contained in:
		
							parent
							
								
									f662aa6da2
								
							
						
					
					
						commit
						fe2dca16f0
					
				|  | @ -20,6 +20,9 @@ if(NOT EXISTS ${CMAKE_CXX_COMPILER}) | |||
| 	set(CMAKE_CXX_COMPILER g++) | ||||
| endif() | ||||
| 
 | ||||
| add_compile_options(-mno-sse -mno-sse2) | ||||
| add_compile_definitions(__enable_sse=0) | ||||
| 
 | ||||
| project(banan-os CXX) | ||||
| 
 | ||||
| set(BANAN_BASE_SYSROOT ${CMAKE_SOURCE_DIR}/base-sysroot.tar.gz) | ||||
|  |  | |||
|  | @ -139,10 +139,11 @@ namespace IDT | |||
| 
 | ||||
| 	extern "C" void cpp_isr_handler(uint64_t isr, uint64_t error, Kernel::InterruptStack& interrupt_stack, const Registers* regs) | ||||
| 	{ | ||||
| #if __enable_sse | ||||
| 		bool from_userspace = (interrupt_stack.cs & 0b11) == 0b11; | ||||
| 
 | ||||
| 		if (from_userspace) | ||||
| 			Kernel::Thread::current().save_sse(); | ||||
| #endif | ||||
| 
 | ||||
| 		pid_t tid = Kernel::Scheduler::current_tid(); | ||||
| 		pid_t pid = tid ? Kernel::Process::current().pid() : 0; | ||||
|  | @ -205,19 +206,22 @@ namespace IDT | |||
| 
 | ||||
| 		ASSERT(Kernel::Thread::current().state() != Kernel::Thread::State::Terminated); | ||||
| 
 | ||||
| #if __enable_sse | ||||
| 		if (from_userspace) | ||||
| 		{ | ||||
| 			ASSERT(Kernel::Thread::current().state() == Kernel::Thread::State::Executing); | ||||
| 			Kernel::Thread::current().load_sse(); | ||||
| 		} | ||||
| #endif | ||||
| 	} | ||||
| 
 | ||||
| 	extern "C" void cpp_irq_handler(uint64_t irq, Kernel::InterruptStack& interrupt_stack) | ||||
| 	{ | ||||
| #if __enable_sse | ||||
| 		bool from_userspace = (interrupt_stack.cs & 0b11) == 0b11; | ||||
| 
 | ||||
| 		if (from_userspace) | ||||
| 			Kernel::Thread::current().save_sse(); | ||||
| #endif | ||||
| 
 | ||||
| 		if (Kernel::Scheduler::current_tid()) | ||||
| 		{ | ||||
|  | @ -240,11 +244,13 @@ namespace IDT | |||
| 
 | ||||
| 		ASSERT(Kernel::Thread::current().state() != Kernel::Thread::State::Terminated); | ||||
| 
 | ||||
| #if __enable_sse | ||||
| 		if (from_userspace) | ||||
| 		{ | ||||
| 			ASSERT(Kernel::Thread::current().state() == Kernel::Thread::State::Executing); | ||||
| 			Kernel::Thread::current().load_sse(); | ||||
| 		} | ||||
| #endif | ||||
| 	} | ||||
| 
 | ||||
| 	static void flush_idt() | ||||
|  |  | |||
|  | @ -82,8 +82,10 @@ namespace Kernel | |||
| 
 | ||||
| 		bool is_userspace() const { return m_is_userspace; } | ||||
| 
 | ||||
| #if __enable_sse | ||||
| 		void save_sse() { asm volatile("fxsave %0" :: "m"(m_sse_storage)); } | ||||
| 		void load_sse() { asm volatile("fxrstor %0" :: "m"(m_sse_storage)); } | ||||
| #endif | ||||
| 
 | ||||
| 	private: | ||||
| 		Thread(pid_t tid, Process*); | ||||
|  | @ -114,7 +116,9 @@ namespace Kernel | |||
| 
 | ||||
| 		uint64_t m_terminate_blockers { 0 }; | ||||
| 
 | ||||
| #if __enable_sse | ||||
| 		alignas(16) uint8_t m_sse_storage[512] {}; | ||||
| #endif | ||||
| 
 | ||||
| 		friend class Scheduler; | ||||
| 	}; | ||||
|  |  | |||
|  | @ -32,7 +32,9 @@ namespace Kernel | |||
| 			return 0; | ||||
| 		} | ||||
| 
 | ||||
| #if __enable_sse | ||||
| 		Thread::current().save_sse(); | ||||
| #endif | ||||
| 
 | ||||
| 		asm volatile("sti"); | ||||
| 
 | ||||
|  | @ -205,7 +207,10 @@ namespace Kernel | |||
| 			Kernel::panic("Kernel error while returning to userspace {}", ret.error()); | ||||
| 
 | ||||
| 		ASSERT(Kernel::Thread::current().state() == Kernel::Thread::State::Executing); | ||||
| 
 | ||||
| #if __enable_sse | ||||
| 		Thread::current().load_sse(); | ||||
| #endif | ||||
| 
 | ||||
| 		if (ret.is_error()) | ||||
| 			return -ret.error().get_error_code(); | ||||
|  |  | |||
|  | @ -104,6 +104,7 @@ static void integer_to_string(char* buffer, T value, int base, bool upper, forma | |||
| 	buffer[offset++] = '\0'; | ||||
| } | ||||
| 
 | ||||
| #if __enable_sse | ||||
| template<BAN::floating_point T> | ||||
| static void floating_point_to_string(char* buffer, T value, bool upper, const format_options_t options) | ||||
| { | ||||
|  | @ -227,6 +228,7 @@ static void floating_point_to_exponent_string(char* buffer, T value, bool upper, | |||
| 	exponent_options.width = 3; | ||||
| 	integer_to_string<int>(buffer + offset, exponent, 10, upper, exponent_options); | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| extern "C" int printf_impl(const char* format, va_list arguments, int (*putc_fun)(int, void*), void* data) | ||||
| { | ||||
|  | @ -349,6 +351,7 @@ extern "C" int printf_impl(const char* format, va_list arguments, int (*putc_fun | |||
| 				format++; | ||||
| 				break; | ||||
| 			} | ||||
| #if __enable_sse | ||||
| 			case 'e': | ||||
| 			case 'E': | ||||
| 			{ | ||||
|  | @ -367,6 +370,7 @@ extern "C" int printf_impl(const char* format, va_list arguments, int (*putc_fun | |||
| 				format++; | ||||
| 				break; | ||||
| 			} | ||||
| #endif | ||||
| 			case 'g': | ||||
| 			case 'G': | ||||
| 				// TODO
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue