From bf7d96865afd7dfb1e8e0d4536f81283c528d4e6 Mon Sep 17 00:00:00 2001 From: Ruslan Isaev Date: Fri, 20 Jun 2025 23:06:01 +0300 Subject: [PATCH] syscalls: done with open, write, close syscalls --- grubshit/aaa | Bin 8748 -> 8724 bytes grubshit/aaa.asm | 58 ++++++++++++++++++++------------------ grubshit/aaa.o | Bin 752 -> 720 bytes src/tasking/syscalls.c | 62 +++++++++++++++++++++++++++++++++++++---- 4 files changed, 88 insertions(+), 32 deletions(-) diff --git a/grubshit/aaa b/grubshit/aaa index c0cf1d37e6139399471b43ef833a597e55cfb5d8..fe52346f45ace5146780eb6e138ec6cf5906606a 100755 GIT binary patch delta 337 zcmZ4EGR0+r0;9@AMQ2u91_lP(iJ8)@+CYZ(#?Eqn+a0Vx=5B@sEF3!>fvjCi7#SGO zHgq1}!2;xU{@%$Cl-VT>WS?!=!3GurGJt9r3~!%p*z72W$I(RzSWEk~~9VVxnGRaV|qzW=?8+L1IY;LvCtu zabkKZm}Unu;&W2-CjU~XW3-)Isi@AVJ$a#`GOvyT&|08bAiuLtzNje8x(6s?Kl!7g NGV5<3OC87(1^^=MP~89k delta 348 zcmbQ@vc_eC0;A1DMQ2tU1_lP3iJ8)@_CSXH#?Eqnn_YZB=1ztMEF8NTfvg=YK;mq} z4iFnifp}o?oqRwQy9|*fU;o?eD6pS@;s#bbkJOx;d>w`I{Gyx`MTX+k)ZAi)oXqT0 z1@FX?#8UrYg{;!z5{1-?)a25V)D(r1jLc#MS06Xsw9K4TMa9Wl3P!2CK%+rUfq;+y z1%V8Zoe(|~gBXwjvK|6H{#O7oCP3r`7#JC(fn0m2dI1I|26Z&P9+2-ad82}eU~X|b zLr!WQ1CTZXF^ncZQmA9JnVhJo&S*cmQ&E}ML4ko`0Z={2_iU4QDoV3H0E!q-HdGLv Q{6c0B>eaZU6uP diff --git a/grubshit/aaa.asm b/grubshit/aaa.asm index 89f914a..9749e68 100644 --- a/grubshit/aaa.asm +++ b/grubshit/aaa.asm @@ -1,29 +1,33 @@ -section .text - global _start ;must be declared for using gcc -_start: ;tell linker entry point - mov edx, len ;message length - mov ecx, msg ;message to write - mov ebx, 1 ;file descriptor (stdout) - mov eax, 4 ;system call number (sys_write) - int 0x80 ;call kernel - - mov eax, 1 ;system call number (sys_exit) - int 0x80 ;call kernel - - mov eax, 4 - mov ebx, 1 - mov ecx, msg2 - mov edx, len2 - int 0x80 - - mov eax, 1 - int 0x80 - - jmp $ - section .data + file_path db '/ebalo/huy.txt', 0 ; Specific file path, null-terminated + message db 'Hello, World from KatauOS!', 10, 0 ; Message to write, with newline + message_len equ $ - message - 1 ; Length of message (14 bytes, excluding null) -msg db 'Hello, world!',0x0 ;our dear string -len equ $ - msg ;length of our dear string -msg2 db 'seems like KatauOS just executed this ELF-file!!',0x0 -len2 equ $ - msg2 +section .text + global _start + +_start: + ; Open the file + mov eax, 5 ; System call number for sys_open + mov ebx, file_path ; Pointer to file path + mov ecx, 65 ; Flags: O_WRONLY (1) | O_CREAT (64) + mov edx, 0x1A4 ; Mode: 0644 (rw-r--r--) + int 0x80 ; Invoke system call + mov edi, eax ; Save file descriptor in edi + + ; Write to the file + mov eax, 4 ; System call number for sys_write + mov ebx, edi ; File descriptor + mov ecx, message ; Pointer to message + mov edx, message_len ; Number of bytes to write + int 0x80 ; Invoke system call + + ; Close the file + mov eax, 6 ; System call number for sys_close + mov ebx, edi ; File descriptor + int 0x80 ; Invoke system call + + ; Exit the program + mov eax, 1 ; System call number for sys_exit + xor ebx, ebx ; Return status 0 + int 0x80 ; Invoke system call diff --git a/grubshit/aaa.o b/grubshit/aaa.o index eb00557b0645d770d8b089963c5b6ba8745b7452..a4dd3c8655215ac633b5561173f8794aa36a881f 100644 GIT binary patch literal 720 zcmbVKu}T9$5S`O#R1gCe78ahBf^s2XD`=qz3KkZYaYHsnxbx(01E%uYbomHBBGJaq zDq!zdq)rjv%kAQ&v2bAa&CI@evzg1w+10t{dE(5IMfuG{PVB|e4ELps`~Mg<>8|?@ z$w5J=WaF~sE!(^g-f@9fvGF?4X|ePLUd`SSIE%IgUzkPtQ9+U+T!M2J=TdVAUexP@ z7og_M>FuGg>WaV*@Yqis&LOVAomF*1g>kjr=?3Q6$b}BW_|U(Nld$Qxk~s1&l~JAR zo87g%W59>KGajDeczea*QP%q$P`Ec4Zm_tGW0VcJquvAoA6NSxWdI495R|}ZObgO> zY7(Owh`LdZHcxbzbJ+8Tx!+AnNygJ6b^f2i{VmMxhF@V54SaKMp781P+{RPx(^-WZ nR7wRZjimJu>iUy1ZHaW6s(bCQ9_mM_r$!|Pjog8UHs9h8{aZ}+ literal 752 zcmbVKF;2rU6#WT>!T{=k1Pj7tp#wysVnl)kgai@;2LMA2EjUz)T~VfT1dhNF7~66N z?$Dhn7ohx?*d#0reChYS=l}BD*clw29tA-_z5<$|LJ=Lf!ES~Ps`C6lg-rCEd-#&Y zUMZ;Nc$E=8zsoC&{gSWZ_+rU}r3w3X+zfyW)CzZ)vHVA{cwsurJvnOKU=Eot=tY=SghvIl%`0bgvx;Wsf=O^pBm diff --git a/src/tasking/syscalls.c b/src/tasking/syscalls.c index dfbe921..b38da5a 100644 --- a/src/tasking/syscalls.c +++ b/src/tasking/syscalls.c @@ -1,13 +1,50 @@ #include "../include/syscalls.h" #include #include "../include/stdio.h" +#include "../include/liballoc.h" #define STDIN_FILENO 0 #define STDOUT_FILENO 1 #define STDERR_FILENO 2 #define EBADF 9 -typedef unsigned short umode_t + +const char* flags_to_mode_str(int flags) { + static char mode[4] = {0}; + int accmode = flags & 3; + + if (accmode == 0) { // O_RDONLY + mode[0] = 'r'; + mode[1] = '\0'; + } else if (accmode == 1) { // O_WRONLY + if (flags & 0x400) { // O_APPEND + mode[0] = 'a'; + mode[1] = '\0'; + } else { + mode[0] = 'w'; + mode[1] = '\0'; + } + } else if (accmode == 2) { // O_RDWR + if (flags & 0x400) { // O_APPEND + mode[0] = 'a'; + mode[1] = '+'; + mode[2] = '\0'; + } else if (flags & 0x200) { // O_TRUNC + mode[0] = 'w'; + mode[1] = '+'; + mode[2] = '\0'; + } else { + mode[0] = 'r'; + mode[1] = '+'; + mode[2] = '\0'; + } + } else { + mode[0] = 'r'; + mode[1] = '\0'; + } + + return mode; +} int sys_write(TrapFrame *tf) { @@ -32,18 +69,30 @@ int sys_write(TrapFrame *tf) int sys_open(TrapFrame *tf) { - const char* filename = tf->ebx; + const char* filename = (const char*)tf->ebx; int flags = tf->ecx; - umode_t mode = tf->edx; int fd = -1; + const char* mode_str = flags_to_mode_str(flags); + + debug_log("\n====filename: %s\n", filename); + debug_log("\n====mode_str: %s\n", mode_str); for(int i = 3; i < MAX_OPEN_FILES; i++) { + debug_log("\n====i: %X\n", i); if(current->file_descriptors[i] == NULL) { - fat_fopen(current->file_descriptors[i], filename, (char)mode); + current->file_descriptors[i] = malloc(sizeof(file_t)); // Kernel malloc + debug_log("\n====FILE_DESCRIPTOR: %X\n", i); + int result = fat_fopen(current->file_descriptors[i], filename, mode_str); + if (result < 0) { + free(current->file_descriptors[i]); // Free on failure + current->file_descriptors[i] = NULL; + return result; + } fd = i; + break; } } @@ -55,7 +104,10 @@ int sys_close(TrapFrame *tf) int fd = tf->ebx; if(current->file_descriptors[fd] != NULL) { - return fat_fclose(current->file_descriptors[fd]); + int result = fat_fclose(current->file_descriptors[fd]); + free(current->file_descriptors[fd]); + current->file_descriptors[fd] = NULL; + return result; } return -1; }