From 390a74776834b10032e03f718eafe505a161fffa Mon Sep 17 00:00:00 2001 From: Bananymous Date: Thu, 23 Feb 2023 01:22:50 +0200 Subject: [PATCH] Kernel: Add prefs font for terminal output before file system --- kernel/Makefile | 7 +++++- kernel/font/prefs.psf | Bin 0 -> 5312 bytes kernel/include/kernel/Font.h | 1 + kernel/include/kernel/TerminalDriver.h | 2 +- kernel/include/kernel/VesaTerminalDriver.h | 7 +++--- kernel/kernel/Font.cpp | 12 +++++++++ kernel/kernel/VesaTerminalDriver.cpp | 5 ++-- kernel/kernel/kernel.cpp | 27 ++++++++++++++------- 8 files changed, 43 insertions(+), 18 deletions(-) create mode 100644 kernel/font/prefs.psf diff --git a/kernel/Makefile b/kernel/Makefile index 4f145555..2b581ea2 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -31,6 +31,7 @@ BUILDDIR=$(abspath build) KERNEL_OBJS= \ $(KERNEL_ARCH_OBJS) \ +font/prefs.o \ kernel/APIC.o \ kernel/ATA.o \ kernel/build_libc.o \ @@ -74,7 +75,7 @@ $(ARCHDIR)/crtend.o \ $(ARCHDIR)/crtn.o \ .PHONY: all always clean install install-headers install-kernel -.SUFFIXES: .o .c .cpp .S +.SUFFIXES: .o .c .cpp .S .psf all: banan-os.kernel @@ -94,10 +95,14 @@ $(ARCHDIR)/crtbegin.o $(ARCHDIR)/crtend.o: .S.o: $(CC) -MD -c $< -o $(BUILDDIR)/$@ $(CFLAGS) +.psf.o: + objcopy -O elf64-x86-64 -B i386 -I binary $< $(BUILDDIR)/$@ + always: mkdir -p $(BUILDDIR)/$(ARCHDIR) mkdir -p $(BUILDDIR)/kernel mkdir -p $(BUILDDIR)/kernel/FS + mkdir -p $(BUILDDIR)/font clean: rm -rf $(BUILDDIR) diff --git a/kernel/font/prefs.psf b/kernel/font/prefs.psf new file mode 100644 index 0000000000000000000000000000000000000000..53c53ab6b2c2aa4b510be1d1443dfc6bc0c5d0ae GIT binary patch literal 5312 zcmZvfdvshy8NjDoTpwpojXY#AwY_P3TOqY3MG90D1a3>YEqYt(D@J?S z@)w6crJln%J^Vw3`oIdlwI$Wiz$&nPh#DgsLVYDZ5Q|6}HSG2G&CI zuhn9+K3K(4}Dx+uVbV^s0#nj0$i^|QiyX|^^P3ul-_S&oG=?M@eQkWQId-%)AHCKh z+WG4Fi3>YEs~;YV3v}`4iVVS^s({LqlQ3oF}E_Mk5JB z(_X8Jl`tJIdTdE{eUqVkBwU{uN{oHQ9G6nb>Xo{CP;YV0>do;f6trG;)6}0PmmQ)b z_bSs?{e?I?uj)h)$Z8V=nTNPW0Ho_Tm!2Zb?fDj?xW*w!_2p=Dp!dkGFM9X>68}-3 z__ymzXqILA>HPC~HHYIs3U$a~Zvw#D8{?Ke{>PJsBpHfMqvAeYZ)(gIx8`H?aTWsU z_|hXi+84IsL$}xWr*Ym;f^}t=(3yCoIR2V@7V>AMzea|4nmY==(zYcV+3{m8Cyd=5A|y|D?V99!h&x z<~?hdmE2#GM2ES*m|k{a$arOZ_D0b0BK}=j{JXNOPn*nm+hlQCi=0!rdP}&y$^jT3 zNc(f|59!a9r9W4e^>Agew--o7{3&%Zh$Z;r^nUASFGlLL(Vr!cY-s<}j|;&g9|5Ml zQoQiTk00lKmkK$~`aGxa!MvVeI+zNAo_WSz_gSHS+{53-o5+wtTW@UM9~`eHIp{I(MZ%Qg)}v}9nvzNEEVQkvB#^j?!dkS`>Zpu z(Y>~e<@2N^nUeXwsA{1c6-#cD{zBP#nPqD4#S;6Fo>{=n`mdJB<;^+ zW^ts91J$gz&Udk#-F(`V@i9Pm1WGacXv8?e|B-tAn4GU&X^pBj8ZVAC%=n4-_IN0j z6t`87?uTh)-xmEG$lZ}8>vMiuVdbe*w!iY_u9KCgX2@ClRG+rDc1bGR-lJ0lslYfCF_y^)*w$u_%{rM0$yQ$3m2ml<_NUYWH|^^>Mx zqc~BgtZaTx%^1(AOrOk1>{!M8vy+CDUBPPW{HkJU7uQ%T6${NmD$51uzV~v0xUyV0 zt}GW^o6H5|$~*vVvh>>5xs!O@o(;f$Kj{BQ%mv%}UXcFX?+0_iw)Ar0xq4||)^j%Z zg|v5NY46JV!E)@?isI7z8ac0~z0A-3UT8f4<_wzg$(3tlGrpGGdH{^xjMvfY8@8H# ze#@e)-ogtoKA_h}`r|Z{%>PT$pDRm$t}OmtS?r}Z`6ohuKk&Vz9{^qe{RCtWhStAM zJPpoHl3+oSY=+z6L4Uvhs6XvD{m$+=$TdG)>~}BePLctYB!}Rq@HO}b`~-H-N)pdY zk}fF0g03W4%Kr{=Q5{m%1hO;+&j>{TYXz~cyII0^v?3G@XkcLOf91RLUpBg4pIr*ufI2i^$+yEbgkHd{{6MRCwc7BrFOz9T&WUiK*y^s|}3e@Ad zL%C;jMX%Gl*h`X))NO*>U^CnfA#8!Ia0h%6J_QkMgY9r9?0`?hXW+B&Iru#E!55$( zz6f7}oe-;qtk7MQs%kXH&Uxo8IOY?9)I0%)VF;dtr&KqqP^0v7_ys%-&%m=#ha+$l zj=^!&LA3mm(sS@D_%-|nhT*p`0>6Xjp#h`t0*t|nu$yu0<@c-b5bXDoWFNl)e!tG| zMt;A^?<4Rn*bfiGqwtt|n%R6uJx~5!H4X;BJ68JxCx^M*m literal 0 HcmV?d00001 diff --git a/kernel/include/kernel/Font.h b/kernel/include/kernel/Font.h index 41fcea09..1a3ab962 100644 --- a/kernel/include/kernel/Font.h +++ b/kernel/include/kernel/Font.h @@ -10,6 +10,7 @@ namespace Kernel { public: static BAN::ErrorOr load(BAN::StringView); + static BAN::ErrorOr prefs(); uint32_t width() const { return m_width; } uint32_t height() const { return m_height; } diff --git a/kernel/include/kernel/TerminalDriver.h b/kernel/include/kernel/TerminalDriver.h index 234e190f..18aa0958 100644 --- a/kernel/include/kernel/TerminalDriver.h +++ b/kernel/include/kernel/TerminalDriver.h @@ -22,7 +22,7 @@ public: }; public: - TerminalDriver(const Kernel::Font& font) : m_font(font) {} + TerminalDriver() : m_font(MUST(Kernel::Font::prefs())) {} virtual ~TerminalDriver() {} virtual uint32_t width() const = 0; virtual uint32_t height() const = 0; diff --git a/kernel/include/kernel/VesaTerminalDriver.h b/kernel/include/kernel/VesaTerminalDriver.h index 827db42e..a1bdf9a9 100644 --- a/kernel/include/kernel/VesaTerminalDriver.h +++ b/kernel/include/kernel/VesaTerminalDriver.h @@ -5,7 +5,7 @@ class VesaTerminalDriver final : public TerminalDriver { public: - static VesaTerminalDriver* create(const Kernel::Font&); + static VesaTerminalDriver* create(); ~VesaTerminalDriver(); virtual uint32_t width() const override { return m_width / font().width(); } @@ -17,9 +17,8 @@ public: virtual void set_cursor_position(uint32_t, uint32_t) override; private: - VesaTerminalDriver(uint32_t width, uint32_t height, uint32_t pitch, uint8_t bpp, uintptr_t address, const Kernel::Font& font) - : TerminalDriver(font) - , m_width(width) + VesaTerminalDriver(uint32_t width, uint32_t height, uint32_t pitch, uint8_t bpp, uintptr_t address) + : m_width(width) , m_height(height) , m_pitch(pitch) , m_bpp(bpp) diff --git a/kernel/kernel/Font.cpp b/kernel/kernel/Font.cpp index 546e364f..555d3469 100644 --- a/kernel/kernel/Font.cpp +++ b/kernel/kernel/Font.cpp @@ -8,9 +8,21 @@ #define PSF2_HAS_UNICODE_TABLE 0x00000001 +extern char _binary_font_prefs_psf_start; +extern char _binary_font_prefs_psf_end; + namespace Kernel { + BAN::ErrorOr Font::prefs() + { + size_t font_data_size = &_binary_font_prefs_psf_end - &_binary_font_prefs_psf_start; + BAN::Vector font_data; + TRY(font_data.resize(font_data_size)); + memcpy(font_data.data(), &_binary_font_prefs_psf_start, font_data_size); + return parse_psf1(font_data); + } + BAN::ErrorOr Font::load(BAN::StringView path) { if (!VirtualFileSystem::is_initialized()) diff --git a/kernel/kernel/VesaTerminalDriver.cpp b/kernel/kernel/VesaTerminalDriver.cpp index 3840414e..6d1523b3 100644 --- a/kernel/kernel/VesaTerminalDriver.cpp +++ b/kernel/kernel/VesaTerminalDriver.cpp @@ -4,7 +4,7 @@ #include #include -VesaTerminalDriver* VesaTerminalDriver::create(const Kernel::Font& font) +VesaTerminalDriver* VesaTerminalDriver::create() { if (!(g_multiboot_info->flags & MULTIBOOT_FLAGS_FRAMEBUFFER)) { @@ -41,8 +41,7 @@ VesaTerminalDriver* VesaTerminalDriver::create(const Kernel::Font& font) framebuffer.height, framebuffer.pitch, framebuffer.bpp, - framebuffer.addr, - font + framebuffer.addr ); driver->set_cursor_position(0, 0); driver->clear(TerminalColor::BLACK); diff --git a/kernel/kernel/kernel.cpp b/kernel/kernel/kernel.cpp index 90bbd663..1a31df79 100644 --- a/kernel/kernel/kernel.cpp +++ b/kernel/kernel/kernel.cpp @@ -81,10 +81,10 @@ extern "C" void kernel_main() MMU::intialize(); dprintln("MMU initialized"); - //TerminalDriver* terminal_driver = VesaTerminalDriver::create(); - //ASSERT(terminal_driver); - //dprintln("VESA initialized"); - //TTY* tty1 = new TTY(terminal_driver); + TerminalDriver* terminal_driver = VesaTerminalDriver::create(); + ASSERT(terminal_driver); + dprintln("VESA initialized"); + TTY* tty1 = new TTY(terminal_driver); InterruptController::initialize(cmdline.force_pic); dprintln("Interrupt controller initialized"); @@ -99,15 +99,24 @@ extern "C" void kernel_main() Scheduler::initialize(); Scheduler& scheduler = Scheduler::get(); MUST(scheduler.add_thread(BAN::Function( - [] + [terminal_driver] { DiskIO::initialize(); dprintln("Disk IO initialized"); - auto font = MUST(Font::load("/usr/share/fonts/zap-ext-vga16.psf")); - dprintln("Font loaded"); - - Shell(new TTY(VesaTerminalDriver::create(font))).run(); + auto font_or_error = Font::load("/usr/share/fonts/zap-ext-vga16.psf"); + if (font_or_error.is_error()) + dprintln("{}", font_or_error.error()); + else + terminal_driver->set_font(font_or_error.release_value()); + } + ))); + MUST(scheduler.add_thread(BAN::Function( + [tty1] + { + Shell* shell = new Shell(tty1); + ASSERT(shell); + shell->run(); } ))); scheduler.start();