From 41b34d2a9d4ac650d491bd0bc77ebf62ae648211 Mon Sep 17 00:00:00 2001 From: cowmonk Date: Fri, 18 Jul 2025 23:50:07 -0700 Subject: [PATCH] cowos attempted gdt, but at least we have vga drivers now --- Makefile | 9 +- README.md | 3 + kernel/drivers/video/vga.c | 145 ++++++++++++++++++++--------- kernel/drivers/video/vga.o | Bin 0 -> 9712 bytes kernel/include/drivers/video/vga.h | 63 +++++-------- kernel/include/fb.h | 22 ----- kernel/include/gdt.h | 28 ++++++ kernel/init/kernel.c | 36 +++---- kernel/init/kernel.o | Bin 0 -> 6720 bytes kernel/klibc/stdio.o | Bin 0 -> 6576 bytes kernel/klibc/string.o | Bin 0 -> 6920 bytes kernel/x86/gdt.c | 73 +++++++++++++++ kernel/x86/gdt.o | Bin 0 -> 5200 bytes scripts/limine-git.sh | 14 +++ 14 files changed, 253 insertions(+), 140 deletions(-) create mode 100644 kernel/drivers/video/vga.o delete mode 100644 kernel/include/fb.h create mode 100644 kernel/include/gdt.h create mode 100644 kernel/init/kernel.o create mode 100644 kernel/klibc/stdio.o create mode 100644 kernel/klibc/string.o create mode 100644 kernel/x86/gdt.c create mode 100644 kernel/x86/gdt.o create mode 100755 scripts/limine-git.sh diff --git a/Makefile b/Makefile index 694385f..bad4f80 100644 --- a/Makefile +++ b/Makefile @@ -15,14 +15,7 @@ kernel: make -C ./kernel/ all limine: kernel - git clone https://github.com/limine-bootloader/limine.git --branch=v9.x-binary --depth=1 - make -C limine - - cp -v limine/limine-bios.sys limine/limine-bios-cd.bin \ - limine/limine-uefi-cd.bin isodir/boot/limine/ - - cp -v limine/BOOTX64.EFI isodir/EFI/BOOT/ - cp -v limine/BOOTIA32.EFI isodir/EFI/BOOT/ + ./scripts/limine-git.sh clean: rm cowos.iso diff --git a/README.md b/README.md index 3b93a81..a0d44dd 100644 --- a/README.md +++ b/README.md @@ -24,3 +24,6 @@ make # Credits - [Limine](https://github.com/limine-bootloader/limine): modern, advanced, portable, multiprotocol bootloader and boot manager. + +## People +- micl: random guy on the interweb in the LHL discord server gave me a free vga driver to use lol diff --git a/kernel/drivers/video/vga.c b/kernel/drivers/video/vga.c index 46663b3..9cf1715 100644 --- a/kernel/drivers/video/vga.c +++ b/kernel/drivers/video/vga.c @@ -1,61 +1,118 @@ #include -/* #include */ -#include -/* for frame buffer -static volatile struct limine_framebuffer_request limineFBreq = { - .id = LIMINE_FRAMEBUFFER_REQUEST, .revision = 0}; -*/ - -size_t term_row; -size_t term_col; -uint8_t term_color; -uint16_t* term_buf = (uint16_t*)VGA_MEMORY; - -void -term_init(void) +// Helper functions for port IO +static inline void +outb(uint16_t port, uint8_t val) { - term_row = 0; - term_col = 0; - term_color = vga_entry_color(VGA_COLOR_WHITE, VGA_COLOR_BLACK); + __asm__ volatile ("outb %0, %1" : : "a"(val), "Nd"(port)); +} - for (size_t y = 0; y < VGA_HEIGHT; y++) { - for (size_t x = 0; x < VGA_WIDTH; x++) { - const size_t index = y * VGA_WIDTH + x; - term_buf[index] = vga_entry(' ', term_color); - } - } +static inline uint8_t +inb(uint16_t port) +{ + uint8_t ret; + __asm__ volatile ("inb %1, %0" : "=a"(ret) : "Nd"(port)); + return ret; +} + +// Write vga registers for mode change +static void +write_regs(uint8_t *regs) +{ + unsigned i; + + // Write misc output register + outb(VGA_MISC_WRITE, *regs); + regs++; + + // Write sequencer registers (5 registers) + for (i = 0; i < 5; i++) { + outb(VGA_SEQ_INDEX, i); + outb(VGA_SEQ_DATA, *regs); + regs++; + } + + // Unlock CRTC registers 0-7 by clearing protect bit + outb(VGA_CRTC_INDEX, 0x03); + outb(VGA_CRTC_DATA, inb(VGA_CRTC_DATA) | 0x80); + outb(VGA_CRTC_INDEX, 0x11); + outb(VGA_CRTC_DATA, inb(VGA_CRTC_DATA) & ~0x80); + + // Update the register values to match + regs[0x03] = regs[0x03] | 0x80; + regs[0x11] = regs[0x11] & ~0x80; + + // Write CRTC registers (25 registers) + for (i = 0; i < 25; i++) { + outb(VGA_CRTC_INDEX, i); + outb(VGA_CRTC_DATA, *regs); + regs++; + } + + // Write graphics controller registers (9 registers) + for (i = 0; i < 9; i++) { + outb(VGA_GC_INDEX, i); + outb(VGA_GC_DATA, *regs); + regs++; + } + + // Write attribute controller registers (21 registers) + for (i = 0; i < 21; i++) { + inb(VGA_INSTAT_READ); // Reset flip-flop + outb(VGA_AC_INDEX, i); + outb(VGA_AC_WRITE, *regs); + regs++; + } + + // Enable video display + inb(VGA_INSTAT_READ); + outb(VGA_AC_INDEX, 0x20); } void -term_setcolor(uint8_t color) +vga_set_mode_13h(void) { - term_color = color; + // Register values for VGA mode 13h (320x200, 256 colors) + // Order: Misc, Seq[5], CRTC[25], GC[9], AC[21] + static uint8_t mode_320x200x256[] = { + // Misc output register + 0x63, + // Sequencer registers + 0x03, 0x01, 0x0F, 0x00, 0x0E, + // CRTC registers + 0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, + 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9C, 0x0E, 0x8F, 0x28, 0x40, 0x96, 0xB9, 0xA3, + 0xFF, + // Graphics controller registers + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, + 0xFF, + // Attribute controller registers + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x41, 0x00, 0x0F, 0x00, 0x00 + }; + + write_regs(mode_320x200x256); } void -term_putentryat(char c, uint8_t color, size_t x, size_t y) +vga_put_pixel(uint16_t x, uint16_t y, uint8_t color) { - const size_t index = y * VGA_HEIGHT + x; - term_buf[index] = vga_entry(c, color); + // check bounds + if (x >= VGA_WIDTH || y >= VGA_HEIGHT) return; + + // Direct write to video memory: offset = y * 320 + x + uint8_t *vga = (uint8_t *)VGA_GRAPHICS_BUFFER; + vga[y * VGA_WIDTH + x] = color; } void -term_putchar(char c) +vga_clear_screen(uint8_t color) { - term_putentryat(c, term_color, term_col, term_row); - if (++term_col == VGA_WIDTH) { - term_col = 0; - if (++term_row == VGA_HEIGHT) { - term_row = 0; - } - } -} - -void -term_writestr(const char* data) -{ - for (size_t i = 0; data[i] != '\0'; i++) { - term_putchar(data[i]); - } + uint8_t *vga = (uint8_t *)VGA_GRAPHICS_BUFFER; + // fill entire buffer (64k pixels) + for (int i = 0; i < VGA_WIDTH * VGA_HEIGHT; i++) { + vga[i] = color; + } } diff --git a/kernel/drivers/video/vga.o b/kernel/drivers/video/vga.o new file mode 100644 index 0000000000000000000000000000000000000000..5565817a2de3e7b8f58bf8ea9e14b64662e9884c GIT binary patch literal 9712 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 -#include -/* hardware text mode const */ -enum vga_color { - VGA_COLOR_BLACK = 0, - VGA_COLOR_BLUE = 1, - VGA_COLOR_GREEN = 2, - VGA_COLOR_CYAN = 3, - VGA_COLOR_RED = 4, - VGA_COLOR_MAGENTA = 5, - VGA_COLOR_BROWN = 6, - VGA_COLOR_LIGHT_GREY = 7, - VGA_COLOR_DARK_GREY = 8, - VGA_COLOR_LIGHT_BLUE = 9, - VGA_COLOR_LIGHT_GREEN = 10, - VGA_COLOR_LIGHT_CYAN = 11, - VGA_COLOR_LIGHT_RED = 12, - VGA_COLOR_LIGHT_MAGENTA = 13, - VGA_COLOR_LIGHT_BROWN = 14, - VGA_COLOR_WHITE = 15, -}; +// VGA mem addr +#define VGA_TEXT_BUFFER 0xB8000 // Text mode video memory +#define VGA_GRAPHICS_BUFFER 0xA0000 // Graphics mode video memory -static inline uint8_t -vga_entry_color(enum vga_color fg, enum vga_color bg) -{ - return fg | bg << 4; -} +// VGA mode 13h dimensions +#define VGA_WIDTH 320 +#define VGA_HEIGHT 200 -static inline uint16_t -vga_entry(unsigned char uc, uint8_t color) -{ - return (uint16_t) uc | (uint16_t) color << 8; -} +// VGA register IO ports +#define VGA_AC_INDEX 0x3C0 // attribute controller index +#define VGA_AC_WRITE 0x3C0 // attribute controller write +#define VGA_AC_READ 0x3C1 // attribute controller read +#define VGA_MISC_WRITE 0x3C2 // miscellaneous output register +#define VGA_SEQ_INDEX 0x3C4 // sequencer index +#define VGA_SEQ_DATA 0x3C5 // sequencer data +#define VGA_GC_INDEX 0x3CE // graphics controller index +#define VGA_GC_DATA 0x3CF // graphics controller data +#define VGA_CRTC_INDEX 0x3D4 // CRT controller index +#define VGA_CRTC_DATA 0x3D5 // CRT controller data +#define VGA_INSTAT_READ 0x3DA // input status read -/* using mode 3 of VGA 80x25 */ -#define VGA_WIDTH 80 -#define VGA_HEIGHT 25 -#define VGA_MEMORY 0xA0000 /* VGA memory location */ +void vga_set_mode_13h(void); +void vga_put_pixel(uint16_t x, uint16_t y, uint8_t color); +void vga_clear_screen(uint8_t color); -void term_init(void); -void term_setcolor(uint8_t color); -void term_putentryat(char c, uint8_t color, size_t x, size_t y); -void term_putchar(char c); -void term_writestr(const char* data); - -#endif // VGA_H +#endif diff --git a/kernel/include/fb.h b/kernel/include/fb.h deleted file mode 100644 index 8469e6e..0000000 --- a/kernel/include/fb.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef FB_H -#define FB_H - -/* *pixel = vram + y*pitch + x*pixelwidth */ - -/* - | width | how many pixels you have on a horizontal line | - |===========================================================================| - | height | how many horizontal lines of pixels are present | - |===========================================================================| - | pitch | how many bytes of VRAM you should skip to go one pixel down | - |===========================================================================| - | depth | how many bits of color you have | - |===========================================================================| - | pixelwidth | how many bytes of VRAM you should skip to go one pixel right | -*/ - -#include - -void putpixel(int pos_x, int pos_y, unsigned char VGA_COLOR); - -#endif /* FB_H */ diff --git a/kernel/include/gdt.h b/kernel/include/gdt.h new file mode 100644 index 0000000..790ba5e --- /dev/null +++ b/kernel/include/gdt.h @@ -0,0 +1,28 @@ +#include + +#ifndef GDT_H +#define GDT_H + +typedef struct GDTEntry { + uint16_t limit; + uint16_t base_low; + uint16_t base_mid; + uint8_t base_high; + uint8_t access; + uint8_t granularity; +} __attribute__((packed)) GDTEntry; + +typedef struct GDTPtr { + uint16_t limit; + uint64_t base; +} __attribute__((packed)) GDTPtr; + +#define GDT_NUM_ENTRIES 5 /* including null descriptor */ +#define GDT_KERNEL_CODE 0x08 +#define GDT_KERNEL_DATA 0x10 +#define GDT_USER_CODE 0x18 +#define GDT_USER_DATA 0x20 + +void initGDT(); + +#endif /* GDT_H */ diff --git a/kernel/init/kernel.c b/kernel/init/kernel.c index af2b5d9..527c081 100644 --- a/kernel/init/kernel.c +++ b/kernel/init/kernel.c @@ -1,12 +1,15 @@ +#include #include -/* #include */ +#include #include #include -static void hcf(void) { - for (;;) { - __asm__("hlt"); - } +static void +hcf(void) +{ + for (;;) { + __asm__("hlt"); + } } void @@ -14,27 +17,10 @@ kernel_main(void) { /* Make sure the bootloader understands our base revision */ if (LIMINE_BASE_REVISION_SUPPORTED == 0) hcf(); + + vga_set_mode_13h(); - /* ensure a framebuffer */ - if (framebuffer_request.response == NULL - || framebuffer_request.response->framebuffer_count < 1) hcf(); - - /* fetch the first framebuffer */ - struct limine_framebuffer *framebuffer = framebuffer_request.response->framebuffers[0]; - - /* assume framebuffer model is RGB w/32-bit pixels */ - for (size_t i = 0; i < 100; i++) { - volatile uint32_t *fb_ptr = framebuffer->address; - fb_ptr[i * (framebuffer->pitch / 4) + i] = 0xffffff; - } - - /* need to get an actual framebuffer driver working before we can use vga */ - - /* - term_init(); - - term_writestr("Hello World!"); - */ + /* initGDT(); */ /* done so now hang */ hcf(); diff --git a/kernel/init/kernel.o b/kernel/init/kernel.o new file mode 100644 index 0000000000000000000000000000000000000000..5631da282bdd1aa119b86d821ff7c26682f96a4b GIT binary patch literal 6720 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 O_=kA|V)XqY=l^e#uNhwe literal 0 HcmV?d00001 diff --git a/kernel/klibc/string.o b/kernel/klibc/string.o new file mode 100644 index 0000000000000000000000000000000000000000..fae87dc679c306c7f1342834830da763439d4fb8 GIT binary patch literal 6920 zcmcgwYiwM_6+Uxk=I(lT?e!zX4kqy?#JDu+I(7}%UQrXm04UWCuwcYH) z+J^~`LW&b)SCG0SsQH0n7mz5aNN9@E79j{&khBy?2$i9&s+N>OiV(CUYDxmzbMDSK zHNO=$e}(+#<( zB|(49*1Xq=rslSZOf#d*po~){D3g?#l%bbH?oi7I*(0HCzsgjG*rA4(qgMZI6HS$& z+%ut;quG-iW}{P9eAs`>KhrfBgnz3KM@NBh3`F?HzmL5(L?oe*6|3H_STRYJOxsJ)hq1;Q^6PB|(9<>_(+RpbMxV0qLHgT&v zN7_fEeMH)aq(5l3O z*7Jth-3EXJH$CPDyCDIT-bgQrpqy{#x#aW z1X@^+Xt|256IZQ4ZOv}R)**T|TQ9EO&BOz2{WOT>1xa;lj8)TOO*b~{zFuabVd=EE z{svSUQMn^6(#f|5tj zc7s2!n5?@LO7;@O%Aka}MMgQ4u0XcO$YNf^E1=Bs0g_*g_3Sz~R9Q~M0;R|cpz0v` zFw3CI^5I$t7m|-6cO_Ieq2h(2q6%1SIr4~YROP9FfO0H%Ai%CGf;!8wcLCHrNB(>l zK;84C6qiAr<+x-aTxvP?SHkDXvB&%#IV-Jz70Q|GO3RrC8fjcOAyv>w(cxGZX>ENO zG!os#dM<<}^5bIN)o_{R(Y>5JmQ}#zd5^w_t=8pSy4=OwD~0iM1jG}V@nVx1&!SS| zr^x-(58#5s$Ktjgq(I%;$heE2=8&+L|P5N=olEzFchfB9m+riKmohd1%f`Y+>O3nN^#ZmXmC3*V? zcVzZIFp*yNlc|-5`|gSCCs%A``&&!z|LMIK{W19HnP6miNZ?+ZZ@$ocNEVr%KJPvW z8{`tt7+S47d6<`V@?@v1GI_bXT-F(NWmwT^_L@Ao+d`wVsKdKW!q=q7bE5>45B5rK z^2Mzt54$`0;-CZ`wx9q)8>e`nm2Zs71twqm59v2MWpR}Esd`y${)KOBMVK#rT;fxc z{$5#peqL>U1N~>rYtcV8Hu;h%=|yI7r}RdNJfAPMn4K6#xy8eRh}`UuhIc~330a8| z8#v4!cR63t$$L7b&*Uo)OApd~ozfGPzTR_r0R0*HvG+V~G0`JY4bz$d^7j?XUuRId zOnya1mf-l%#ZvQ|GO$8cnyu1kg!8q1_vY2zWm7%9Huq%iEtUQqaq!u7dAJDU6)Aq7RBBU7joKB}fvpBs7xXvFr}(~%QyV$wYQ z8BDl+mTJ%@A&j`1kC!J)2$z_Ac@yeXNjN=Cjq7%V+n<`Q*SLrmqX#niS9`vY&h&>jL6B|+ebf>^9H_DNHDGTY!>-QjCW>Dk_z|GL zQG%#t`UfDGz9~-SrzCWhrT2(aMi=A}`e(~74io>&&F>X@*V&~_8P4x`z27yL&R?fb zs{5PTU-zq0^POBeSDYAe@1mC`$}jW9eD37lhc!-&$k(U=9d%SXO!y&k1*SGk=ZU)7 zOev7wyA%?|OQO%Wm8d&?QvE_jtR}-IPVRcFb7DkqQ0+I{+LG$zb|F?M{wWpzjGBLn zpIkcQr}qi@)aNX!mOQM8Cp4f+-M=okBCd5i^&WM2t+Rs#xO9Ig6#pvvyB6iud;t_c zolDO6>HIDf|LdxMTHkijvFdUkR%+eOJ8eIFZ52-L+yABgd$zWu>i9MMS5yj(->t67 zx;>4b9;t4x*Wd3DbH;=ayhR5&%1KA1!-U@=r%?Z=RsVYZQU7!|cJ`k{jC?xR&mVjU zqD + +static GDTEntry descriptors[5]; +static GDTPtr gdtptr; + +void +gdt_reload() +{ + asm volatile("lgdt %0\n\t" + "push $0x28\n\t" + "lea 1f(%%rip), %%rax\n\t" + "push %%rax\n\t" + "lretq\n\t" + "1:\n\t" + "mov $0x30, %%eax\n\t" + "mov %%eax, %%ds\n\t" + "mov %%eax, %%es\n\t" + "mov %%eax, %%fs\n\t" + "mov %%eax, %%gs\n\t" + "mov %%eax, %%ss\n\t" + : + : "m"(gdtptr) + : "rax", "memory"); +} + +void +initGDT() +{ + /* null descriptor (0) */ + descriptors[0].limit = 0; + descriptors[0].base_low = 0; + descriptors[0].base_mid = 0; + descriptors[0].access = 0; + descriptors[0].granularity = 0; + descriptors[0].base_high = 0; + + /* kernel code 64 (40) */ + descriptors[1].limit = 0; + descriptors[1].base_low = 0; + descriptors[1].base_mid = 0; + descriptors[1].access = 0b10011010; + descriptors[1].granularity = 0b00100000; + descriptors[1].base_high = 0; + + /* kernel data 64 (48) */ + descriptors[2].limit = 0; + descriptors[2].base_low = 0; + descriptors[2].base_mid = 0; + descriptors[2].access = 0b10010010; + descriptors[2].granularity = 0; + descriptors[2].base_high = 0; + + // user code 64 (72) + descriptors[3].limit = 0; + descriptors[3].base_low = 0; + descriptors[3].base_mid = 0; + descriptors[3].access = 0b11111010; + descriptors[3].granularity = 0b00100000; + descriptors[3].base_high = 0; + + // user data 64. (80) + descriptors[4].limit = 0; + descriptors[4].base_low = 0; + descriptors[4].base_mid = 0; + descriptors[4].access = 0b11110010; + descriptors[4].granularity = 0; + descriptors[4].base_high = 0; + + gdtptr.limit = sizeof(descriptors) - 1; + gdtptr.base = (uint64_t)&descriptors; + + gdt_reload(); +} diff --git a/kernel/x86/gdt.o b/kernel/x86/gdt.o new file mode 100644 index 0000000000000000000000000000000000000000..12e173dfd50dcb528208d15dbfb7ff97185949ec GIT binary patch literal 5200 zcmcIoU2Ggz6+Sbwv%B`#YdcPyx@qc78lwfZvvCw0tA%vaCS;>V$SNsq3TVAQ< zvteeO*m)ons+J(I(t^t0OIsn72dLCmD&+;LQZ<&KG=M-LRVXS#3cR&QErbel&dfQx zo13*LLL6o1obS8m=g$3`>zqAw^kcfFfrtkCp^JnCxRmMIg~%+x1bW_AJoo1jZ3{7< z%@x098feTHfBxcb)T_T=eQEXb>Xp??pZVFy)WhTx`4=ymk&O?GAoJCjDE^rF?-b7s zclm6GfBYIAx_K7GWaDa)6?UoG3{?1-MVdh zY}=+}uoXbx3&!-3@!PFCEd2%mL(`6o10;69k@0;NfH{GNF-^??$#Kn?wyYSWhC6|C z*p}XfaKB}tInas0UJep(S^JTX&DU$8 zU4?w3-E#8P_UTsJJCQ%wt}eA4FAVbYe!K3MTP@eCQ)@fOpKyH7X+q5js=j+NZ2JK; z-Ig1|k{7sjgDM%zc|dg07$DTGQna7xYg>DXwwwb*F5^+q?Q+9>-`$Q(wLt5qim z01JCd&9d)?D{%PWu|r zoZX8lF@7Fh(6i(_&33s4uIGlx!mT*oCPeG*{f&Izk%Y|{ypEEsI>vS> zNoh@x9LS75qTfB7tfD7j)sNN+iTLR+$Bw^6j=Jlj)->&(nPE~?3V&!!(E->ILz~h^ z%$sBG;)ORazxB>9UirqO2e+*3IP)5LX|Gv__gy&oqbr~K$LqTuy7Rdvk@_>2Uwrv5 z-<~+XF!8rXb59g!6S(_voyIb0>Vx-~nq`dWJ2exYHn$EQHK)?M%*phGIkntT%jQi_ znm0aXZhzdIJl(ZNPMMjde!Dq&B1Apb$96pVGWn6-Jr#R&;KBAV0!}ITJPs(KxdFT&2_Xij1U=Q zqkx+DQO38iCS~;a_t41qKP8L}mahR)tv3thrxW*jF<|6+5*Y)=HsJBRSL9cSH}#Bz ztoOH>r|&X}tnX9|qX>Gt_h=KL>{Iw?lOT7O!VfVnD!laUL4}WQ3dk)e{7sB~g}<5c zvcgX@KCAGzFs3gH39SfvuMZMHp^poR@O1o;d^c9t@lS8S|4`xgFn&SdKg{?i8}Rhy zB9Z=Fjfa2z^_cGP|6=}k3NP~|^Fu2x$v&iH`4|FTk|GiQ(~M&_%qDs6#p+VmiZU| zuQD(DMEEC|->c;L9^*NM{{iEVDE#w`3kv^J#s?LCjd4-o-(Y-H;s3-~##Q=%h52KO z|2vEyQ22GmG7pj`8GTi|`&ale=F=QUkoKLd1JS~>TW8*hr#&E&WkYzGkDS8)hH>vY zp+1RZ*^oTK_l|R~zl^i^OWmCuNWMdo1oa0LeunXf6rR3AB(t%K)<5NGGrmXRR~RoS z{1+L^x|V)24Mqa&np0V-m&%oj@0Y~`eC_(dZk5Lu97ka|BHSTgN;53ejWWi3UF0vqw((* zI^T%vJ%g#eKo1o8V=6}7{UMlc015mRgb>XeYmE!iIjiGO_M4oacQB{ELxJNyD*0H; zz7(3=*j1=VOZ?h3?Df76ZxElR&Z4{*tIkucbrxItz5g10j8GP$Cjh-ajj{UvIpoxw z6q4WpsS)TA)%O-`>sLR=heVFwgX&XlwLYE4lvBRni+&Otjic-IS@{C~I&z8Y^YV@M4>d}h XIQ|t4@ez*nx43?T14vOywg3MH5f$*I literal 0 HcmV?d00001 diff --git a/scripts/limine-git.sh b/scripts/limine-git.sh new file mode 100755 index 0000000..6bc1771 --- /dev/null +++ b/scripts/limine-git.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +if [ ! -d ./limine/ ]; then + git clone https://github.com/limine-bootloader/limine.git --branch=v9.x-binary --depth=1 + make -C limine + + cp -v limine/limine-bios.sys limine/limine-bios-cd.bin \ + limine/limine-uefi-cd.bin isodir/boot/limine/ + + mkdir -p isodir/EFI/BOOT + + cp -v limine/BOOTX64.EFI isodir/EFI/BOOT/ + cp -v limine/BOOTIA32.EFI isodir/EFI/BOOT/ +fi