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
7 changed files with 96 additions and 0 deletions

No files matched your search

+3
View File
@@ -21,3 +21,6 @@ path = "examples/dark.rs"
[profile.release]
opt-level = "z"
lto = "thin"
[[example]]
name = "fs_demo"
+10
View File
@@ -0,0 +1,10 @@
#![no_std]
#![no_main]
use kos::fs::read_file;
#[no_mangle]
Sweetbread marked this conversation as resolved
Review

Use c"..." for c-strings

Use `c"..."` for c-strings
pub fn kol_main() {
Sweetbread marked this conversation as resolved Outdated
Outdated
Review

Look at other examples for start command

Look at other examples for start command
let mut buf = [0u8; 256];
let _ = read_file(c"/rd/1/readme.txt", &mut buf);
}
+58
View File
@@ -0,0 +1,58 @@
use core::ffi::CStr;
use crate::sys::{fs_execute, FsBlock};
fn execute(op: u32, offset: u32, offset_hi: u32, count: u32, buf: *mut u8, path: &CStr) -> Result<(), u32> {
let info = FsBlock {
operation: op,
offset,
offset_hi,
byte_count: count,
buffer: buf,
_pad: 0,
path: path.as_ptr() as *const u8,
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?
};
match unsafe { fs_execute(&info) } {
0 => Ok(()),
e => Err(e),
}
}
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 fn read_file(path: &CStr, buf: &mut [u8]) -> Result<(), u32> {
execute(0, 0, 0, buf.len() as u32, buf.as_mut_ptr(), path)
}
pub fn read_folder(path: &CStr, buf: &mut [u8]) -> Result<(), u32> {
execute(1, 0, 0, buf.len() as u32, buf.as_mut_ptr(), path)
}
pub fn create_file(path: &CStr, buf: &[u8]) -> Result<(), u32> {
execute(2, 0, 0, buf.len() as u32, buf.as_ptr() as *mut u8, path)
}
pub fn write_file(path: &CStr, buf: &[u8]) -> Result<(), u32> {
execute(3, 0, 0, buf.len() as u32, buf.as_ptr() as *mut u8, path)
}
pub fn set_size(path: &CStr, size: u64) -> Result<(), u32> {
execute(4, size as u32, (size >> 32) as u32, 0, core::ptr::null_mut(), path)
}
pub fn get_attributes(path: &CStr, buf: &mut [u8]) -> Result<(), u32> {
execute(5, 0, 0, buf.len() as u32, buf.as_mut_ptr(), path)
}
pub fn set_attributes(path: &CStr, buf: &[u8]) -> Result<(), u32> {
execute(6, 0, 0, buf.len() as u32, buf.as_ptr() as *mut u8, path)
}
pub fn run(path: &CStr) -> Result<(), u32> {
execute(7, 0, 0, 0, core::ptr::null_mut(), path)
}
pub fn delete(path: &CStr) -> Result<(), u32> {
execute(8, 0, 0, 0, core::ptr::null_mut(), path)
}
pub fn create_folder(path: &CStr) -> Result<(), u32> {
execute(9, 0, 0, 0, core::ptr::null_mut(), path)
}
+1
View File
@@ -20,3 +20,4 @@ SF_SYS_MISC = 68
SSF_MEM_ALLOC = 12
SSF_MEM_FREE = 13
SSF_LOAD_DLL = 19
SF_FILE = 70
+1
View File
@@ -6,6 +6,7 @@ mod nanolibc;
pub mod allocation;
pub mod dll;
pub mod sys;
pub mod fs;
pub use modules::*;
+15
View File
@@ -67,4 +67,19 @@ extern "C" {
// 68.19
#[link_name = "_load_dll"]
pub fn load_dll(name: *const u8) -> *const u32;
// 70
#[link_name = "_fs_execute"]
pub fn fs_execute(info: *const FsBlock) -> u32;
}
#[repr(C)]
pub(crate) struct FsBlock {
pub operation: u32,
pub offset: u32,
pub offset_hi: u32,
pub byte_count: u32,
pub buffer: *mut u8,
pub _pad: u8,
Sweetbread marked this conversation as resolved Outdated
Outdated
Review

Why do you reserve it?

Why do you reserve it?
pub path: *const u8,
}
+8
View File
@@ -20,6 +20,7 @@ section '.text'
public _get_lang
public _load_dll
public _set_event_mask
public _fs_execute
_exit:
mov eax, SF_TERMINATE_PROCESS
@@ -143,3 +144,10 @@ _set_event_mask:
int 0x40
ret
_fs_execute:
push ebx
mov eax, SF_FILE
Sweetbread marked this conversation as resolved Outdated
Outdated
Review

Magic number. Use const SF_FILE

Magic number. Use const `SF_FILE`
mov ebx, [esp + 4 * 2]
int 0x40
pop ebx
ret