Kernel: lol
This commit is contained in:
		
							parent
							
								
									68e88d9413
								
							
						
					
					
						commit
						334abe6b27
					
				|  | @ -0,0 +1,3 @@ | ||||||
|  | *.a | ||||||
|  | *.d | ||||||
|  | *.o | ||||||
|  | @ -15,7 +15,7 @@ LIBDIR?=$(EXEC_PREFIX)/lib | ||||||
|   |   | ||||||
| CFLAGS:=$(CFLAGS) -D__is_ban -Iinclude -ffreestanding -Wall -Wextra | CFLAGS:=$(CFLAGS) -D__is_ban -Iinclude -ffreestanding -Wall -Wextra | ||||||
| CPPFLAGS:=$(CPPFLAGS) | CPPFLAGS:=$(CPPFLAGS) | ||||||
| LIBK_CFLAGS:=$(CFLAGS) -D__is_bank | LIBK_CFLAGS:=$(CFLAGS) -D__is_kernel | ||||||
| LIBK_CPPFLAGS:=$(CPPFLAGS) | LIBK_CPPFLAGS:=$(CPPFLAGS) | ||||||
|   |   | ||||||
| ARCHDIR=arch/$(HOSTARCH) | ARCHDIR=arch/$(HOSTARCH) | ||||||
|  | @ -41,17 +41,17 @@ $(HOSTEDOBJS) \ | ||||||
|   |   | ||||||
| BANK_OBJS=$(FREEOBJS:.o=.bank.o) | BANK_OBJS=$(FREEOBJS:.o=.bank.o) | ||||||
|   |   | ||||||
| BINARIES=bank.a | BINARIES=libbank.a | ||||||
|   |   | ||||||
| .PHONY: all always clean install install-headers install-libs | .PHONY: all always clean install install-headers install-libs | ||||||
| .SUFFIXES: .o .bank.o .cpp .S | .SUFFIXES: .o .bank.o .cpp .S | ||||||
|   |   | ||||||
| all: $(BINARIES) | all: $(BINARIES) | ||||||
|   |   | ||||||
| ban.a: always $(OBJS) | libban.a: always $(OBJS) | ||||||
| 	cd $(BUILDDIR) && $(AR) rcs $@ $(OBJS) | 	cd $(BUILDDIR) && $(AR) rcs $@ $(OBJS) | ||||||
|   |   | ||||||
| bank.a: always $(LIBK_OBJS) | libbank.a: always $(LIBK_OBJS) | ||||||
| 	cd $(BUILDDIR) && $(AR) rcs $@ $(LIBK_OBJS) | 	cd $(BUILDDIR) && $(AR) rcs $@ $(LIBK_OBJS) | ||||||
|   |   | ||||||
| .cpp.o: | .cpp.o: | ||||||
|  |  | ||||||
|  | @ -1 +0,0 @@ | ||||||
| !<arch> |  | ||||||
|  | @ -2,14 +2,16 @@ | ||||||
| 
 | 
 | ||||||
| #include <BAN/Formatter.h> | #include <BAN/Formatter.h> | ||||||
| 
 | 
 | ||||||
| #if defined(__is_bank) | #include <string.h> | ||||||
|  | 
 | ||||||
|  | #if defined(__is_kernel) | ||||||
| 	#include <kernel/panic.h> | 	#include <kernel/panic.h> | ||||||
| 	#define MUST(error)	{ decltype(error) e = error; if (e.HasError()) { Kernel::panic("{}", e.GetError()); } } | 	#define MUST(error)	({ auto e = error; if (e.IsError()) Kernel::panic("{}", e.GetError()); }) | ||||||
| #else | #else | ||||||
| 	#error "NOT IMPLEMENTED" | 	#error "NOT IMPLEMENTED" | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #define TRY(error)	{ decltype(error) e = error; if (e.HasError()) return e; } | #define TRY(error) ({ auto e = error; if (e.IsError()) return e; e.Value(); }) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class Error | class Error | ||||||
|  | @ -59,6 +61,7 @@ public: | ||||||
| 
 | 
 | ||||||
| 	bool IsError() const			{ return m_error; } | 	bool IsError() const			{ return m_error; } | ||||||
| 	const Error& GetError() const	{ return *m_error; } | 	const Error& GetError() const	{ return *m_error; } | ||||||
|  | 	void Value()					{ } | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
| 	Error*	m_error; | 	Error*	m_error; | ||||||
|  |  | ||||||
|  | @ -1,9 +1,8 @@ | ||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
| #include <BAN/Errors.h> | #include <BAN/Errors.h> | ||||||
| #include <kernel/kmalloc.h> |  | ||||||
| 
 | 
 | ||||||
| #if defined(__is_bank) | #if defined(__is_kernel) | ||||||
| 	#include <kernel/kmalloc.h> | 	#include <kernel/kmalloc.h> | ||||||
| #else | #else | ||||||
| 	#include <stdlib.h> | 	#include <stdlib.h> | ||||||
|  | @ -21,12 +20,12 @@ namespace BAN | ||||||
| 	class Queue | 	class Queue | ||||||
| 	{ | 	{ | ||||||
| 	private: | 	private: | ||||||
| 	#if defined(__is_bank) | 	#if defined(__is_kernel) | ||||||
| 		using allocator = kmalloc; | 		static constexpr auto& allocator = kmalloc; | ||||||
| 		using deallocator = kfree; | 		static constexpr auto& deallocator = kfree; | ||||||
| 	#else | 	#else | ||||||
| 		using allocator = malloc; | 		static constexpr auto& allocator = malloc; | ||||||
| 		using deallocator = free; | 		static constexpr auto& deallocator = free; | ||||||
| 	#endif | 	#endif | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -59,13 +58,13 @@ namespace BAN | ||||||
| 	template<typename T> | 	template<typename T> | ||||||
| 	Queue<T>::~Queue() | 	Queue<T>::~Queue() | ||||||
| 	{ | 	{ | ||||||
| 		deallocator(m_data); | 		Queue<T>::deallocator(m_data); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	template<typename T> | 	template<typename T> | ||||||
| 	ErrorOr<void> Queue<T>::Push(const T& value) | 	ErrorOr<void> Queue<T>::Push(const T& value) | ||||||
| 	{ | 	{ | ||||||
| 		VerifyCapacity(m_size + 1); | 		TRY(VerifyCapacity(m_size + 1)); | ||||||
| 		m_data[m_size++] = value; | 		m_data[m_size++] = value; | ||||||
| 		return {}; | 		return {}; | ||||||
| 	} | 	} | ||||||
|  | @ -110,16 +109,18 @@ namespace BAN | ||||||
| 		if (m_capacity > size) | 		if (m_capacity > size) | ||||||
| 			return {}; | 			return {}; | ||||||
| 
 | 
 | ||||||
| 		size_type new_cap = MAX(m_capacity * 1.5f, m_capacity + 1) * sizeof(T); | 		size_type new_cap = MAX(m_capacity * 1.5f, m_capacity + 1); | ||||||
| 		void* new_data = allocator(new_cap); | 		void* new_data = Queue<T>::allocator(new_cap * sizeof(T)); | ||||||
| 		if (new_data == nullptr) | 		if (new_data == nullptr) | ||||||
| 			return Error { .message = "Queue: out of memory", .error_code = ErrorCode::OutOfMemory }; | 			return Error::FromString("Queue: out of memory"); | ||||||
| 
 | 
 | ||||||
| 		memcpy(new_data, m_data, m_size * sizeof(T)); | 		memcpy(new_data, m_data, m_size * sizeof(T)); | ||||||
| 		deallocator(m_data); | 		Queue<T>::deallocator(m_data); | ||||||
| 
 | 
 | ||||||
| 		m_data = (T*)new_data; | 		m_data = (T*)new_data; | ||||||
| 		m_capacity = new_cap; | 		m_capacity = new_cap; | ||||||
|  | 
 | ||||||
|  | 		return {}; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  | @ -16,7 +16,7 @@ INCLUDEDIR?=$(PREFIX)/include | ||||||
| CFLAGS:=$(CFLAGS) -D__is_kernel -Iinclude -fstack-protector -ffreestanding -Wall -Wextra -Wno-unused-function | CFLAGS:=$(CFLAGS) -D__is_kernel -Iinclude -fstack-protector -ffreestanding -Wall -Wextra -Wno-unused-function | ||||||
| CPPFLAGS:=$(CPPFLAGS) -fno-rtti -fno-exceptions | CPPFLAGS:=$(CPPFLAGS) -fno-rtti -fno-exceptions | ||||||
| LDFLAGS:=$(LDFLAGS) | LDFLAGS:=$(LDFLAGS) | ||||||
| LIBS:=$(LIBS) -nostdlib -lk -lgcc | LIBS:=$(LIBS) -nostdlib -lk -lbank -lgcc | ||||||
|   |   | ||||||
| ARCHDIR=arch/$(HOSTARCH) | ARCHDIR=arch/$(HOSTARCH) | ||||||
|   |   | ||||||
|  |  | ||||||
|  | @ -1,9 +1,27 @@ | ||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
| #include <BAN/Formatter.h> | #include <BAN/Formatter.h> | ||||||
|  | #include <kernel/PIT.h> | ||||||
| 
 | 
 | ||||||
| #define dprint		BAN::Formatter::print<Serial::serial_putc> | #define dprintln(...)																										\ | ||||||
| #define dprintln	BAN::Formatter::println<Serial::serial_putc> | 	do {																													\ | ||||||
|  | 		BAN::Formatter::print<Serial::serial_putc>("[{5.3}] {}({}):  ", (float)PIT::ms_since_boot(), __FILE__, __LINE__);	\ | ||||||
|  | 		BAN::Formatter::println<Serial::serial_putc>(__VA_ARGS__);															\ | ||||||
|  | 	} while(false) | ||||||
|  | 
 | ||||||
|  | #define dwarnln(...)											\ | ||||||
|  | 	do {														\ | ||||||
|  | 		BAN::Formatter::print<Serial::serial_putc>("\e[33m");	\ | ||||||
|  | 		dprintln(__VA_ARGS__);									\ | ||||||
|  | 		BAN::Formatter::print<Serial::serial_putc>("\e[m");		\ | ||||||
|  | 	} while(false) | ||||||
|  | 
 | ||||||
|  | #define derrorln(...)											\ | ||||||
|  | 	do {														\ | ||||||
|  | 		BAN::Formatter::print<Serial::serial_putc>("\e[31m");	\ | ||||||
|  | 		dprintln(__VA_ARGS__);									\ | ||||||
|  | 		BAN::Formatter::print<Serial::serial_putc>("\e[m");		\ | ||||||
|  | 	} while(false) | ||||||
| 
 | 
 | ||||||
| namespace Serial | namespace Serial | ||||||
| { | { | ||||||
|  |  | ||||||
|  | @ -3,5 +3,5 @@ | ||||||
| #include <BAN/Formatter.h> | #include <BAN/Formatter.h> | ||||||
| #include <kernel/tty.h> | #include <kernel/tty.h> | ||||||
| 
 | 
 | ||||||
| #define kprint		BAN::Formatter::print<TTY::putchar> | #define kprint(...) BAN::Formatter::print<TTY::putchar>(__VA_ARGS__) | ||||||
| #define kprintln	BAN::Formatter::println<TTY::putchar> | #define kprintln(...) BAN::Formatter::println<TTY::putchar>(__VA_ARGS__) | ||||||
|  |  | ||||||
|  | @ -1,10 +1,10 @@ | ||||||
|  | #include <BAN/Queue.h> | ||||||
| #include <kernel/IDT.h> | #include <kernel/IDT.h> | ||||||
| #include <kernel/IO.h> | #include <kernel/IO.h> | ||||||
| #include <kernel/Keyboard.h> | #include <kernel/Keyboard.h> | ||||||
| #include <kernel/kprint.h> | #include <kernel/kprint.h> | ||||||
| #include <kernel/PIC.h> | #include <kernel/PIC.h> | ||||||
| #include <kernel/PIT.h> | #include <kernel/PIT.h> | ||||||
| #include <kernel/Queue.h> |  | ||||||
| #include <kernel/Serial.h> | #include <kernel/Serial.h> | ||||||
| 
 | 
 | ||||||
| #include <kernel/KeyboardLayout/FI.h> | #include <kernel/KeyboardLayout/FI.h> | ||||||
|  | @ -73,10 +73,10 @@ namespace Keyboard | ||||||
| 		uint8_t _ack		= 0; | 		uint8_t _ack		= 0; | ||||||
| 		bool	_done		= false; | 		bool	_done		= false; | ||||||
| 	}; | 	}; | ||||||
| 	static Queue<Command>	s_keyboard_command_queue; | 	static BAN::Queue<Command>	s_keyboard_command_queue; | ||||||
| 	static uint8_t				s_keyboard_command_extra = 0x00; | 	static uint8_t				s_keyboard_command_extra = 0x00; | ||||||
| 
 | 
 | ||||||
| 	static Queue<KeyEvent> s_key_event_queue; | 	static BAN::Queue<KeyEvent> s_key_event_queue; | ||||||
| 	static uint8_t s_keyboard_key_buffer[10] = {}; | 	static uint8_t s_keyboard_key_buffer[10] = {}; | ||||||
| 	static uint8_t s_keyboard_key_buffer_size = 0; | 	static uint8_t s_keyboard_key_buffer_size = 0; | ||||||
| 
 | 
 | ||||||
|  | @ -290,8 +290,8 @@ namespace Keyboard | ||||||
| 		if (key != Key::INVALID) | 		if (key != Key::INVALID) | ||||||
| 		{ | 		{ | ||||||
| 			auto error_or = s_key_event_queue.Push({ .key = key, .modifiers = modifiers, .pressed = pressed }); | 			auto error_or = s_key_event_queue.Push({ .key = key, .modifiers = modifiers, .pressed = pressed }); | ||||||
| 			if (error_or.HasError()) | 			if (error_or.IsError()) | ||||||
| 				dprintln("PS/2 Keyboard: {}", error_or.GetError().message); | 				dwarnln("{}", error_or.GetError()); | ||||||
| 		} | 		} | ||||||
| 		s_keyboard_key_buffer_size -= index + 1; | 		s_keyboard_key_buffer_size -= index + 1; | ||||||
| 		memmove(s_keyboard_key_buffer, s_keyboard_key_buffer + index, s_keyboard_key_buffer_size); | 		memmove(s_keyboard_key_buffer, s_keyboard_key_buffer + index, s_keyboard_key_buffer_size); | ||||||
|  | @ -384,7 +384,7 @@ namespace Keyboard | ||||||
| 		i8042_controller_command(I8042_TEST_CONTROLLER); | 		i8042_controller_command(I8042_TEST_CONTROLLER); | ||||||
| 		if (wait_and_read() != I8042_TEST_CONTROLLER_PASS) | 		if (wait_and_read() != I8042_TEST_CONTROLLER_PASS) | ||||||
| 		{ | 		{ | ||||||
| 			kprintln("\e[33mERROR: PS/2 controller self test failed\e[m"); | 			derrorln("PS/2 controller self test failed"); | ||||||
| 			return false; | 			return false; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | @ -394,7 +394,7 @@ namespace Keyboard | ||||||
| 		i8042_controller_command(I8042_TEST_FIRST_PORT); | 		i8042_controller_command(I8042_TEST_FIRST_PORT); | ||||||
| 		if (wait_and_read() != I8042_TEST_FIRST_PORT_PASS) | 		if (wait_and_read() != I8042_TEST_FIRST_PORT_PASS) | ||||||
| 		{ | 		{ | ||||||
| 			kprintln("\e[33mERROR: PS/2 first port test failed\e[m"); | 			derrorln("PS/2 first port test failed"); | ||||||
| 			return false; | 			return false; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,6 +1,7 @@ | ||||||
|  | #include <kernel/panic.h> | ||||||
|  | 
 | ||||||
| #include <stdint.h> | #include <stdint.h> | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #include <stdio.h> |  | ||||||
|   |   | ||||||
| #if UINT32_MAX == UINTPTR_MAX | #if UINT32_MAX == UINTPTR_MAX | ||||||
| #define STACK_CHK_GUARD 0xe2dee396 | #define STACK_CHK_GUARD 0xe2dee396 | ||||||
|  | @ -15,7 +16,7 @@ __BEGIN_DECLS | ||||||
| __attribute__((noreturn)) | __attribute__((noreturn)) | ||||||
| void __stack_chk_fail(void) | void __stack_chk_fail(void) | ||||||
| { | { | ||||||
| 	printf("Stack smashing detected\n"); | 	Kernel::panic("Stack smashing detected"); | ||||||
| 	abort(); | 	abort(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -73,8 +73,7 @@ void kmalloc_dump_nodes() | ||||||
| 	for (size_t i = 0; i < s_kmalloc_node_count; i++) | 	for (size_t i = 0; i < s_kmalloc_node_count; i++) | ||||||
| 	{ | 	{ | ||||||
| 		kmalloc_node& node = s_kmalloc_node_head[i]; | 		kmalloc_node& node = s_kmalloc_node_head[i]; | ||||||
| 		if (i < 10) dprint(" "); | 		dprintln(" ({3}) {}, node at {}, free: {}, size: {}", i, (void*)&node, (void*)node.addr, node.free, node.size); | ||||||
| 		dprintln(" ({}) {}, node at {}, free: {}, size: {}", i, (void*)&node, (void*)node.addr, node.free, node.size); |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue