diff --git a/grubshit/aaa b/grubshit/aaa index fe52346..db56b22 100755 Binary files a/grubshit/aaa and b/grubshit/aaa differ diff --git a/grubshit/aaa.asm b/grubshit/aaa.asm index 9749e68..d3590ba 100644 --- a/grubshit/aaa.asm +++ b/grubshit/aaa.asm @@ -1,33 +1,45 @@ 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) + file_path db '/ebalo/huy.txt', 0 ; File path + message db 'Hello, World from KatauOS!', 10, 0 ; Message with newline + message_len equ $ - message - 1 ; Length excluding null terminator + +section .bss + buffer resb 256 ; Buffer for reading file content + read_count resd 1 ; Store bytes read count 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 + ; Reopen file for reading + mov eax, 5 ; sys_open + mov ebx, file_path + mov ecx, 0 ; O_RDONLY + mov edx, 0 ; Mode (unused) + int 0x80 + mov edi, eax ; Save new descriptor - ; 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 + ; Read file content + mov eax, 3 ; sys_read + mov ebx, edi + mov ecx, buffer + mov edx, 256 + int 0x80 + mov [read_count], eax ; Save bytes read count - ; Close the file - mov eax, 6 ; System call number for sys_close - mov ebx, edi ; File descriptor - int 0x80 ; Invoke system call + ; Write to stdout + mov eax, 4 ; sys_write + mov ebx, 1 ; stdout + mov ecx, buffer + mov edx, [read_count] ; Use actual bytes read + int 0x80 - ; Exit the program - mov eax, 1 ; System call number for sys_exit - xor ebx, ebx ; Return status 0 - int 0x80 ; Invoke system call + ; Close file + mov eax, 6 ; sys_close + mov ebx, edi + int 0x80 + + ; Exit + mov eax, 1 ; sys_exit + xor ebx, ebx ; Return 0 + int 0x80 diff --git a/grubshit/aaa.o b/grubshit/aaa.o index a4dd3c8..b7c32e7 100644 Binary files a/grubshit/aaa.o and b/grubshit/aaa.o differ diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c index 1c6661f..225ff1c 100644 --- a/src/kernel/kernel.c +++ b/src/kernel/kernel.c @@ -218,7 +218,7 @@ void kmain(unsigned int magic, unsigned int info) printf("huy1 points to: 0x%X huy2 points to:0x%X\n", huy, huy2); printf("huy1: %s\nhuy2: %s", huy, huy2); - exec_from_file("/boot/katauos.bin"); + exec_from_file("/ebalo/aaa"); while(1) { diff --git a/src/tasking/exec_from_file.c b/src/tasking/exec_from_file.c index 052f718..5052963 100644 --- a/src/tasking/exec_from_file.c +++ b/src/tasking/exec_from_file.c @@ -68,7 +68,7 @@ void exec_from_file(const char* filename) uint8_t* file; - int result = read_file("/ebalo/aaa", &file); + int result = read_file(filename, &file); debug_log("result: %X\n", result); debug_log("buffer: %s\n", file); diff --git a/src/tasking/syscalls.c b/src/tasking/syscalls.c index b38da5a..37e20b6 100644 --- a/src/tasking/syscalls.c +++ b/src/tasking/syscalls.c @@ -46,6 +46,22 @@ const char* flags_to_mode_str(int flags) { return mode; } +int sys_read(TrapFrame *tf) +{ + if(tf->ebx < 3) + { + //TODO: implement stdin handling here + } + else + { + if(current->file_descriptors[tf->ebx] == NULL) + { + return -EBADF; + } + return fat_fread(current->file_descriptors[tf->ebx], (void*)tf->ecx, tf->edx); + } +} + int sys_write(TrapFrame *tf) { if(tf->ebx < 3) @@ -53,7 +69,9 @@ int sys_write(TrapFrame *tf) //stdin, stdout or stderr if(tf->ebx == STDOUT_FILENO) { + debug_log("\n=================SYS_WRITE output to stdout=====================\n"); print((char*)tf->ecx, tf->edx); + debug_log("\n=================END OF THAT SHIT=====================\n"); tf->ecx++; } } @@ -102,9 +120,12 @@ int sys_open(TrapFrame *tf) int sys_close(TrapFrame *tf) { int fd = tf->ebx; + debug_log("SYS_CLOSE: fd = 0x%X", fd); if(current->file_descriptors[fd] != NULL) { + debug_log("SYS_CLOSE: current->file_descriptors[fd] != NULL"); int result = fat_fclose(current->file_descriptors[fd]); + debug_log("SYS_CLOSE: fat_fclose result: 0x%X", result); free(current->file_descriptors[fd]); current->file_descriptors[fd] = NULL; return result; @@ -120,6 +141,12 @@ void handle_syscall(TrapFrame *tf) debug_log("ECX: %s ", tf->ecx); debug_log("EDX: %X\n", tf->edx); + if(tf->eax == 3)//read + { + int r = sys_read(tf); + tf->eax = r; + } + if(tf->eax == 4)//write { int r = sys_write(tf);