hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/kernel/vfs.rv
diff options
context:
space:
mode:
authorhachem <im@hachem.wtf>2026-10-04 16:03:42 +0200
committerhachem <im@hachem.wtf>2026-10-04 16:03:42 +0200
commit52dab7fc85d877e80e3032f0afabae906adebad8 (patch)
treeb6d56299b839413bb77b1b8c8fa9f7a682124a05 /kernel/vfs.rv
parenta8a35a00a3c3c57cfbef2311d0348376c2e83208 (diff)
feat: fs tree and free list alloc
Diffstat (limited to 'kernel/vfs.rv')
-rw-r--r--kernel/vfs.rv57
1 files changed, 57 insertions, 0 deletions
diff --git a/kernel/vfs.rv b/kernel/vfs.rv
new file mode 100644
index 0000000..5d2d1de
--- /dev/null
+++ b/kernel/vfs.rv
@@ -0,0 +1,57 @@
+# shitty vfs implementation
+# proc and /bin arent on disk, theyre completely virtual
+
+const TASK_STATES = { "free", "ready", "dead", "blocked" }
+
+fn vfs_owns(path) do
+ if path == "/proc" or path:starts_with?("/proc/") return :true
+ if path == "/bin" or path:starts_with?("/bin/") return :true
+ return :false
+end
+
+fn parse_pid(s) do
+ if s:len() == 0 return -1
+ let n = 0
+ for i in 0..s:len() do
+ const c = s[i]:ascii()
+ if c < 48 or c > 57 return -1
+ n = n * 10 + (c - 48)
+ end
+ return n
+end
+
+fn vfs_ls(path) do
+ if path == "/proc" do
+ puts(" uptime\n meminfo\n")
+ for i in 0..task_max() do
+ if task_state(i) != 0 puts(" #{i}\n")
+ end
+ end
+ else if path == "/bin" do
+ for i in 0..prog_count() do puts(" #{prog_name(i)}\n") end
+ end
+ else do puts("ls: #{path}: no such directory\n") end
+end
+
+fn vfs_cat(path) do
+ if path == "/proc/uptime" do puts("#{math.floor(uptime() / 100)}s\n") return :nil end
+ if path == "/proc/meminfo" do puts("#{(mem_free() shr 20)} MiB free / #{(mem_total() shr 20)} MiB total\n") return :nil end
+ if path:starts_with?("/proc/") do
+ const pid = parse_pid(path[6..])
+ if pid >= 0 and pid < task_max() and task_state(pid) != 0 do
+ puts("pid #{pid}: #{TASK_STATES[task_state(pid)]}\n")
+ return :nil
+ end
+ puts("cat: #{path}: no such file\n")
+ return :nil
+ end
+ if path:starts_with?("/bin/") do
+ const nm = path[5..]
+ for i in 0..prog_count() do
+ if prog_name(i) == nm do puts("#{nm}: elf program, #{prog_size(i)} bytes\n") return :nil end
+ end
+ puts("cat: #{path}: no such file\n")
+ return :nil
+ end
+ puts("cat: #{path}: no such file\n")
+end