diff --git a/.VSCodeCounter/2026-04-11_19-00-52/details.md b/.VSCodeCounter/2026-04-11_19-00-52/details.md new file mode 100644 index 0000000..f1957b9 --- /dev/null +++ b/.VSCodeCounter/2026-04-11_19-00-52/details.md @@ -0,0 +1,112 @@ +# Details + +Date : 2026-04-11 19:00:52 + +Directory d:\\Projects\\C\\cleonos + +Total : 97 files, 7635 codes, 8 comments, 1894 blanks, all 9537 lines + +[Summary](results.md) / Details / [Diff Summary](diff.md) / [Diff Details](diff-details.md) + +## Files +| filename | language | code | comment | blank | total | +| :--- | :--- | ---: | ---: | ---: | ---: | +| [CMakeLists.txt](/CMakeLists.txt) | CMake | 535 | 0 | 75 | 610 | +| [Makefile](/Makefile) | Makefile | 100 | 0 | 22 | 122 | +| [cleonos/c/apps/elfrunner\_kmain.c](/cleonos/c/apps/elfrunner_kmain.c) | C | 6 | 0 | 3 | 9 | +| [cleonos/c/apps/elfrunner\_main.c](/cleonos/c/apps/elfrunner_main.c) | C | 6 | 0 | 3 | 9 | +| [cleonos/c/apps/memc\_kmain.c](/cleonos/c/apps/memc_kmain.c) | C | 6 | 0 | 3 | 9 | +| [cleonos/c/apps/memc\_main.c](/cleonos/c/apps/memc_main.c) | C | 8 | 0 | 3 | 11 | +| [cleonos/c/apps/shell\_main.c](/cleonos/c/apps/shell_main.c) | C | 396 | 0 | 124 | 520 | +| [cleonos/c/apps/ttydrv\_main.c](/cleonos/c/apps/ttydrv_main.c) | C | 6 | 0 | 3 | 9 | +| [cleonos/c/include/cleonos\_rust\_bridge.h](/cleonos/c/include/cleonos_rust_bridge.h) | C++ | 6 | 0 | 4 | 10 | +| [cleonos/c/include/cleonos\_syscall.h](/cleonos/c/include/cleonos_syscall.h) | C++ | 60 | 0 | 5 | 65 | +| [cleonos/c/src/runtime.c](/cleonos/c/src/runtime.c) | C | 11 | 0 | 6 | 17 | +| [cleonos/c/src/syscall.c](/cleonos/c/src/syscall.c) | C | 89 | 0 | 29 | 118 | +| [cleonos/c/stub.c](/cleonos/c/stub.c) | C | 3 | 4 | 2 | 9 | +| [cleonos/rust/src/lib.rs](/cleonos/rust/src/lib.rs) | Rust | 23 | 0 | 9 | 32 | +| [clks/arch/aarch64/boot.c](/clks/arch/aarch64/boot.c) | C | 6 | 0 | 1 | 7 | +| [clks/arch/x86\_64/boot.c](/clks/arch/x86_64/boot.c) | C | 6 | 0 | 1 | 7 | +| [clks/arch/x86\_64/interrupt\_stubs.S](/clks/arch/x86_64/interrupt_stubs.S) | Go Assembly | 108 | 0 | 12 | 120 | +| [clks/drivers/serial/serial.c](/clks/drivers/serial/serial.c) | C | 52 | 0 | 16 | 68 | +| [clks/drivers/video/font8x8.c](/clks/drivers/video/font8x8.c) | C | 67 | 0 | 8 | 75 | +| [clks/drivers/video/font8x8.h](/clks/drivers/video/font8x8.h) | C++ | 5 | 0 | 3 | 8 | +| [clks/drivers/video/framebuffer.c](/clks/drivers/video/framebuffer.c) | C | 162 | 0 | 42 | 204 | +| [clks/drivers/video/psf\_font.c](/clks/drivers/video/psf_font.c) | C | 159 | 0 | 35 | 194 | +| [clks/drivers/video/psf\_font.h](/clks/drivers/video/psf_font.h) | C++ | 14 | 0 | 4 | 18 | +| [clks/include/clks/boot.h](/clks/include/clks/boot.h) | C++ | 11 | 0 | 4 | 15 | +| [clks/include/clks/compiler.h](/clks/include/clks/compiler.h) | C++ | 13 | 0 | 4 | 17 | +| [clks/include/clks/cpu.h](/clks/include/clks/cpu.h) | C++ | 20 | 0 | 4 | 24 | +| [clks/include/clks/driver.h](/clks/include/clks/driver.h) | C++ | 28 | 0 | 8 | 36 | +| [clks/include/clks/elf64.h](/clks/include/clks/elf64.h) | C++ | 27 | 0 | 8 | 35 | +| [clks/include/clks/elfrunner.h](/clks/include/clks/elfrunner.h) | C++ | 6 | 0 | 3 | 9 | +| [clks/include/clks/exec.h](/clks/include/clks/exec.h) | C++ | 8 | 0 | 3 | 11 | +| [clks/include/clks/framebuffer.h](/clks/include/clks/framebuffer.h) | C++ | 20 | 0 | 4 | 24 | +| [clks/include/clks/fs.h](/clks/include/clks/fs.h) | C++ | 23 | 0 | 7 | 30 | +| [clks/include/clks/heap.h](/clks/include/clks/heap.h) | C++ | 15 | 0 | 4 | 19 | +| [clks/include/clks/interrupts.h](/clks/include/clks/interrupts.h) | C++ | 6 | 0 | 3 | 9 | +| [clks/include/clks/kelf.h](/clks/include/clks/kelf.h) | C++ | 9 | 0 | 5 | 14 | +| [clks/include/clks/kernel.h](/clks/include/clks/kernel.h) | C++ | 4 | 0 | 2 | 6 | +| [clks/include/clks/keyboard.h](/clks/include/clks/keyboard.h) | C++ | 19 | 0 | 5 | 24 | +| [clks/include/clks/limine.h](/clks/include/clks/limine.h) | C++ | 132 | 0 | 24 | 156 | +| [clks/include/clks/log.h](/clks/include/clks/log.h) | C++ | 12 | 0 | 4 | 16 | +| [clks/include/clks/pmm.h](/clks/include/clks/pmm.h) | C++ | 16 | 0 | 5 | 21 | +| [clks/include/clks/ramdisk.h](/clks/include/clks/ramdisk.h) | C++ | 17 | 0 | 8 | 25 | +| [clks/include/clks/scheduler.h](/clks/include/clks/scheduler.h) | C++ | 18 | 0 | 5 | 23 | +| [clks/include/clks/serial.h](/clks/include/clks/serial.h) | C++ | 6 | 0 | 2 | 8 | +| [clks/include/clks/service.h](/clks/include/clks/service.h) | C++ | 31 | 0 | 8 | 39 | +| [clks/include/clks/shell.h](/clks/include/clks/shell.h) | C++ | 7 | 0 | 3 | 10 | +| [clks/include/clks/string.h](/clks/include/clks/string.h) | C++ | 9 | 0 | 3 | 12 | +| [clks/include/clks/syscall.h](/clks/include/clks/syscall.h) | C++ | 34 | 0 | 4 | 38 | +| [clks/include/clks/task.h](/clks/include/clks/task.h) | C++ | 24 | 0 | 7 | 31 | +| [clks/include/clks/tty.h](/clks/include/clks/tty.h) | C++ | 12 | 0 | 5 | 17 | +| [clks/include/clks/types.h](/clks/include/clks/types.h) | C++ | 17 | 0 | 6 | 23 | +| [clks/include/clks/userland.h](/clks/include/clks/userland.h) | C++ | 11 | 0 | 4 | 15 | +| [clks/kernel/driver.c](/clks/kernel/driver.c) | C | 163 | 0 | 48 | 211 | +| [clks/kernel/elf64.c](/clks/kernel/elf64.c) | C | 170 | 0 | 52 | 222 | +| [clks/kernel/elfrunner.c](/clks/kernel/elfrunner.c) | C | 30 | 0 | 8 | 38 | +| [clks/kernel/exec.c](/clks/kernel/exec.c) | C | 51 | 0 | 15 | 66 | +| [clks/kernel/fs.c](/clks/kernel/fs.c) | C | 698 | 0 | 220 | 918 | +| [clks/kernel/heap.c](/clks/kernel/heap.c) | C | 134 | 0 | 42 | 176 | +| [clks/kernel/interrupts.c](/clks/kernel/interrupts.c) | C | 298 | 0 | 43 | 341 | +| [clks/kernel/kelf.c](/clks/kernel/kelf.c) | C | 203 | 1 | 53 | 257 | +| [clks/kernel/keyboard.c](/clks/kernel/keyboard.c) | C | 199 | 0 | 42 | 241 | +| [clks/kernel/kmain.c](/clks/kernel/kmain.c) | C | 180 | 1 | 50 | 231 | +| [clks/kernel/limine\_requests.c](/clks/kernel/limine_requests.c) | C | 76 | 0 | 26 | 102 | +| [clks/kernel/log.c](/clks/kernel/log.c) | C | 79 | 0 | 17 | 96 | +| [clks/kernel/pmm.c](/clks/kernel/pmm.c) | C | 82 | 0 | 23 | 105 | +| [clks/kernel/ramdisk.c](/clks/kernel/ramdisk.c) | C | 172 | 0 | 50 | 222 | +| [clks/kernel/scheduler.c](/clks/kernel/scheduler.c) | C | 127 | 0 | 42 | 169 | +| [clks/kernel/service.c](/clks/kernel/service.c) | C | 113 | 0 | 34 | 147 | +| [clks/kernel/shell.c](/clks/kernel/shell.c) | C | 860 | 0 | 230 | 1,090 | +| [clks/kernel/syscall.c](/clks/kernel/syscall.c) | C | 243 | 0 | 50 | 293 | +| [clks/kernel/tty.c](/clks/kernel/tty.c) | C | 275 | 0 | 77 | 352 | +| [clks/kernel/userland.c](/clks/kernel/userland.c) | C | 113 | 0 | 32 | 145 | +| [clks/lib/string.c](/clks/lib/string.c) | C | 54 | 0 | 16 | 70 | +| [cmake/check\_tools.cmake](/cmake/check_tools.cmake) | CMake | 32 | 0 | 6 | 38 | +| [cmake/log.cmake](/cmake/log.cmake) | CMake | 30 | 0 | 6 | 36 | +| [cmake/log\_emit.cmake](/cmake/log_emit.cmake) | CMake | 23 | 0 | 6 | 29 | +| [cmake/setup\_limine.cmake](/cmake/setup_limine.cmake) | CMake | 100 | 0 | 18 | 118 | +| [configs/limine.conf](/configs/limine.conf) | Properties | 6 | 0 | 1 | 7 | +| [docs/README.md](/docs/README.md) | Markdown | 22 | 0 | 2 | 24 | +| [docs/stage1.md](/docs/stage1.md) | Markdown | 41 | 0 | 5 | 46 | +| [docs/stage10.md](/docs/stage10.md) | Markdown | 34 | 0 | 6 | 40 | +| [docs/stage11.md](/docs/stage11.md) | Markdown | 36 | 0 | 5 | 41 | +| [docs/stage12.md](/docs/stage12.md) | Markdown | 40 | 0 | 6 | 46 | +| [docs/stage13.md](/docs/stage13.md) | Markdown | 34 | 0 | 6 | 40 | +| [docs/stage14.md](/docs/stage14.md) | Markdown | 44 | 0 | 8 | 52 | +| [docs/stage15.md](/docs/stage15.md) | Markdown | 47 | 0 | 7 | 54 | +| [docs/stage2.md](/docs/stage2.md) | Markdown | 30 | 0 | 5 | 35 | +| [docs/stage20.md](/docs/stage20.md) | Markdown | 46 | 0 | 6 | 52 | +| [docs/stage21.md](/docs/stage21.md) | Markdown | 72 | 0 | 7 | 79 | +| [docs/stage3.md](/docs/stage3.md) | Markdown | 29 | 0 | 5 | 34 | +| [docs/stage4.md](/docs/stage4.md) | Markdown | 30 | 0 | 5 | 35 | +| [docs/stage5.md](/docs/stage5.md) | Markdown | 29 | 0 | 5 | 34 | +| [docs/stage6.md](/docs/stage6.md) | Markdown | 30 | 0 | 6 | 36 | +| [docs/stage7.md](/docs/stage7.md) | Markdown | 34 | 0 | 6 | 40 | +| [docs/stage8.md](/docs/stage8.md) | Markdown | 31 | 0 | 6 | 37 | +| [docs/stage9.md](/docs/stage9.md) | Markdown | 31 | 0 | 6 | 37 | +| [ramdisk/shell/init.cmd](/ramdisk/shell/init.cmd) | Batch | 11 | 0 | 2 | 13 | +| [scripts/gen-tty-psf.ps1](/scripts/gen-tty-psf.ps1) | PowerShell | 64 | 2 | 18 | 84 | + +[Summary](results.md) / Details / [Diff Summary](diff.md) / [Diff Details](diff-details.md) \ No newline at end of file diff --git a/.VSCodeCounter/2026-04-11_19-00-52/diff-details.md b/.VSCodeCounter/2026-04-11_19-00-52/diff-details.md new file mode 100644 index 0000000..209e0be --- /dev/null +++ b/.VSCodeCounter/2026-04-11_19-00-52/diff-details.md @@ -0,0 +1,15 @@ +# Diff Details + +Date : 2026-04-11 19:00:52 + +Directory d:\\Projects\\C\\cleonos + +Total : 0 files, 0 codes, 0 comments, 0 blanks, all 0 lines + +[Summary](results.md) / [Details](details.md) / [Diff Summary](diff.md) / Diff Details + +## Files +| filename | language | code | comment | blank | total | +| :--- | :--- | ---: | ---: | ---: | ---: | + +[Summary](results.md) / [Details](details.md) / [Diff Summary](diff.md) / Diff Details \ No newline at end of file diff --git a/.VSCodeCounter/2026-04-11_19-00-52/diff.csv b/.VSCodeCounter/2026-04-11_19-00-52/diff.csv new file mode 100644 index 0000000..b7d8d75 --- /dev/null +++ b/.VSCodeCounter/2026-04-11_19-00-52/diff.csv @@ -0,0 +1,2 @@ +"filename", "language", "", "comment", "blank", "total" +"Total", "-", , 0, 0, 0 \ No newline at end of file diff --git a/.VSCodeCounter/2026-04-11_19-00-52/diff.md b/.VSCodeCounter/2026-04-11_19-00-52/diff.md new file mode 100644 index 0000000..512a1aa --- /dev/null +++ b/.VSCodeCounter/2026-04-11_19-00-52/diff.md @@ -0,0 +1,19 @@ +# Diff Summary + +Date : 2026-04-11 19:00:52 + +Directory d:\\Projects\\C\\cleonos + +Total : 0 files, 0 codes, 0 comments, 0 blanks, all 0 lines + +[Summary](results.md) / [Details](details.md) / Diff Summary / [Diff Details](diff-details.md) + +## Languages +| language | files | code | comment | blank | total | +| :--- | ---: | ---: | ---: | ---: | ---: | + +## Directories +| path | files | code | comment | blank | total | +| :--- | ---: | ---: | ---: | ---: | ---: | + +[Summary](results.md) / [Details](details.md) / Diff Summary / [Diff Details](diff-details.md) \ No newline at end of file diff --git a/.VSCodeCounter/2026-04-11_19-00-52/diff.txt b/.VSCodeCounter/2026-04-11_19-00-52/diff.txt new file mode 100644 index 0000000..f010405 --- /dev/null +++ b/.VSCodeCounter/2026-04-11_19-00-52/diff.txt @@ -0,0 +1,22 @@ +Date : 2026-04-11 19:00:52 +Directory : d:\Projects\C\cleonos +Total : 0 files, 0 codes, 0 comments, 0 blanks, all 0 lines + +Languages ++----------+------------+------------+------------+------------+------------+ +| language | files | code | comment | blank | total | ++----------+------------+------------+------------+------------+------------+ ++----------+------------+------------+------------+------------+------------+ + +Directories ++------+------------+------------+------------+------------+------------+ +| path | files | code | comment | blank | total | ++------+------------+------------+------------+------------+------------+ ++------+------------+------------+------------+------------+------------+ + +Files ++----------+----------+------------+------------+------------+------------+ +| filename | language | code | comment | blank | total | ++----------+----------+------------+------------+------------+------------+ +| Total | | 0 | 0 | 0 | 0 | ++----------+----------+------------+------------+------------+------------+ \ No newline at end of file diff --git a/.VSCodeCounter/2026-04-11_19-00-52/results.csv b/.VSCodeCounter/2026-04-11_19-00-52/results.csv new file mode 100644 index 0000000..1f789c1 --- /dev/null +++ b/.VSCodeCounter/2026-04-11_19-00-52/results.csv @@ -0,0 +1,99 @@ +"filename", "language", "PowerShell", "CMake", "Markdown", "Batch", "Makefile", "Properties", "C++", "C", "Go Assembly", "Rust", "comment", "blank", "total" +"d:\Projects\C\cleonos\CMakeLists.txt", "CMake", 0, 535, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 610 +"d:\Projects\C\cleonos\Makefile", "Makefile", 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 22, 122 +"d:\Projects\C\cleonos\cleonos\c\apps\elfrunner_kmain.c", "C", 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 3, 9 +"d:\Projects\C\cleonos\cleonos\c\apps\elfrunner_main.c", "C", 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 3, 9 +"d:\Projects\C\cleonos\cleonos\c\apps\memc_kmain.c", "C", 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 3, 9 +"d:\Projects\C\cleonos\cleonos\c\apps\memc_main.c", "C", 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 3, 11 +"d:\Projects\C\cleonos\cleonos\c\apps\shell_main.c", "C", 0, 0, 0, 0, 0, 0, 0, 396, 0, 0, 0, 124, 520 +"d:\Projects\C\cleonos\cleonos\c\apps\ttydrv_main.c", "C", 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 3, 9 +"d:\Projects\C\cleonos\cleonos\c\include\cleonos_rust_bridge.h", "C++", 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 4, 10 +"d:\Projects\C\cleonos\cleonos\c\include\cleonos_syscall.h", "C++", 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, 5, 65 +"d:\Projects\C\cleonos\cleonos\c\src\runtime.c", "C", 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 6, 17 +"d:\Projects\C\cleonos\cleonos\c\src\syscall.c", "C", 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 29, 118 +"d:\Projects\C\cleonos\cleonos\c\stub.c", "C", 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 4, 2, 9 +"d:\Projects\C\cleonos\cleonos\rust\src\lib.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 9, 32 +"d:\Projects\C\cleonos\clks\arch\aarch64\boot.c", "C", 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 1, 7 +"d:\Projects\C\cleonos\clks\arch\x86_64\boot.c", "C", 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 1, 7 +"d:\Projects\C\cleonos\clks\arch\x86_64\interrupt_stubs.S", "Go Assembly", 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 12, 120 +"d:\Projects\C\cleonos\clks\drivers\serial\serial.c", "C", 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 16, 68 +"d:\Projects\C\cleonos\clks\drivers\video\font8x8.c", "C", 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 8, 75 +"d:\Projects\C\cleonos\clks\drivers\video\font8x8.h", "C++", 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 3, 8 +"d:\Projects\C\cleonos\clks\drivers\video\framebuffer.c", "C", 0, 0, 0, 0, 0, 0, 0, 162, 0, 0, 0, 42, 204 +"d:\Projects\C\cleonos\clks\drivers\video\psf_font.c", "C", 0, 0, 0, 0, 0, 0, 0, 159, 0, 0, 0, 35, 194 +"d:\Projects\C\cleonos\clks\drivers\video\psf_font.h", "C++", 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 4, 18 +"d:\Projects\C\cleonos\clks\include\clks\boot.h", "C++", 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 4, 15 +"d:\Projects\C\cleonos\clks\include\clks\compiler.h", "C++", 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 4, 17 +"d:\Projects\C\cleonos\clks\include\clks\cpu.h", "C++", 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 4, 24 +"d:\Projects\C\cleonos\clks\include\clks\driver.h", "C++", 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 8, 36 +"d:\Projects\C\cleonos\clks\include\clks\elf64.h", "C++", 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 8, 35 +"d:\Projects\C\cleonos\clks\include\clks\elfrunner.h", "C++", 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 3, 9 +"d:\Projects\C\cleonos\clks\include\clks\exec.h", "C++", 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 3, 11 +"d:\Projects\C\cleonos\clks\include\clks\framebuffer.h", "C++", 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 4, 24 +"d:\Projects\C\cleonos\clks\include\clks\fs.h", "C++", 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 7, 30 +"d:\Projects\C\cleonos\clks\include\clks\heap.h", "C++", 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 4, 19 +"d:\Projects\C\cleonos\clks\include\clks\interrupts.h", "C++", 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 3, 9 +"d:\Projects\C\cleonos\clks\include\clks\kelf.h", "C++", 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 5, 14 +"d:\Projects\C\cleonos\clks\include\clks\kernel.h", "C++", 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 2, 6 +"d:\Projects\C\cleonos\clks\include\clks\keyboard.h", "C++", 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 5, 24 +"d:\Projects\C\cleonos\clks\include\clks\limine.h", "C++", 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 24, 156 +"d:\Projects\C\cleonos\clks\include\clks\log.h", "C++", 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 4, 16 +"d:\Projects\C\cleonos\clks\include\clks\pmm.h", "C++", 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 5, 21 +"d:\Projects\C\cleonos\clks\include\clks\ramdisk.h", "C++", 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 8, 25 +"d:\Projects\C\cleonos\clks\include\clks\scheduler.h", "C++", 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 5, 23 +"d:\Projects\C\cleonos\clks\include\clks\serial.h", "C++", 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 2, 8 +"d:\Projects\C\cleonos\clks\include\clks\service.h", "C++", 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 8, 39 +"d:\Projects\C\cleonos\clks\include\clks\shell.h", "C++", 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 3, 10 +"d:\Projects\C\cleonos\clks\include\clks\string.h", "C++", 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 3, 12 +"d:\Projects\C\cleonos\clks\include\clks\syscall.h", "C++", 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 4, 38 +"d:\Projects\C\cleonos\clks\include\clks\task.h", "C++", 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 7, 31 +"d:\Projects\C\cleonos\clks\include\clks\tty.h", "C++", 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 5, 17 +"d:\Projects\C\cleonos\clks\include\clks\types.h", "C++", 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 6, 23 +"d:\Projects\C\cleonos\clks\include\clks\userland.h", "C++", 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 4, 15 +"d:\Projects\C\cleonos\clks\kernel\driver.c", "C", 0, 0, 0, 0, 0, 0, 0, 163, 0, 0, 0, 48, 211 +"d:\Projects\C\cleonos\clks\kernel\elf64.c", "C", 0, 0, 0, 0, 0, 0, 0, 170, 0, 0, 0, 52, 222 +"d:\Projects\C\cleonos\clks\kernel\elfrunner.c", "C", 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 8, 38 +"d:\Projects\C\cleonos\clks\kernel\exec.c", "C", 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 15, 66 +"d:\Projects\C\cleonos\clks\kernel\fs.c", "C", 0, 0, 0, 0, 0, 0, 0, 698, 0, 0, 0, 220, 918 +"d:\Projects\C\cleonos\clks\kernel\heap.c", "C", 0, 0, 0, 0, 0, 0, 0, 134, 0, 0, 0, 42, 176 +"d:\Projects\C\cleonos\clks\kernel\interrupts.c", "C", 0, 0, 0, 0, 0, 0, 0, 298, 0, 0, 0, 43, 341 +"d:\Projects\C\cleonos\clks\kernel\kelf.c", "C", 0, 0, 0, 0, 0, 0, 0, 203, 0, 0, 1, 53, 257 +"d:\Projects\C\cleonos\clks\kernel\keyboard.c", "C", 0, 0, 0, 0, 0, 0, 0, 199, 0, 0, 0, 42, 241 +"d:\Projects\C\cleonos\clks\kernel\kmain.c", "C", 0, 0, 0, 0, 0, 0, 0, 180, 0, 0, 1, 50, 231 +"d:\Projects\C\cleonos\clks\kernel\limine_requests.c", "C", 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 26, 102 +"d:\Projects\C\cleonos\clks\kernel\log.c", "C", 0, 0, 0, 0, 0, 0, 0, 79, 0, 0, 0, 17, 96 +"d:\Projects\C\cleonos\clks\kernel\pmm.c", "C", 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 23, 105 +"d:\Projects\C\cleonos\clks\kernel\ramdisk.c", "C", 0, 0, 0, 0, 0, 0, 0, 172, 0, 0, 0, 50, 222 +"d:\Projects\C\cleonos\clks\kernel\scheduler.c", "C", 0, 0, 0, 0, 0, 0, 0, 127, 0, 0, 0, 42, 169 +"d:\Projects\C\cleonos\clks\kernel\service.c", "C", 0, 0, 0, 0, 0, 0, 0, 113, 0, 0, 0, 34, 147 +"d:\Projects\C\cleonos\clks\kernel\shell.c", "C", 0, 0, 0, 0, 0, 0, 0, 860, 0, 0, 0, 230, 1090 +"d:\Projects\C\cleonos\clks\kernel\syscall.c", "C", 0, 0, 0, 0, 0, 0, 0, 243, 0, 0, 0, 50, 293 +"d:\Projects\C\cleonos\clks\kernel\tty.c", "C", 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, 77, 352 +"d:\Projects\C\cleonos\clks\kernel\userland.c", "C", 0, 0, 0, 0, 0, 0, 0, 113, 0, 0, 0, 32, 145 +"d:\Projects\C\cleonos\clks\lib\string.c", "C", 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 16, 70 +"d:\Projects\C\cleonos\cmake\check_tools.cmake", "CMake", 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 38 +"d:\Projects\C\cleonos\cmake\log.cmake", "CMake", 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 36 +"d:\Projects\C\cleonos\cmake\log_emit.cmake", "CMake", 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 29 +"d:\Projects\C\cleonos\cmake\setup_limine.cmake", "CMake", 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 118 +"d:\Projects\C\cleonos\configs\limine.conf", "Properties", 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 1, 7 +"d:\Projects\C\cleonos\docs\README.md", "Markdown", 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 2, 24 +"d:\Projects\C\cleonos\docs\stage1.md", "Markdown", 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 5, 46 +"d:\Projects\C\cleonos\docs\stage10.md", "Markdown", 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 6, 40 +"d:\Projects\C\cleonos\docs\stage11.md", "Markdown", 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 5, 41 +"d:\Projects\C\cleonos\docs\stage12.md", "Markdown", 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 6, 46 +"d:\Projects\C\cleonos\docs\stage13.md", "Markdown", 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 6, 40 +"d:\Projects\C\cleonos\docs\stage14.md", "Markdown", 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 8, 52 +"d:\Projects\C\cleonos\docs\stage15.md", "Markdown", 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 7, 54 +"d:\Projects\C\cleonos\docs\stage2.md", "Markdown", 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 5, 35 +"d:\Projects\C\cleonos\docs\stage20.md", "Markdown", 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 6, 52 +"d:\Projects\C\cleonos\docs\stage21.md", "Markdown", 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 7, 79 +"d:\Projects\C\cleonos\docs\stage3.md", "Markdown", 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 5, 34 +"d:\Projects\C\cleonos\docs\stage4.md", "Markdown", 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 5, 35 +"d:\Projects\C\cleonos\docs\stage5.md", "Markdown", 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 5, 34 +"d:\Projects\C\cleonos\docs\stage6.md", "Markdown", 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 6, 36 +"d:\Projects\C\cleonos\docs\stage7.md", "Markdown", 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 6, 40 +"d:\Projects\C\cleonos\docs\stage8.md", "Markdown", 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37 +"d:\Projects\C\cleonos\docs\stage9.md", "Markdown", 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 6, 37 +"d:\Projects\C\cleonos\ramdisk\shell\init.cmd", "Batch", 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 2, 13 +"d:\Projects\C\cleonos\scripts\gen-tty-psf.ps1", "PowerShell", 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 18, 84 +"Total", "-", 64, 720, 660, 11, 100, 6, 640, 5303, 108, 23, 8, 1894, 9537 \ No newline at end of file diff --git a/.VSCodeCounter/2026-04-11_19-00-52/results.json b/.VSCodeCounter/2026-04-11_19-00-52/results.json new file mode 100644 index 0000000..275418c --- /dev/null +++ b/.VSCodeCounter/2026-04-11_19-00-52/results.json @@ -0,0 +1 @@ +{"file:///d%3A/Projects/C/cleonos/scripts/gen-tty-psf.ps1":{"language":"PowerShell","code":64,"comment":2,"blank":18},"file:///d%3A/Projects/C/cleonos/CMakeLists.txt":{"language":"CMake","code":535,"comment":0,"blank":75},"file:///d%3A/Projects/C/cleonos/docs/stage7.md":{"language":"Markdown","code":34,"comment":0,"blank":6},"file:///d%3A/Projects/C/cleonos/ramdisk/shell/init.cmd":{"language":"Batch","code":11,"comment":0,"blank":2},"file:///d%3A/Projects/C/cleonos/docs/stage6.md":{"language":"Markdown","code":30,"comment":0,"blank":6},"file:///d%3A/Projects/C/cleonos/Makefile":{"language":"Makefile","code":100,"comment":0,"blank":22},"file:///d%3A/Projects/C/cleonos/docs/stage9.md":{"language":"Markdown","code":31,"comment":0,"blank":6},"file:///d%3A/Projects/C/cleonos/docs/stage5.md":{"language":"Markdown","code":29,"comment":0,"blank":5},"file:///d%3A/Projects/C/cleonos/docs/stage21.md":{"language":"Markdown","code":72,"comment":0,"blank":7},"file:///d%3A/Projects/C/cleonos/docs/stage8.md":{"language":"Markdown","code":31,"comment":0,"blank":6},"file:///d%3A/Projects/C/cleonos/docs/stage4.md":{"language":"Markdown","code":30,"comment":0,"blank":5},"file:///d%3A/Projects/C/cleonos/docs/stage20.md":{"language":"Markdown","code":46,"comment":0,"blank":6},"file:///d%3A/Projects/C/cleonos/docs/stage2.md":{"language":"Markdown","code":30,"comment":0,"blank":5},"file:///d%3A/Projects/C/cleonos/docs/stage3.md":{"language":"Markdown","code":29,"comment":0,"blank":5},"file:///d%3A/Projects/C/cleonos/docs/stage15.md":{"language":"Markdown","code":47,"comment":0,"blank":7},"file:///d%3A/Projects/C/cleonos/docs/stage13.md":{"language":"Markdown","code":34,"comment":0,"blank":6},"file:///d%3A/Projects/C/cleonos/docs/stage14.md":{"language":"Markdown","code":44,"comment":0,"blank":8},"file:///d%3A/Projects/C/cleonos/docs/stage11.md":{"language":"Markdown","code":36,"comment":0,"blank":5},"file:///d%3A/Projects/C/cleonos/configs/limine.conf":{"language":"Properties","code":6,"comment":0,"blank":1},"file:///d%3A/Projects/C/cleonos/docs/stage12.md":{"language":"Markdown","code":40,"comment":0,"blank":6},"file:///d%3A/Projects/C/cleonos/docs/README.md":{"language":"Markdown","code":22,"comment":0,"blank":2},"file:///d%3A/Projects/C/cleonos/docs/stage10.md":{"language":"Markdown","code":34,"comment":0,"blank":6},"file:///d%3A/Projects/C/cleonos/docs/stage1.md":{"language":"Markdown","code":41,"comment":0,"blank":5},"file:///d%3A/Projects/C/cleonos/clks/drivers/video/psf_font.h":{"language":"C++","code":14,"comment":0,"blank":4},"file:///d%3A/Projects/C/cleonos/cmake/log_emit.cmake":{"language":"CMake","code":23,"comment":0,"blank":6},"file:///d%3A/Projects/C/cleonos/cmake/setup_limine.cmake":{"language":"CMake","code":100,"comment":0,"blank":18},"file:///d%3A/Projects/C/cleonos/cmake/log.cmake":{"language":"CMake","code":30,"comment":0,"blank":6},"file:///d%3A/Projects/C/cleonos/clks/lib/string.c":{"language":"C","code":54,"comment":0,"blank":16},"file:///d%3A/Projects/C/cleonos/cmake/check_tools.cmake":{"language":"CMake","code":32,"comment":0,"blank":6},"file:///d%3A/Projects/C/cleonos/clks/drivers/video/framebuffer.c":{"language":"C","code":162,"comment":0,"blank":42},"file:///d%3A/Projects/C/cleonos/clks/kernel/userland.c":{"language":"C","code":113,"comment":0,"blank":32},"file:///d%3A/Projects/C/cleonos/clks/drivers/video/psf_font.c":{"language":"C","code":159,"comment":0,"blank":35},"file:///d%3A/Projects/C/cleonos/clks/kernel/tty.c":{"language":"C","code":275,"comment":0,"blank":77},"file:///d%3A/Projects/C/cleonos/clks/kernel/syscall.c":{"language":"C","code":243,"comment":0,"blank":50},"file:///d%3A/Projects/C/cleonos/clks/drivers/video/font8x8.h":{"language":"C++","code":5,"comment":0,"blank":3},"file:///d%3A/Projects/C/cleonos/clks/kernel/service.c":{"language":"C","code":113,"comment":0,"blank":34},"file:///d%3A/Projects/C/cleonos/clks/kernel/scheduler.c":{"language":"C","code":127,"comment":0,"blank":42},"file:///d%3A/Projects/C/cleonos/clks/drivers/video/font8x8.c":{"language":"C","code":67,"comment":0,"blank":8},"file:///d%3A/Projects/C/cleonos/clks/kernel/shell.c":{"language":"C","code":860,"comment":0,"blank":230},"file:///d%3A/Projects/C/cleonos/clks/kernel/pmm.c":{"language":"C","code":82,"comment":0,"blank":23},"file:///d%3A/Projects/C/cleonos/clks/kernel/ramdisk.c":{"language":"C","code":172,"comment":0,"blank":50},"file:///d%3A/Projects/C/cleonos/clks/kernel/log.c":{"language":"C","code":79,"comment":0,"blank":17},"file:///d%3A/Projects/C/cleonos/clks/kernel/kmain.c":{"language":"C","code":180,"comment":1,"blank":50},"file:///d%3A/Projects/C/cleonos/clks/kernel/limine_requests.c":{"language":"C","code":76,"comment":0,"blank":26},"file:///d%3A/Projects/C/cleonos/clks/kernel/keyboard.c":{"language":"C","code":199,"comment":0,"blank":42},"file:///d%3A/Projects/C/cleonos/clks/kernel/interrupts.c":{"language":"C","code":298,"comment":0,"blank":43},"file:///d%3A/Projects/C/cleonos/clks/kernel/kelf.c":{"language":"C","code":203,"comment":1,"blank":53},"file:///d%3A/Projects/C/cleonos/clks/kernel/exec.c":{"language":"C","code":51,"comment":0,"blank":15},"file:///d%3A/Projects/C/cleonos/clks/kernel/elfrunner.c":{"language":"C","code":30,"comment":0,"blank":8},"file:///d%3A/Projects/C/cleonos/clks/kernel/heap.c":{"language":"C","code":134,"comment":0,"blank":42},"file:///d%3A/Projects/C/cleonos/clks/kernel/elf64.c":{"language":"C","code":170,"comment":0,"blank":52},"file:///d%3A/Projects/C/cleonos/clks/kernel/fs.c":{"language":"C","code":698,"comment":0,"blank":220},"file:///d%3A/Projects/C/cleonos/clks/kernel/driver.c":{"language":"C","code":163,"comment":0,"blank":48},"file:///d%3A/Projects/C/cleonos/clks/drivers/serial/serial.c":{"language":"C","code":52,"comment":0,"blank":16},"file:///d%3A/Projects/C/cleonos/clks/include/clks/tty.h":{"language":"C++","code":12,"comment":0,"blank":5},"file:///d%3A/Projects/C/cleonos/clks/include/clks/userland.h":{"language":"C++","code":11,"comment":0,"blank":4},"file:///d%3A/Projects/C/cleonos/clks/include/clks/types.h":{"language":"C++","code":17,"comment":0,"blank":6},"file:///d%3A/Projects/C/cleonos/clks/include/clks/task.h":{"language":"C++","code":24,"comment":0,"blank":7},"file:///d%3A/Projects/C/cleonos/clks/include/clks/syscall.h":{"language":"C++","code":34,"comment":0,"blank":4},"file:///d%3A/Projects/C/cleonos/clks/include/clks/string.h":{"language":"C++","code":9,"comment":0,"blank":3},"file:///d%3A/Projects/C/cleonos/clks/include/clks/service.h":{"language":"C++","code":31,"comment":0,"blank":8},"file:///d%3A/Projects/C/cleonos/clks/include/clks/serial.h":{"language":"C++","code":6,"comment":0,"blank":2},"file:///d%3A/Projects/C/cleonos/clks/include/clks/scheduler.h":{"language":"C++","code":18,"comment":0,"blank":5},"file:///d%3A/Projects/C/cleonos/clks/include/clks/shell.h":{"language":"C++","code":7,"comment":0,"blank":3},"file:///d%3A/Projects/C/cleonos/clks/include/clks/log.h":{"language":"C++","code":12,"comment":0,"blank":4},"file:///d%3A/Projects/C/cleonos/clks/include/clks/ramdisk.h":{"language":"C++","code":17,"comment":0,"blank":8},"file:///d%3A/Projects/C/cleonos/clks/include/clks/keyboard.h":{"language":"C++","code":19,"comment":0,"blank":5},"file:///d%3A/Projects/C/cleonos/clks/include/clks/pmm.h":{"language":"C++","code":16,"comment":0,"blank":5},"file:///d%3A/Projects/C/cleonos/clks/include/clks/kelf.h":{"language":"C++","code":9,"comment":0,"blank":5},"file:///d%3A/Projects/C/cleonos/clks/include/clks/limine.h":{"language":"C++","code":132,"comment":0,"blank":24},"file:///d%3A/Projects/C/cleonos/clks/include/clks/kernel.h":{"language":"C++","code":4,"comment":0,"blank":2},"file:///d%3A/Projects/C/cleonos/clks/include/clks/interrupts.h":{"language":"C++","code":6,"comment":0,"blank":3},"file:///d%3A/Projects/C/cleonos/clks/include/clks/heap.h":{"language":"C++","code":15,"comment":0,"blank":4},"file:///d%3A/Projects/C/cleonos/clks/include/clks/exec.h":{"language":"C++","code":8,"comment":0,"blank":3},"file:///d%3A/Projects/C/cleonos/clks/include/clks/fs.h":{"language":"C++","code":23,"comment":0,"blank":7},"file:///d%3A/Projects/C/cleonos/clks/include/clks/elf64.h":{"language":"C++","code":27,"comment":0,"blank":8},"file:///d%3A/Projects/C/cleonos/clks/include/clks/framebuffer.h":{"language":"C++","code":20,"comment":0,"blank":4},"file:///d%3A/Projects/C/cleonos/clks/include/clks/elfrunner.h":{"language":"C++","code":6,"comment":0,"blank":3},"file:///d%3A/Projects/C/cleonos/clks/include/clks/compiler.h":{"language":"C++","code":13,"comment":0,"blank":4},"file:///d%3A/Projects/C/cleonos/clks/include/clks/cpu.h":{"language":"C++","code":20,"comment":0,"blank":4},"file:///d%3A/Projects/C/cleonos/clks/include/clks/driver.h":{"language":"C++","code":28,"comment":0,"blank":8},"file:///d%3A/Projects/C/cleonos/clks/arch/x86_64/interrupt_stubs.S":{"language":"Go Assembly","code":108,"comment":0,"blank":12},"file:///d%3A/Projects/C/cleonos/clks/include/clks/boot.h":{"language":"C++","code":11,"comment":0,"blank":4},"file:///d%3A/Projects/C/cleonos/clks/arch/x86_64/boot.c":{"language":"C","code":6,"comment":0,"blank":1},"file:///d%3A/Projects/C/cleonos/clks/arch/aarch64/boot.c":{"language":"C","code":6,"comment":0,"blank":1},"file:///d%3A/Projects/C/cleonos/cleonos/c/stub.c":{"language":"C","code":3,"comment":4,"blank":2},"file:///d%3A/Projects/C/cleonos/cleonos/rust/src/lib.rs":{"language":"Rust","code":23,"comment":0,"blank":9},"file:///d%3A/Projects/C/cleonos/cleonos/c/src/syscall.c":{"language":"C","code":89,"comment":0,"blank":29},"file:///d%3A/Projects/C/cleonos/cleonos/c/src/runtime.c":{"language":"C","code":11,"comment":0,"blank":6},"file:///d%3A/Projects/C/cleonos/cleonos/c/include/cleonos_syscall.h":{"language":"C++","code":60,"comment":0,"blank":5},"file:///d%3A/Projects/C/cleonos/cleonos/c/apps/memc_main.c":{"language":"C","code":8,"comment":0,"blank":3},"file:///d%3A/Projects/C/cleonos/cleonos/c/apps/ttydrv_main.c":{"language":"C","code":6,"comment":0,"blank":3},"file:///d%3A/Projects/C/cleonos/cleonos/c/apps/shell_main.c":{"language":"C","code":396,"comment":0,"blank":124},"file:///d%3A/Projects/C/cleonos/cleonos/c/apps/memc_kmain.c":{"language":"C","code":6,"comment":0,"blank":3},"file:///d%3A/Projects/C/cleonos/cleonos/c/include/cleonos_rust_bridge.h":{"language":"C++","code":6,"comment":0,"blank":4},"file:///d%3A/Projects/C/cleonos/cleonos/c/apps/elfrunner_main.c":{"language":"C","code":6,"comment":0,"blank":3},"file:///d%3A/Projects/C/cleonos/cleonos/c/apps/elfrunner_kmain.c":{"language":"C","code":6,"comment":0,"blank":3}} \ No newline at end of file diff --git a/.VSCodeCounter/2026-04-11_19-00-52/results.md b/.VSCodeCounter/2026-04-11_19-00-52/results.md new file mode 100644 index 0000000..1bec2d7 --- /dev/null +++ b/.VSCodeCounter/2026-04-11_19-00-52/results.md @@ -0,0 +1,56 @@ +# Summary + +Date : 2026-04-11 19:00:52 + +Directory d:\\Projects\\C\\cleonos + +Total : 97 files, 7635 codes, 8 comments, 1894 blanks, all 9537 lines + +Summary / [Details](details.md) / [Diff Summary](diff.md) / [Diff Details](diff-details.md) + +## Languages +| language | files | code | comment | blank | total | +| :--- | ---: | ---: | ---: | ---: | ---: | +| C | 36 | 5,303 | 6 | 1,449 | 6,758 | +| CMake | 5 | 720 | 0 | 111 | 831 | +| Markdown | 18 | 660 | 0 | 102 | 762 | +| C++ | 32 | 640 | 0 | 168 | 808 | +| Go Assembly | 1 | 108 | 0 | 12 | 120 | +| Makefile | 1 | 100 | 0 | 22 | 122 | +| PowerShell | 1 | 64 | 2 | 18 | 84 | +| Rust | 1 | 23 | 0 | 9 | 32 | +| Batch | 1 | 11 | 0 | 2 | 13 | +| Properties | 1 | 6 | 0 | 1 | 7 | + +## Directories +| path | files | code | comment | blank | total | +| :--- | ---: | ---: | ---: | ---: | ---: | +| . | 97 | 7,635 | 8 | 1,894 | 9,537 | +| . (Files) | 2 | 635 | 0 | 97 | 732 | +| cleonos | 12 | 620 | 4 | 194 | 818 | +| cleonos\\c | 11 | 597 | 4 | 185 | 786 | +| cleonos\\c (Files) | 1 | 3 | 4 | 2 | 9 | +| cleonos\\c\\apps | 6 | 428 | 0 | 139 | 567 | +| cleonos\\c\\include | 2 | 66 | 0 | 9 | 75 | +| cleonos\\c\\src | 2 | 100 | 0 | 35 | 135 | +| cleonos\\rust | 1 | 23 | 0 | 9 | 32 | +| cleonos\\rust\\src | 1 | 23 | 0 | 9 | 32 | +| clks | 58 | 5,454 | 2 | 1,444 | 6,900 | +| clks\\arch | 3 | 120 | 0 | 14 | 134 | +| clks\\arch\\aarch64 | 1 | 6 | 0 | 1 | 7 | +| clks\\arch\\x86_64 | 2 | 114 | 0 | 13 | 127 | +| clks\\drivers | 6 | 459 | 0 | 108 | 567 | +| clks\\drivers\\serial | 1 | 52 | 0 | 16 | 68 | +| clks\\drivers\\video | 5 | 407 | 0 | 92 | 499 | +| clks\\include | 28 | 555 | 0 | 152 | 707 | +| clks\\include\\clks | 28 | 555 | 0 | 152 | 707 | +| clks\\kernel | 20 | 4,266 | 2 | 1,154 | 5,422 | +| clks\\lib | 1 | 54 | 0 | 16 | 70 | +| cmake | 4 | 185 | 0 | 36 | 221 | +| configs | 1 | 6 | 0 | 1 | 7 | +| docs | 18 | 660 | 0 | 102 | 762 | +| ramdisk | 1 | 11 | 0 | 2 | 13 | +| ramdisk\\shell | 1 | 11 | 0 | 2 | 13 | +| scripts | 1 | 64 | 2 | 18 | 84 | + +Summary / [Details](details.md) / [Diff Summary](diff.md) / [Diff Details](diff-details.md) \ No newline at end of file diff --git a/.VSCodeCounter/2026-04-11_19-00-52/results.txt b/.VSCodeCounter/2026-04-11_19-00-52/results.txt new file mode 100644 index 0000000..8ec4998 --- /dev/null +++ b/.VSCodeCounter/2026-04-11_19-00-52/results.txt @@ -0,0 +1,156 @@ +Date : 2026-04-11 19:00:52 +Directory : d:\Projects\C\cleonos +Total : 97 files, 7635 codes, 8 comments, 1894 blanks, all 9537 lines + +Languages ++-------------+------------+------------+------------+------------+------------+ +| language | files | code | comment | blank | total | ++-------------+------------+------------+------------+------------+------------+ +| C | 36 | 5,303 | 6 | 1,449 | 6,758 | +| CMake | 5 | 720 | 0 | 111 | 831 | +| Markdown | 18 | 660 | 0 | 102 | 762 | +| C++ | 32 | 640 | 0 | 168 | 808 | +| Go Assembly | 1 | 108 | 0 | 12 | 120 | +| Makefile | 1 | 100 | 0 | 22 | 122 | +| PowerShell | 1 | 64 | 2 | 18 | 84 | +| Rust | 1 | 23 | 0 | 9 | 32 | +| Batch | 1 | 11 | 0 | 2 | 13 | +| Properties | 1 | 6 | 0 | 1 | 7 | ++-------------+------------+------------+------------+------------+------------+ + +Directories ++---------------------------------------------------------------+------------+------------+------------+------------+------------+ +| path | files | code | comment | blank | total | ++---------------------------------------------------------------+------------+------------+------------+------------+------------+ +| . | 97 | 7,635 | 8 | 1,894 | 9,537 | +| . (Files) | 2 | 635 | 0 | 97 | 732 | +| cleonos | 12 | 620 | 4 | 194 | 818 | +| cleonos\c | 11 | 597 | 4 | 185 | 786 | +| cleonos\c (Files) | 1 | 3 | 4 | 2 | 9 | +| cleonos\c\apps | 6 | 428 | 0 | 139 | 567 | +| cleonos\c\include | 2 | 66 | 0 | 9 | 75 | +| cleonos\c\src | 2 | 100 | 0 | 35 | 135 | +| cleonos\rust | 1 | 23 | 0 | 9 | 32 | +| cleonos\rust\src | 1 | 23 | 0 | 9 | 32 | +| clks | 58 | 5,454 | 2 | 1,444 | 6,900 | +| clks\arch | 3 | 120 | 0 | 14 | 134 | +| clks\arch\aarch64 | 1 | 6 | 0 | 1 | 7 | +| clks\arch\x86_64 | 2 | 114 | 0 | 13 | 127 | +| clks\drivers | 6 | 459 | 0 | 108 | 567 | +| clks\drivers\serial | 1 | 52 | 0 | 16 | 68 | +| clks\drivers\video | 5 | 407 | 0 | 92 | 499 | +| clks\include | 28 | 555 | 0 | 152 | 707 | +| clks\include\clks | 28 | 555 | 0 | 152 | 707 | +| clks\kernel | 20 | 4,266 | 2 | 1,154 | 5,422 | +| clks\lib | 1 | 54 | 0 | 16 | 70 | +| cmake | 4 | 185 | 0 | 36 | 221 | +| configs | 1 | 6 | 0 | 1 | 7 | +| docs | 18 | 660 | 0 | 102 | 762 | +| ramdisk | 1 | 11 | 0 | 2 | 13 | +| ramdisk\shell | 1 | 11 | 0 | 2 | 13 | +| scripts | 1 | 64 | 2 | 18 | 84 | ++---------------------------------------------------------------+------------+------------+------------+------------+------------+ + +Files ++---------------------------------------------------------------+-------------+------------+------------+------------+------------+ +| filename | language | code | comment | blank | total | ++---------------------------------------------------------------+-------------+------------+------------+------------+------------+ +| d:\Projects\C\cleonos\CMakeLists.txt | CMake | 535 | 0 | 75 | 610 | +| d:\Projects\C\cleonos\Makefile | Makefile | 100 | 0 | 22 | 122 | +| d:\Projects\C\cleonos\cleonos\c\apps\elfrunner_kmain.c | C | 6 | 0 | 3 | 9 | +| d:\Projects\C\cleonos\cleonos\c\apps\elfrunner_main.c | C | 6 | 0 | 3 | 9 | +| d:\Projects\C\cleonos\cleonos\c\apps\memc_kmain.c | C | 6 | 0 | 3 | 9 | +| d:\Projects\C\cleonos\cleonos\c\apps\memc_main.c | C | 8 | 0 | 3 | 11 | +| d:\Projects\C\cleonos\cleonos\c\apps\shell_main.c | C | 396 | 0 | 124 | 520 | +| d:\Projects\C\cleonos\cleonos\c\apps\ttydrv_main.c | C | 6 | 0 | 3 | 9 | +| d:\Projects\C\cleonos\cleonos\c\include\cleonos_rust_bridge.h | C++ | 6 | 0 | 4 | 10 | +| d:\Projects\C\cleonos\cleonos\c\include\cleonos_syscall.h | C++ | 60 | 0 | 5 | 65 | +| d:\Projects\C\cleonos\cleonos\c\src\runtime.c | C | 11 | 0 | 6 | 17 | +| d:\Projects\C\cleonos\cleonos\c\src\syscall.c | C | 89 | 0 | 29 | 118 | +| d:\Projects\C\cleonos\cleonos\c\stub.c | C | 3 | 4 | 2 | 9 | +| d:\Projects\C\cleonos\cleonos\rust\src\lib.rs | Rust | 23 | 0 | 9 | 32 | +| d:\Projects\C\cleonos\clks\arch\aarch64\boot.c | C | 6 | 0 | 1 | 7 | +| d:\Projects\C\cleonos\clks\arch\x86_64\boot.c | C | 6 | 0 | 1 | 7 | +| d:\Projects\C\cleonos\clks\arch\x86_64\interrupt_stubs.S | Go Assembly | 108 | 0 | 12 | 120 | +| d:\Projects\C\cleonos\clks\drivers\serial\serial.c | C | 52 | 0 | 16 | 68 | +| d:\Projects\C\cleonos\clks\drivers\video\font8x8.c | C | 67 | 0 | 8 | 75 | +| d:\Projects\C\cleonos\clks\drivers\video\font8x8.h | C++ | 5 | 0 | 3 | 8 | +| d:\Projects\C\cleonos\clks\drivers\video\framebuffer.c | C | 162 | 0 | 42 | 204 | +| d:\Projects\C\cleonos\clks\drivers\video\psf_font.c | C | 159 | 0 | 35 | 194 | +| d:\Projects\C\cleonos\clks\drivers\video\psf_font.h | C++ | 14 | 0 | 4 | 18 | +| d:\Projects\C\cleonos\clks\include\clks\boot.h | C++ | 11 | 0 | 4 | 15 | +| d:\Projects\C\cleonos\clks\include\clks\compiler.h | C++ | 13 | 0 | 4 | 17 | +| d:\Projects\C\cleonos\clks\include\clks\cpu.h | C++ | 20 | 0 | 4 | 24 | +| d:\Projects\C\cleonos\clks\include\clks\driver.h | C++ | 28 | 0 | 8 | 36 | +| d:\Projects\C\cleonos\clks\include\clks\elf64.h | C++ | 27 | 0 | 8 | 35 | +| d:\Projects\C\cleonos\clks\include\clks\elfrunner.h | C++ | 6 | 0 | 3 | 9 | +| d:\Projects\C\cleonos\clks\include\clks\exec.h | C++ | 8 | 0 | 3 | 11 | +| d:\Projects\C\cleonos\clks\include\clks\framebuffer.h | C++ | 20 | 0 | 4 | 24 | +| d:\Projects\C\cleonos\clks\include\clks\fs.h | C++ | 23 | 0 | 7 | 30 | +| d:\Projects\C\cleonos\clks\include\clks\heap.h | C++ | 15 | 0 | 4 | 19 | +| d:\Projects\C\cleonos\clks\include\clks\interrupts.h | C++ | 6 | 0 | 3 | 9 | +| d:\Projects\C\cleonos\clks\include\clks\kelf.h | C++ | 9 | 0 | 5 | 14 | +| d:\Projects\C\cleonos\clks\include\clks\kernel.h | C++ | 4 | 0 | 2 | 6 | +| d:\Projects\C\cleonos\clks\include\clks\keyboard.h | C++ | 19 | 0 | 5 | 24 | +| d:\Projects\C\cleonos\clks\include\clks\limine.h | C++ | 132 | 0 | 24 | 156 | +| d:\Projects\C\cleonos\clks\include\clks\log.h | C++ | 12 | 0 | 4 | 16 | +| d:\Projects\C\cleonos\clks\include\clks\pmm.h | C++ | 16 | 0 | 5 | 21 | +| d:\Projects\C\cleonos\clks\include\clks\ramdisk.h | C++ | 17 | 0 | 8 | 25 | +| d:\Projects\C\cleonos\clks\include\clks\scheduler.h | C++ | 18 | 0 | 5 | 23 | +| d:\Projects\C\cleonos\clks\include\clks\serial.h | C++ | 6 | 0 | 2 | 8 | +| d:\Projects\C\cleonos\clks\include\clks\service.h | C++ | 31 | 0 | 8 | 39 | +| d:\Projects\C\cleonos\clks\include\clks\shell.h | C++ | 7 | 0 | 3 | 10 | +| d:\Projects\C\cleonos\clks\include\clks\string.h | C++ | 9 | 0 | 3 | 12 | +| d:\Projects\C\cleonos\clks\include\clks\syscall.h | C++ | 34 | 0 | 4 | 38 | +| d:\Projects\C\cleonos\clks\include\clks\task.h | C++ | 24 | 0 | 7 | 31 | +| d:\Projects\C\cleonos\clks\include\clks\tty.h | C++ | 12 | 0 | 5 | 17 | +| d:\Projects\C\cleonos\clks\include\clks\types.h | C++ | 17 | 0 | 6 | 23 | +| d:\Projects\C\cleonos\clks\include\clks\userland.h | C++ | 11 | 0 | 4 | 15 | +| d:\Projects\C\cleonos\clks\kernel\driver.c | C | 163 | 0 | 48 | 211 | +| d:\Projects\C\cleonos\clks\kernel\elf64.c | C | 170 | 0 | 52 | 222 | +| d:\Projects\C\cleonos\clks\kernel\elfrunner.c | C | 30 | 0 | 8 | 38 | +| d:\Projects\C\cleonos\clks\kernel\exec.c | C | 51 | 0 | 15 | 66 | +| d:\Projects\C\cleonos\clks\kernel\fs.c | C | 698 | 0 | 220 | 918 | +| d:\Projects\C\cleonos\clks\kernel\heap.c | C | 134 | 0 | 42 | 176 | +| d:\Projects\C\cleonos\clks\kernel\interrupts.c | C | 298 | 0 | 43 | 341 | +| d:\Projects\C\cleonos\clks\kernel\kelf.c | C | 203 | 1 | 53 | 257 | +| d:\Projects\C\cleonos\clks\kernel\keyboard.c | C | 199 | 0 | 42 | 241 | +| d:\Projects\C\cleonos\clks\kernel\kmain.c | C | 180 | 1 | 50 | 231 | +| d:\Projects\C\cleonos\clks\kernel\limine_requests.c | C | 76 | 0 | 26 | 102 | +| d:\Projects\C\cleonos\clks\kernel\log.c | C | 79 | 0 | 17 | 96 | +| d:\Projects\C\cleonos\clks\kernel\pmm.c | C | 82 | 0 | 23 | 105 | +| d:\Projects\C\cleonos\clks\kernel\ramdisk.c | C | 172 | 0 | 50 | 222 | +| d:\Projects\C\cleonos\clks\kernel\scheduler.c | C | 127 | 0 | 42 | 169 | +| d:\Projects\C\cleonos\clks\kernel\service.c | C | 113 | 0 | 34 | 147 | +| d:\Projects\C\cleonos\clks\kernel\shell.c | C | 860 | 0 | 230 | 1,090 | +| d:\Projects\C\cleonos\clks\kernel\syscall.c | C | 243 | 0 | 50 | 293 | +| d:\Projects\C\cleonos\clks\kernel\tty.c | C | 275 | 0 | 77 | 352 | +| d:\Projects\C\cleonos\clks\kernel\userland.c | C | 113 | 0 | 32 | 145 | +| d:\Projects\C\cleonos\clks\lib\string.c | C | 54 | 0 | 16 | 70 | +| d:\Projects\C\cleonos\cmake\check_tools.cmake | CMake | 32 | 0 | 6 | 38 | +| d:\Projects\C\cleonos\cmake\log.cmake | CMake | 30 | 0 | 6 | 36 | +| d:\Projects\C\cleonos\cmake\log_emit.cmake | CMake | 23 | 0 | 6 | 29 | +| d:\Projects\C\cleonos\cmake\setup_limine.cmake | CMake | 100 | 0 | 18 | 118 | +| d:\Projects\C\cleonos\configs\limine.conf | Properties | 6 | 0 | 1 | 7 | +| d:\Projects\C\cleonos\docs\README.md | Markdown | 22 | 0 | 2 | 24 | +| d:\Projects\C\cleonos\docs\stage1.md | Markdown | 41 | 0 | 5 | 46 | +| d:\Projects\C\cleonos\docs\stage10.md | Markdown | 34 | 0 | 6 | 40 | +| d:\Projects\C\cleonos\docs\stage11.md | Markdown | 36 | 0 | 5 | 41 | +| d:\Projects\C\cleonos\docs\stage12.md | Markdown | 40 | 0 | 6 | 46 | +| d:\Projects\C\cleonos\docs\stage13.md | Markdown | 34 | 0 | 6 | 40 | +| d:\Projects\C\cleonos\docs\stage14.md | Markdown | 44 | 0 | 8 | 52 | +| d:\Projects\C\cleonos\docs\stage15.md | Markdown | 47 | 0 | 7 | 54 | +| d:\Projects\C\cleonos\docs\stage2.md | Markdown | 30 | 0 | 5 | 35 | +| d:\Projects\C\cleonos\docs\stage20.md | Markdown | 46 | 0 | 6 | 52 | +| d:\Projects\C\cleonos\docs\stage21.md | Markdown | 72 | 0 | 7 | 79 | +| d:\Projects\C\cleonos\docs\stage3.md | Markdown | 29 | 0 | 5 | 34 | +| d:\Projects\C\cleonos\docs\stage4.md | Markdown | 30 | 0 | 5 | 35 | +| d:\Projects\C\cleonos\docs\stage5.md | Markdown | 29 | 0 | 5 | 34 | +| d:\Projects\C\cleonos\docs\stage6.md | Markdown | 30 | 0 | 6 | 36 | +| d:\Projects\C\cleonos\docs\stage7.md | Markdown | 34 | 0 | 6 | 40 | +| d:\Projects\C\cleonos\docs\stage8.md | Markdown | 31 | 0 | 6 | 37 | +| d:\Projects\C\cleonos\docs\stage9.md | Markdown | 31 | 0 | 6 | 37 | +| d:\Projects\C\cleonos\ramdisk\shell\init.cmd | Batch | 11 | 0 | 2 | 13 | +| d:\Projects\C\cleonos\scripts\gen-tty-psf.ps1 | PowerShell | 64 | 2 | 18 | 84 | +| Total | | 7,635 | 8 | 1,894 | 9,537 | ++---------------------------------------------------------------+-------------+------------+------------+------------+------------+ \ No newline at end of file diff --git a/clks/include/clks/fs.h b/clks/include/clks/fs.h index 6ef902e..0c81040 100644 --- a/clks/include/clks/fs.h +++ b/clks/include/clks/fs.h @@ -19,6 +19,12 @@ clks_bool clks_fs_stat(const char *path, struct clks_fs_node_info *out_info); const void *clks_fs_read_all(const char *path, u64 *out_size); u64 clks_fs_count_children(const char *dir_path); clks_bool clks_fs_get_child_name(const char *dir_path, u64 index, char *out_name, usize out_name_size); + +clks_bool clks_fs_mkdir(const char *path); +clks_bool clks_fs_write_all(const char *path, const void *data, u64 size); +clks_bool clks_fs_append(const char *path, const void *data, u64 size); +clks_bool clks_fs_remove(const char *path); + u64 clks_fs_node_count(void); -#endif +#endif \ No newline at end of file diff --git a/clks/kernel/fs.c b/clks/kernel/fs.c index ef554cf..02447da 100644 --- a/clks/kernel/fs.c +++ b/clks/kernel/fs.c @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -8,6 +9,8 @@ #define CLKS_FS_MAX_NODES 512U #define CLKS_FS_PATH_MAX CLKS_RAMDISK_PATH_MAX +#define CLKS_FS_NODE_FLAG_HEAP_DATA 0x0001U + struct clks_fs_node { clks_bool used; enum clks_fs_node_type type; @@ -26,6 +29,7 @@ struct clks_fs_build_stats { static struct clks_fs_node clks_fs_nodes[CLKS_FS_MAX_NODES]; static u16 clks_fs_nodes_used = 0U; static clks_bool clks_fs_ready = CLKS_FALSE; +static const u8 clks_fs_empty_file_data[1] = {0U}; static clks_bool clks_fs_normalize_external_path(const char *path, char *out_internal, usize out_size) { usize in_pos = 0; @@ -94,6 +98,33 @@ static clks_bool clks_fs_normalize_external_path(const char *path, char *out_int return CLKS_TRUE; } +static clks_bool clks_fs_internal_in_temp_tree(const char *internal_path) { + if (internal_path == CLKS_NULL) { + return CLKS_FALSE; + } + + if (internal_path[0] != 't' || + internal_path[1] != 'e' || + internal_path[2] != 'm' || + internal_path[3] != 'p') { + return CLKS_FALSE; + } + + return (internal_path[4] == '\0' || internal_path[4] == '/') ? CLKS_TRUE : CLKS_FALSE; +} + +static clks_bool clks_fs_internal_is_temp_file_path(const char *internal_path) { + if (clks_fs_internal_in_temp_tree(internal_path) == CLKS_FALSE) { + return CLKS_FALSE; + } + + if (internal_path[4] == '\0') { + return CLKS_FALSE; + } + + return CLKS_TRUE; +} + static i32 clks_fs_find_node_by_internal(const char *internal_path) { u16 i; @@ -176,12 +207,54 @@ static clks_bool clks_fs_split_parent(const char *internal_path, char *parent_ou return CLKS_TRUE; } +static clks_bool clks_fs_node_has_heap_data(u16 index) { + return ((clks_fs_nodes[index].reserved & CLKS_FS_NODE_FLAG_HEAP_DATA) != 0U) ? CLKS_TRUE : CLKS_FALSE; +} + +static void clks_fs_node_set_heap_data(u16 index, clks_bool value) { + if (value == CLKS_TRUE) { + clks_fs_nodes[index].reserved |= CLKS_FS_NODE_FLAG_HEAP_DATA; + } else { + clks_fs_nodes[index].reserved &= (u16)(~CLKS_FS_NODE_FLAG_HEAP_DATA); + } +} + +static void clks_fs_node_release_heap_data(u16 index) { + if (clks_fs_nodes[index].type != CLKS_FS_NODE_FILE) { + return; + } + + if (clks_fs_node_has_heap_data(index) == CLKS_TRUE && clks_fs_nodes[index].data != CLKS_NULL) { + clks_kfree((void *)clks_fs_nodes[index].data); + } + + clks_fs_node_set_heap_data(index, CLKS_FALSE); +} + +static i32 clks_fs_alloc_slot(void) { + u16 i; + + for (i = 0U; i < clks_fs_nodes_used; i++) { + if (clks_fs_nodes[i].used == CLKS_FALSE) { + return (i32)i; + } + } + + if (clks_fs_nodes_used >= CLKS_FS_MAX_NODES) { + return -1; + } + + clks_fs_nodes_used++; + return (i32)(clks_fs_nodes_used - 1U); +} + static i32 clks_fs_create_or_update_node(const char *internal_path, enum clks_fs_node_type type, u16 parent, const void *data, u64 size) { i32 existing; + i32 slot; usize path_len; if (internal_path == CLKS_NULL) { @@ -208,25 +281,28 @@ static i32 clks_fs_create_or_update_node(const char *internal_path, if (type == CLKS_FS_NODE_FILE) { node->data = data; node->size = size; + node->reserved = 0U; } + node->used = CLKS_TRUE; return existing; } - if (clks_fs_nodes_used >= CLKS_FS_MAX_NODES) { + slot = clks_fs_alloc_slot(); + + if (slot < 0) { return -1; } - clks_fs_nodes[clks_fs_nodes_used].used = CLKS_TRUE; - clks_fs_nodes[clks_fs_nodes_used].type = type; - clks_fs_nodes[clks_fs_nodes_used].parent = parent; - clks_fs_nodes[clks_fs_nodes_used].reserved = 0U; - clks_fs_nodes[clks_fs_nodes_used].data = (type == CLKS_FS_NODE_FILE) ? data : CLKS_NULL; - clks_fs_nodes[clks_fs_nodes_used].size = (type == CLKS_FS_NODE_FILE) ? size : 0ULL; - clks_memcpy(clks_fs_nodes[clks_fs_nodes_used].path, internal_path, path_len + 1U); + clks_fs_nodes[(u16)slot].used = CLKS_TRUE; + clks_fs_nodes[(u16)slot].type = type; + clks_fs_nodes[(u16)slot].parent = parent; + clks_fs_nodes[(u16)slot].reserved = 0U; + clks_fs_nodes[(u16)slot].data = (type == CLKS_FS_NODE_FILE) ? data : CLKS_NULL; + clks_fs_nodes[(u16)slot].size = (type == CLKS_FS_NODE_FILE) ? size : 0ULL; + clks_memcpy(clks_fs_nodes[(u16)slot].path, internal_path, path_len + 1U); - clks_fs_nodes_used++; - return (i32)(clks_fs_nodes_used - 1U); + return slot; } static clks_bool clks_fs_ensure_root(void) { @@ -372,6 +448,38 @@ static clks_bool clks_fs_ramdisk_visit(const struct clks_ramdisk_entry *entry, v return CLKS_TRUE; } +static clks_bool clks_fs_build_file_payload(const void *data, + u64 size, + const void **out_data, + clks_bool *out_heap_owned) { + void *payload; + + if (out_data == CLKS_NULL || out_heap_owned == CLKS_NULL) { + return CLKS_FALSE; + } + + if (size == 0ULL) { + *out_data = (const void *)clks_fs_empty_file_data; + *out_heap_owned = CLKS_FALSE; + return CLKS_TRUE; + } + + if (data == CLKS_NULL) { + return CLKS_FALSE; + } + + payload = clks_kmalloc((usize)size); + + if (payload == CLKS_NULL) { + return CLKS_FALSE; + } + + clks_memcpy(payload, data, (usize)size); + *out_data = (const void *)payload; + *out_heap_owned = CLKS_TRUE; + return CLKS_TRUE; +} + void clks_fs_init(void) { const struct limine_file *module; struct clks_fs_build_stats stats; @@ -474,6 +582,10 @@ const void *clks_fs_read_all(const char *path, u64 *out_size) { *out_size = clks_fs_nodes[(u16)node_index].size; } + if (clks_fs_nodes[(u16)node_index].size == 0ULL) { + return (const void *)clks_fs_empty_file_data; + } + return clks_fs_nodes[(u16)node_index].data; } @@ -563,10 +675,244 @@ clks_bool clks_fs_get_child_name(const char *dir_path, u64 index, char *out_name return CLKS_FALSE; } +clks_bool clks_fs_mkdir(const char *path) { + char internal[CLKS_FS_PATH_MAX]; + i32 node_index; + + if (clks_fs_ready == CLKS_FALSE || path == CLKS_NULL) { + return CLKS_FALSE; + } + + if (clks_fs_normalize_external_path(path, internal, sizeof(internal)) == CLKS_FALSE) { + return CLKS_FALSE; + } + + if (clks_fs_internal_in_temp_tree(internal) == CLKS_FALSE) { + return CLKS_FALSE; + } + + if (internal[0] == '\0') { + return CLKS_FALSE; + } + + if (clks_fs_ensure_dir_hierarchy(internal) == CLKS_FALSE) { + return CLKS_FALSE; + } + + node_index = clks_fs_find_node_by_internal(internal); + + if (node_index < 0) { + return CLKS_FALSE; + } + + return (clks_fs_nodes[(u16)node_index].type == CLKS_FS_NODE_DIR) ? CLKS_TRUE : CLKS_FALSE; +} + +clks_bool clks_fs_write_all(const char *path, const void *data, u64 size) { + char internal[CLKS_FS_PATH_MAX]; + char parent[CLKS_FS_PATH_MAX]; + const void *payload_data = CLKS_NULL; + clks_bool payload_heap_owned = CLKS_FALSE; + i32 parent_index; + i32 node_index; + + if (clks_fs_ready == CLKS_FALSE || path == CLKS_NULL) { + return CLKS_FALSE; + } + + if (clks_fs_normalize_external_path(path, internal, sizeof(internal)) == CLKS_FALSE) { + return CLKS_FALSE; + } + + if (clks_fs_internal_is_temp_file_path(internal) == CLKS_FALSE) { + return CLKS_FALSE; + } + + if (clks_fs_split_parent(internal, parent, sizeof(parent)) == CLKS_FALSE) { + return CLKS_FALSE; + } + + if (clks_fs_internal_in_temp_tree(parent) == CLKS_FALSE) { + return CLKS_FALSE; + } + + if (clks_fs_ensure_dir_hierarchy(parent) == CLKS_FALSE) { + return CLKS_FALSE; + } + + parent_index = clks_fs_find_node_by_internal(parent); + + if (parent_index < 0 || clks_fs_nodes[(u16)parent_index].type != CLKS_FS_NODE_DIR) { + return CLKS_FALSE; + } + + node_index = clks_fs_find_node_by_internal(internal); + + if (node_index >= 0 && clks_fs_nodes[(u16)node_index].type != CLKS_FS_NODE_FILE) { + return CLKS_FALSE; + } + + if (clks_fs_build_file_payload(data, size, &payload_data, &payload_heap_owned) == CLKS_FALSE) { + return CLKS_FALSE; + } + + if (node_index >= 0) { + clks_fs_node_release_heap_data((u16)node_index); + } + + node_index = clks_fs_create_or_update_node( + internal, + CLKS_FS_NODE_FILE, + (u16)parent_index, + payload_data, + size + ); + + if (node_index < 0) { + if (payload_heap_owned == CLKS_TRUE) { + clks_kfree((void *)payload_data); + } + return CLKS_FALSE; + } + + clks_fs_node_set_heap_data((u16)node_index, payload_heap_owned); + return CLKS_TRUE; +} + +clks_bool clks_fs_append(const char *path, const void *data, u64 size) { + char internal[CLKS_FS_PATH_MAX]; + i32 node_index; + const void *old_data; + u64 old_size; + u64 new_size; + void *merged = CLKS_NULL; + + if (clks_fs_ready == CLKS_FALSE || path == CLKS_NULL) { + return CLKS_FALSE; + } + + if (size > 0ULL && data == CLKS_NULL) { + return CLKS_FALSE; + } + + if (clks_fs_normalize_external_path(path, internal, sizeof(internal)) == CLKS_FALSE) { + return CLKS_FALSE; + } + + if (clks_fs_internal_is_temp_file_path(internal) == CLKS_FALSE) { + return CLKS_FALSE; + } + + node_index = clks_fs_find_node_by_internal(internal); + + if (node_index < 0) { + return clks_fs_write_all(path, data, size); + } + + if (clks_fs_nodes[(u16)node_index].type != CLKS_FS_NODE_FILE) { + return CLKS_FALSE; + } + + old_data = clks_fs_nodes[(u16)node_index].data; + old_size = clks_fs_nodes[(u16)node_index].size; + + if (old_size > (0xFFFFFFFFFFFFFFFFULL - size)) { + return CLKS_FALSE; + } + + new_size = old_size + size; + + if (new_size == 0ULL) { + return clks_fs_write_all(path, clks_fs_empty_file_data, 0ULL); + } + + merged = clks_kmalloc((usize)new_size); + + if (merged == CLKS_NULL) { + return CLKS_FALSE; + } + + if (old_size > 0ULL && old_data != CLKS_NULL) { + clks_memcpy(merged, old_data, (usize)old_size); + } + + if (size > 0ULL) { + clks_memcpy((u8 *)merged + (usize)old_size, data, (usize)size); + } + if (clks_fs_write_all(path, merged, new_size) == CLKS_FALSE) { + clks_kfree(merged); + return CLKS_FALSE; + } + + clks_kfree(merged); + return CLKS_TRUE; +} + +clks_bool clks_fs_remove(const char *path) { + char internal[CLKS_FS_PATH_MAX]; + i32 node_index; + u16 i; + + if (clks_fs_ready == CLKS_FALSE || path == CLKS_NULL) { + return CLKS_FALSE; + } + + if (clks_fs_normalize_external_path(path, internal, sizeof(internal)) == CLKS_FALSE) { + return CLKS_FALSE; + } + + if (clks_fs_internal_in_temp_tree(internal) == CLKS_FALSE) { + return CLKS_FALSE; + } + + if (clks_strcmp(internal, "temp") == 0) { + return CLKS_FALSE; + } + + node_index = clks_fs_find_node_by_internal(internal); + + if (node_index < 0) { + return CLKS_FALSE; + } + + if (clks_fs_nodes[(u16)node_index].type == CLKS_FS_NODE_DIR) { + for (i = 0U; i < clks_fs_nodes_used; i++) { + if (clks_fs_nodes[i].used == CLKS_FALSE) { + continue; + } + + if (clks_fs_nodes[i].parent == (u16)node_index) { + return CLKS_FALSE; + } + } + } + + clks_fs_node_release_heap_data((u16)node_index); + + clks_fs_nodes[(u16)node_index].used = CLKS_FALSE; + clks_fs_nodes[(u16)node_index].type = CLKS_FS_NODE_FILE; + clks_fs_nodes[(u16)node_index].parent = 0U; + clks_fs_nodes[(u16)node_index].reserved = 0U; + clks_fs_nodes[(u16)node_index].data = CLKS_NULL; + clks_fs_nodes[(u16)node_index].size = 0ULL; + clks_fs_nodes[(u16)node_index].path[0] = '\0'; + + return CLKS_TRUE; +} + u64 clks_fs_node_count(void) { + u16 i; + u64 used = 0ULL; + if (clks_fs_ready == CLKS_FALSE) { return 0ULL; } - return (u64)clks_fs_nodes_used; -} + for (i = 0U; i < clks_fs_nodes_used; i++) { + if (clks_fs_nodes[i].used == CLKS_TRUE) { + used++; + } + } + + return used; +} \ No newline at end of file diff --git a/clks/kernel/kmain.c b/clks/kernel/kmain.c index 7eb8e2b..a9fff99 100644 --- a/clks/kernel/kmain.c +++ b/clks/kernel/kmain.c @@ -96,7 +96,7 @@ void clks_kernel_main(void) { clks_tty_init(); } - clks_log(CLKS_LOG_INFO, "BOOT", "CLEONOS STAGE18 START"); + clks_log(CLKS_LOG_INFO, "BOOT", "CLEONOS Stage21 START"); if (boot_fb == CLKS_NULL) { clks_log(CLKS_LOG_WARN, "VIDEO", "NO FRAMEBUFFER FROM LIMINE"); diff --git a/clks/kernel/shell.c b/clks/kernel/shell.c index b17d692..b4d4d63 100644 --- a/clks/kernel/shell.c +++ b/clks/kernel/shell.c @@ -23,6 +23,7 @@ static char clks_shell_line[CLKS_SHELL_LINE_MAX]; static usize clks_shell_line_len = 0U; static usize clks_shell_cursor = 0U; static usize clks_shell_rendered_len = 0U; +static char clks_shell_cwd[CLKS_SHELL_PATH_MAX] = "/"; static char clks_shell_history[CLKS_SHELL_HISTORY_MAX][CLKS_SHELL_LINE_MAX]; static u32 clks_shell_history_count = 0U; @@ -390,11 +391,178 @@ static clks_bool clks_shell_resolve_exec_path(const char *arg, char *out_path, u return CLKS_TRUE; } +static clks_bool clks_shell_path_push_component(char *path, usize path_size, usize *io_len, const char *component, usize comp_len) { + if (path == CLKS_NULL || io_len == CLKS_NULL || component == CLKS_NULL || comp_len == 0U) { + return CLKS_FALSE; + } + + if (*io_len == 1U) { + if (*io_len + comp_len >= path_size) { + return CLKS_FALSE; + } + + clks_memcpy(path + 1U, component, comp_len); + *io_len = 1U + comp_len; + path[*io_len] = '\0'; + return CLKS_TRUE; + } + + if (*io_len + 1U + comp_len >= path_size) { + return CLKS_FALSE; + } + + path[*io_len] = '/'; + clks_memcpy(path + *io_len + 1U, component, comp_len); + *io_len += (1U + comp_len); + path[*io_len] = '\0'; + return CLKS_TRUE; +} + +static void clks_shell_path_pop_component(char *path, usize *io_len) { + if (path == CLKS_NULL || io_len == CLKS_NULL) { + return; + } + + if (*io_len <= 1U) { + path[0] = '/'; + path[1] = '\0'; + *io_len = 1U; + return; + } + + while (*io_len > 1U && path[*io_len - 1U] != '/') { + (*io_len)--; + } + + if (*io_len > 1U) { + (*io_len)--; + } + + path[*io_len] = '\0'; +} + +static clks_bool clks_shell_path_parse_into(const char *src, char *out_path, usize out_size, usize *io_len) { + usize i = 0U; + + if (src == CLKS_NULL || out_path == CLKS_NULL || io_len == CLKS_NULL) { + return CLKS_FALSE; + } + + if (src[0] == '/') { + i = 1U; + } + + while (src[i] != '\0') { + usize start; + usize len; + + while (src[i] == '/') { + i++; + } + + if (src[i] == '\0') { + break; + } + + start = i; + + while (src[i] != '\0' && src[i] != '/') { + i++; + } + + len = i - start; + + if (len == 1U && src[start] == '.') { + continue; + } + + if (len == 2U && src[start] == '.' && src[start + 1U] == '.') { + clks_shell_path_pop_component(out_path, io_len); + continue; + } + + if (clks_shell_path_push_component(out_path, out_size, io_len, src + start, len) == CLKS_FALSE) { + return CLKS_FALSE; + } + } + + return CLKS_TRUE; +} + +static clks_bool clks_shell_resolve_path(const char *arg, char *out_path, usize out_size) { + usize len = 1U; + + if (out_path == CLKS_NULL || out_size < 2U) { + return CLKS_FALSE; + } + + out_path[0] = '/'; + out_path[1] = '\0'; + + if (arg == CLKS_NULL || arg[0] == '\0') { + return clks_shell_path_parse_into(clks_shell_cwd, out_path, out_size, &len); + } + + if (arg[0] != '/') { + if (clks_shell_path_parse_into(clks_shell_cwd, out_path, out_size, &len) == CLKS_FALSE) { + return CLKS_FALSE; + } + } + + return clks_shell_path_parse_into(arg, out_path, out_size, &len); +} + +static clks_bool clks_shell_split_first_and_rest(const char *arg, + char *out_first, + usize out_first_size, + const char **out_rest) { + usize i = 0U; + usize p = 0U; + + if (arg == CLKS_NULL || out_first == CLKS_NULL || out_first_size == 0U || out_rest == CLKS_NULL) { + return CLKS_FALSE; + } + + out_first[0] = '\0'; + *out_rest = ""; + + while (arg[i] != '\0' && clks_shell_is_space(arg[i]) == CLKS_TRUE) { + i++; + } + + if (arg[i] == '\0') { + return CLKS_FALSE; + } + + while (arg[i] != '\0' && clks_shell_is_space(arg[i]) == CLKS_FALSE) { + if (p + 1U < out_first_size) { + out_first[p++] = arg[i]; + } + i++; + } + + out_first[p] = '\0'; + + while (arg[i] != '\0' && clks_shell_is_space(arg[i]) == CLKS_TRUE) { + i++; + } + + *out_rest = &arg[i]; + return CLKS_TRUE; +} + static void clks_shell_cmd_help(void) { clks_shell_writeln("commands:"); clks_shell_writeln(" help"); clks_shell_writeln(" ls [dir]"); clks_shell_writeln(" cat "); + clks_shell_writeln(" pwd"); + clks_shell_writeln(" cd [dir]"); + clks_shell_writeln(" mkdir (/temp only)"); + clks_shell_writeln(" touch (/temp only)"); + clks_shell_writeln(" write (/temp only)"); + clks_shell_writeln(" append (/temp only)"); + clks_shell_writeln(" rm (/temp only)"); clks_shell_writeln(" exec "); clks_shell_writeln(" clear"); clks_shell_writeln(" kbdstat"); @@ -403,12 +571,18 @@ static void clks_shell_cmd_help(void) { static void clks_shell_cmd_ls(const char *arg) { struct clks_fs_node_info info; - const char *path = arg; + char path[CLKS_SHELL_PATH_MAX]; + const char *target = arg; u64 count; u64 i; - if (path == CLKS_NULL || path[0] == '\0') { - path = "/"; + if (target == CLKS_NULL || target[0] == '\0') { + target = "."; + } + + if (clks_shell_resolve_path(target, path, sizeof(path)) == CLKS_FALSE) { + clks_shell_writeln("ls: invalid path"); + return; } if (clks_fs_stat(path, &info) == CLKS_FALSE || info.type != CLKS_FS_NODE_DIR) { @@ -439,6 +613,7 @@ static void clks_shell_cmd_cat(const char *arg) { const void *data; u64 size = 0ULL; u64 copy_len; + char path[CLKS_SHELL_PATH_MAX]; char out[CLKS_SHELL_CAT_LIMIT + 1U]; if (arg == CLKS_NULL || arg[0] == '\0') { @@ -446,7 +621,12 @@ static void clks_shell_cmd_cat(const char *arg) { return; } - data = clks_fs_read_all(arg, &size); + if (clks_shell_resolve_path(arg, path, sizeof(path)) == CLKS_FALSE) { + clks_shell_writeln("cat: invalid path"); + return; + } + + data = clks_fs_read_all(path, &size); if (data == CLKS_NULL) { clks_shell_writeln("cat: file not found"); @@ -469,6 +649,143 @@ static void clks_shell_cmd_cat(const char *arg) { } } +static void clks_shell_cmd_pwd(void) { + clks_shell_writeln(clks_shell_cwd); +} + +static void clks_shell_cmd_cd(const char *arg) { + struct clks_fs_node_info info; + char path[CLKS_SHELL_PATH_MAX]; + const char *target = arg; + + if (target == CLKS_NULL || target[0] == '\0') { + target = "/"; + } + + if (clks_shell_resolve_path(target, path, sizeof(path)) == CLKS_FALSE) { + clks_shell_writeln("cd: invalid path"); + return; + } + + if (clks_fs_stat(path, &info) == CLKS_FALSE || info.type != CLKS_FS_NODE_DIR) { + clks_shell_writeln("cd: directory not found"); + return; + } + + clks_shell_copy_line(clks_shell_cwd, sizeof(clks_shell_cwd), path); +} + +static void clks_shell_cmd_mkdir(const char *arg) { + char path[CLKS_SHELL_PATH_MAX]; + + if (arg == CLKS_NULL || arg[0] == '\0') { + clks_shell_writeln("mkdir: directory path required"); + return; + } + + if (clks_shell_resolve_path(arg, path, sizeof(path)) == CLKS_FALSE) { + clks_shell_writeln("mkdir: invalid path"); + return; + } + + if (clks_fs_mkdir(path) == CLKS_FALSE) { + clks_shell_writeln("mkdir: failed (only /temp writable)"); + } +} + +static void clks_shell_cmd_touch(const char *arg) { + static const char empty_data[1] = {'\0'}; + char path[CLKS_SHELL_PATH_MAX]; + + if (arg == CLKS_NULL || arg[0] == '\0') { + clks_shell_writeln("touch: file path required"); + return; + } + + if (clks_shell_resolve_path(arg, path, sizeof(path)) == CLKS_FALSE) { + clks_shell_writeln("touch: invalid path"); + return; + } + + if (clks_fs_write_all(path, empty_data, 0ULL) == CLKS_FALSE) { + clks_shell_writeln("touch: failed (only /temp writable)"); + } +} + +static void clks_shell_cmd_write(const char *arg) { + char path_arg[CLKS_SHELL_PATH_MAX]; + char abs_path[CLKS_SHELL_PATH_MAX]; + const char *payload; + u64 payload_len; + + if (arg == CLKS_NULL || arg[0] == '\0') { + clks_shell_writeln("write: usage write "); + return; + } + + if (clks_shell_split_first_and_rest(arg, path_arg, sizeof(path_arg), &payload) == CLKS_FALSE) { + clks_shell_writeln("write: usage write "); + return; + } + + if (clks_shell_resolve_path(path_arg, abs_path, sizeof(abs_path)) == CLKS_FALSE) { + clks_shell_writeln("write: invalid path"); + return; + } + + payload_len = clks_strlen(payload); + + if (clks_fs_write_all(abs_path, payload, payload_len) == CLKS_FALSE) { + clks_shell_writeln("write: failed (only /temp writable)"); + } +} + +static void clks_shell_cmd_append(const char *arg) { + char path_arg[CLKS_SHELL_PATH_MAX]; + char abs_path[CLKS_SHELL_PATH_MAX]; + const char *payload; + u64 payload_len; + + if (arg == CLKS_NULL || arg[0] == '\0') { + clks_shell_writeln("append: usage append "); + return; + } + + if (clks_shell_split_first_and_rest(arg, path_arg, sizeof(path_arg), &payload) == CLKS_FALSE) { + clks_shell_writeln("append: usage append "); + return; + } + + if (clks_shell_resolve_path(path_arg, abs_path, sizeof(abs_path)) == CLKS_FALSE) { + clks_shell_writeln("append: invalid path"); + return; + } + + payload_len = clks_strlen(payload); + + if (clks_fs_append(abs_path, payload, payload_len) == CLKS_FALSE) { + clks_shell_writeln("append: failed (only /temp writable)"); + } +} + +static void clks_shell_cmd_rm(const char *arg) { + char path[CLKS_SHELL_PATH_MAX]; + + if (arg == CLKS_NULL || arg[0] == '\0') { + clks_shell_writeln("rm: path required"); + return; + } + + if (clks_shell_resolve_path(arg, path, sizeof(path)) == CLKS_FALSE) { + clks_shell_writeln("rm: invalid path"); + return; + } + + if (clks_fs_remove(path) == CLKS_FALSE) { + clks_shell_writeln("rm: failed (only /temp writable; dir must be empty)"); + } +} + static void clks_shell_cmd_exec(const char *arg) { char path[CLKS_SHELL_PATH_MAX]; u64 status = (u64)-1; @@ -540,6 +857,41 @@ static void clks_shell_execute_line(const char *line) { return; } + if (clks_shell_streq(cmd, "pwd") == CLKS_TRUE) { + clks_shell_cmd_pwd(); + return; + } + + if (clks_shell_streq(cmd, "cd") == CLKS_TRUE) { + clks_shell_cmd_cd(arg); + return; + } + + if (clks_shell_streq(cmd, "mkdir") == CLKS_TRUE) { + clks_shell_cmd_mkdir(arg); + return; + } + + if (clks_shell_streq(cmd, "touch") == CLKS_TRUE) { + clks_shell_cmd_touch(arg); + return; + } + + if (clks_shell_streq(cmd, "write") == CLKS_TRUE) { + clks_shell_cmd_write(arg); + return; + } + + if (clks_shell_streq(cmd, "append") == CLKS_TRUE) { + clks_shell_cmd_append(arg); + return; + } + + if (clks_shell_streq(cmd, "rm") == CLKS_TRUE) { + clks_shell_cmd_rm(arg); + return; + } + if (clks_shell_streq(cmd, "exec") == CLKS_TRUE || clks_shell_streq(cmd, "run") == CLKS_TRUE) { clks_shell_cmd_exec(arg); return; @@ -686,10 +1038,12 @@ static void clks_shell_handle_char(char ch) { clks_shell_render_line(); } } + void clks_shell_init(void) { clks_shell_reset_line(); clks_shell_history_count = 0U; clks_shell_history_cancel_nav(); + clks_shell_copy_line(clks_shell_cwd, sizeof(clks_shell_cwd), "/"); if (clks_tty_ready() == CLKS_FALSE) { clks_shell_ready = CLKS_FALSE; @@ -702,6 +1056,7 @@ void clks_shell_init(void) { clks_shell_writeln(""); clks_shell_writeln("CLeonOS interactive shell ready"); clks_shell_writeln("type 'help' for commands"); + clks_shell_writeln("/temp is writable in kernel shell mode"); clks_shell_prompt(); clks_log(CLKS_LOG_INFO, "SHELL", "INTERACTIVE LOOP ONLINE"); diff --git a/configs/limine.conf b/configs/limine.conf index bf9fa10..40e1eff 100644 --- a/configs/limine.conf +++ b/configs/limine.conf @@ -1,7 +1,7 @@ timeout: 3 verbose: yes -/CLeonOS Stage1 +/CLeonOS Stage21 protocol: limine kernel_path: boot():/boot/clks_kernel.elf module_path: boot():/boot/cleonos_ramdisk.tar \ No newline at end of file diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..a4b3738 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,24 @@ +# CLeonOS Stage Docs + +## Available Stage Docs +- `stage1.md` +- `stage2.md` +- `stage3.md` +- `stage4.md` +- `stage5.md` +- `stage6.md` +- `stage7.md` +- `stage8.md` +- `stage9.md` +- `stage10.md` +- `stage11.md` +- `stage12.md` +- `stage13.md` +- `stage14.md` +- `stage15.md` +- `stage20.md` +- `stage21.md` + +## Notes +- Stage docs use a fixed template: goal, implementation, acceptance criteria, build targets, QEMU command, and debugging notes. +- Stages 16~19 are currently not documented in this folder; add them later using the same template to keep history continuous. \ No newline at end of file diff --git a/docs/stage20.md b/docs/stage20.md new file mode 100644 index 0000000..19a8eb0 --- /dev/null +++ b/docs/stage20.md @@ -0,0 +1,52 @@ +# CLeonOS Stage20 + +## Stage Goal +- Keep system in kernel-shell mode while ELF user shell remains deferred. +- Stabilize terminal interaction path: PS/2 input queue + line editing shell loop. +- Enable external PSF font loading for framebuffer TTY. +- Keep scheduler/service/syscall/interrupt pipeline stable. + +## What Was Implemented +- Boot pipeline keeps kernel shell as the active interactive interface. +- TTY supports loading external PSF font from `/system/tty.psf`. +- Keyboard module provides: + - PS/2 scan code handling + - input queue buffering + - `Alt+F1..F4` virtual TTY switch hotkeys +- Kernel shell interactive loop is online: + - command dispatch (`help/ls/cat/exec/clear/kbdstat` baseline) + - line editing and history +- TTY cursor path is timer-driven and supports blink updates via `clks_tty_tick()`. + +## Acceptance Criteria +- Kernel boots and prints `CLEONOS Stage20 START`. +- Boot logs include: + - `[INFO][TTY] EXTERNAL PSF LOADED /SYSTEM/TTY.PSF` (or fallback warning) + - `[INFO][KBD] ALT+F1..F4 TTY HOTKEY ONLINE` + - `[INFO][KBD] PS2 INPUT QUEUE ONLINE` + - `[INFO][SHELL] INTERACTIVE LOOP ONLINE` +- Typing in kernel shell produces immediate echo and command execution. +- `Alt+F1..F4` switches active TTY without panic. + +## Build Targets +- `make setup` +- `make userapps` +- `make iso` +- `make run` +- `make debug` + +## QEMU Command +- `qemu-system-x86_64 -M q35 -m 1024M -cdrom build/CLeonOS-x86_64.iso -serial stdio` + +## Common Bugs and Debugging +- Cannot type in shell: + - Ensure QEMU window has keyboard focus. + - Check logs for keyboard queue online messages. +- External PSF not applied: + - Verify `/system/tty.psf` exists in ramdisk package. + - If load fails, system will fall back to built-in font. +- Hotkey switching does not work: + - Confirm `Alt` is held while pressing `F1..F4`. + - Check `[INFO][TTY] HOTKEY SWITCH` logs. +- Input lag feels high: + - Increase shell input budget or scheduler frequency in later stage. \ No newline at end of file diff --git a/docs/stage21.md b/docs/stage21.md new file mode 100644 index 0000000..cad31d1 --- /dev/null +++ b/docs/stage21.md @@ -0,0 +1,79 @@ +# CLeonOS Stage21 + +## Stage Goal +- Add writable runtime filesystem capability without touching ELF execution path. +- Restrict write operations to `/temp` to keep system area read-only. +- Extend kernel shell with practical file/dir operations for daily debugging. + +## What Was Implemented +- New writable VFS APIs: + - `clks_fs_mkdir(const char *path)` + - `clks_fs_write_all(const char *path, const void *data, u64 size)` + - `clks_fs_append(const char *path, const void *data, u64 size)` + - `clks_fs_remove(const char *path)` +- Write guard policy: + - Only `/temp` subtree is writable. + - `/system`, `/shell`, `/driver` remain read-only. + - Non-empty directory delete is rejected. +- Runtime file payload management: + - Dynamically written file data uses kernel heap. + - Overwrite/append paths release previous heap-backed payload safely. +- Kernel shell command expansion: + - `pwd` + - `cd [dir]` + - `mkdir ` + - `touch ` + - `write ` + - `append ` + - `rm ` +- Shell path handling upgraded: + - relative path support + - `.` and `..` handling + - shell-maintained current working directory + +## Acceptance Criteria +- Boot completes and kernel shell is interactive. +- `help` output includes new file commands. +- Writable flow under `/temp` works: + - create dir + - create file + - write and append text + - read with `cat` + - remove file/empty dir +- Write operation outside `/temp` fails with safe message. +- No regression in scheduler/service/syscall/interrupt initialization logs. + +## Suggested Validation Script (Manual) +- `pwd` +- `cd /temp` +- `mkdir demo` +- `cd demo` +- `touch a.txt` +- `write a.txt hello` +- `append a.txt _world` +- `cat a.txt` (expect `hello_world`) +- `cd /` +- `write /system/x.txt bad` (expect failure) +- `rm /temp/demo/a.txt` +- `rm /temp/demo` + +## Build Targets +- `make setup` +- `make userapps` +- `make iso` +- `make run` +- `make debug` + +## QEMU Command +- `qemu-system-x86_64 -M q35 -m 1024M -cdrom build/CLeonOS-x86_64.iso -serial stdio` + +## Common Bugs and Debugging +- `mkdir/write/touch` always fails: + - Confirm target path resolves under `/temp`. + - Use `pwd` and absolute paths to verify current directory. +- `rm` fails for directory: + - Stage21 only allows removing empty directories. +- `cat` prints truncated data: + - Current shell output keeps bounded preview buffer by design. +- Unexpected write behavior after repeated overwrite: + - Check heap stats and ensure no panic; Stage21 releases old heap payload before replacing. \ No newline at end of file