From 9388457774192bcb45f3ef2d544c4b373c6d332d Mon Sep 17 00:00:00 2001 From: Tom-on64 Date: Mon, 26 Aug 2024 14:43:12 +0200 Subject: [PATCH] Made Open() syscall work (badly) --- include/c/stdio.h | 36 ++++++++++++++++++++--------------- include/fs/impl.h | 5 +++-- include/interrupt/syscalls.h | 29 ++++++---------------------- include/memory/addresses.h | 3 ++- kern.iso | Bin 1470464 -> 1470464 bytes src/kernel.c | 34 ++++++++++++++++++++++++++------- 6 files changed, 59 insertions(+), 48 deletions(-) diff --git a/include/c/stdio.h b/include/c/stdio.h index c7f1aaf..1a864aa 100644 --- a/include/c/stdio.h +++ b/include/c/stdio.h @@ -7,36 +7,42 @@ #include // Nobody should have to interface with the internals of this structure -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 +typedef struct _iobuf { // 24B + unsigned char* _ptr; // File buffer base + unsigned int _size; // Size of buffer + int _offset; // Offset into file + unsigned short _flag; // Open flags + int _file; // File descriptor + + char __reserved[6]; } FILE; FILE* stdin; FILE* stdout; FILE* stderr; +/* Declarations */ +int printf(const char*, ...); + /* --- file I/O --- */ FILE* fopen(const char* filename, const char* mode) { - FILE* stream = malloc(sizeof(FILE)); - int oflag = O_RDWR | O_CREAT | O_BIN; // TODO! int fd = open(filename, oflag); + if (fd < 0) { + printf(""); // TODO: i'd prefer if i didn't need this + return NULL; + } + + // TODO: Somehow get the open file table + FILE* fp = malloc(sizeof(FILE)); + fp->_file = fd; - stream->_ptr = NULL; // Idk - stream->_file = fd; - stream->_oflag = oflag; - - return stream; + return fp; } int fclose(FILE* stream) { int res = close(stream->_file); - free(stream); - return res; } @@ -148,7 +154,7 @@ int printf(const char* fmt, ...) { case '%': // Just print '%' buffer[len++] = c; break; - } + } state = 0; } } diff --git a/include/fs/impl.h b/include/fs/impl.h index a180369..48adabf 100644 --- a/include/fs/impl.h +++ b/include/fs/impl.h @@ -6,6 +6,8 @@ #include #include +#define MAX_OPEN_FILES 256 + superblock_t* impl_superblock = (superblock_t*)SUPERBLOCK_LOC; inode_t* getInode(char* path, dirEntry_t* dentries) { @@ -13,8 +15,7 @@ inode_t* getInode(char* path, dirEntry_t* dentries) { if (strcmp(dentries->name, path) == 0) break; dentries++; } - - if (dentries->name[0] == '\0') return NULL; + if (dentries->name[0] == '\0') { return NULL; } inode_t* inode = (inode_t*)BOOT_FIRST_INODE_LOC + dentries->id; diff --git a/include/interrupt/syscalls.h b/include/interrupt/syscalls.h index 55cc67a..04a372e 100644 --- a/include/interrupt/syscalls.h +++ b/include/interrupt/syscalls.h @@ -115,38 +115,21 @@ int sys_open(sys_regs_t regs) { loadFile(root, (void*)SCRATCH_BLOCK_LOC); inode_t* inode = getInode(path, (dirEntry_t*)SCRATCH_BLOCK_LOC); + if (inode == NULL) { + return -1; + } // TODO: check if max open files have'nt been reached fd = openFiles++; FILE* fp = openFileTable + fd; - fp->_ptr = 0; + fp->_ptr = (void*)0xd000; fp->_offset = 0; fp->_size = inode->sizeBytes; fp->_flag = oflag; fp->_file = fd; - /*fp->_ptr = (unsigned char*)nextAvailableVirtualAddress; + loadFile(inode, fp->_ptr); - // Read file from disk - uint32_t pageCount = BYTES2BLOCKS(inode->sizeBytes); - if (pageCount == 0) { pageCount++; } - - for (size_t i = 0; i < pageCount; i++) { - ptEntry_t page = 0; - uint32_t physAddr = (uint32_t)allocPage(&page); - - if (!mapPage((void*)physAddr, (void*)nextAvailableVirtualAddress)) { - fd = -1; // TODO errno - break; - } - - nextAvailableVirtualAddress += PAGE_SIZE; - } - - if (!loadFile(inode, fp->_ptr)) { - fd = -1; // TODO errno - }*/ - return fd; } @@ -159,7 +142,7 @@ int sys_close(sys_regs_t regs) { extern uint32_t openFiles; FILE* fp = openFileTable + fd; - //free(fp->_ptr); + free(fp->_ptr); openFiles--; return 0; diff --git a/include/memory/addresses.h b/include/memory/addresses.h index a8a87e0..f5ba23b 100644 --- a/include/memory/addresses.h +++ b/include/memory/addresses.h @@ -30,7 +30,7 @@ #define DATETIME_LOC 0x2200 // Filesystem Area 0x3000 - 0x3fff -#define FILETABLE_LOC 0x3000 +#define OPEN_FILE_TABLE_LOC 0x3000 // Font area 0x4000 - 0x4fff #define FONT_LOC 0x4000 @@ -58,5 +58,6 @@ #define KERNEL_LOC 0x100000 #define KERNEL_MALLOC_AREA 0x300000 #define MEMMAP_AREA 0x30000 +#define OPEN_FILE_LOC 0xd000 #endif diff --git a/kern.iso b/kern.iso index 23932b563785c7555e5bbf29bd903a82a41d47a2..7948b038fcd23d921b5ac20712419034610f3f5f 100644 GIT binary patch delta 5273 zcma)9eRver)xW#hO@^?^E|`QMOR~glAW$KR1o_m20Odn;vI|KF0uh0Z0VF_HLIdpL zCYoUrDqO|BSWrl7Yx~%Tx)p=8bkhhMtyG(SQP8KM1etYHiv?bzg7f~)OoEG#zU?1p z?)jZ_?wNb;xpVFrU-uGU_mU$gi_B~aVs#*NIMw zoF3&8QyFuYDHC$|Q=29lr;X*OHf0)tE@4Q{;lk!j<3F7|7sK05J|Dx+oO~^YT~6M- z*=}6t)!MxtCk5k>R8?itx3KL}1r{K^ht(+sIp9A1 z%VAc%K>CQJN8=zpn5)fDR$^b36A6q(etun5-EOH&3#At`_1$UQgSGp6Ez(jbl$T(M zvr|L-0iEAd$h;wCj}DHLqEYAnLi|>p|BU$cIzMs}_=j|UA@PfKzMlAbI)8xp89LuV ze7??K10VSS0hX3ZDR)yIOR&C-qLJ20lcN2OLcr3)9`Y=~zwswyu@Kyxo&-9BSg{Jj1=8%AcL~Mefz@@-(~c z1756+ANKFuR4A0G_ym-BV{ldv9Km74i%zsbehlWU<<}&-@}t0AqF7y5rWC-eqLR2V z;Fc_xF2hJ#Kxb+g1S={eiE`ZL#Z!sbjCGUeNpNlSmvfp(&;tSHXik=q;ExcHf5}Pc zq-GDK>0Z-}fwZYF0r@*jSZzxqeM3_^tc|mA%5Wg6>lE+nP%As|h)n%V+txYS9+(oS za_DyAbg!LlvB#My(m;BQD>VuAK9nC? zx~#+Bsdo7Lge_x5>rbpN#AhrnFLRZ;7pWV5Esw!$=bGm%F*63I#c@jh@l*@|pauPd=7E z*|pb)wKeS{DX%)8W~?d>eq2{;;EmsH8a)fbHq;7s9H)dGBPgFe?ZcueG=Hxxuuv#f zUgXCw*tuArXxvl4AFQ{>AAv_m&tGsR7GVkse$w<}{&M|-^okqUHrmj@vL5{&2+Tgy zT2#z!+eVwF(-IE$IE*k}wrxU|6XmFKiKu#dls|%%?b*sy%twk0VR?pTJ>=r(bYkRi zz|$Q~{r0IiXG^(3PSup+#f2-d&N6o!(#Vd@(_Sm&cb)b%hPI|ql7C4Hb>fJ?XMQM} zDxcD?DLYK{<;gX+meqYrmunH1x~SiZ6p(vfA+=5T1l3y{4G{S zUaPIjN&fd8uNph=4({`gG8oqt@MFF?hEscYt|tCFJMW}n-_F&BxA^s)Sp*!9&lyKo zxmqKrH5RqTq~=vS6bCY=-SBFW30o^f=S>$p3nAfq9#5lbFFn4}@EdONPxJcl>1n2c z#htmLDKZL&ZvY#Bhs5AqTf`Ux4YtS?#64gw+af(NFq-M#-l;3CPZtf3bjIjpTVV0q zGQ0By?k`8LfnxadE=v?UFFLnMs9D9SmY#9%SqH6wkuXq zLJPuN%F2K9^Q*pPA}JrTdb-Y(uC@zgJubDmm}fMNGh$fKG?9j#O_fG;e(yKc(@-gA z)8LcG8jASOWWV88e8R4oL%04*KT{0dV>K&R9{CqP`<=Z!H85g?4{qJc@98@Zw>AI- zlBi#llY}XJL7>Qpp(XGL4SfOkV6tw%WQm*6RLskoCmDUke0TF5qzyJNrNP!xfFU@m zWu3tgO|{NvndM=rgFI7+O3rKTP{aoaVsS^EnhR6HOso2mZNX69IhdoZ-xM6-3GKDW)7Ne3q&=4dAd z2fDpG&U!Q?24*IM6P54t(18(IRD~V4RAHQBT#KcpWzs6D_M`ZX13AeXh`sh6-hiKy zSv>z>#=SI?EFU;xi1svuY7_L5?g-58*;QnMAo+_;TXQ~}F*Ml3oCJBQBcqgR5MlUR+X~9p^B4jYdUI1ewQrT*5IGj$XZ0Z zoSFhzxQPC~7^GuTAe}6y+BE50qb{A5f?s7SIMi3+1%YMP-|S#}x>EW17c#T{fQxvZ zz(PB%EcA<17HV*y_XEz#01s*wc-A3TaPy(PChw+|tYpLb^$$I|%JJxiTF06Vo<~R^yC{Oz%|DJ)bE3V`;5UIMj&ehc~&DAG?q zzzT>Apot**SulhC7d|4v)h|vHUOAGMmwhUsh$%lsJXBq=e`g5q2W~mghgwPB>OnrW z+i5t*tGY*I9>sqUEK!85qNu)l6(&+QrbHWQau46%{bGhgC}MeS^o(s)55THvpF`lw z&!-z5La^?9f1{cL!Q z$)X|DGr=+M`pvfV6R;HB@-N#`7+EjordenOUujCAy8q$>bN~OA^cC8>|EeYB&s{8Z zQ>3viK5_hD`^J$ zrEnN+@%;S@xrrhyC{_2xQ>uo2eX2xmy*kDS6Ur2Z|C}ipQKs&L_pfFOs{fp+6ioc@ zGv%T3mV&S-3=zPcCvCVHkw8Jnp^{5RLe`6Jh!j9fE-jG#D>31kMvgAzajXb>n7 eG#F$7C4rJbR*(%e1T++M8z|+q$hFkot^Wr-_*f7C delta 4687 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 + printf("%d: 0x%x Bytes", fp->_file, fp->_size); + for (size_t i = 0; i < fp->_size; i++) { + if (i % 32 == 0) { + if (i != 0) { + size_t oldi = i; + i -= 32; + while (i < oldi) { + char c = fp->_ptr[i++]; + printf("%c", c < 32 ? '.' : c); + } + } + printf("\n%x: ", i); + } + printf("%x ", fp->_ptr[i]); + } + printf("\n"); + + free(_f); + fclose(fp); } }