From 6d9b807fe66ec723df81ca3c7eead5624a9ea822 Mon Sep 17 00:00:00 2001 From: Tom-on64 Date: Fri, 16 Aug 2024 18:42:42 +0200 Subject: [PATCH] Made fonts not have to be assembled every time and made open file table --- Makefile | 3 +- include/c/stdio.h | 9 +- include/interrupt/exceptions.h.bak | 185 ----------------------------- include/interrupt/syscalls.h | 2 + kern.iso | Bin 1470464 -> 1470464 bytes src/fonts/term16n.fnt | Bin 0 -> 2048 bytes src/fonts/testfont.fnt | Bin 0 -> 2048 bytes src/kernel.c | 44 +++++-- 8 files changed, 40 insertions(+), 203 deletions(-) delete mode 100644 include/interrupt/exceptions.h.bak create mode 100644 src/fonts/term16n.fnt create mode 100644 src/fonts/testfont.fnt diff --git a/Makefile b/Makefile index 77fe38f..58970c0 100644 --- a/Makefile +++ b/Makefile @@ -51,8 +51,7 @@ $(C_FILES): # This target builds all fonts inside src/fonts $(FONTS): - @echo "Assembling $(SRC)/fonts/$@.asm..." - @$(AS) -fbin -o $(BIN)/$@.fnt $(SRC)/fonts/$@.asm + @cp $(SRC)/fonts/$@.fnt $(BIN)/$@.fnt # Run QEMU run: diff --git a/include/c/stdio.h b/include/c/stdio.h index d219cd5..c7f1aaf 100644 --- a/include/c/stdio.h +++ b/include/c/stdio.h @@ -7,10 +7,11 @@ #include // Nobody should have to interface with the internals of this structure -typedef struct _iobuf { - char* _ptr; - int _file; - int _oflag; +typedef struct _iobuf { // 16B + char* _ptr; // Virtual address of file base + int _offset; // Offset into file; Seek() + int _file; // File descriptor + int _oflag; // Flags used to open file } FILE; FILE* stdin; diff --git a/include/interrupt/exceptions.h.bak b/include/interrupt/exceptions.h.bak deleted file mode 100644 index 3a118b3..0000000 --- a/include/interrupt/exceptions.h.bak +++ /dev/null @@ -1,185 +0,0 @@ -#ifndef ISRS_H -#define ISRS_H - -#include -#include - -// Exception handlers -__attribute__ ((interrupt)) -void excp_divideErr(intFrame_t* iframe) { // ISR 0 - fgColor = RED; - print("[ Division Error ]\n"); - __asm__ volatile ("cli; hlt"); // Halt system -} - -__attribute__ ((interrupt)) -void excp_debugErr(intFrame_t* iframe) { // ISR 1 - fgColor = RED; - print("[ Debug Exception ]\n"); - __asm__ volatile ("cli; hlt"); -} - -__attribute__ ((interrupt)) -void excp_nmiInterrupt(intFrame_t* iframe) { // ISR 2 - fgColor = RED; - print("[ Non-maskable Interrupt ]\n"); - __asm__ volatile ("cli; hlt"); -} - -__attribute__ ((interrupt)) -void excp_breakpoint(intFrame_t* iframe) { // ISR 3 - fgColor = RED; - print("[ Breakpoint ]\n"); - __asm__ volatile ("cli; hlt"); -} - -__attribute__ ((interrupt)) -void excp_overflow(intFrame_t* iframe) { // ISR 4 - fgColor = RED; - print("[ Overflow Error ]\n"); - __asm__ volatile ("cli; hlt"); -} - -__attribute__ ((interrupt)) -void excp_boundRangeExceed(intFrame_t* iframe) { // ISR 5 - fgColor = RED; - print("[ Bound Range Exceeded ]\n"); - __asm__ volatile ("cli; hlt"); -} - -__attribute__ ((interrupt)) -void excp_invalidOpcode(intFrame_t* iframe) { // ISR 6 - fgColor = RED; - print("[ Invalid OpCode ]\n"); - __asm__ volatile ("cli; hlt"); -} - -__attribute__ ((interrupt)) -void excp_deviceNA(intFrame_t* iframe) { // ISR 7 - fgColor = RED; - print("[ Device Not Available ]\n"); - __asm__ volatile ("cli; hlt"); -} - -__attribute__ ((interrupt)) -void excp_doubleFault(intFrame_t* iframe, uint32_t errCode) { // ISR 8 - fgColor = RED; - print("[ Double Fault : 0x"); - print(itoa(errCode, 16)); - print(" ]\n"); - __asm__ volatile ("cli; hlt"); -} - -__attribute__ ((interrupt)) -void excp_coprocOverrun(intFrame_t* iframe) { // ISR 9 - fgColor = RED; - print("[ Coprocessor Segment Overrun ]\n"); - __asm__ volatile ("cli; hlt"); -} - -__attribute__ ((interrupt)) -void excp_invalidTss(intFrame_t* iframe, uint32_t errCode) { // ISR 10 - fgColor = RED; - print("[ Invalid TSS : 0x"); - print(itoa(errCode, 16)); - print(" ]\n"); - __asm__ volatile ("cli; hlt"); -} - -__attribute__ ((interrupt)) -void excp_noSegment(intFrame_t* iframe, uint32_t errCode) { // ISR 11 - fgColor = RED; - print("[ Segment Not Present : 0x"); - print(itoa(errCode, 16)); - print(" ]\n"); - __asm__ volatile ("cli; hlt"); -} - -__attribute__ ((interrupt)) -void excp_stackSegmentFault(intFrame_t* iframe, uint32_t errCode) { // ISR 12 - fgColor = RED; - print("[ Stack-Segment Fault : 0x"); - print(itoa(errCode, 16)); - print(" ]\n"); - __asm__ volatile ("cli; hlt"); -} - -__attribute__ ((interrupt)) -void excp_generalProtectionFault(intFrame_t* iframe, uint32_t errCode) { // ISR 13 - fgColor = RED; - print("[ General Protection Fault : 0x"); - print(itoa(errCode, 16)); - print(" ]\n"); - __asm__ volatile ("cli; hlt"); -} - -__attribute__ ((interrupt)) -void excp_pageFault(intFrame_t* iframe, uint32_t errCode) { // ISR 14 - fgColor = RED; - print("[ Page Fault : 0x"); - print(itoa(errCode, 16)); - print(" ]\n"); - __asm__ volatile ("cli; hlt"); -} - -__attribute__ ((interrupt)) -void excp_reserved(intFrame_t* iframe) { // ISR 15 - fgColor = RED; - print("[ Reserved Exception ]\n"); // Shouldn't get this one - __asm__ volatile ("cli; hlt"); -} - -__attribute__ ((interrupt)) -void excp_floatingPointErr(intFrame_t* iframe) { // ISR 16 - fgColor = RED; - print("[ x87 FPU Floating-Point Error ]\n"); - __asm__ volatile ("cli; hlt"); -} - -__attribute__ ((interrupt)) -void excp_alignCheck(intFrame_t* iframe, uint32_t errCode) { // ISR 17 - fgColor = RED; - print("[ Alignment Check : 0x"); - print(itoa(errCode, 16)); - print(" ]\n"); - __asm__ volatile ("cli; hlt"); -} - -__attribute__ ((interrupt)) -void excp_machineCheck(intFrame_t* iframe) { // ISR 18 - fgColor = RED; - print("[ Machine Check ]\n"); - __asm__ volatile ("cli; hlt"); -} - -// TODO: Add more (because there's always more) - -// Repetative isr definitions -void setupExceptions() { - for (uint8_t i = 0; i < 32; i++) { - idtSetGate(i, excp_reserved, TRAP_GATE_FLAGS); - } - - idtSetGate(0, excp_divideErr, TRAP_GATE_FLAGS); - idtSetGate(1, excp_debugErr, TRAP_GATE_FLAGS); - idtSetGate(2, excp_nmiInterrupt, TRAP_GATE_FLAGS); - idtSetGate(3, excp_breakpoint, TRAP_GATE_FLAGS); - idtSetGate(4, excp_overflow, TRAP_GATE_FLAGS); - idtSetGate(5, excp_boundRangeExceed, TRAP_GATE_FLAGS); - idtSetGate(6, excp_invalidOpcode, TRAP_GATE_FLAGS); - idtSetGate(7, excp_deviceNA, TRAP_GATE_FLAGS); - idtSetGate(8, excp_doubleFault, TRAP_GATE_FLAGS); - idtSetGate(9, excp_coprocOverrun, TRAP_GATE_FLAGS); - idtSetGate(10, excp_invalidTss, TRAP_GATE_FLAGS); - idtSetGate(11, excp_noSegment, TRAP_GATE_FLAGS); - idtSetGate(12, excp_stackSegmentFault, TRAP_GATE_FLAGS); - idtSetGate(13, excp_generalProtectionFault, TRAP_GATE_FLAGS); - idtSetGate(14, excp_pageFault, TRAP_GATE_FLAGS); - idtSetGate(15, excp_reserved, TRAP_GATE_FLAGS); - idtSetGate(16, excp_floatingPointErr, TRAP_GATE_FLAGS); - idtSetGate(17, excp_alignCheck, TRAP_GATE_FLAGS); - idtSetGate(18, excp_machineCheck, TRAP_GATE_FLAGS); - // Other are reserved -} - -#endif diff --git a/include/interrupt/syscalls.h b/include/interrupt/syscalls.h index 5d2d6d7..5623b5a 100644 --- a/include/interrupt/syscalls.h +++ b/include/interrupt/syscalls.h @@ -87,6 +87,8 @@ void sys_open() { uint32_t oflag = 0; __asm__ volatile ("nop" : "=b"(path), "=c"(oflag)); + + __asm__ volatile ("movl %0, %%eax" : : "a"(fd)); } diff --git a/kern.iso b/kern.iso index 68bb134200f55313bb3b5fbc46259aef34048044..45d6e289b5a4a45926c86d3ebfa3daba3c2e6537 100644 GIT binary patch delta 2800 zcmb7GZBSI#89sNpD;K!?fv}1xt4kCV`C0^PjcnYGF=7*^yKVp>qU}ticbHC!#uXhA z78U}Rg$N#|&1i5yGX6-K8FZ~7vCiy{;9^_T#I(`0ld@F6yIGQ=*huQf?fc$q9H!Gh z`SG6fJkNX1x$pUWuP0pY36~F!*cp%ivb`*?p{I}pLfT{-2@n!P`neQB28_V^c|<%Q zX(dO9)TbxJDSS-`5&jcP0)hvSbS)N&<0dF(pa`)mG^lF=TaHCYW^5DBUwEvH0dC8C)H6w(qXmEOhKgbXc!aV`*+ zko+s+AFg@^I-p-gxiFqf0uHGjV(niAFl6WNei0=hJGVH2A<{?jN(`@BVLk@|dxwqN zg#*Ckwb)-cWTi*;{$hy-6qi&8gFu6pfT8&!%*f#oUZ)TD?oIcBH?mr*C`Xl+Ct(2| zw@g*_9zWe@)ik`RxJy7&-7UQkwRf5qdch%8LN{2gvxuE4{uJ?M6+cA0Ud1W-fOAw_ zgg8ybyAhjId=znANq>upTXnbITKFy!3TCA(1B4+fHZPTb}At+Kk6M zS%NPgFTru@Jg`{vqXJre;LqmMN~nFjBe`>)6&{!^nXE;AlGPJvQ>!E zleHNOSHK1v&i{lloWBtqk8STr@X*g{f2kq4^tpq1&ke$cR)yG+vru#7GCOh(0BPe# zeg}2%OJkLoJaQgj<)x~S_HFcWA?<0Xv7>=8qeR~eQ%ksr1gt|?Msvj*`Pc5<7Votm zv%|;RevK;q+4v$R>~B0&$1q0PeaEtl3q8+og=va2FYl_nR3c86mAZUxZV1i+@$KU1 z$9FOqj#k{vhqB{lLDDdcG6X9`F5vn804e>|td;V0@fv3?O{q&=Py?TnPE&p&oezK; z4!!R8*vvMum7c3x#G*+1Cem3&y)t1@!B-PGwD`zUl@v{`OhLC8^0~uN)0WFI>78Ya zXi~Zyp4_H~NS)gq-iaCSbSj(zwmyyNq8ar$%scd@`WF*1E^dCD^h|wH{{IPH{M%KJ z_$d0`Wi2}6=Xb#{9aD>FLc`J>*Awt;<$Wv5n_$}uK1Rb2-lMSQ*UPkQYD;dpn zu#q&_w(mFtJaHb+G)6S@C}WJw!VJG_EgB;e^JsLL_sFQ~H1yb)L`LWNM5C|dPa=%& zr>{20V(hienTZ&M=-{J=y>p!V01QjdG(WvwRk>&}s+*LLh14f7x)x_a0&u_NeVn`x zN>*OukT$@b#ol~NnQ;g<$veZG!djX0Yc1>a=YZG;utdo})M8_pR{G8BnVMu9O=~q{ zWp7=9RaNU!9VU;Uq!l+$_k+^i+LVOJMGOWbyr?)u9dDxnfrR}Zm?YL&Ix=Ww?P5A}Jk^Ys#qvLw1+S9RSt>+m z=7}ukE-g8c^$fN{{ilOWbfP)1KUTeG7T@NHb~_7#{?Vv=8NQ$oAhxK^;Q$Z3oWec& z;feHym^^q&D#EZ{H!8{4I8%!dBPr$~(X24`HeKHB8fUO4G_}K11jaCNM?*HqlKk{b>XV-lHjOOpS$r`?Y zH%x@yowKbwXBjXJSPU2orUhF777NCK#ev0xC4li@Ixsz$0n7-N2(}O`2`u^jowKI5 G>;4Nf@JjFi delta 2681 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 W7y%|g7GMD&8({wR_8H3?2mS+3kSrYl diff --git a/src/fonts/term16n.fnt b/src/fonts/term16n.fnt new file mode 100644 index 0000000000000000000000000000000000000000..bb89ed4ab42a1ebff1ba5d6ac5a4d259a3b98a6c GIT binary patch literal 2048 zcmeHHy^0$#5H?~7A{ZlFZE?jCws3KUOA{6&ggA@|;qU_lW3EV<(#5ibty3IJsuU?) zq__vUrwU2F`H^;gw9A~Pp9p|0!ecHp4nkDNQ#4v&xR zayhgT@$mJdb*{QSypy=HuFLg4#`uz@I50VMtq>I}m`)nt$wmc;o$%3u z89pp+|NU~g{P^~HtS^L)2&o;rmee-Kqe7qgo+BAUh-a}={b%w}ysZ04{CfmwKPZ;d zX}*nKK&SOD3YHjE4{>*YJl^l3`coaY`-lX@0oslRFj5ylz4QR!P%=kBgEJVl3@Tq^IkMoD#_ry=**055IvS7Tp_{|Qm6>#Fey}|Pz6U1Ut z2BXqtY8OIzL&5-qDxL3%AYJw5HJ zs%zWUAL`n<&DrFYb2S@$y1xFb^}G4}ij9h@8ja^`d-aX6ci;1;^SmUSrXu;gHYZS!;^fFfJ;yTD$GODj1K?HaYD`HVdNFVTPt=J7=C zA^(U&y;M$K<~o!3#4r5^iV#o=N**Q1pTZ|0{^Y~@hjZ?GIb~jtDq}h%#2C5bYo4M# zDvbF)T9C%rN9MVH(vW^d-1O{!8ne1&?2UWzFj_BSKSisutZl!tzHK)*yWP#EwTzLB z7tuH7aJY5wD*pHT?bf;Vdc_$1^&<1|^?3(>@xOl8FZ_Y$TT4|&z8nu!tUu-}+b7;5 z4@@^`H0ts0_HYRPtewrqy=3nm=;`5@&s56m|W?oLKCW_*I%136(# z`^|rzKbL$E4I^J0wT$zjXm@+mu)hlmwLuE9&lKo#1wPC(!G_V$g@1`sxJP2IYHRI9 zSu2GJz!e9OH0ffGefcsU+EcpPkj=vD`vr*eXI&VGev;hNIzuF0BJN`wWCNmpsIO_* zBGjX#qr@XiVNqYRc%#C7Mr4H7gAfnh==XyFjkJ*YCyC+oz8v+dil!9vgZ0Pv)L6-| s;|1XTF7T=>G4rydH" +// FS things +char* cwd; + +FILE* openFileTable; +uint32_t maxOpenFiles; +uint32_t openFiles; + // Function declarations void listFiles(); void printRegs(); void printPhysicalMemmap(); - -// FS things -char* cwd; +void initOpenFileTable(); __attribute__ ((section("entry"))) void main() { @@ -74,16 +79,9 @@ void main() { mallocVirtualAddr = kernelMallocVirtualAddr; mallocPhysicalAddr = kernelMallocPhysicalAddr; mallocPages = kernelMallocPages; - - // Setup stdio FILE* - stdin->_file = 0; - stdin->_oflag = O_RDONLY; - stdout->_file = 1; - stdout->_oflag = O_WRONLY | O_APPEND; - stderr->_file = 2; - stderr->_oflag = O_WRONLY | O_APPEND; - + // FS Setup + initOpenFileTable(); cwd = malloc(1024); strcpy(cwd, "/"); @@ -345,3 +343,25 @@ void printPhysicalMemmap() { printf("Free blocks: %d\n\n", maxBlocks - usedBlocks); } +void initOpenFileTable() { + maxOpenFiles = 256; + + openFileTable = malloc(sizeof(FILE) * maxOpenFiles); + memset(openFileTable, 0, sizeof(FILE) * maxOpenFiles); + + // offset and ptr are unused in these + stdin = openFileTable + 0; + stdin->_file = 0; + stdin->_oflag = O_RDONLY; + + stdout = openFileTable + 1; + stdout->_file = 1; + stdout->_oflag = O_WRONLY | O_APPEND; + + stderr = openFileTable + 2; + stderr->_file = 2; + stderr->_oflag = O_WRONLY | O_APPEND; + + openFiles = 3; +} +