From 819ffb3e5a3fde35a75ec2e77594da6c32527c37 Mon Sep 17 00:00:00 2001 From: rajc6h6 Date: Wed, 25 Mar 2026 21:43:18 +0530 Subject: [PATCH] fix: use syscalls.S FFI pattern for fs syscall, pub fn kol_main --- examples/fs_demo.rs | 10 ++++------ src/fs.rs | 22 ++++++++++++---------- src/sys.rs | 32 ++++++++++++-------------------- src/syscalls.S | 8 ++++++++ 4 files changed, 36 insertions(+), 36 deletions(-) diff --git a/examples/fs_demo.rs b/examples/fs_demo.rs index 41a03b5..f7fc4cb 100644 --- a/examples/fs_demo.rs +++ b/examples/fs_demo.rs @@ -1,12 +1,10 @@ #![no_std] #![no_main] -use kos::fs::fs_read; +use kos::fs::read_file; #[no_mangle] -pub extern "C" fn _start() -> ! { - let path = c"/rd/1/readme.txt"; - let mut buf = [0u8; 512]; - let (_status, _bytes) = fs_read(path, &mut buf); - loop {} +pub fn kol_main() { + let mut buf = [0u8; 256]; + let _ = read_file(c"/rd/1/readme.txt", &mut buf); } diff --git a/src/fs.rs b/src/fs.rs index ed6b23c..ed10a22 100644 --- a/src/fs.rs +++ b/src/fs.rs @@ -1,14 +1,16 @@ use core::ffi::CStr; -use crate::sys::{syscall_fs, FileSystemRequest}; +use crate::sys::{fs_read, FsInfo}; -pub fn fs_read(path: &CStr, buf: &mut [u8]) -> (u32, u32) { - let req = FileSystemRequest { - operation: 0, - offset_low: 0, - offset_high: 0, - byte_count: buf.len() as u32, - buffer: buf.as_mut_ptr() as u32, - path: path.as_ptr() as u32, +pub fn read_file(path: &CStr, buf: &mut [u8]) -> Result<(), u32> { + let info = FsInfo { + operation: 0, + offset: 0, + offset_hi: 0, + byte_count: buf.len() as u32, + buffer: buf.as_mut_ptr(), + reserved: 0, + path: path.as_ptr() as *const u8, }; - unsafe { syscall_fs(&req) } + let result = unsafe { fs_read(&info) }; + if result == 0 { Ok(()) } else { Err(result) } } diff --git a/src/sys.rs b/src/sys.rs index eb10ed2..5ba5b38 100644 --- a/src/sys.rs +++ b/src/sys.rs @@ -67,27 +67,19 @@ extern "C" { // 68.19 #[link_name = "_load_dll"] pub fn load_dll(name: *const u8) -> *const u32; + + // 70 + #[link_name = "_fs_read"] + pub fn fs_read(info: *const FsInfo) -> u32; } #[repr(C)] -pub struct FileSystemRequest { - pub operation: u32, - pub offset_low: u32, - pub offset_high: u32, - pub byte_count: u32, - pub buffer: u32, - pub path: u32, -} - -pub unsafe fn syscall_fs(req: *const FileSystemRequest) -> (u32, u32) { - let eax_result: u32; - let ebx_result: u32; - core::arch::asm!( - "int 0x40", - inout("eax") 70u32 => eax_result, - in("ebx") req, - out("ebx") ebx_result, - options(nostack) - ); - (eax_result, ebx_result) +pub struct FsInfo { + pub operation: u32, + pub offset: u32, + pub offset_hi: u32, + pub byte_count: u32, + pub buffer: *mut u8, + pub reserved: u8, + pub path: *const u8, } diff --git a/src/syscalls.S b/src/syscalls.S index 85570eb..41959d5 100644 --- a/src/syscalls.S +++ b/src/syscalls.S @@ -20,6 +20,7 @@ section '.text' public _get_lang public _load_dll public _set_event_mask + public _fs_read _exit: mov eax, SF_TERMINATE_PROCESS @@ -143,3 +144,10 @@ _set_event_mask: int 0x40 ret +_fs_read: + push ebx + mov eax, 70 + mov ebx, [esp + 4 * 2] + int 0x40 + pop ebx + ret