diff --git a/Cargo.lock b/Cargo.lock index 269c2698fa..a3b959805f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -567,7 +567,7 @@ dependencies = [ "nb", "num-align", "smccc", - "spin 0.12.0", + "spin", "thiserror 2.0.18", "tock-registers 0.10.1", ] @@ -585,7 +585,7 @@ dependencies = [ "axvisor_api", "log", "numeric-enum-macro", - "spin 0.12.0", + "spin", ] [[package]] @@ -602,7 +602,7 @@ dependencies = [ "axvisor_api", "bitmaps", "log", - "spin 0.12.0", + "spin", "tock-registers 0.10.1", ] @@ -664,9 +664,9 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.5.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-lc-rs" @@ -909,7 +909,7 @@ dependencies = [ "sdmmc-protocol", "simple-ahci", "some-serial", - "spin 0.12.0", + "spin", "virtio-drivers", ] @@ -960,7 +960,7 @@ dependencies = [ "axfatfs", "log", "rsext4", - "spin 0.12.0", + "spin", ] [[package]] @@ -969,7 +969,7 @@ version = "0.3.11" dependencies = [ "ax-fs-vfs", "log", - "spin 0.12.0", + "spin", ] [[package]] @@ -995,7 +995,7 @@ dependencies = [ "rsext4", "scope-local", "slab", - "spin 0.12.0", + "spin", "starry-fatfs", ] @@ -1005,7 +1005,7 @@ version = "0.3.12" dependencies = [ "ax-fs-vfs", "log", - "spin 0.12.0", + "spin", ] [[package]] @@ -1036,16 +1036,16 @@ dependencies = [ "ax-plat-loongarch64-qemu-virt", "ax-plat-riscv64-qemu-virt", "ax-plat-riscv64-sg2002", - "ax-plat-riscv64-visionfive2", "ax-plat-x86-pc", - "ax-plat-x86-qemu-q35", "axplat-dyn", + "axplat-riscv64-visionfive2", + "axplat-x86-qemu-q35", "cfg-if", "fdt-parser", "heapless 0.9.3", "log", "rdrive", - "spin 0.12.0", + "spin", "toml 1.1.2+spec-1.1.0", ] @@ -1231,7 +1231,7 @@ dependencies = [ "cfg-if", "log", "smoltcp 0.13.1", - "spin 0.12.0", + "spin", ] [[package]] @@ -1260,7 +1260,7 @@ dependencies = [ "rdif-vsock", "ringbuf", "smoltcp 0.13.1", - "spin 0.12.0", + "spin", ] [[package]] @@ -1295,7 +1295,7 @@ dependencies = [ "ax-kernel-guard", "ax-percpu-macros", "cfg-if", - "spin 0.12.0", + "spin", "x86", ] @@ -1352,7 +1352,7 @@ dependencies = [ "ax-plat", "log", "some-serial", - "spin 0.12.0", + "spin", ] [[package]] @@ -1462,25 +1462,7 @@ dependencies = [ "sbi-rt 0.0.3", "sg200x-bsp", "some-serial", - "spin 0.12.0", -] - -[[package]] -name = "ax-plat-riscv64-visionfive2" -version = "0.1.4" -dependencies = [ - "ax-config-macros", - "ax-cpu", - "ax-kspin", - "ax-lazyinit", - "ax-plat", - "ax-riscv-plic", - "log", - "rdrive", - "riscv 0.14.0", - "riscv_goldfish", - "sbi-rt 0.0.3", - "uart_16550 0.4.0", + "spin", ] [[package]] @@ -1508,31 +1490,6 @@ dependencies = [ "x86_rtc", ] -[[package]] -name = "ax-plat-x86-qemu-q35" -version = "0.4.8" -dependencies = [ - "ax-config-macros", - "ax-cpu", - "ax-driver", - "ax-int-ratio", - "ax-kspin", - "ax-lazyinit", - "ax-percpu", - "ax-plat", - "axklib", - "bitflags 2.11.1", - "heapless 0.9.3", - "log", - "multiboot", - "raw-cpuid 11.6.0", - "uart_16550 0.4.0", - "x2apic", - "x86", - "x86_64", - "x86_rtc", -] - [[package]] name = "ax-posix-api" version = "0.5.16" @@ -1552,7 +1509,7 @@ dependencies = [ "bindgen 0.72.1", "flatten_objects", "scope-local", - "spin 0.12.0", + "spin", ] [[package]] @@ -1596,7 +1553,7 @@ dependencies = [ "rd-block", "rd-net", "rdrive", - "spin 0.12.0", + "spin", ] [[package]] @@ -1626,7 +1583,7 @@ dependencies = [ "ax-kspin", "ax-lazyinit", "lock_api", - "spin 0.12.0", + "spin", ] [[package]] @@ -1665,7 +1622,7 @@ dependencies = [ "extern-trait", "futures-util", "log", - "spin 0.12.0", + "spin", ] [[package]] @@ -1713,7 +1670,7 @@ dependencies = [ "gimli 0.33.0", "log", "paste", - "spin 0.12.0", + "spin", ] [[package]] @@ -1787,6 +1744,16 @@ dependencies = [ "serde", ] +[[package]] +name = "axerrno" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f961d2868582a092fb1e71b90c16cc6f2cbbe7bb5fa7e4bd6fe61d882ce6bb34" +dependencies = [ + "log", + "strum 0.27.2", +] + [[package]] name = "axfatfs" version = "0.1.0-pre.0" @@ -1863,7 +1830,50 @@ dependencies = [ "log", "rdrive", "somehal", - "spin 0.12.0", + "spin", +] + +[[package]] +name = "axplat-riscv64-visionfive2" +version = "0.1.4" +dependencies = [ + "ax-config-macros", + "ax-cpu", + "ax-kspin", + "ax-lazyinit", + "ax-plat", + "ax-riscv-plic", + "log", + "rdrive", + "riscv 0.14.0", + "riscv_goldfish", + "sbi-rt 0.0.3", + "uart_16550 0.4.0", +] + +[[package]] +name = "axplat-x86-qemu-q35" +version = "0.4.8" +dependencies = [ + "ax-config-macros", + "ax-cpu", + "ax-driver", + "ax-int-ratio", + "ax-kspin", + "ax-lazyinit", + "ax-percpu", + "ax-plat", + "axklib", + "bitflags 2.11.1", + "heapless 0.9.3", + "log", + "multiboot", + "raw-cpuid 11.6.0", + "uart_16550 0.4.0", + "x2apic", + "x86", + "x86_64", + "x86_rtc", ] [[package]] @@ -1874,7 +1884,7 @@ dependencies = [ "bitflags 2.11.1", "futures", "linux-raw-sys 0.12.1", - "spin 0.12.0", + "spin", "tokio", ] @@ -1963,7 +1973,6 @@ dependencies = [ "ax-percpu", "ax-plat-loongarch64-qemu-virt", "ax-plat-riscv64-qemu-virt", - "ax-plat-x86-qemu-q35", "ax-std", "ax-timer-list", "axaddrspace", @@ -1973,6 +1982,7 @@ dependencies = [ "axhvc", "axklib", "axplat-dyn", + "axplat-x86-qemu-q35", "axvcpu", "axvisor_api", "axvm", @@ -1991,7 +2001,7 @@ dependencies = [ "rdrive", "riscv_vcpu", "riscv_vplic", - "spin 0.12.0", + "spin", "syn 2.0.117", "tokio", "toml 0.9.12+spec-1.1.0", @@ -2041,7 +2051,7 @@ dependencies = [ "log", "loongarch_vcpu", "riscv_vcpu", - "spin 0.12.0", + "spin", "x86_vcpu", ] @@ -2202,6 +2212,17 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "bitfield-struct" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ca6739863c590881f038d033a146c51ddae239186a4327014839fd864f44ed5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -2288,7 +2309,7 @@ dependencies = [ "divan", "log", "rand 0.10.1", - "spin 0.12.0", + "spin", ] [[package]] @@ -2303,14 +2324,14 @@ version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b672b945a3e4f4f40bfd4cd5ee07df9e796a42254ce7cd6d2599ad969244c44a" dependencies = [ - "spin 0.10.0", + "spin", ] [[package]] name = "bumpalo" -version = "3.20.3" +version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" [[package]] name = "bwbench-client" @@ -2623,9 +2644,9 @@ dependencies = [ [[package]] name = "compact_str" -version = "0.8.2" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fd622ebbb56a5b2ccb651b32b911cdeb2a9b4b11776b2473bf26a26a286244e" +checksum = "3b79c4069c6cad78e2e0cdfcbd26275770669fb39fd308a752dc110e83b9af32" dependencies = [ "castaway", "cfg-if", @@ -2637,9 +2658,9 @@ dependencies = [ [[package]] name = "compact_str" -version = "0.9.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dfdd1c2274d9aa354115b09dc9a901d6c5576818cdf70d14cae2bdb47df00ab" +checksum = "3fdb1325a1cece981e8a296ab8f0f9b63ae357bd0784a9faaf548cc7b480707a" dependencies = [ "castaway", "cfg-if", @@ -2803,7 +2824,7 @@ dependencies = [ "mbarrier", "nb", "num_enum", - "spin 0.12.0", + "spin", "thiserror 2.0.18", "tock-registers 0.10.1", "trait-ffi", @@ -3017,9 +3038,9 @@ dependencies = [ [[package]] name = "crypto-common" -version = "0.2.2" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" +checksum = "77727bb15fa921304124b128af125e7e3b968275d1b108b379190264f4423710" dependencies = [ "hybrid-array", ] @@ -3101,7 +3122,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "321ec774d27fafc66e812034d0025f8858bd7d9095304ff8fc200e0b9f9cc257" dependencies = [ "ahash 0.8.12", - "compact_str 0.8.2", + "compact_str 0.8.1", "crossbeam-channel", "cursive-macros", "enum-map", @@ -3361,14 +3382,14 @@ checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" dependencies = [ "block-buffer 0.12.0", "const-oid", - "crypto-common 0.2.2", + "crypto-common 0.2.1", ] [[package]] name = "displaydoc" -version = "0.2.6" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", @@ -3468,7 +3489,7 @@ checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" name = "dwmmc-host" version = "0.1.1" dependencies = [ - "bitfield-struct", + "bitfield-struct 0.11.0", "dma-api", "embedded-hal", "log", @@ -3485,9 +3506,9 @@ checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "either" -version = "1.16.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "embedded-graphics" @@ -3609,9 +3630,9 @@ dependencies = [ [[package]] name = "enumset" -version = "1.1.13" +version = "1.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "839c4174b41e75c8f7306110b2c51996a293b8d1d850edd529011841d9fede7d" +checksum = "7f96a4a12fe60ac746ae295a1a4ecb5bb02debc20856506c8635288065f142de" dependencies = [ "enumset_derive", ] @@ -3864,9 +3885,9 @@ checksum = "9844ddc3a6e533d62bba727eb6c28b5d360921d5175e9ff0f1e621a5c590a4d5" [[package]] name = "fitimage" -version = "0.1.4" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92edd7c1c55efd27b5a17dd6d505affafcfe48dfaed7423d4c4ae7361e56a7d8" +checksum = "8cb4d07a1e7a76a7ac4b6b754d45670b1a82c8a0484d80cceeb30c99ad65ce1d" dependencies = [ "anyhow", "byteorder", @@ -4043,9 +4064,9 @@ checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] name = "futures-timer" -version = "3.0.4" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af43fadb8a98512d547e37b4e92e0ced13e205c061b87b4623eff01d918d6968" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" [[package]] name = "futures-util" @@ -4159,6 +4180,17 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" +[[package]] +name = "goblin" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "983a6aafb3b12d4c41ea78d39e189af4298ce747353945ff5105b54a056e5cd9" +dependencies = [ + "log", + "plain", + "scroll", +] + [[package]] name = "h2" version = "0.4.14" @@ -4280,6 +4312,18 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hello-kernel" +version = "0.3.1" +dependencies = [ + "ax-plat", + "ax-plat-aarch64-qemu-virt", + "ax-plat-loongarch64-qemu-virt", + "ax-plat-riscv64-qemu-virt", + "ax-plat-x86-pc", + "cfg-if", +] + [[package]] name = "hermit-abi" version = "0.5.2" @@ -4294,9 +4338,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "http" -version = "1.4.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8be7462df143984c4598a256ef469b251d7d7f9e271135073e78fc535414f3d0" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" dependencies = [ "bytes", "itoa", @@ -4654,6 +4698,18 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "int-enum" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e366a1634cccc76b4cfd3e7580de9b605e4d93f1edac48d786c1f867c0def495" +dependencies = [ + "proc-macro2", + "proc-macro2-diagnostics", + "quote", + "syn 2.0.117", +] + [[package]] name = "intrusive-collections" version = "0.9.7" @@ -4679,6 +4735,20 @@ version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" +[[package]] +name = "irq-kernel" +version = "0.3.1" +dependencies = [ + "ax-config-macros", + "ax-cpu", + "ax-plat", + "ax-plat-aarch64-qemu-virt", + "ax-plat-loongarch64-qemu-virt", + "ax-plat-riscv64-qemu-virt", + "ax-plat-x86-pc", + "cfg-if", +] + [[package]] name = "is-terminal" version = "0.4.17" @@ -4744,9 +4814,9 @@ dependencies = [ [[package]] name = "jiff" -version = "0.2.27" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "392c70591e8749fe235ddaf513e6f58b26bce3dcc16524cecc8936f75afa161e" +checksum = "f00b5dbd620d61dfdcb6007c9c1f6054ebd75319f163d886a9055cec1155073d" dependencies = [ "jiff-static", "log", @@ -4757,9 +4827,9 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.27" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b605b0c050d845fc355bb11eb3f9a8deddc218ea60c76e61aa1f2adfb2c96a" +checksum = "e000de030ff8022ea1da3f466fbb0f3a809f5e51ed31f6dd931c35181ad8e6d7" dependencies = [ "proc-macro2", "quote", @@ -4791,9 +4861,9 @@ dependencies = [ [[package]] name = "jkconfig" -version = "0.2.4" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4cbaedffb63dabcbab61e23e0adc1fc7bc0d7420f2f56124e2bc0002d9274ab" +checksum = "d8746ebf553e6e9d0620a918072432b44aa9563f6f19d17432b613828df708a1" dependencies = [ "anyhow", "cargo_metadata", @@ -4879,9 +4949,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.99" +version = "0.3.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "142bc4740e452c1e57ade0cbc129f139c9093e354346f0872ef985f4f5cf5f11" +checksum = "67df7112613f8bfd9150013a0314e196f4800d3201ae742489d999db2f979f08" dependencies = [ "cfg-if", "futures-util", @@ -4889,6 +4959,17 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "kapi" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93505ad306e00dcd1b283c328110de980a1b1ac00e127c0eba192cf5500159d9" +dependencies = [ + "axerrno", + "kmod-tools", + "paste", +] + [[package]] name = "kasm-aarch64" version = "0.2.1" @@ -4910,6 +4991,12 @@ dependencies = [ "thiserror 2.0.18", ] +[[package]] +name = "kbindings" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "753ac4e7753fa007b8f7828d0e01e9ececa48b689460e6380fb36bbf74654a8d" + [[package]] name = "kernel-elf-parser" version = "0.3.4" @@ -4939,6 +5026,45 @@ dependencies = [ "bitflags 2.11.1", ] +[[package]] +name = "kmacro-tools" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edf3202c44ae67bf2647146a753b2b09e9b48db0fd5db1686f595b6682e7ca72" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "kmod-loader" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "550f9b0e0c6e219e177bc0c6e6a10630deec3befdc3c9951b2ce7fb0b3f3070c" +dependencies = [ + "axerrno", + "bitfield-struct 0.13.0", + "bitflags 2.11.1", + "cfg-if", + "goblin", + "int-enum", + "kapi", + "kmod-tools", + "log", + "paste", +] + +[[package]] +name = "kmod-tools" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80053048fd6814e4fcd5bda5f23a88d2deffb5d70ac7544f8312f706296c503e" +dependencies = [ + "kbindings", + "kmacro-tools", +] + [[package]] name = "kprobe" version = "0.5.5" @@ -4952,12 +5078,6 @@ dependencies = [ "yaxpeax-x86", ] -[[package]] -name = "ksym" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b543b77d8cfa33302b6b51b6a255f9e85b06997b7c4a0a7354fcc8304036eb09" - [[package]] name = "ktest-helper" version = "0.1.1" @@ -5135,9 +5255,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.30" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616ec5685824bcc94416c6d4a7a446eea774a31efd7062c8480ba6fd06d7a6e5" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] name = "loongArch64" @@ -5274,9 +5394,9 @@ checksum = "ae960838283323069879657ca3de837e9f7bbb4c7bf6ea7f1b290d5e9476d2e0" [[package]] name = "memchr" -version = "2.8.1" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] name = "memmap2" @@ -5487,9 +5607,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.2.2" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" +checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" [[package]] name = "num-derive" @@ -5609,7 +5729,7 @@ dependencies = [ "mmio-api", "pcie", "rd-block", - "spin 0.12.0", + "spin", "tock-registers 0.10.1", ] @@ -5681,9 +5801,9 @@ dependencies = [ [[package]] name = "ostool" -version = "0.21.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4d0470fd8561e21f458d865490c928ebff45c0e1037a45f634a527acb8f15ff" +checksum = "f785cb91e2622849c3f0e55d5363989934d365967c06f0a8ce8fd944f3b834ba" dependencies = [ "anyhow", "async-trait", @@ -5697,7 +5817,7 @@ dependencies = [ "fitimage", "futures", "indicatif", - "jkconfig 0.2.4", + "jkconfig 0.2.3", "log", "lzma-rs", "network-interface", @@ -5917,7 +6037,7 @@ dependencies = [ name = "phytium-mci-host" version = "0.1.1" dependencies = [ - "bitfield-struct", + "bitfield-struct 0.11.0", "dma-api", "log", "mmio-api", @@ -5943,6 +6063,12 @@ version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + [[package]] name = "plotters" version = "0.3.7" @@ -6270,7 +6396,7 @@ dependencies = [ "dma-api", "rd-block", "rdif-block", - "spin 0.12.0", + "spin", ] [[package]] @@ -6382,7 +6508,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ef8dea09a92caaf73bff7adb70b76162e5937524058a7e5bff37869cbbec293" dependencies = [ "bitflags 2.11.1", - "compact_str 0.9.1", + "compact_str 0.9.0", "hashbrown 0.16.1", "indoc", "itertools 0.14.0", @@ -6600,7 +6726,7 @@ dependencies = [ "futures", "heapless 0.9.3", "rdif-base", - "spin 0.12.0", + "spin", "thiserror 2.0.18", ] @@ -6641,7 +6767,7 @@ dependencies = [ "rdif-intc", "rdif-pcie", "rdrive-macros", - "spin 0.12.0", + "spin", "thiserror 2.0.18", ] @@ -6662,7 +6788,7 @@ dependencies = [ "log", "mmio-api", "rdif-eth", - "spin 0.12.0", + "spin", "thiserror 2.0.18", "tock-registers 0.10.1", ] @@ -6742,9 +6868,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.13.4" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" +checksum = "62e0021ea2c22aed41653bc7e1419abb2c97e038ff2c33d0e1309e49a97deec0" dependencies = [ "base64 0.22.1", "bytes", @@ -7001,7 +7127,7 @@ dependencies = [ "mbarrier", "num-align", "rdif-base", - "spin 0.12.0", + "spin", "thiserror 2.0.18", "tock-registers 0.10.1", ] @@ -7028,7 +7154,7 @@ dependencies = [ "log", "mbarrier", "num-align", - "spin 0.12.0", + "spin", "thiserror 2.0.18", "tock-registers 0.10.1", ] @@ -7039,7 +7165,7 @@ version = "0.4.1" dependencies = [ "bitflags 2.11.1", "log", - "spin 0.12.0", + "spin", ] [[package]] @@ -7327,7 +7453,7 @@ version = "0.3.7" dependencies = [ "ax-percpu", "ctor 0.6.3", - "spin 0.12.0", + "spin", ] [[package]] @@ -7336,6 +7462,26 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "scroll" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1257cd4248b4132760d6524d6dda4e053bc648c9070b960929bf50cfb1e7add" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed76efe62313ab6610570951494bdaa81568026e0318eaa55f167de70eeea67d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "sdhci-host" version = "0.1.1" @@ -7438,9 +7584,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.150" +version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" dependencies = [ "itoa", "memchr", @@ -7651,7 +7797,7 @@ version = "0.1.1-preview.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e202ff0a10a30a13384768edcda5b00eeeafd7dda1784234662f43dba170e9b2" dependencies = [ - "bitfield-struct", + "bitfield-struct 0.11.0", "log", "thiserror 2.0.18", "volatile 0.6.1", @@ -7714,6 +7860,23 @@ dependencies = [ "managed", ] +[[package]] +name = "smp-kernel" +version = "0.3.1" +dependencies = [ + "ax-config-macros", + "ax-cpu", + "ax-memory-addr", + "ax-percpu", + "ax-plat", + "ax-plat-aarch64-qemu-virt", + "ax-plat-loongarch64-qemu-virt", + "ax-plat-riscv64-qemu-virt", + "ax-plat-x86-pc", + "cfg-if", + "const-str", +] + [[package]] name = "socket2" version = "0.6.3" @@ -7777,7 +7940,7 @@ dependencies = [ "smccc", "some-serial", "somehal-macros", - "spin 0.12.0", + "spin", "syn 2.0.117", "thiserror 2.0.18", "tock-registers 0.10.1", @@ -7801,7 +7964,7 @@ dependencies = [ "rdrive", "someboot", "somehal-macros", - "spin 0.12.0", + "spin", "thiserror 2.0.18", "tock-registers 0.10.1", ] @@ -7821,12 +7984,6 @@ name = "spin" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591" - -[[package]] -name = "spin" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1527984ca054dfca79333baec451042863f485fbee01b7bf6d911de915cac865" dependencies = [ "lock_api", ] @@ -7923,8 +8080,8 @@ dependencies = [ "indoc", "inherit-methods-macro", "kernel-elf-parser", + "kmod-loader", "kprobe", - "ksym", "ktracepoint", "linux-raw-sys 0.12.1", "lock_api", @@ -7939,7 +8096,7 @@ dependencies = [ "sg200x-bsp", "slab", "some-serial", - "spin 0.12.0", + "spin", "starry-process", "starry-signal", "starry-vm", @@ -8174,9 +8331,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tar" -version = "0.4.46" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f6221d9a6003c78398e3b239969f352578258df48c8eb051caadae0015bc840" +checksum = "22692a6476a21fa75fdfc11d452fda482af402c008cdbaf3476414e122040973" dependencies = [ "filetime", "libc", @@ -8934,9 +9091,9 @@ dependencies = [ [[package]] name = "uboot-shell" -version = "0.2.4" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2237321472e37a34980340e0a6f8ba406167fb010209ead2f0e594bdfb718e02" +checksum = "c3b3d5d2959cc2e9a28cb2c4ad30f99a33f6831f4f159b08c696604b9494b672" dependencies = [ "colored", "futures", @@ -9134,7 +9291,7 @@ dependencies = [ "futures", "log", "num_enum", - "spin 0.12.0", + "spin", "thiserror 2.0.18", ] @@ -9347,9 +9504,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.122" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed04576f974d2b2fba0f38c51dbc5518011e38c36bf1143164be765528fd409" +checksum = "49ace1d07c165b0864824eee619580c4689389afa9dc9ed3a4c75040d82e6790" dependencies = [ "cfg-if", "once_cell", @@ -9360,9 +9517,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.72" +version = "0.4.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9473dbd2991ae90b6291c3c32c30c6187ac49aa32f9905d1cce280ec1e110b0f" +checksum = "96492d0d3ffba25305a7dc88720d250b1401d7edca02cc3bcd50633b424673b8" dependencies = [ "js-sys", "wasm-bindgen", @@ -9370,9 +9527,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.122" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "916151b09da36bd82f6615cbf3a419e2f0ba23a03c6160e8e92eb6bd4aa1dec6" +checksum = "8e68e6f4afd367a562002c05637acb8578ff2dea1943df76afb9e83d177c8578" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -9380,9 +9537,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.122" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "299047362ccbfce148b67ab7e73349f77748e00c8296f9542adfad2ad82c5c5e" +checksum = "d95a9ec35c64b2a7cb35d3fead40c4238d0940c86d107136999567a4703259f2" dependencies = [ "bumpalo", "proc-macro2", @@ -9393,9 +9550,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.122" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a929b2c61f11ba3e9bc35b50c1f25cb38e0e892c0c231ae2b8cf78d5dad4437" +checksum = "c4e0100b01e9f0d03189a92b96772a1fb998639d981193d7dbab487302513441" dependencies = [ "unicode-ident", ] @@ -9455,9 +9612,9 @@ checksum = "dba9c05687e501b2710833fbe2cc7ff8cc24411fb0d81967498ca44598942f88" [[package]] name = "web-sys" -version = "0.3.99" +version = "0.3.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621441cfc37b84979402712047321980c178f299193a3589d05b99e8763436" +checksum = "4b572dff8bcf38bad0fa19729c89bb5748b2b9b1d8be70cf90df697e3a8f32aa" dependencies = [ "js-sys", "wasm-bindgen", @@ -10166,9 +10323,9 @@ dependencies = [ [[package]] name = "yaxpeax-x86" -version = "2.1.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a159e15f66ce40b5dfc28213366f8ff42ff8f0508e2e72e431c62573f025ac5e" +checksum = "9a9a30b7dd533c7b1a73eaf7c4ea162a7a632a2bb29b9fff47d8f2cc8513a883" dependencies = [ "cfg-if", "num-traits", diff --git a/components/axplat_crates/examples/hello-kernel/linker_x86_64.lds b/components/axplat_crates/examples/hello-kernel/linker_x86_64.lds new file mode 100644 index 0000000000..113e7914c0 --- /dev/null +++ b/components/axplat_crates/examples/hello-kernel/linker_x86_64.lds @@ -0,0 +1,52 @@ +ENTRY(_start) +SECTIONS +{ + . = 0xffff800000200000; + _skernel = .; + + .text : ALIGN(4K) { + _stext = .; + *(.text.boot) + *(.text .text.*) + _etext = .; + } + + .rodata : ALIGN(4K) { + _srodata = .; + *(.rodata .rodata.*) + _erodata = .; + } + + .data : ALIGN(4K) { + _sdata = .; + *(.data .data.*) + *(.got .got.*) + } + + . = ALIGN(4K); + _percpu_start = .; + _percpu_end = _percpu_start + SIZEOF(.percpu); + .percpu 0x0 : AT(_percpu_start) { + _percpu_load_start = .; + *(.percpu .percpu.*) + _percpu_load_end = .; + . = _percpu_load_start + ALIGN(64) * 1; + } + . = _percpu_end; + _edata = .; + + .bss : AT(.) ALIGN(4K) { + *(.bss.stack) + . = ALIGN(4K); + _sbss = .; + *(.bss .bss.*) + *(COMMON) + _ebss = .; + } + + _ekernel = .; + + /DISCARD/ : { + *(.comment) + } +} diff --git a/components/axplat_crates/examples/irq-kernel/linker_x86_64.lds b/components/axplat_crates/examples/irq-kernel/linker_x86_64.lds new file mode 100644 index 0000000000..113e7914c0 --- /dev/null +++ b/components/axplat_crates/examples/irq-kernel/linker_x86_64.lds @@ -0,0 +1,52 @@ +ENTRY(_start) +SECTIONS +{ + . = 0xffff800000200000; + _skernel = .; + + .text : ALIGN(4K) { + _stext = .; + *(.text.boot) + *(.text .text.*) + _etext = .; + } + + .rodata : ALIGN(4K) { + _srodata = .; + *(.rodata .rodata.*) + _erodata = .; + } + + .data : ALIGN(4K) { + _sdata = .; + *(.data .data.*) + *(.got .got.*) + } + + . = ALIGN(4K); + _percpu_start = .; + _percpu_end = _percpu_start + SIZEOF(.percpu); + .percpu 0x0 : AT(_percpu_start) { + _percpu_load_start = .; + *(.percpu .percpu.*) + _percpu_load_end = .; + . = _percpu_load_start + ALIGN(64) * 1; + } + . = _percpu_end; + _edata = .; + + .bss : AT(.) ALIGN(4K) { + *(.bss.stack) + . = ALIGN(4K); + _sbss = .; + *(.bss .bss.*) + *(COMMON) + _ebss = .; + } + + _ekernel = .; + + /DISCARD/ : { + *(.comment) + } +} diff --git a/components/axplat_crates/examples/smp-kernel/linker_x86_64.lds b/components/axplat_crates/examples/smp-kernel/linker_x86_64.lds new file mode 100644 index 0000000000..113e7914c0 --- /dev/null +++ b/components/axplat_crates/examples/smp-kernel/linker_x86_64.lds @@ -0,0 +1,52 @@ +ENTRY(_start) +SECTIONS +{ + . = 0xffff800000200000; + _skernel = .; + + .text : ALIGN(4K) { + _stext = .; + *(.text.boot) + *(.text .text.*) + _etext = .; + } + + .rodata : ALIGN(4K) { + _srodata = .; + *(.rodata .rodata.*) + _erodata = .; + } + + .data : ALIGN(4K) { + _sdata = .; + *(.data .data.*) + *(.got .got.*) + } + + . = ALIGN(4K); + _percpu_start = .; + _percpu_end = _percpu_start + SIZEOF(.percpu); + .percpu 0x0 : AT(_percpu_start) { + _percpu_load_start = .; + *(.percpu .percpu.*) + _percpu_load_end = .; + . = _percpu_load_start + ALIGN(64) * 1; + } + . = _percpu_end; + _edata = .; + + .bss : AT(.) ALIGN(4K) { + *(.bss.stack) + . = ALIGN(4K); + _sbss = .; + *(.bss .bss.*) + *(COMMON) + _ebss = .; + } + + _ekernel = .; + + /DISCARD/ : { + *(.comment) + } +} diff --git a/os/StarryOS/kernel/Cargo.toml b/os/StarryOS/kernel/Cargo.toml index b3e594d8de..8946edcbf6 100644 --- a/os/StarryOS/kernel/Cargo.toml +++ b/os/StarryOS/kernel/Cargo.toml @@ -133,6 +133,7 @@ ax-ipi = { workspace = true } static-keys = "0.8" ddebug = "0.5" kprobe = "0.5" +kmod-loader = "0.2" some-serial = { workspace = true, optional = true } sg200x-bsp = { workspace = true, optional = true } # 0.9 to match sg200x-bsp's internal tock-registers; cannot use workspace (0.10) diff --git a/os/StarryOS/kernel/src/ebpf.rs b/os/StarryOS/kernel/src/ebpf.rs index 99b3a1e0d9..b47243b3a4 100644 --- a/os/StarryOS/kernel/src/ebpf.rs +++ b/os/StarryOS/kernel/src/ebpf.rs @@ -1131,7 +1131,7 @@ impl BpfVm { let class = insn.class(); if class == bpf_insn::BPF_JMP || class == bpf_insn::BPF_JMP32 { let op = insn.code & 0xf0; - if op != bpf_insn::BPF_EXIT && op != bpf_insn::BPF_CALL_OP { + if op != bpf_insn::BPF_EXIT && op != 0x80 { let target = pc as isize + 1 + insn.off as isize; if target < 0 || target as usize >= insns.len() { warn!("bpf verifier: jump out of bounds at pc={pc} target={target}"); diff --git a/os/StarryOS/kernel/src/kmod_loader.rs b/os/StarryOS/kernel/src/kmod_loader.rs new file mode 100644 index 0000000000..9f9720bcf6 --- /dev/null +++ b/os/StarryOS/kernel/src/kmod_loader.rs @@ -0,0 +1,229 @@ +//! Loadable Kernel Module (LKM) support for StarryOS. +//! +//! Integrates the [`kmod_loader`] crate to provide `init_module` / +//! `delete_module` / `finit_module` system calls for loading .ko ELF +//! kernel modules at runtime. +//! +//! # Key Components +//! +//! - **KmodSectionMem**: Page-aligned memory with R/W/X permission control +//! via page table manipulation. Includes null-safe Drop. +//! - **NullSectionMem**: No-op fallback when vmalloc fails. +//! - **StarryKmodHelper**: Implements `KernelModuleHelper` trait with +//! vmalloc, resolve_symbol (stub), and cache flushing. +//! +//! # Known Limitations +//! +//! - `resolve_symbol` is a stub returning `None`; full implementation +//! requires PR #837 (kallsyms) to be merged. +//! - `delete_module` and `finit_module` are syscall stubs. +//! - Loaded modules are kept alive via `mem::forget`; future `delete_module` +//! will need a global registry to recover and free resources. + +use alloc::{ + alloc::{Layout, alloc, dealloc}, + boxed::Box, +}; + +use ax_memory_addr::{PAGE_SIZE_4K, VirtAddr}; +use kmod_loader::{KernelModuleHelper, SectionMemOps, SectionPerm}; + +static RESOLVE_SYMBOL_WARNED: core::sync::atomic::AtomicBool = + core::sync::atomic::AtomicBool::new(false); + +struct KmodSectionMem { + ptr: *mut u8, + size: usize, + layout: Layout, +} + +impl KmodSectionMem { + fn new(size: usize) -> Option { + let aligned_size = (size + PAGE_SIZE_4K - 1) & !(PAGE_SIZE_4K - 1); + let layout = Layout::from_size_align(aligned_size, PAGE_SIZE_4K).ok()?; + let ptr = unsafe { alloc(layout) }; + if ptr.is_null() { + return None; + } + unsafe { core::ptr::write_bytes(ptr, 0, aligned_size) }; + Some(Self { + ptr, + size: aligned_size, + layout, + }) + } +} + +impl SectionMemOps for KmodSectionMem { + fn as_ptr(&self) -> *const u8 { + self.ptr + } + + fn as_mut_ptr(&mut self) -> *mut u8 { + self.ptr + } + + fn change_perms(&mut self, perms: SectionPerm) -> bool { + let vaddr = VirtAddr::from(self.ptr as usize); + let mut aspace = ax_mm::kernel_aspace().lock(); + let (_, original_flags, _) = match aspace.page_table().query(vaddr) { + Ok(r) => r, + Err(_) => return false, + }; + let mut new_flags = ax_runtime::hal::paging::MappingFlags::empty(); + if perms.contains(SectionPerm::READ) { + new_flags |= ax_runtime::hal::paging::MappingFlags::READ; + } + if perms.contains(SectionPerm::WRITE) { + new_flags |= ax_runtime::hal::paging::MappingFlags::WRITE; + } + if perms.contains(SectionPerm::EXECUTE) { + new_flags |= ax_runtime::hal::paging::MappingFlags::EXECUTE; + } + if aspace.protect(vaddr, self.size, new_flags).is_err() { + return false; + } + for offset in (0..self.size).step_by(PAGE_SIZE_4K) { + ax_runtime::hal::cpu::asm::flush_tlb(Some(vaddr + offset)); + } + if perms.contains(SectionPerm::EXECUTE) { + ax_runtime::hal::cpu::asm::flush_icache_all(); + } + drop(aspace); + let _ = original_flags; + true + } +} + +unsafe impl Send for KmodSectionMem {} +unsafe impl Sync for KmodSectionMem {} + +impl Drop for KmodSectionMem { + fn drop(&mut self) { + if !self.ptr.is_null() { + unsafe { dealloc(self.ptr, self.layout) }; + } + } +} + +struct NullSectionMem; + +impl SectionMemOps for NullSectionMem { + fn as_ptr(&self) -> *const u8 { + core::ptr::null() + } + + fn as_mut_ptr(&mut self) -> *mut u8 { + core::ptr::null_mut() + } + + fn change_perms(&mut self, _perms: SectionPerm) -> bool { + false + } +} + +pub struct StarryKmodHelper; + +impl KernelModuleHelper for StarryKmodHelper { + fn vmalloc(size: usize) -> Box { + match KmodSectionMem::new(size) { + Some(mem) => Box::new(mem), + None => { + warn!("kmod: vmalloc failed for size {size}"); + Box::new(NullSectionMem) + } + } + } + + fn resolve_symbol(_name: &str) -> Option { + if RESOLVE_SYMBOL_WARNED + .compare_exchange( + false, + true, + core::sync::atomic::Ordering::Relaxed, + core::sync::atomic::Ordering::Relaxed, + ) + .is_ok() + { + warn!("kmod: resolve_symbol not yet available (depends on PR #837 kallsyms)"); + } + None + } + + fn flsuh_cache(addr: usize, size: usize) { + #[cfg(target_arch = "aarch64")] + ax_runtime::hal::cpu::asm::clean_dcache_range_to_pou(VirtAddr::from(addr), size); + let _ = (addr, size); + ax_runtime::hal::cpu::asm::flush_icache_all(); + } +} + +#[allow(dead_code)] +pub fn load_module_from_memory( + elf_data: &[u8], + args: &str, +) -> ax_errno::AxResult> { + let loader = kmod_loader::ModuleLoader::::new(elf_data).map_err(|e| { + warn!("kmod: failed to create loader: {e:?}"); + ax_errno::AxError::Io + })?; + let c_args = alloc::ffi::CString::new(args).map_err(|_| ax_errno::AxError::InvalidInput)?; + loader.load_module(c_args).map_err(|e| { + warn!("kmod: failed to load module: {e:?}"); + ax_errno::AxError::Io + }) +} + +pub fn sys_init_module( + elf_ptr: usize, + elf_len: usize, + args_ptr: usize, +) -> ax_errno::AxResult { + if elf_ptr == 0 || elf_len == 0 { + return Err(ax_errno::AxError::InvalidInput); + } + let elf_data = unsafe { core::slice::from_raw_parts(elf_ptr as *const u8, elf_len) }; + let args = if args_ptr != 0 { + unsafe { + let p = args_ptr as *const i8; + let len = (0..).take_while(|&i| *p.add(i) != 0).count(); + core::str::from_utf8(core::slice::from_raw_parts(p as *const u8, len)).unwrap_or("") + } + } else { + "" + }; + let mut owner = load_module_from_memory(elf_data, args)?; + owner.call_init().map_err(|e| { + warn!("kmod: module init failed: {e:?}"); + ax_errno::AxError::Io + })?; + info!("kmod: module loaded and initialized successfully"); + // Intentionally leak the module owner: the loaded module must remain in + // memory for the kernel's lifetime. When `delete_module` is implemented + // the owner can be recovered (e.g. via a global registry) and dropped. + core::mem::forget(owner); + Ok(0) +} + +pub fn sys_delete_module(_name_ptr: usize, _flags: usize) -> ax_errno::AxResult { + warn!("kmod: delete_module not yet fully implemented"); + Err(ax_errno::AxError::Unsupported) +} + +pub fn sys_finit_module(fd: i32, args_ptr: usize, _flags: usize) -> ax_errno::AxResult { + if fd < 0 { + return Err(ax_errno::AxError::BadFileDescriptor); + } + let args = if args_ptr != 0 { + unsafe { + let p = args_ptr as *const i8; + let len = (0..).take_while(|&i| *p.add(i) != 0).count(); + core::str::from_utf8(core::slice::from_raw_parts(p as *const u8, len)).unwrap_or("") + } + } else { + "" + }; + let _ = (fd, args); + warn!("kmod: finit_module not yet fully implemented (need file fd to content)"); + Err(ax_errno::AxError::Unsupported) +} diff --git a/os/StarryOS/kernel/src/lib.rs b/os/StarryOS/kernel/src/lib.rs index 2024974966..7010d5b688 100644 --- a/os/StarryOS/kernel/src/lib.rs +++ b/os/StarryOS/kernel/src/lib.rs @@ -21,6 +21,7 @@ mod config; #[cfg(feature = "ebpf")] mod ebpf; mod file; +mod kmod_loader; mod kprobe; mod mm; #[cfg(feature = "ebpf")] diff --git a/os/StarryOS/kernel/src/perf_event.rs b/os/StarryOS/kernel/src/perf_event.rs index 9d0e7a5e36..63d0de6b2d 100644 --- a/os/StarryOS/kernel/src/perf_event.rs +++ b/os/StarryOS/kernel/src/perf_event.rs @@ -282,6 +282,7 @@ impl PerfEvent { if !self.enabled { return; } + #[cfg(feature = "ebpf")] if let Some(prog_fd) = self.prog_fd && let Err(e) = crate::ebpf::run_bpf_prog(prog_fd, ctx) { diff --git a/os/StarryOS/kernel/src/syscall/mod.rs b/os/StarryOS/kernel/src/syscall/mod.rs index e0de308173..e46ec8c3e0 100644 --- a/os/StarryOS/kernel/src/syscall/mod.rs +++ b/os/StarryOS/kernel/src/syscall/mod.rs @@ -786,6 +786,13 @@ pub fn handle_syscall(uctx: &mut UserContext) { ), #[cfg(not(feature = "ebpf"))] Sysno::bpf | Sysno::perf_event_open => sys_dummy_fd(sysno), + Sysno::init_module => { + crate::kmod_loader::sys_init_module(uctx.arg0(), uctx.arg1(), uctx.arg2()) + } + Sysno::delete_module => crate::kmod_loader::sys_delete_module(uctx.arg0(), uctx.arg1()), + Sysno::finit_module => { + crate::kmod_loader::sys_finit_module(uctx.arg0() as _, uctx.arg1(), uctx.arg2()) + } Sysno::fanotify_init => Err(AxError::Unsupported), diff --git a/test-suit/starryos/normal/qemu-smp1/syscall/test-kmod-loader/c/CMakeLists.txt b/test-suit/starryos/normal/qemu-smp1/syscall/test-kmod-loader/c/CMakeLists.txt new file mode 100644 index 0000000000..d1fafcd92c --- /dev/null +++ b/test-suit/starryos/normal/qemu-smp1/syscall/test-kmod-loader/c/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.20) +project(test-kmod-loader C) +set(CMAKE_C_STANDARD 11) +set(CMAKE_C_STANDARD_REQUIRED ON) +set(CMAKE_C_EXTENSIONS OFF) +add_executable(test-kmod-loader src/main.c) +target_compile_options(test-kmod-loader PRIVATE -Wall -Wextra -Werror) +install(TARGETS test-kmod-loader RUNTIME DESTINATION usr/bin/starry-test-suit) diff --git a/test-suit/starryos/normal/qemu-smp1/syscall/test-kmod-loader/c/src/main.c b/test-suit/starryos/normal/qemu-smp1/syscall/test-kmod-loader/c/src/main.c new file mode 100644 index 0000000000..74c3d38a84 --- /dev/null +++ b/test-suit/starryos/normal/qemu-smp1/syscall/test-kmod-loader/c/src/main.c @@ -0,0 +1,106 @@ +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + +#include +#include +#include +#include +#include +#include +#include + +static int __pass = 0; +static int __fail = 0; + +#define CHECK(cond, msg) do { \ + if (cond) { \ + printf(" PASS | %s:%d | %s\n", __FILE__, __LINE__, msg); \ + __pass++; \ + } else { \ + printf(" FAIL | %s:%d | %s | errno=%d (%s)\n", \ + __FILE__, __LINE__, msg, errno, strerror(errno)); \ + __fail++; \ + } \ +} while(0) + +#define MODULE_START(name) printf("\n--- MODULE: %s ---\n", name) +#define SUMMARY() \ + printf("\n=== SUMMARY: %d passed, %d failed ===\n", __pass, __fail); \ + return __fail > 0 ? 1 : 0 + +static long raw_init_module(void *data, unsigned long len, const char *args) { +#ifdef SYS_init_module + return syscall(SYS_init_module, data, len, args); +#else + errno = ENOSYS; return -1; +#endif +} + +static long raw_finit_module(int fd, const char *args, unsigned int flags) { +#ifdef SYS_finit_module + return syscall(SYS_finit_module, fd, args, flags); +#else + errno = ENOSYS; return -1; +#endif +} + +static long raw_delete_module(const char *name, unsigned int flags) { +#ifdef SYS_delete_module + return syscall(SYS_delete_module, name, flags); +#else + errno = ENOSYS; return -1; +#endif +} + +int main(void) { + printf("=== kmod Loader Test Suite ===\n"); + + MODULE_START("init_module_null"); + CHECK(raw_init_module(NULL, 0, "") < 0, "init_module(NULL,0) returns error"); + + MODULE_START("init_module_invalid_elf"); + uint8_t bad[64]; memset(bad, 0xFF, sizeof(bad)); + CHECK(raw_init_module(bad, sizeof(bad), "") < 0, "init_module(non-ELF) returns error"); + + MODULE_START("init_module_truncated_elf"); + uint8_t hdr[16] = {0x7f,'E','L','F', 2,1,1, 0,0,0,0,0,0,0,0,0}; + CHECK(raw_init_module(hdr, sizeof(hdr), "") < 0, "init_module(truncated) returns error"); + + MODULE_START("finit_module_bad_fd"); + CHECK(raw_finit_module(-1, "", 0) < 0, "finit_module(-1) returns error"); + + MODULE_START("delete_module_nonexistent"); + CHECK(raw_delete_module("no_such_module", 0) < 0, "delete_module(nonexistent) returns error"); + + MODULE_START("init_module_zero_len"); + uint8_t dummy = 0; + CHECK(raw_init_module(&dummy, 0, "") < 0, "init_module(,0,) returns error"); + + MODULE_START("init_module_with_args"); + uint8_t buf[64]; memset(buf, 0, sizeof(buf)); + CHECK(raw_init_module(buf, sizeof(buf), "key=val") < 0, + "init_module(invalid ELF with args) returns error, no crash"); + + MODULE_START("init_module_valid_et_rel_header"); + uint8_t et_rel[64] = { + 0x7f,'E','L','F', 2,1,1,0, 0,0,0,0,0,0,0,0, + 1,0, 0x3e,0, 1,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0, 64,0, 0,0, 0,0, 64,0, 0,0, 0,0 + }; + CHECK(raw_init_module(et_rel, sizeof(et_rel), "") < 0, + "init_module(valid ET_REL header, no sections) returns error"); + + MODULE_START("finit_module_fd_zero"); + CHECK(raw_finit_module(0, "", 0) < 0, + "finit_module(fd=0 stdin) returns error"); + + MODULE_START("init_module_large_junk"); + uint8_t big[256]; memset(big, 0xAA, sizeof(big)); + CHECK(raw_init_module(big, sizeof(big), "") < 0, + "init_module(256-byte junk) returns error, no crash"); + + SUMMARY(); +}