Add filesystem syscall 70 wrapper and fs_demo example #10

Open
rajc6h6 wants to merge 4 commits from rajc6h6/Core:feat/fs-syscall into master
pull from: rajc6h6/Core:feat/fs-syscall
2 changed files with 56 additions and 0 deletions
Showing only changes of commit 1ea751f931 - Show all commits

No files matched your search

+25
View File
@@ -0,0 +1,25 @@
#![no_std]
#![no_main]
use kos::fs::{FileInfo, fs_read};
static FILENAME: &[u8] = b"/rd/1/readme.txt\0";
Sweetbread marked this conversation as resolved
Review

Use c"..." for c-strings

Use `c"..."` for c-strings
static mut BUFFER: [u8; 256] = [0u8; 256];
Sweetbread marked this conversation as resolved Outdated
Outdated
Review

Look at other examples for start command

Look at other examples for start command
#[no_mangle]
pub extern "C" fn _start() -> ! {
unsafe {
Sweetbread marked this conversation as resolved Outdated
Outdated
Review

In examples should not be unsafes

In examples should not be `unsafe`s
let info = FileInfo {
func: 0,
param1: 0,
param2: 0,
param3: 256,
buf: BUFFER.as_mut_ptr(),
name: FILENAME.as_ptr(),
};
let (_result, _bytes_read) = fs_read(&info as *const FileInfo);
}
loop {}
}
Sweetbread marked this conversation as resolved Outdated
Outdated
Review

Add the example into Cargo.toml

Add the example into `Cargo.toml`
+31
View File
@@ -0,0 +1,31 @@
use core::arch::asm;
/// KolibriOS Function 70 — filesystem operations
/// Passes a pointer to a FileInfo structure via ebx
/// int 0x40 with eax=70 is the KolibriOS FS syscall
#[repr(C, packed)]
pub struct FileInfo {
pub func: u32, // 0 = read, 1 = read folder, 2 = create/write
pub param1: u32, // offset (low)
pub param2: u32, // offset (high) or flags
pub param3: u32, // bytes to read/write
Sweetbread marked this conversation as resolved Outdated
Outdated
Review

Em? Why not just name them istead of writing comment?

Em? Why not just name them istead of writing comment?
pub buf: *mut u8, // pointer to buffer
pub name: *const u8, // pointer to filename (ASCIIZ)
}
/// Opens/reads a file on KolibriOS using syscall eax=70
/// Returns (eax_result, ebx_bytes_read)
Sweetbread marked this conversation as resolved Outdated
Outdated
Review

That's too low-level. Those functions should be in src/sys.rs

That's too low-level. Those functions should be in `src/sys.rs`
pub unsafe fn fs_read(info: *const FileInfo) -> (u32, u32) {
let eax_out: u32;
let ebx_out: u32;
unsafe {
asm!(
"int 0x40",
inlateout("eax") 70u32 => eax_out,
inlateout("ebx") info as u32 => ebx_out,
options(nostack)
);
}
(eax_out, ebx_out)
}