From febcd86dac85b958ac02cbbde311c76912242ce6 Mon Sep 17 00:00:00 2001 From: lhw2002426 <1466397747@qq.com> Date: Sun, 3 Dec 2023 19:42:11 +0800 Subject: [PATCH] add nginx app --- .clang-format | 0 .../workflows/actions/setup-musl/action.yml | 0 .../workflows/actions/setup-qemu/action.yml | 0 .github/workflows/build.yml | 0 .github/workflows/docs.yml | 0 .github/workflows/test.yml | 0 .gitignore | 0 Cargo.lock | 9 + Cargo.toml | 1 + LICENSE.MulanPSL2 | 0 Makefile | 2 +- README.md | 0 api/arceos_api/Cargo.toml | 0 api/arceos_api/src/imp/display.rs | 0 api/arceos_api/src/imp/fs.rs | 0 api/arceos_api/src/imp/mem.rs | 0 api/arceos_api/src/imp/mod.rs | 0 api/arceos_api/src/imp/net.rs | 0 api/arceos_api/src/imp/task.rs | 0 api/arceos_api/src/lib.rs | 0 api/arceos_api/src/macros.rs | 0 api/arceos_posix_api/.gitignore | 0 api/arceos_posix_api/Cargo.toml | 0 api/arceos_posix_api/build.rs | 1 + api/arceos_posix_api/ctypes.h | 1 + api/arceos_posix_api/src/imp/fd_ops.rs | 7 + api/arceos_posix_api/src/imp/fs.rs | 53 +- api/arceos_posix_api/src/imp/io.rs | 0 api/arceos_posix_api/src/imp/io_mpx/epoll.rs | 46 +- api/arceos_posix_api/src/imp/io_mpx/mod.rs | 0 api/arceos_posix_api/src/imp/io_mpx/poll.rs | 0 api/arceos_posix_api/src/imp/io_mpx/select.rs | 0 api/arceos_posix_api/src/imp/ioctl.rs | 13 +- api/arceos_posix_api/src/imp/mod.rs | 0 api/arceos_posix_api/src/imp/net.rs | 5 + api/arceos_posix_api/src/imp/pipe.rs | 4 + .../src/imp/pthread/condvar.rs | 0 api/arceos_posix_api/src/imp/pthread/mod.rs | 0 api/arceos_posix_api/src/imp/pthread/mutex.rs | 0 api/arceos_posix_api/src/imp/pthread/tsd.rs | 0 api/arceos_posix_api/src/imp/resources.rs | 0 api/arceos_posix_api/src/imp/signal.rs | 0 api/arceos_posix_api/src/imp/stdio.rs | 8 + api/arceos_posix_api/src/imp/sys.rs | 0 api/arceos_posix_api/src/imp/task.rs | 0 api/arceos_posix_api/src/imp/time.rs | 0 api/arceos_posix_api/src/lib.rs | 1 + api/arceos_posix_api/src/utils.rs | 0 api/axfeat/Cargo.toml | 0 api/axfeat/src/lib.rs | 0 apps/.gitignore | 0 apps/c/envtest/expect_info.out | 0 apps/c/envtest/features.txt | 0 apps/c/envtest/main.c | 0 apps/c/envtest/test_cmd | 0 apps/c/filetest/expect_info.out | 0 apps/c/filetest/features.txt | 0 apps/c/filetest/main.c | 0 apps/c/filetest/test_cmd | 0 apps/c/helloworld/expect_info.out | 0 apps/c/helloworld/expect_info_smp4.out | 0 apps/c/helloworld/main.c | 0 apps/c/helloworld/test_cmd | 0 apps/c/httpclient/axbuild.mk | 0 apps/c/httpclient/expect_info.out | 0 apps/c/httpclient/features.txt | 0 apps/c/httpclient/httpclient.c | 0 apps/c/httpclient/test_cmd | 0 apps/c/httpserver/axbuild.mk | 0 apps/c/httpserver/features.txt | 0 apps/c/httpserver/httpserver.c | 0 apps/c/iperf/.gitignore | 0 apps/c/iperf/README.md | 0 apps/c/iperf/axbuild.mk | 0 apps/c/iperf/features.txt | 0 apps/c/iperf/iperf.patch | 0 apps/c/memtest/axbuild.mk | 0 apps/c/memtest/expect_trace.out | 0 apps/c/memtest/features.txt | 0 apps/c/memtest/memtest.c | 0 apps/c/memtest/test_cmd | 0 apps/c/nginx/.gitignore | 2 + apps/c/nginx/axbuild.mk | 33 + apps/c/nginx/create_nginx_img.sh | 39 ++ apps/c/nginx/features.txt | 13 + apps/c/nginx/html/README.md | 1 + apps/c/nginx/html/_404.md | 1 + apps/c/nginx/html/_coverpage.md | 16 + apps/c/nginx/html/_media/bg-bluesea.jpg | Bin 0 -> 122531 bytes apps/c/nginx/html/_media/car-ee.svg | 1 + apps/c/nginx/html/_media/communities.svg | 4 + apps/c/nginx/html/_media/custom.css | 49 ++ apps/c/nginx/html/_media/favicon.ico | Bin 0 -> 15406 bytes apps/c/nginx/html/_media/logo.png | Bin 0 -> 15865 bytes apps/c/nginx/html/_media/logo.svg | 1 + apps/c/nginx/html/_media/os20years.svg | 1 + apps/c/nginx/html/_media/overview.svg | 4 + .../html/_media/qrcode_4_ubiquitousos.jpg | Bin 0 -> 27901 bytes apps/c/nginx/html/_media/syswonder.svg | 4 + apps/c/nginx/html/_navbar.md | 12 + apps/c/nginx/html/_sidebar.md | 8 + apps/c/nginx/html/community.md | 135 ++++ apps/c/nginx/html/contact.md | 25 + apps/c/nginx/html/contrib.md | 95 +++ apps/c/nginx/html/courses.md | 44 ++ apps/c/nginx/html/en/_coverpage.md | 15 + apps/c/nginx/html/en/_navbar.md | 6 + apps/c/nginx/html/en/_sidebar.md | 5 + apps/c/nginx/html/en/community.md | 17 + apps/c/nginx/html/en/contact.md | 21 + apps/c/nginx/html/en/courses.md | 5 + apps/c/nginx/html/en/intro.md | 3 + apps/c/nginx/html/en/projects.md | 27 + apps/c/nginx/html/index.html | 92 +++ apps/c/nginx/html/intro.md | 185 ++++++ apps/c/nginx/html/news/README.md | 0 apps/c/nginx/html/news/news.md | 254 ++++++++ apps/c/nginx/html/projects.md | 17 + apps/c/nginx/html/uos.md | 41 ++ apps/c/nginx/mime.types | 98 +++ apps/c/nginx/nginx.conf | 125 ++++ .../c/pthread/basic/expect_info_smp4_fifo.out | 0 apps/c/pthread/basic/features.txt | 0 apps/c/pthread/basic/main.c | 0 apps/c/pthread/basic/test_cmd | 0 .../parallel/expect_info_smp4_fifo.out | 0 .../pthread/parallel/expect_info_smp4_rr.out | 0 apps/c/pthread/parallel/features.txt | 0 apps/c/pthread/parallel/main.c | 0 apps/c/pthread/parallel/test_cmd | 0 apps/c/pthread/pipe/expect_info_smp4_fifo.out | 0 apps/c/pthread/pipe/features.txt | 0 apps/c/pthread/pipe/main.c | 0 apps/c/pthread/pipe/test_cmd | 0 .../c/pthread/sleep/expect_info_smp4_fifo.out | 0 apps/c/pthread/sleep/features.txt | 0 apps/c/pthread/sleep/main.c | 0 apps/c/pthread/sleep/test_cmd | 0 apps/c/pthread/tsd/expect_info_smp4_fifo.out | 0 apps/c/pthread/tsd/features.txt | 0 apps/c/pthread/tsd/main.c | 0 apps/c/pthread/tsd/test_cmd | 0 apps/c/redis/.gitignore | 0 apps/c/redis/Makefile | 0 apps/c/redis/README.md | 0 apps/c/redis/axbuild.mk | 2 + apps/c/redis/features.txt | 2 + apps/c/redis/redis.conf | 0 apps/c/redis/redis.patch | 0 apps/c/sqlite3/.gitignore | 0 apps/c/sqlite3/Makefile | 0 apps/c/sqlite3/axbuild.mk | 0 apps/c/sqlite3/expect_info.out | 0 apps/c/sqlite3/expect_info_again.out | 0 apps/c/sqlite3/expect_info_ramdisk.out | 0 apps/c/sqlite3/features.txt | 0 apps/c/sqlite3/main.c | 0 apps/c/sqlite3/test_cmd | 0 apps/c/systime/features.txt | 0 apps/c/systime/main.c | 0 apps/c/udpserver/axbuild.mk | 0 apps/c/udpserver/features.txt | 0 apps/c/udpserver/udpserver.c | 0 apps/display/basic_painting/Cargo.toml | 0 apps/display/basic_painting/src/display.rs | 0 apps/display/basic_painting/src/main.rs | 0 apps/display/basic_painting/test_cmd | 0 apps/display/draw_map/Cargo.toml | 0 apps/display/draw_map/pictures/map.bmp | Bin apps/display/draw_map/src/display.rs | 0 apps/display/draw_map/src/main.rs | 0 apps/display/draw_map/test_cmd | 0 apps/exception/Cargo.toml | 0 apps/exception/expect_debug_aarch64.out | 0 apps/exception/expect_debug_riscv64.out | 0 apps/exception/expect_debug_x86_64.out | 0 apps/exception/src/main.rs | 0 apps/exception/test_cmd | 0 apps/fs/shell/Cargo.toml | 0 apps/fs/shell/src/cmd.rs | 0 apps/fs/shell/src/main.rs | 0 apps/fs/shell/src/ramfs.rs | 0 apps/helloworld/Cargo.toml | 0 apps/helloworld/expect_info.out | 0 apps/helloworld/expect_info_smp4.out | 0 apps/helloworld/src/main.rs | 0 apps/helloworld/test_cmd | 0 apps/memtest/Cargo.toml | 0 apps/memtest/expect_trace.out | 0 apps/memtest/src/main.rs | 0 apps/memtest/test_cmd | 0 apps/net/bwbench/Cargo.toml | 0 apps/net/bwbench/src/main.rs | 0 apps/net/echoserver/Cargo.toml | 0 apps/net/echoserver/src/main.rs | 0 apps/net/httpclient/Cargo.toml | 0 apps/net/httpclient/expect_info.out | 0 apps/net/httpclient/expect_info_dns.out | 0 apps/net/httpclient/src/main.rs | 0 apps/net/httpclient/test_cmd | 0 apps/net/httpserver/Cargo.toml | 0 apps/net/httpserver/src/main.rs | 0 apps/net/udpserver/Cargo.toml | 0 apps/net/udpserver/src/main.rs | 0 apps/systime/Cargo.toml | 9 + apps/systime/src/main.rs | 109 ++++ apps/task/parallel/Cargo.toml | 0 apps/task/parallel/expect_info_smp1_fifo.out | 0 apps/task/parallel/expect_info_smp4_cfs.out | 0 apps/task/parallel/expect_info_smp4_rr.out | 0 apps/task/parallel/src/main.rs | 0 apps/task/parallel/test_cmd | 0 apps/task/priority/Cargo.toml | 0 apps/task/priority/expect_info_smp1_cfs.out | 0 apps/task/priority/expect_info_smp1_fifo.out | 0 apps/task/priority/expect_info_smp1_rr.out | 0 apps/task/priority/expect_info_smp4_cfs.out | 0 apps/task/priority/src/main.rs | 0 apps/task/priority/test_cmd | 0 apps/task/sleep/Cargo.toml | 0 apps/task/sleep/expect_info_smp4_fifo.out | 0 apps/task/sleep/expect_info_smp4_rr.out | 0 apps/task/sleep/src/main.rs | 0 apps/task/sleep/test_cmd | 0 apps/task/tls/Cargo.toml | 0 apps/task/tls/expect_info_smp1_fifo.out | 0 apps/task/tls/expect_info_smp4_rr.out | 0 apps/task/tls/src/main.rs | 0 apps/task/tls/test_cmd | 0 apps/task/yield/Cargo.toml | 0 apps/task/yield/expect_debug_smp1_fifo.out | 0 apps/task/yield/expect_info_smp4_fifo.out | 0 apps/task/yield/expect_info_smp4_rr.out | 0 apps/task/yield/src/main.rs | 0 apps/task/yield/test_cmd | 0 crates/allocator/Cargo.toml | 0 crates/allocator/benches/collections.rs | 0 crates/allocator/benches/utils/mod.rs | 0 crates/allocator/src/bitmap.rs | 0 crates/allocator/src/buddy.rs | 0 crates/allocator/src/lib.rs | 0 crates/allocator/src/slab.rs | 0 crates/allocator/src/tlsf.rs | 0 crates/allocator/tests/allocator.rs | 0 crates/arm_gic/Cargo.toml | 0 crates/arm_gic/src/gic_v2.rs | 0 crates/arm_gic/src/lib.rs | 0 crates/arm_pl011/Cargo.toml | 0 crates/arm_pl011/src/lib.rs | 0 crates/arm_pl011/src/pl011.rs | 0 crates/axerrno/.gitignore | 0 crates/axerrno/Cargo.toml | 0 crates/axerrno/build.rs | 0 crates/axerrno/src/errno.h | 0 crates/axerrno/src/lib.rs | 0 crates/axfs_devfs/Cargo.toml | 0 crates/axfs_devfs/src/dir.rs | 0 crates/axfs_devfs/src/lib.rs | 0 crates/axfs_devfs/src/null.rs | 0 crates/axfs_devfs/src/tests.rs | 0 crates/axfs_devfs/src/zero.rs | 0 crates/axfs_ramfs/Cargo.toml | 0 crates/axfs_ramfs/src/dir.rs | 0 crates/axfs_ramfs/src/file.rs | 0 crates/axfs_ramfs/src/lib.rs | 0 crates/axfs_ramfs/src/tests.rs | 0 crates/axfs_vfs/Cargo.toml | 0 crates/axfs_vfs/src/lib.rs | 0 crates/axfs_vfs/src/macros.rs | 0 crates/axfs_vfs/src/path.rs | 0 crates/axfs_vfs/src/structs.rs | 0 crates/axio/Cargo.toml | 0 crates/axio/src/buffered/bufreader.rs | 0 crates/axio/src/buffered/mod.rs | 0 crates/axio/src/error.rs | 0 crates/axio/src/impls.rs | 0 crates/axio/src/lib.rs | 0 crates/axio/src/prelude.rs | 0 crates/capability/Cargo.toml | 0 crates/capability/src/lib.rs | 0 crates/crate_interface/Cargo.toml | 0 crates/crate_interface/README.md | 0 crates/crate_interface/src/lib.rs | 0 .../tests/test_crate_interface.rs | 0 crates/driver_9p/Cargo.toml | 0 crates/driver_9p/src/lib.rs | 0 crates/driver_block/Cargo.toml | 0 crates/driver_block/src/bcm2835sdhci.rs | 0 crates/driver_block/src/lib.rs | 0 crates/driver_block/src/ramdisk.rs | 0 crates/driver_common/Cargo.toml | 0 crates/driver_common/src/lib.rs | 0 crates/driver_display/Cargo.toml | 0 crates/driver_display/src/lib.rs | 0 crates/driver_net/Cargo.toml | 0 crates/driver_net/src/ixgbe.rs | 0 crates/driver_net/src/lib.rs | 0 crates/driver_net/src/net_buf.rs | 0 crates/driver_pci/Cargo.toml | 0 crates/driver_pci/src/lib.rs | 0 crates/driver_virtio/Cargo.toml | 0 crates/driver_virtio/src/blk.rs | 0 crates/driver_virtio/src/gpu.rs | 0 crates/driver_virtio/src/lib.rs | 0 crates/driver_virtio/src/net.rs | 0 crates/driver_virtio/src/v9p.rs | 0 crates/dtb/Cargo.toml | 0 crates/dtb/src/lib.rs | 0 crates/dw_apb_uart/Cargo.toml | 0 crates/dw_apb_uart/src/lib.rs | 0 crates/flatten_objects/Cargo.toml | 1 + crates/flatten_objects/src/lib.rs | 1 + crates/handler_table/Cargo.toml | 0 crates/handler_table/README.md | 0 crates/handler_table/src/lib.rs | 0 crates/kernel_guard/Cargo.toml | 0 crates/kernel_guard/README.md | 0 crates/kernel_guard/src/arch/aarch64.rs | 0 crates/kernel_guard/src/arch/mod.rs | 0 crates/kernel_guard/src/arch/riscv.rs | 0 crates/kernel_guard/src/arch/x86.rs | 0 crates/kernel_guard/src/lib.rs | 0 crates/lazy_init/Cargo.toml | 0 crates/lazy_init/src/lib.rs | 0 crates/linked_list/Cargo.toml | 0 crates/linked_list/src/lib.rs | 0 crates/linked_list/src/linked_list.rs | 0 crates/linked_list/src/unsafe_list.rs | 0 crates/memory_addr/Cargo.toml | 0 crates/memory_addr/README.md | 0 crates/memory_addr/src/lib.rs | 0 crates/page_table/Cargo.toml | 0 crates/page_table/src/arch/aarch64.rs | 0 crates/page_table/src/arch/mod.rs | 0 crates/page_table/src/arch/riscv.rs | 0 crates/page_table/src/arch/x86_64.rs | 0 crates/page_table/src/bits64.rs | 0 crates/page_table/src/lib.rs | 0 crates/page_table_entry/Cargo.toml | 0 crates/page_table_entry/src/arch/aarch64.rs | 0 crates/page_table_entry/src/arch/mod.rs | 0 crates/page_table_entry/src/arch/riscv.rs | 0 crates/page_table_entry/src/arch/x86_64.rs | 0 crates/page_table_entry/src/lib.rs | 0 crates/percpu/Cargo.toml | 0 crates/percpu/build.rs | 0 crates/percpu/src/imp.rs | 0 crates/percpu/src/lib.rs | 0 crates/percpu/src/naive.rs | 0 crates/percpu/test_percpu.x | 0 crates/percpu/tests/test_percpu.rs | 0 crates/percpu_macros/Cargo.toml | 0 crates/percpu_macros/src/arch.rs | 0 crates/percpu_macros/src/lib.rs | 0 crates/percpu_macros/src/naive.rs | 0 crates/ratio/Cargo.toml | 0 crates/ratio/src/lib.rs | 0 crates/scheduler/Cargo.toml | 0 crates/scheduler/src/cfs.rs | 0 crates/scheduler/src/fifo.rs | 0 crates/scheduler/src/lib.rs | 0 crates/scheduler/src/round_robin.rs | 0 crates/scheduler/src/tests.rs | 0 crates/slab_allocator/Cargo.toml | 0 crates/slab_allocator/src/lib.rs | 0 crates/slab_allocator/src/slab.rs | 0 crates/slab_allocator/src/tests.rs | 0 crates/spinlock/Cargo.toml | 0 crates/spinlock/src/base.rs | 0 crates/spinlock/src/lib.rs | 0 crates/timer_list/Cargo.toml | 0 crates/timer_list/src/lib.rs | 0 crates/tuple_for_each/Cargo.toml | 0 crates/tuple_for_each/src/lib.rs | 0 .../tests/test_tuple_for_each.rs | 0 doc/README.md | 0 doc/apps_display.md | 0 doc/apps_echoserver.md | 0 doc/apps_exception.md | 0 doc/apps_fs_shell.md | 0 doc/apps_helloworld.md | 0 doc/apps_httpserver.md | 0 doc/apps_memtest.md | 0 doc/apps_net-httpclient.md | 0 doc/apps_parallel.md | 0 doc/apps_priority.md | 0 doc/apps_sleep.md | 0 doc/apps_yield.md | 0 doc/build.md | 0 doc/figures/display.png | Bin doc/figures/rukos.svg | 0 doc/init.md | 0 doc/ixgbe.md | 0 doc/platform_raspi4.md | 0 modules/ax9p/Cargo.toml | 0 modules/ax9p/src/drv.rs | 0 modules/ax9p/src/fs.rs | 37 +- modules/ax9p/src/lib.rs | 0 modules/ax9p/src/netdev.rs | 0 modules/axalloc/Cargo.toml | 0 modules/axalloc/src/lib.rs | 0 modules/axalloc/src/page.rs | 0 modules/axconfig/Cargo.toml | 0 modules/axconfig/build.rs | 0 modules/axconfig/defconfig.toml | 0 modules/axconfig/src/lib.rs | 0 modules/axdisplay/Cargo.toml | 0 modules/axdisplay/src/lib.rs | 0 modules/axdriver/Cargo.toml | 0 modules/axdriver/build.rs | 0 modules/axdriver/src/bus/mmio.rs | 0 modules/axdriver/src/bus/mod.rs | 0 modules/axdriver/src/bus/pci.rs | 0 modules/axdriver/src/drivers.rs | 0 modules/axdriver/src/dummy.rs | 0 modules/axdriver/src/ixgbe.rs | 0 modules/axdriver/src/lib.rs | 0 modules/axdriver/src/macros.rs | 0 modules/axdriver/src/prelude.rs | 0 modules/axdriver/src/structs/dyn.rs | 0 modules/axdriver/src/structs/mod.rs | 0 modules/axdriver/src/structs/static.rs | 0 modules/axdriver/src/virtio.rs | 0 modules/axfs/Cargo.toml | 0 modules/axfs/resources/create_test_img.sh | 12 +- modules/axfs/src/api/dir.rs | 0 modules/axfs/src/api/file.rs | 0 modules/axfs/src/api/mod.rs | 0 modules/axfs/src/dev.rs | 0 modules/axfs/src/fops.rs | 8 +- modules/axfs/src/fs/fatfs.rs | 53 +- modules/axfs/src/fs/mod.rs | 0 modules/axfs/src/fs/myfs.rs | 0 modules/axfs/src/lib.rs | 0 modules/axfs/src/mounts.rs | 0 modules/axfs/src/root.rs | 0 modules/axfs/tests/test_common/mod.rs | 0 modules/axfs/tests/test_fatfs.rs | 0 modules/axfs/tests/test_ramfs.rs | 0 modules/axhal/.gitignore | 0 modules/axhal/Cargo.toml | 0 modules/axhal/build.rs | 0 modules/axhal/linker.lds.S | 0 modules/axhal/src/arch/aarch64/context.rs | 0 modules/axhal/src/arch/aarch64/mod.rs | 0 modules/axhal/src/arch/aarch64/trap.S | 0 modules/axhal/src/arch/aarch64/trap.rs | 0 modules/axhal/src/arch/mod.rs | 0 modules/axhal/src/arch/riscv/context.rs | 0 modules/axhal/src/arch/riscv/macros.rs | 0 modules/axhal/src/arch/riscv/mod.rs | 0 modules/axhal/src/arch/riscv/trap.S | 0 modules/axhal/src/arch/riscv/trap.rs | 0 modules/axhal/src/arch/x86_64/context.rs | 0 modules/axhal/src/arch/x86_64/gdt.rs | 0 modules/axhal/src/arch/x86_64/idt.rs | 0 modules/axhal/src/arch/x86_64/mod.rs | 0 modules/axhal/src/arch/x86_64/trap.S | 0 modules/axhal/src/arch/x86_64/trap.rs | 0 modules/axhal/src/cpu.rs | 0 modules/axhal/src/irq.rs | 0 modules/axhal/src/lib.rs | 1 + modules/axhal/src/mem.rs | 0 modules/axhal/src/paging.rs | 0 .../platform/aarch64_bsta1000b/dw_apb_uart.rs | 0 .../src/platform/aarch64_bsta1000b/mem.rs | 0 .../src/platform/aarch64_bsta1000b/misc.rs | 0 .../src/platform/aarch64_bsta1000b/mod.rs | 0 .../src/platform/aarch64_bsta1000b/mp.rs | 0 .../axhal/src/platform/aarch64_common/boot.rs | 0 .../platform/aarch64_common/generic_timer.rs | 0 .../axhal/src/platform/aarch64_common/gic.rs | 0 .../axhal/src/platform/aarch64_common/mod.rs | 0 .../src/platform/aarch64_common/pl011.rs | 0 .../src/platform/aarch64_common/pl031.rs | 0 .../axhal/src/platform/aarch64_common/psci.rs | 0 .../src/platform/aarch64_qemu_virt/mem.rs | 0 .../src/platform/aarch64_qemu_virt/mod.rs | 0 .../src/platform/aarch64_qemu_virt/mp.rs | 0 .../axhal/src/platform/aarch64_raspi/mem.rs | 0 .../axhal/src/platform/aarch64_raspi/mod.rs | 0 .../axhal/src/platform/aarch64_raspi/mp.rs | 0 modules/axhal/src/platform/dummy/mod.rs | 0 modules/axhal/src/platform/mod.rs | 0 .../src/platform/riscv64_qemu_virt/boot.rs | 0 .../src/platform/riscv64_qemu_virt/console.rs | 0 .../src/platform/riscv64_qemu_virt/irq.rs | 0 .../src/platform/riscv64_qemu_virt/mem.rs | 0 .../src/platform/riscv64_qemu_virt/misc.rs | 0 .../src/platform/riscv64_qemu_virt/mod.rs | 0 .../src/platform/riscv64_qemu_virt/mp.rs | 0 .../src/platform/riscv64_qemu_virt/time.rs | 0 modules/axhal/src/platform/x86_pc/ap_start.S | 0 modules/axhal/src/platform/x86_pc/apic.rs | 0 modules/axhal/src/platform/x86_pc/boot.rs | 0 modules/axhal/src/platform/x86_pc/dtables.rs | 0 modules/axhal/src/platform/x86_pc/mem.rs | 0 modules/axhal/src/platform/x86_pc/misc.rs | 0 modules/axhal/src/platform/x86_pc/mod.rs | 0 modules/axhal/src/platform/x86_pc/mp.rs | 0 modules/axhal/src/platform/x86_pc/multiboot.S | 0 modules/axhal/src/platform/x86_pc/rtc.rs | 0 modules/axhal/src/platform/x86_pc/time.rs | 0 .../axhal/src/platform/x86_pc/uart16550.rs | 0 modules/axhal/src/time.rs | 0 modules/axhal/src/tls.rs | 0 modules/axhal/src/trap.rs | 0 modules/axlog/Cargo.toml | 0 modules/axlog/src/lib.rs | 0 modules/axnet/Cargo.toml | 0 modules/axnet/src/lib.rs | 0 modules/axnet/src/smoltcp_impl/addr.rs | 0 modules/axnet/src/smoltcp_impl/bench.rs | 0 modules/axnet/src/smoltcp_impl/dns.rs | 0 .../axnet/src/smoltcp_impl/listen_table.rs | 0 modules/axnet/src/smoltcp_impl/mod.rs | 0 modules/axnet/src/smoltcp_impl/tcp.rs | 17 +- modules/axnet/src/smoltcp_impl/udp.rs | 0 modules/axruntime/Cargo.toml | 0 modules/axruntime/src/env.rs | 0 modules/axruntime/src/lang_items.rs | 0 modules/axruntime/src/lib.rs | 0 modules/axruntime/src/mp.rs | 0 modules/axruntime/src/signal.rs | 0 modules/axruntime/src/trap.rs | 0 modules/axsync/Cargo.toml | 0 modules/axsync/src/lib.rs | 0 modules/axsync/src/mutex.rs | 0 modules/axtask/Cargo.toml | 0 modules/axtask/src/api.rs | 0 modules/axtask/src/api_s.rs | 0 modules/axtask/src/lib.rs | 0 modules/axtask/src/loadavg.rs | 0 modules/axtask/src/run_queue.rs | 1 + modules/axtask/src/task.rs | 0 modules/axtask/src/tests.rs | 0 modules/axtask/src/timers.rs | 0 modules/axtask/src/tsd.rs | 0 modules/axtask/src/wait_queue.rs | 0 platforms/aarch64-bsta1000b.toml | 0 platforms/aarch64-qemu-virt.toml | 0 platforms/aarch64-raspi4.toml | 0 platforms/riscv64-qemu-virt.toml | 0 platforms/x86_64-pc-oslab.toml | 0 platforms/x86_64-qemu-q35.toml | 0 rust-toolchain.toml | 0 scripts/make/bsta1000b-fada.mk | 0 scripts/make/build.mk | 3 + scripts/make/build_c.mk | 9 + scripts/make/build_musl.mk | 3 + scripts/make/cargo.mk | 0 scripts/make/features.mk | 2 +- scripts/make/qemu.mk | 0 scripts/make/raspi4.mk | 0 scripts/make/test.mk | 0 scripts/make/utils.mk | 0 tools/.gitignore | 0 tools/bsta1000b/bsta1000b-fada.dtb | Bin tools/bwbench_client/Cargo.toml | 0 tools/bwbench_client/README.md | 0 tools/bwbench_client/src/device.rs | 0 tools/bwbench_client/src/main.rs | 0 tools/deptool/Cargo.toml | 0 tools/deptool/Makefile | 0 tools/deptool/README.md | 0 tools/deptool/src/cmd_builder.rs | 0 tools/deptool/src/cmd_parser.rs | 0 tools/deptool/src/d2_generator.rs | 0 tools/deptool/src/lib.rs | 0 tools/deptool/src/main.rs | 0 tools/deptool/src/mermaid_generator.rs | 0 tools/raspi4/common/docker.mk | 0 tools/raspi4/common/format.mk | 0 tools/raspi4/common/operating_system.mk | 0 .../serial/minipush/progressbar_patch.rb | 0 ulib/axlibc/.gitignore | 0 ulib/axlibc/Cargo.toml | 1 + ulib/axlibc/build.rs | 0 ulib/axlibc/c/assert.c | 0 ulib/axlibc/c/atomic.h | 333 ++++++++++ ulib/axlibc/c/atomic_arch.h | 82 +++ ulib/axlibc/c/ctype.c | 0 ulib/axlibc/c/dirent.c | 0 ulib/axlibc/c/dlfcn.c | 0 ulib/axlibc/c/fcntl.c | 8 + ulib/axlibc/c/flock.c | 0 ulib/axlibc/c/fnmatch.c | 0 ulib/axlibc/c/glob.c | 0 ulib/axlibc/c/grp.c | 46 ++ ulib/axlibc/c/ioctl.c | 14 +- ulib/axlibc/c/libgen.c | 0 ulib/axlibc/c/libm.c | 0 ulib/axlibc/c/libm.h | 0 ulib/axlibc/c/locale.c | 0 ulib/axlibc/c/log.c | 0 ulib/axlibc/c/math.c | 0 ulib/axlibc/c/mmap.c | 16 +- ulib/axlibc/c/netdb.c | 19 + ulib/axlibc/c/network.c | 0 ulib/axlibc/c/nscd.h | 44 ++ ulib/axlibc/c/nscd_query.c | 116 ++++ ulib/axlibc/c/pow.c | 0 ulib/axlibc/c/prctl.c | 18 + ulib/axlibc/c/printf.c | 0 ulib/axlibc/c/printf.h | 0 ulib/axlibc/c/printf_config.h | 0 ulib/axlibc/c/pthread.c | 0 ulib/axlibc/c/pwd.c | 30 + ulib/axlibc/c/resource.c | 7 + ulib/axlibc/c/sched.c | 6 + ulib/axlibc/c/select.c | 7 + ulib/axlibc/c/semaphore.c | 39 ++ ulib/axlibc/c/sendfile.c | 16 + ulib/axlibc/c/signal.c | 12 + ulib/axlibc/c/socket.c | 14 + ulib/axlibc/c/stat.c | 0 ulib/axlibc/c/statfs.c | 18 + ulib/axlibc/c/stdio.c | 0 ulib/axlibc/c/stdlib.c | 100 +++ ulib/axlibc/c/string.c | 0 ulib/axlibc/c/syslog.c | 0 ulib/axlibc/c/time.c | 0 ulib/axlibc/c/uio.c | 32 + ulib/axlibc/c/unistd.c | 62 ++ ulib/axlibc/c/utsname.c | 0 ulib/axlibc/c/wait.c | 0 ulib/axlibc/ctypes.h | 0 ulib/axlibc/include/arpa/inet.h | 0 ulib/axlibc/include/assert.h | 0 ulib/axlibc/include/bits/alltypes.h | 423 +++++++++++++ ulib/axlibc/include/bits/statfs.h | 7 + ulib/axlibc/include/bits/syscall.h | 593 ++++++++++++++++++ ulib/axlibc/include/byteswap.h | 26 + ulib/axlibc/include/crypt.h | 20 + ulib/axlibc/include/ctype.h | 0 ulib/axlibc/include/dirent.h | 0 ulib/axlibc/include/dlfcn.h | 0 ulib/axlibc/include/endian.h | 0 ulib/axlibc/include/errno.h | 0 ulib/axlibc/include/fcntl.h | 4 + ulib/axlibc/include/features.h | 0 ulib/axlibc/include/float.h | 0 ulib/axlibc/include/fnmatch.h | 0 ulib/axlibc/include/glob.h | 0 ulib/axlibc/include/grp.h | 53 ++ ulib/axlibc/include/inttypes.h | 0 ulib/axlibc/include/ksigaction.h | 0 ulib/axlibc/include/langinfo.h | 0 ulib/axlibc/include/libgen.h | 0 ulib/axlibc/include/limits.h | 0 ulib/axlibc/include/locale.h | 0 ulib/axlibc/include/malloc.h | 25 + ulib/axlibc/include/math.h | 0 ulib/axlibc/include/memory.h | 0 ulib/axlibc/include/netdb.h | 33 + ulib/axlibc/include/netinet/in.h | 7 + ulib/axlibc/include/netinet/tcp.h | 0 ulib/axlibc/include/poll.h | 0 ulib/axlibc/include/pthread.h | 0 ulib/axlibc/include/pwd.h | 9 + ulib/axlibc/include/regex.h | 0 ulib/axlibc/include/sched.h | 2 + ulib/axlibc/include/semaphore.h | 40 ++ ulib/axlibc/include/setjmp.h | 0 ulib/axlibc/include/signal.h | 2 + ulib/axlibc/include/stdarg.h | 0 ulib/axlibc/include/stdbool.h | 0 ulib/axlibc/include/stddef.h | 0 ulib/axlibc/include/stdint.h | 0 ulib/axlibc/include/stdio.h | 0 ulib/axlibc/include/stdlib.h | 3 + ulib/axlibc/include/string.h | 0 ulib/axlibc/include/strings.h | 0 ulib/axlibc/include/sys/epoll.h | 0 ulib/axlibc/include/sys/eventfd.h | 26 + ulib/axlibc/include/sys/file.h | 0 ulib/axlibc/include/sys/ioctl.h | 2 + ulib/axlibc/include/sys/mman.h | 0 ulib/axlibc/include/sys/param.h | 0 ulib/axlibc/include/sys/prctl.h | 4 + ulib/axlibc/include/sys/resource.h | 7 + ulib/axlibc/include/sys/select.h | 0 ulib/axlibc/include/sys/sendfile.h | 22 + ulib/axlibc/include/sys/socket.h | 19 + ulib/axlibc/include/sys/stat.h | 6 +- ulib/axlibc/include/sys/statfs.h | 32 + ulib/axlibc/include/sys/statvfs.h | 56 ++ ulib/axlibc/include/sys/syscall.h | 6 + ulib/axlibc/include/sys/sysinfo.h | 0 ulib/axlibc/include/sys/time.h | 0 ulib/axlibc/include/sys/types.h | 5 + ulib/axlibc/include/sys/uio.h | 4 + ulib/axlibc/include/sys/un.h | 0 ulib/axlibc/include/sys/utsname.h | 0 ulib/axlibc/include/sys/vfs.h | 1 + ulib/axlibc/include/sys/wait.h | 0 ulib/axlibc/include/syslog.h | 0 ulib/axlibc/include/termios.h | 0 ulib/axlibc/include/time.h | 2 + ulib/axlibc/include/unistd.h | 10 + ulib/axlibc/src/env.rs | 0 ulib/axlibc/src/errno.rs | 0 ulib/axlibc/src/fd_ops.rs | 0 ulib/axlibc/src/fs.rs | 0 ulib/axlibc/src/io.rs | 12 + ulib/axlibc/src/io_mpx.rs | 2 +- ulib/axlibc/src/lib.rs | 1 + ulib/axlibc/src/malloc.rs | 0 ulib/axlibc/src/mktime.rs | 0 ulib/axlibc/src/net.rs | 0 ulib/axlibc/src/pipe.rs | 0 ulib/axlibc/src/pthread.rs | 0 ulib/axlibc/src/rand.rs | 0 ulib/axlibc/src/resource.rs | 0 ulib/axlibc/src/setjmp.rs | 0 ulib/axlibc/src/signal.rs | 0 ulib/axlibc/src/strftime.rs | 0 ulib/axlibc/src/string.rs | 0 ulib/axlibc/src/strtod.rs | 0 ulib/axlibc/src/sys.rs | 0 ulib/axlibc/src/time.rs | 0 ulib/axlibc/src/unistd.rs | 3 +- ulib/axlibc/src/utils.rs | 0 ulib/axmusl/.gitignore | 2 +- ulib/axmusl/src/syscall/mod.rs | 3 + ulib/axmusl/src/syscall/syscall_id.rs | 3 + ulib/axstd/Cargo.toml | 0 ulib/axstd/src/env.rs | 0 ulib/axstd/src/fs/dir.rs | 0 ulib/axstd/src/fs/file.rs | 0 ulib/axstd/src/fs/mod.rs | 0 ulib/axstd/src/io/mod.rs | 0 ulib/axstd/src/io/stdio.rs | 0 ulib/axstd/src/lib.rs | 0 ulib/axstd/src/macros.rs | 0 ulib/axstd/src/net/mod.rs | 0 ulib/axstd/src/net/socket_addr.rs | 0 ulib/axstd/src/net/tcp.rs | 0 ulib/axstd/src/net/udp.rs | 0 ulib/axstd/src/os.rs | 0 ulib/axstd/src/process.rs | 0 ulib/axstd/src/sync/mod.rs | 0 ulib/axstd/src/sync/mutex.rs | 0 ulib/axstd/src/thread/mod.rs | 0 ulib/axstd/src/thread/multi.rs | 0 ulib/axstd/src/time.rs | 5 + 746 files changed, 4303 insertions(+), 37 deletions(-) mode change 100644 => 100755 .clang-format mode change 100644 => 100755 .github/workflows/actions/setup-musl/action.yml mode change 100644 => 100755 .github/workflows/actions/setup-qemu/action.yml mode change 100644 => 100755 .github/workflows/build.yml mode change 100644 => 100755 .github/workflows/docs.yml mode change 100644 => 100755 .github/workflows/test.yml mode change 100644 => 100755 .gitignore mode change 100644 => 100755 Cargo.lock mode change 100644 => 100755 Cargo.toml mode change 100644 => 100755 LICENSE.MulanPSL2 mode change 100644 => 100755 Makefile mode change 100644 => 100755 README.md mode change 100644 => 100755 api/arceos_api/Cargo.toml mode change 100644 => 100755 api/arceos_api/src/imp/display.rs mode change 100644 => 100755 api/arceos_api/src/imp/fs.rs mode change 100644 => 100755 api/arceos_api/src/imp/mem.rs mode change 100644 => 100755 api/arceos_api/src/imp/mod.rs mode change 100644 => 100755 api/arceos_api/src/imp/net.rs mode change 100644 => 100755 api/arceos_api/src/imp/task.rs mode change 100644 => 100755 api/arceos_api/src/lib.rs mode change 100644 => 100755 api/arceos_api/src/macros.rs mode change 100644 => 100755 api/arceos_posix_api/.gitignore mode change 100644 => 100755 api/arceos_posix_api/Cargo.toml mode change 100644 => 100755 api/arceos_posix_api/build.rs mode change 100644 => 100755 api/arceos_posix_api/ctypes.h mode change 100644 => 100755 api/arceos_posix_api/src/imp/fd_ops.rs mode change 100644 => 100755 api/arceos_posix_api/src/imp/fs.rs mode change 100644 => 100755 api/arceos_posix_api/src/imp/io.rs mode change 100644 => 100755 api/arceos_posix_api/src/imp/io_mpx/epoll.rs mode change 100644 => 100755 api/arceos_posix_api/src/imp/io_mpx/mod.rs mode change 100644 => 100755 api/arceos_posix_api/src/imp/io_mpx/poll.rs mode change 100644 => 100755 api/arceos_posix_api/src/imp/io_mpx/select.rs mode change 100644 => 100755 api/arceos_posix_api/src/imp/mod.rs mode change 100644 => 100755 api/arceos_posix_api/src/imp/net.rs mode change 100644 => 100755 api/arceos_posix_api/src/imp/pipe.rs mode change 100644 => 100755 api/arceos_posix_api/src/imp/pthread/condvar.rs mode change 100644 => 100755 api/arceos_posix_api/src/imp/pthread/mod.rs mode change 100644 => 100755 api/arceos_posix_api/src/imp/pthread/mutex.rs mode change 100644 => 100755 api/arceos_posix_api/src/imp/pthread/tsd.rs mode change 100644 => 100755 api/arceos_posix_api/src/imp/resources.rs mode change 100644 => 100755 api/arceos_posix_api/src/imp/signal.rs mode change 100644 => 100755 api/arceos_posix_api/src/imp/stdio.rs mode change 100644 => 100755 api/arceos_posix_api/src/imp/sys.rs mode change 100644 => 100755 api/arceos_posix_api/src/imp/task.rs mode change 100644 => 100755 api/arceos_posix_api/src/imp/time.rs mode change 100644 => 100755 api/arceos_posix_api/src/lib.rs mode change 100644 => 100755 api/arceos_posix_api/src/utils.rs mode change 100644 => 100755 api/axfeat/Cargo.toml mode change 100644 => 100755 api/axfeat/src/lib.rs mode change 100644 => 100755 apps/.gitignore mode change 100644 => 100755 apps/c/envtest/expect_info.out mode change 100644 => 100755 apps/c/envtest/features.txt mode change 100644 => 100755 apps/c/envtest/main.c mode change 100644 => 100755 apps/c/envtest/test_cmd mode change 100644 => 100755 apps/c/filetest/expect_info.out mode change 100644 => 100755 apps/c/filetest/features.txt mode change 100644 => 100755 apps/c/filetest/main.c mode change 100644 => 100755 apps/c/filetest/test_cmd mode change 100644 => 100755 apps/c/helloworld/expect_info.out mode change 100644 => 100755 apps/c/helloworld/expect_info_smp4.out mode change 100644 => 100755 apps/c/helloworld/main.c mode change 100644 => 100755 apps/c/helloworld/test_cmd mode change 100644 => 100755 apps/c/httpclient/axbuild.mk mode change 100644 => 100755 apps/c/httpclient/expect_info.out mode change 100644 => 100755 apps/c/httpclient/features.txt mode change 100644 => 100755 apps/c/httpclient/httpclient.c mode change 100644 => 100755 apps/c/httpclient/test_cmd mode change 100644 => 100755 apps/c/httpserver/axbuild.mk mode change 100644 => 100755 apps/c/httpserver/features.txt mode change 100644 => 100755 apps/c/httpserver/httpserver.c mode change 100644 => 100755 apps/c/iperf/.gitignore mode change 100644 => 100755 apps/c/iperf/README.md mode change 100644 => 100755 apps/c/iperf/axbuild.mk mode change 100644 => 100755 apps/c/iperf/features.txt mode change 100644 => 100755 apps/c/iperf/iperf.patch mode change 100644 => 100755 apps/c/memtest/axbuild.mk mode change 100644 => 100755 apps/c/memtest/expect_trace.out mode change 100644 => 100755 apps/c/memtest/features.txt mode change 100644 => 100755 apps/c/memtest/memtest.c mode change 100644 => 100755 apps/c/memtest/test_cmd create mode 100755 apps/c/nginx/.gitignore create mode 100755 apps/c/nginx/axbuild.mk create mode 100755 apps/c/nginx/create_nginx_img.sh create mode 100755 apps/c/nginx/features.txt create mode 100644 apps/c/nginx/html/README.md create mode 100644 apps/c/nginx/html/_404.md create mode 100644 apps/c/nginx/html/_coverpage.md create mode 100644 apps/c/nginx/html/_media/bg-bluesea.jpg create mode 100644 apps/c/nginx/html/_media/car-ee.svg create mode 100644 apps/c/nginx/html/_media/communities.svg create mode 100644 apps/c/nginx/html/_media/custom.css create mode 100644 apps/c/nginx/html/_media/favicon.ico create mode 100644 apps/c/nginx/html/_media/logo.png create mode 100644 apps/c/nginx/html/_media/logo.svg create mode 100644 apps/c/nginx/html/_media/os20years.svg create mode 100644 apps/c/nginx/html/_media/overview.svg create mode 100644 apps/c/nginx/html/_media/qrcode_4_ubiquitousos.jpg create mode 100644 apps/c/nginx/html/_media/syswonder.svg create mode 100644 apps/c/nginx/html/_navbar.md create mode 100644 apps/c/nginx/html/_sidebar.md create mode 100644 apps/c/nginx/html/community.md create mode 100644 apps/c/nginx/html/contact.md create mode 100644 apps/c/nginx/html/contrib.md create mode 100644 apps/c/nginx/html/courses.md create mode 100644 apps/c/nginx/html/en/_coverpage.md create mode 100644 apps/c/nginx/html/en/_navbar.md create mode 100644 apps/c/nginx/html/en/_sidebar.md create mode 100644 apps/c/nginx/html/en/community.md create mode 100644 apps/c/nginx/html/en/contact.md create mode 100644 apps/c/nginx/html/en/courses.md create mode 100644 apps/c/nginx/html/en/intro.md create mode 100644 apps/c/nginx/html/en/projects.md create mode 100644 apps/c/nginx/html/index.html create mode 100644 apps/c/nginx/html/intro.md create mode 100644 apps/c/nginx/html/news/README.md create mode 100644 apps/c/nginx/html/news/news.md create mode 100644 apps/c/nginx/html/projects.md create mode 100644 apps/c/nginx/html/uos.md create mode 100755 apps/c/nginx/mime.types create mode 100755 apps/c/nginx/nginx.conf mode change 100644 => 100755 apps/c/pthread/basic/expect_info_smp4_fifo.out mode change 100644 => 100755 apps/c/pthread/basic/features.txt mode change 100644 => 100755 apps/c/pthread/basic/main.c mode change 100644 => 100755 apps/c/pthread/basic/test_cmd mode change 100644 => 100755 apps/c/pthread/parallel/expect_info_smp4_fifo.out mode change 100644 => 100755 apps/c/pthread/parallel/expect_info_smp4_rr.out mode change 100644 => 100755 apps/c/pthread/parallel/features.txt mode change 100644 => 100755 apps/c/pthread/parallel/main.c mode change 100644 => 100755 apps/c/pthread/parallel/test_cmd mode change 100644 => 100755 apps/c/pthread/pipe/expect_info_smp4_fifo.out mode change 100644 => 100755 apps/c/pthread/pipe/features.txt mode change 100644 => 100755 apps/c/pthread/pipe/main.c mode change 100644 => 100755 apps/c/pthread/pipe/test_cmd mode change 100644 => 100755 apps/c/pthread/sleep/expect_info_smp4_fifo.out mode change 100644 => 100755 apps/c/pthread/sleep/features.txt mode change 100644 => 100755 apps/c/pthread/sleep/main.c mode change 100644 => 100755 apps/c/pthread/sleep/test_cmd mode change 100644 => 100755 apps/c/pthread/tsd/expect_info_smp4_fifo.out mode change 100644 => 100755 apps/c/pthread/tsd/features.txt mode change 100644 => 100755 apps/c/pthread/tsd/main.c mode change 100644 => 100755 apps/c/pthread/tsd/test_cmd mode change 100644 => 100755 apps/c/redis/.gitignore mode change 100644 => 100755 apps/c/redis/Makefile mode change 100644 => 100755 apps/c/redis/README.md mode change 100644 => 100755 apps/c/redis/axbuild.mk mode change 100644 => 100755 apps/c/redis/features.txt mode change 100644 => 100755 apps/c/redis/redis.conf mode change 100644 => 100755 apps/c/redis/redis.patch mode change 100644 => 100755 apps/c/sqlite3/.gitignore mode change 100644 => 100755 apps/c/sqlite3/Makefile mode change 100644 => 100755 apps/c/sqlite3/axbuild.mk mode change 100644 => 100755 apps/c/sqlite3/expect_info.out mode change 100644 => 100755 apps/c/sqlite3/expect_info_again.out mode change 100644 => 100755 apps/c/sqlite3/expect_info_ramdisk.out mode change 100644 => 100755 apps/c/sqlite3/features.txt mode change 100644 => 100755 apps/c/sqlite3/main.c mode change 100644 => 100755 apps/c/sqlite3/test_cmd mode change 100644 => 100755 apps/c/systime/features.txt mode change 100644 => 100755 apps/c/systime/main.c mode change 100644 => 100755 apps/c/udpserver/axbuild.mk mode change 100644 => 100755 apps/c/udpserver/features.txt mode change 100644 => 100755 apps/c/udpserver/udpserver.c mode change 100644 => 100755 apps/display/basic_painting/Cargo.toml mode change 100644 => 100755 apps/display/basic_painting/src/display.rs mode change 100644 => 100755 apps/display/basic_painting/src/main.rs mode change 100644 => 100755 apps/display/basic_painting/test_cmd mode change 100644 => 100755 apps/display/draw_map/Cargo.toml mode change 100644 => 100755 apps/display/draw_map/pictures/map.bmp mode change 100644 => 100755 apps/display/draw_map/src/display.rs mode change 100644 => 100755 apps/display/draw_map/src/main.rs mode change 100644 => 100755 apps/display/draw_map/test_cmd mode change 100644 => 100755 apps/exception/Cargo.toml mode change 100644 => 100755 apps/exception/expect_debug_aarch64.out mode change 100644 => 100755 apps/exception/expect_debug_riscv64.out mode change 100644 => 100755 apps/exception/expect_debug_x86_64.out mode change 100644 => 100755 apps/exception/src/main.rs mode change 100644 => 100755 apps/exception/test_cmd mode change 100644 => 100755 apps/fs/shell/Cargo.toml mode change 100644 => 100755 apps/fs/shell/src/cmd.rs mode change 100644 => 100755 apps/fs/shell/src/main.rs mode change 100644 => 100755 apps/fs/shell/src/ramfs.rs mode change 100644 => 100755 apps/helloworld/Cargo.toml mode change 100644 => 100755 apps/helloworld/expect_info.out mode change 100644 => 100755 apps/helloworld/expect_info_smp4.out mode change 100644 => 100755 apps/helloworld/src/main.rs mode change 100644 => 100755 apps/helloworld/test_cmd mode change 100644 => 100755 apps/memtest/Cargo.toml mode change 100644 => 100755 apps/memtest/expect_trace.out mode change 100644 => 100755 apps/memtest/src/main.rs mode change 100644 => 100755 apps/memtest/test_cmd mode change 100644 => 100755 apps/net/bwbench/Cargo.toml mode change 100644 => 100755 apps/net/bwbench/src/main.rs mode change 100644 => 100755 apps/net/echoserver/Cargo.toml mode change 100644 => 100755 apps/net/echoserver/src/main.rs mode change 100644 => 100755 apps/net/httpclient/Cargo.toml mode change 100644 => 100755 apps/net/httpclient/expect_info.out mode change 100644 => 100755 apps/net/httpclient/expect_info_dns.out mode change 100644 => 100755 apps/net/httpclient/src/main.rs mode change 100644 => 100755 apps/net/httpclient/test_cmd mode change 100644 => 100755 apps/net/httpserver/Cargo.toml mode change 100644 => 100755 apps/net/httpserver/src/main.rs mode change 100644 => 100755 apps/net/udpserver/Cargo.toml mode change 100644 => 100755 apps/net/udpserver/src/main.rs create mode 100755 apps/systime/Cargo.toml create mode 100755 apps/systime/src/main.rs mode change 100644 => 100755 apps/task/parallel/Cargo.toml mode change 100644 => 100755 apps/task/parallel/expect_info_smp1_fifo.out mode change 100644 => 100755 apps/task/parallel/expect_info_smp4_cfs.out mode change 100644 => 100755 apps/task/parallel/expect_info_smp4_rr.out mode change 100644 => 100755 apps/task/parallel/src/main.rs mode change 100644 => 100755 apps/task/parallel/test_cmd mode change 100644 => 100755 apps/task/priority/Cargo.toml mode change 100644 => 100755 apps/task/priority/expect_info_smp1_cfs.out mode change 100644 => 100755 apps/task/priority/expect_info_smp1_fifo.out mode change 100644 => 100755 apps/task/priority/expect_info_smp1_rr.out mode change 100644 => 100755 apps/task/priority/expect_info_smp4_cfs.out mode change 100644 => 100755 apps/task/priority/src/main.rs mode change 100644 => 100755 apps/task/priority/test_cmd mode change 100644 => 100755 apps/task/sleep/Cargo.toml mode change 100644 => 100755 apps/task/sleep/expect_info_smp4_fifo.out mode change 100644 => 100755 apps/task/sleep/expect_info_smp4_rr.out mode change 100644 => 100755 apps/task/sleep/src/main.rs mode change 100644 => 100755 apps/task/sleep/test_cmd mode change 100644 => 100755 apps/task/tls/Cargo.toml mode change 100644 => 100755 apps/task/tls/expect_info_smp1_fifo.out mode change 100644 => 100755 apps/task/tls/expect_info_smp4_rr.out mode change 100644 => 100755 apps/task/tls/src/main.rs mode change 100644 => 100755 apps/task/tls/test_cmd mode change 100644 => 100755 apps/task/yield/Cargo.toml mode change 100644 => 100755 apps/task/yield/expect_debug_smp1_fifo.out mode change 100644 => 100755 apps/task/yield/expect_info_smp4_fifo.out mode change 100644 => 100755 apps/task/yield/expect_info_smp4_rr.out mode change 100644 => 100755 apps/task/yield/src/main.rs mode change 100644 => 100755 apps/task/yield/test_cmd mode change 100644 => 100755 crates/allocator/Cargo.toml mode change 100644 => 100755 crates/allocator/benches/collections.rs mode change 100644 => 100755 crates/allocator/benches/utils/mod.rs mode change 100644 => 100755 crates/allocator/src/bitmap.rs mode change 100644 => 100755 crates/allocator/src/buddy.rs mode change 100644 => 100755 crates/allocator/src/lib.rs mode change 100644 => 100755 crates/allocator/src/slab.rs mode change 100644 => 100755 crates/allocator/src/tlsf.rs mode change 100644 => 100755 crates/allocator/tests/allocator.rs mode change 100644 => 100755 crates/arm_gic/Cargo.toml mode change 100644 => 100755 crates/arm_gic/src/gic_v2.rs mode change 100644 => 100755 crates/arm_gic/src/lib.rs mode change 100644 => 100755 crates/arm_pl011/Cargo.toml mode change 100644 => 100755 crates/arm_pl011/src/lib.rs mode change 100644 => 100755 crates/arm_pl011/src/pl011.rs mode change 100644 => 100755 crates/axerrno/.gitignore mode change 100644 => 100755 crates/axerrno/Cargo.toml mode change 100644 => 100755 crates/axerrno/build.rs mode change 100644 => 100755 crates/axerrno/src/errno.h mode change 100644 => 100755 crates/axerrno/src/lib.rs mode change 100644 => 100755 crates/axfs_devfs/Cargo.toml mode change 100644 => 100755 crates/axfs_devfs/src/dir.rs mode change 100644 => 100755 crates/axfs_devfs/src/lib.rs mode change 100644 => 100755 crates/axfs_devfs/src/null.rs mode change 100644 => 100755 crates/axfs_devfs/src/tests.rs mode change 100644 => 100755 crates/axfs_devfs/src/zero.rs mode change 100644 => 100755 crates/axfs_ramfs/Cargo.toml mode change 100644 => 100755 crates/axfs_ramfs/src/dir.rs mode change 100644 => 100755 crates/axfs_ramfs/src/file.rs mode change 100644 => 100755 crates/axfs_ramfs/src/lib.rs mode change 100644 => 100755 crates/axfs_ramfs/src/tests.rs mode change 100644 => 100755 crates/axfs_vfs/Cargo.toml mode change 100644 => 100755 crates/axfs_vfs/src/lib.rs mode change 100644 => 100755 crates/axfs_vfs/src/macros.rs mode change 100644 => 100755 crates/axfs_vfs/src/path.rs mode change 100644 => 100755 crates/axfs_vfs/src/structs.rs mode change 100644 => 100755 crates/axio/Cargo.toml mode change 100644 => 100755 crates/axio/src/buffered/bufreader.rs mode change 100644 => 100755 crates/axio/src/buffered/mod.rs mode change 100644 => 100755 crates/axio/src/error.rs mode change 100644 => 100755 crates/axio/src/impls.rs mode change 100644 => 100755 crates/axio/src/lib.rs mode change 100644 => 100755 crates/axio/src/prelude.rs mode change 100644 => 100755 crates/capability/Cargo.toml mode change 100644 => 100755 crates/capability/src/lib.rs mode change 100644 => 100755 crates/crate_interface/Cargo.toml mode change 100644 => 100755 crates/crate_interface/README.md mode change 100644 => 100755 crates/crate_interface/src/lib.rs mode change 100644 => 100755 crates/crate_interface/tests/test_crate_interface.rs mode change 100644 => 100755 crates/driver_9p/Cargo.toml mode change 100644 => 100755 crates/driver_9p/src/lib.rs mode change 100644 => 100755 crates/driver_block/Cargo.toml mode change 100644 => 100755 crates/driver_block/src/bcm2835sdhci.rs mode change 100644 => 100755 crates/driver_block/src/lib.rs mode change 100644 => 100755 crates/driver_block/src/ramdisk.rs mode change 100644 => 100755 crates/driver_common/Cargo.toml mode change 100644 => 100755 crates/driver_common/src/lib.rs mode change 100644 => 100755 crates/driver_display/Cargo.toml mode change 100644 => 100755 crates/driver_display/src/lib.rs mode change 100644 => 100755 crates/driver_net/Cargo.toml mode change 100644 => 100755 crates/driver_net/src/ixgbe.rs mode change 100644 => 100755 crates/driver_net/src/lib.rs mode change 100644 => 100755 crates/driver_net/src/net_buf.rs mode change 100644 => 100755 crates/driver_pci/Cargo.toml mode change 100644 => 100755 crates/driver_pci/src/lib.rs mode change 100644 => 100755 crates/driver_virtio/Cargo.toml mode change 100644 => 100755 crates/driver_virtio/src/blk.rs mode change 100644 => 100755 crates/driver_virtio/src/gpu.rs mode change 100644 => 100755 crates/driver_virtio/src/lib.rs mode change 100644 => 100755 crates/driver_virtio/src/net.rs mode change 100644 => 100755 crates/driver_virtio/src/v9p.rs mode change 100644 => 100755 crates/dtb/Cargo.toml mode change 100644 => 100755 crates/dtb/src/lib.rs mode change 100644 => 100755 crates/dw_apb_uart/Cargo.toml mode change 100644 => 100755 crates/dw_apb_uart/src/lib.rs mode change 100644 => 100755 crates/flatten_objects/Cargo.toml mode change 100644 => 100755 crates/flatten_objects/src/lib.rs mode change 100644 => 100755 crates/handler_table/Cargo.toml mode change 100644 => 100755 crates/handler_table/README.md mode change 100644 => 100755 crates/handler_table/src/lib.rs mode change 100644 => 100755 crates/kernel_guard/Cargo.toml mode change 100644 => 100755 crates/kernel_guard/README.md mode change 100644 => 100755 crates/kernel_guard/src/arch/aarch64.rs mode change 100644 => 100755 crates/kernel_guard/src/arch/mod.rs mode change 100644 => 100755 crates/kernel_guard/src/arch/riscv.rs mode change 100644 => 100755 crates/kernel_guard/src/arch/x86.rs mode change 100644 => 100755 crates/kernel_guard/src/lib.rs mode change 100644 => 100755 crates/lazy_init/Cargo.toml mode change 100644 => 100755 crates/lazy_init/src/lib.rs mode change 100644 => 100755 crates/linked_list/Cargo.toml mode change 100644 => 100755 crates/linked_list/src/lib.rs mode change 100644 => 100755 crates/linked_list/src/linked_list.rs mode change 100644 => 100755 crates/linked_list/src/unsafe_list.rs mode change 100644 => 100755 crates/memory_addr/Cargo.toml mode change 100644 => 100755 crates/memory_addr/README.md mode change 100644 => 100755 crates/memory_addr/src/lib.rs mode change 100644 => 100755 crates/page_table/Cargo.toml mode change 100644 => 100755 crates/page_table/src/arch/aarch64.rs mode change 100644 => 100755 crates/page_table/src/arch/mod.rs mode change 100644 => 100755 crates/page_table/src/arch/riscv.rs mode change 100644 => 100755 crates/page_table/src/arch/x86_64.rs mode change 100644 => 100755 crates/page_table/src/bits64.rs mode change 100644 => 100755 crates/page_table/src/lib.rs mode change 100644 => 100755 crates/page_table_entry/Cargo.toml mode change 100644 => 100755 crates/page_table_entry/src/arch/aarch64.rs mode change 100644 => 100755 crates/page_table_entry/src/arch/mod.rs mode change 100644 => 100755 crates/page_table_entry/src/arch/riscv.rs mode change 100644 => 100755 crates/page_table_entry/src/arch/x86_64.rs mode change 100644 => 100755 crates/page_table_entry/src/lib.rs mode change 100644 => 100755 crates/percpu/Cargo.toml mode change 100644 => 100755 crates/percpu/build.rs mode change 100644 => 100755 crates/percpu/src/imp.rs mode change 100644 => 100755 crates/percpu/src/lib.rs mode change 100644 => 100755 crates/percpu/src/naive.rs mode change 100644 => 100755 crates/percpu/test_percpu.x mode change 100644 => 100755 crates/percpu/tests/test_percpu.rs mode change 100644 => 100755 crates/percpu_macros/Cargo.toml mode change 100644 => 100755 crates/percpu_macros/src/arch.rs mode change 100644 => 100755 crates/percpu_macros/src/lib.rs mode change 100644 => 100755 crates/percpu_macros/src/naive.rs mode change 100644 => 100755 crates/ratio/Cargo.toml mode change 100644 => 100755 crates/ratio/src/lib.rs mode change 100644 => 100755 crates/scheduler/Cargo.toml mode change 100644 => 100755 crates/scheduler/src/cfs.rs mode change 100644 => 100755 crates/scheduler/src/fifo.rs mode change 100644 => 100755 crates/scheduler/src/lib.rs mode change 100644 => 100755 crates/scheduler/src/round_robin.rs mode change 100644 => 100755 crates/scheduler/src/tests.rs mode change 100644 => 100755 crates/slab_allocator/Cargo.toml mode change 100644 => 100755 crates/slab_allocator/src/lib.rs mode change 100644 => 100755 crates/slab_allocator/src/slab.rs mode change 100644 => 100755 crates/slab_allocator/src/tests.rs mode change 100644 => 100755 crates/spinlock/Cargo.toml mode change 100644 => 100755 crates/spinlock/src/base.rs mode change 100644 => 100755 crates/spinlock/src/lib.rs mode change 100644 => 100755 crates/timer_list/Cargo.toml mode change 100644 => 100755 crates/timer_list/src/lib.rs mode change 100644 => 100755 crates/tuple_for_each/Cargo.toml mode change 100644 => 100755 crates/tuple_for_each/src/lib.rs mode change 100644 => 100755 crates/tuple_for_each/tests/test_tuple_for_each.rs mode change 100644 => 100755 doc/README.md mode change 100644 => 100755 doc/apps_display.md mode change 100644 => 100755 doc/apps_echoserver.md mode change 100644 => 100755 doc/apps_exception.md mode change 100644 => 100755 doc/apps_fs_shell.md mode change 100644 => 100755 doc/apps_helloworld.md mode change 100644 => 100755 doc/apps_httpserver.md mode change 100644 => 100755 doc/apps_memtest.md mode change 100644 => 100755 doc/apps_net-httpclient.md mode change 100644 => 100755 doc/apps_parallel.md mode change 100644 => 100755 doc/apps_priority.md mode change 100644 => 100755 doc/apps_sleep.md mode change 100644 => 100755 doc/apps_yield.md mode change 100644 => 100755 doc/build.md mode change 100644 => 100755 doc/figures/display.png mode change 100644 => 100755 doc/figures/rukos.svg mode change 100644 => 100755 doc/init.md mode change 100644 => 100755 doc/ixgbe.md mode change 100644 => 100755 doc/platform_raspi4.md mode change 100644 => 100755 modules/ax9p/Cargo.toml mode change 100644 => 100755 modules/ax9p/src/drv.rs mode change 100644 => 100755 modules/ax9p/src/fs.rs mode change 100644 => 100755 modules/ax9p/src/lib.rs mode change 100644 => 100755 modules/ax9p/src/netdev.rs mode change 100644 => 100755 modules/axalloc/Cargo.toml mode change 100644 => 100755 modules/axalloc/src/lib.rs mode change 100644 => 100755 modules/axalloc/src/page.rs mode change 100644 => 100755 modules/axconfig/Cargo.toml mode change 100644 => 100755 modules/axconfig/build.rs mode change 100644 => 100755 modules/axconfig/defconfig.toml mode change 100644 => 100755 modules/axconfig/src/lib.rs mode change 100644 => 100755 modules/axdisplay/Cargo.toml mode change 100644 => 100755 modules/axdisplay/src/lib.rs mode change 100644 => 100755 modules/axdriver/Cargo.toml mode change 100644 => 100755 modules/axdriver/build.rs mode change 100644 => 100755 modules/axdriver/src/bus/mmio.rs mode change 100644 => 100755 modules/axdriver/src/bus/mod.rs mode change 100644 => 100755 modules/axdriver/src/bus/pci.rs mode change 100644 => 100755 modules/axdriver/src/drivers.rs mode change 100644 => 100755 modules/axdriver/src/dummy.rs mode change 100644 => 100755 modules/axdriver/src/ixgbe.rs mode change 100644 => 100755 modules/axdriver/src/lib.rs mode change 100644 => 100755 modules/axdriver/src/macros.rs mode change 100644 => 100755 modules/axdriver/src/prelude.rs mode change 100644 => 100755 modules/axdriver/src/structs/dyn.rs mode change 100644 => 100755 modules/axdriver/src/structs/mod.rs mode change 100644 => 100755 modules/axdriver/src/structs/static.rs mode change 100644 => 100755 modules/axdriver/src/virtio.rs mode change 100644 => 100755 modules/axfs/Cargo.toml mode change 100644 => 100755 modules/axfs/src/api/dir.rs mode change 100644 => 100755 modules/axfs/src/api/file.rs mode change 100644 => 100755 modules/axfs/src/api/mod.rs mode change 100644 => 100755 modules/axfs/src/dev.rs mode change 100644 => 100755 modules/axfs/src/fops.rs mode change 100644 => 100755 modules/axfs/src/fs/fatfs.rs mode change 100644 => 100755 modules/axfs/src/fs/mod.rs mode change 100644 => 100755 modules/axfs/src/fs/myfs.rs mode change 100644 => 100755 modules/axfs/src/lib.rs mode change 100644 => 100755 modules/axfs/src/mounts.rs mode change 100644 => 100755 modules/axfs/src/root.rs mode change 100644 => 100755 modules/axfs/tests/test_common/mod.rs mode change 100644 => 100755 modules/axfs/tests/test_fatfs.rs mode change 100644 => 100755 modules/axfs/tests/test_ramfs.rs mode change 100644 => 100755 modules/axhal/.gitignore mode change 100644 => 100755 modules/axhal/Cargo.toml mode change 100644 => 100755 modules/axhal/build.rs mode change 100644 => 100755 modules/axhal/linker.lds.S mode change 100644 => 100755 modules/axhal/src/arch/aarch64/context.rs mode change 100644 => 100755 modules/axhal/src/arch/aarch64/mod.rs mode change 100644 => 100755 modules/axhal/src/arch/aarch64/trap.S mode change 100644 => 100755 modules/axhal/src/arch/aarch64/trap.rs mode change 100644 => 100755 modules/axhal/src/arch/mod.rs mode change 100644 => 100755 modules/axhal/src/arch/riscv/context.rs mode change 100644 => 100755 modules/axhal/src/arch/riscv/macros.rs mode change 100644 => 100755 modules/axhal/src/arch/riscv/mod.rs mode change 100644 => 100755 modules/axhal/src/arch/riscv/trap.S mode change 100644 => 100755 modules/axhal/src/arch/riscv/trap.rs mode change 100644 => 100755 modules/axhal/src/arch/x86_64/context.rs mode change 100644 => 100755 modules/axhal/src/arch/x86_64/gdt.rs mode change 100644 => 100755 modules/axhal/src/arch/x86_64/idt.rs mode change 100644 => 100755 modules/axhal/src/arch/x86_64/mod.rs mode change 100644 => 100755 modules/axhal/src/arch/x86_64/trap.S mode change 100644 => 100755 modules/axhal/src/arch/x86_64/trap.rs mode change 100644 => 100755 modules/axhal/src/cpu.rs mode change 100644 => 100755 modules/axhal/src/irq.rs mode change 100644 => 100755 modules/axhal/src/lib.rs mode change 100644 => 100755 modules/axhal/src/mem.rs mode change 100644 => 100755 modules/axhal/src/paging.rs mode change 100644 => 100755 modules/axhal/src/platform/aarch64_bsta1000b/dw_apb_uart.rs mode change 100644 => 100755 modules/axhal/src/platform/aarch64_bsta1000b/mem.rs mode change 100644 => 100755 modules/axhal/src/platform/aarch64_bsta1000b/misc.rs mode change 100644 => 100755 modules/axhal/src/platform/aarch64_bsta1000b/mod.rs mode change 100644 => 100755 modules/axhal/src/platform/aarch64_bsta1000b/mp.rs mode change 100644 => 100755 modules/axhal/src/platform/aarch64_common/boot.rs mode change 100644 => 100755 modules/axhal/src/platform/aarch64_common/generic_timer.rs mode change 100644 => 100755 modules/axhal/src/platform/aarch64_common/gic.rs mode change 100644 => 100755 modules/axhal/src/platform/aarch64_common/mod.rs mode change 100644 => 100755 modules/axhal/src/platform/aarch64_common/pl011.rs mode change 100644 => 100755 modules/axhal/src/platform/aarch64_common/pl031.rs mode change 100644 => 100755 modules/axhal/src/platform/aarch64_common/psci.rs mode change 100644 => 100755 modules/axhal/src/platform/aarch64_qemu_virt/mem.rs mode change 100644 => 100755 modules/axhal/src/platform/aarch64_qemu_virt/mod.rs mode change 100644 => 100755 modules/axhal/src/platform/aarch64_qemu_virt/mp.rs mode change 100644 => 100755 modules/axhal/src/platform/aarch64_raspi/mem.rs mode change 100644 => 100755 modules/axhal/src/platform/aarch64_raspi/mod.rs mode change 100644 => 100755 modules/axhal/src/platform/aarch64_raspi/mp.rs mode change 100644 => 100755 modules/axhal/src/platform/dummy/mod.rs mode change 100644 => 100755 modules/axhal/src/platform/mod.rs mode change 100644 => 100755 modules/axhal/src/platform/riscv64_qemu_virt/boot.rs mode change 100644 => 100755 modules/axhal/src/platform/riscv64_qemu_virt/console.rs mode change 100644 => 100755 modules/axhal/src/platform/riscv64_qemu_virt/irq.rs mode change 100644 => 100755 modules/axhal/src/platform/riscv64_qemu_virt/mem.rs mode change 100644 => 100755 modules/axhal/src/platform/riscv64_qemu_virt/misc.rs mode change 100644 => 100755 modules/axhal/src/platform/riscv64_qemu_virt/mod.rs mode change 100644 => 100755 modules/axhal/src/platform/riscv64_qemu_virt/mp.rs mode change 100644 => 100755 modules/axhal/src/platform/riscv64_qemu_virt/time.rs mode change 100644 => 100755 modules/axhal/src/platform/x86_pc/ap_start.S mode change 100644 => 100755 modules/axhal/src/platform/x86_pc/apic.rs mode change 100644 => 100755 modules/axhal/src/platform/x86_pc/boot.rs mode change 100644 => 100755 modules/axhal/src/platform/x86_pc/dtables.rs mode change 100644 => 100755 modules/axhal/src/platform/x86_pc/mem.rs mode change 100644 => 100755 modules/axhal/src/platform/x86_pc/misc.rs mode change 100644 => 100755 modules/axhal/src/platform/x86_pc/mod.rs mode change 100644 => 100755 modules/axhal/src/platform/x86_pc/mp.rs mode change 100644 => 100755 modules/axhal/src/platform/x86_pc/multiboot.S mode change 100644 => 100755 modules/axhal/src/platform/x86_pc/rtc.rs mode change 100644 => 100755 modules/axhal/src/platform/x86_pc/time.rs mode change 100644 => 100755 modules/axhal/src/platform/x86_pc/uart16550.rs mode change 100644 => 100755 modules/axhal/src/time.rs mode change 100644 => 100755 modules/axhal/src/tls.rs mode change 100644 => 100755 modules/axhal/src/trap.rs mode change 100644 => 100755 modules/axlog/Cargo.toml mode change 100644 => 100755 modules/axlog/src/lib.rs mode change 100644 => 100755 modules/axnet/Cargo.toml mode change 100644 => 100755 modules/axnet/src/lib.rs mode change 100644 => 100755 modules/axnet/src/smoltcp_impl/addr.rs mode change 100644 => 100755 modules/axnet/src/smoltcp_impl/bench.rs mode change 100644 => 100755 modules/axnet/src/smoltcp_impl/dns.rs mode change 100644 => 100755 modules/axnet/src/smoltcp_impl/listen_table.rs mode change 100644 => 100755 modules/axnet/src/smoltcp_impl/mod.rs mode change 100644 => 100755 modules/axnet/src/smoltcp_impl/tcp.rs mode change 100644 => 100755 modules/axnet/src/smoltcp_impl/udp.rs mode change 100644 => 100755 modules/axruntime/Cargo.toml mode change 100644 => 100755 modules/axruntime/src/env.rs mode change 100644 => 100755 modules/axruntime/src/lang_items.rs mode change 100644 => 100755 modules/axruntime/src/lib.rs mode change 100644 => 100755 modules/axruntime/src/mp.rs mode change 100644 => 100755 modules/axruntime/src/signal.rs mode change 100644 => 100755 modules/axruntime/src/trap.rs mode change 100644 => 100755 modules/axsync/Cargo.toml mode change 100644 => 100755 modules/axsync/src/lib.rs mode change 100644 => 100755 modules/axsync/src/mutex.rs mode change 100644 => 100755 modules/axtask/Cargo.toml mode change 100644 => 100755 modules/axtask/src/api.rs mode change 100644 => 100755 modules/axtask/src/api_s.rs mode change 100644 => 100755 modules/axtask/src/lib.rs mode change 100644 => 100755 modules/axtask/src/loadavg.rs mode change 100644 => 100755 modules/axtask/src/run_queue.rs mode change 100644 => 100755 modules/axtask/src/task.rs mode change 100644 => 100755 modules/axtask/src/tests.rs mode change 100644 => 100755 modules/axtask/src/timers.rs mode change 100644 => 100755 modules/axtask/src/tsd.rs mode change 100644 => 100755 modules/axtask/src/wait_queue.rs mode change 100644 => 100755 platforms/aarch64-bsta1000b.toml mode change 100644 => 100755 platforms/aarch64-qemu-virt.toml mode change 100644 => 100755 platforms/aarch64-raspi4.toml mode change 100644 => 100755 platforms/riscv64-qemu-virt.toml mode change 100644 => 100755 platforms/x86_64-pc-oslab.toml mode change 100644 => 100755 platforms/x86_64-qemu-q35.toml mode change 100644 => 100755 rust-toolchain.toml mode change 100644 => 100755 scripts/make/bsta1000b-fada.mk mode change 100644 => 100755 scripts/make/build.mk mode change 100644 => 100755 scripts/make/build_c.mk mode change 100644 => 100755 scripts/make/cargo.mk mode change 100644 => 100755 scripts/make/features.mk mode change 100644 => 100755 scripts/make/qemu.mk mode change 100644 => 100755 scripts/make/raspi4.mk mode change 100644 => 100755 scripts/make/test.mk mode change 100644 => 100755 scripts/make/utils.mk mode change 100644 => 100755 tools/.gitignore mode change 100644 => 100755 tools/bsta1000b/bsta1000b-fada.dtb mode change 100644 => 100755 tools/bwbench_client/Cargo.toml mode change 100644 => 100755 tools/bwbench_client/README.md mode change 100644 => 100755 tools/bwbench_client/src/device.rs mode change 100644 => 100755 tools/bwbench_client/src/main.rs mode change 100644 => 100755 tools/deptool/Cargo.toml mode change 100644 => 100755 tools/deptool/Makefile mode change 100644 => 100755 tools/deptool/README.md mode change 100644 => 100755 tools/deptool/src/cmd_builder.rs mode change 100644 => 100755 tools/deptool/src/cmd_parser.rs mode change 100644 => 100755 tools/deptool/src/d2_generator.rs mode change 100644 => 100755 tools/deptool/src/lib.rs mode change 100644 => 100755 tools/deptool/src/main.rs mode change 100644 => 100755 tools/deptool/src/mermaid_generator.rs mode change 100644 => 100755 tools/raspi4/common/docker.mk mode change 100644 => 100755 tools/raspi4/common/format.mk mode change 100644 => 100755 tools/raspi4/common/operating_system.mk mode change 100644 => 100755 tools/raspi4/common/serial/minipush/progressbar_patch.rb mode change 100644 => 100755 ulib/axlibc/.gitignore mode change 100644 => 100755 ulib/axlibc/Cargo.toml mode change 100644 => 100755 ulib/axlibc/build.rs mode change 100644 => 100755 ulib/axlibc/c/assert.c create mode 100755 ulib/axlibc/c/atomic.h create mode 100755 ulib/axlibc/c/atomic_arch.h mode change 100644 => 100755 ulib/axlibc/c/ctype.c mode change 100644 => 100755 ulib/axlibc/c/dirent.c mode change 100644 => 100755 ulib/axlibc/c/dlfcn.c mode change 100644 => 100755 ulib/axlibc/c/fcntl.c mode change 100644 => 100755 ulib/axlibc/c/flock.c mode change 100644 => 100755 ulib/axlibc/c/fnmatch.c mode change 100644 => 100755 ulib/axlibc/c/glob.c create mode 100755 ulib/axlibc/c/grp.c mode change 100644 => 100755 ulib/axlibc/c/ioctl.c mode change 100644 => 100755 ulib/axlibc/c/libgen.c mode change 100644 => 100755 ulib/axlibc/c/libm.c mode change 100644 => 100755 ulib/axlibc/c/libm.h mode change 100644 => 100755 ulib/axlibc/c/locale.c mode change 100644 => 100755 ulib/axlibc/c/log.c mode change 100644 => 100755 ulib/axlibc/c/math.c mode change 100644 => 100755 ulib/axlibc/c/mmap.c create mode 100755 ulib/axlibc/c/netdb.c mode change 100644 => 100755 ulib/axlibc/c/network.c create mode 100755 ulib/axlibc/c/nscd.h create mode 100755 ulib/axlibc/c/nscd_query.c mode change 100644 => 100755 ulib/axlibc/c/pow.c create mode 100755 ulib/axlibc/c/prctl.c mode change 100644 => 100755 ulib/axlibc/c/printf.c mode change 100644 => 100755 ulib/axlibc/c/printf.h mode change 100644 => 100755 ulib/axlibc/c/printf_config.h mode change 100644 => 100755 ulib/axlibc/c/pthread.c mode change 100644 => 100755 ulib/axlibc/c/pwd.c mode change 100644 => 100755 ulib/axlibc/c/resource.c mode change 100644 => 100755 ulib/axlibc/c/sched.c mode change 100644 => 100755 ulib/axlibc/c/select.c create mode 100755 ulib/axlibc/c/semaphore.c create mode 100755 ulib/axlibc/c/sendfile.c mode change 100644 => 100755 ulib/axlibc/c/signal.c mode change 100644 => 100755 ulib/axlibc/c/socket.c mode change 100644 => 100755 ulib/axlibc/c/stat.c create mode 100755 ulib/axlibc/c/statfs.c mode change 100644 => 100755 ulib/axlibc/c/stdio.c mode change 100644 => 100755 ulib/axlibc/c/stdlib.c mode change 100644 => 100755 ulib/axlibc/c/string.c mode change 100644 => 100755 ulib/axlibc/c/syslog.c mode change 100644 => 100755 ulib/axlibc/c/time.c create mode 100755 ulib/axlibc/c/uio.c mode change 100644 => 100755 ulib/axlibc/c/unistd.c mode change 100644 => 100755 ulib/axlibc/c/utsname.c mode change 100644 => 100755 ulib/axlibc/c/wait.c mode change 100644 => 100755 ulib/axlibc/ctypes.h mode change 100644 => 100755 ulib/axlibc/include/arpa/inet.h mode change 100644 => 100755 ulib/axlibc/include/assert.h create mode 100755 ulib/axlibc/include/bits/alltypes.h create mode 100755 ulib/axlibc/include/bits/statfs.h create mode 100755 ulib/axlibc/include/bits/syscall.h create mode 100755 ulib/axlibc/include/byteswap.h create mode 100755 ulib/axlibc/include/crypt.h mode change 100644 => 100755 ulib/axlibc/include/ctype.h mode change 100644 => 100755 ulib/axlibc/include/dirent.h mode change 100644 => 100755 ulib/axlibc/include/dlfcn.h mode change 100644 => 100755 ulib/axlibc/include/endian.h mode change 100644 => 100755 ulib/axlibc/include/errno.h mode change 100644 => 100755 ulib/axlibc/include/fcntl.h mode change 100644 => 100755 ulib/axlibc/include/features.h mode change 100644 => 100755 ulib/axlibc/include/float.h mode change 100644 => 100755 ulib/axlibc/include/fnmatch.h mode change 100644 => 100755 ulib/axlibc/include/glob.h create mode 100755 ulib/axlibc/include/grp.h mode change 100644 => 100755 ulib/axlibc/include/inttypes.h mode change 100644 => 100755 ulib/axlibc/include/ksigaction.h mode change 100644 => 100755 ulib/axlibc/include/langinfo.h mode change 100644 => 100755 ulib/axlibc/include/libgen.h mode change 100644 => 100755 ulib/axlibc/include/limits.h mode change 100644 => 100755 ulib/axlibc/include/locale.h create mode 100755 ulib/axlibc/include/malloc.h mode change 100644 => 100755 ulib/axlibc/include/math.h mode change 100644 => 100755 ulib/axlibc/include/memory.h mode change 100644 => 100755 ulib/axlibc/include/netdb.h mode change 100644 => 100755 ulib/axlibc/include/netinet/in.h mode change 100644 => 100755 ulib/axlibc/include/netinet/tcp.h mode change 100644 => 100755 ulib/axlibc/include/poll.h mode change 100644 => 100755 ulib/axlibc/include/pthread.h mode change 100644 => 100755 ulib/axlibc/include/pwd.h mode change 100644 => 100755 ulib/axlibc/include/regex.h mode change 100644 => 100755 ulib/axlibc/include/sched.h create mode 100755 ulib/axlibc/include/semaphore.h mode change 100644 => 100755 ulib/axlibc/include/setjmp.h mode change 100644 => 100755 ulib/axlibc/include/signal.h mode change 100644 => 100755 ulib/axlibc/include/stdarg.h mode change 100644 => 100755 ulib/axlibc/include/stdbool.h mode change 100644 => 100755 ulib/axlibc/include/stddef.h mode change 100644 => 100755 ulib/axlibc/include/stdint.h mode change 100644 => 100755 ulib/axlibc/include/stdio.h mode change 100644 => 100755 ulib/axlibc/include/stdlib.h mode change 100644 => 100755 ulib/axlibc/include/string.h mode change 100644 => 100755 ulib/axlibc/include/strings.h mode change 100644 => 100755 ulib/axlibc/include/sys/epoll.h create mode 100755 ulib/axlibc/include/sys/eventfd.h mode change 100644 => 100755 ulib/axlibc/include/sys/file.h mode change 100644 => 100755 ulib/axlibc/include/sys/ioctl.h mode change 100644 => 100755 ulib/axlibc/include/sys/mman.h mode change 100644 => 100755 ulib/axlibc/include/sys/param.h mode change 100644 => 100755 ulib/axlibc/include/sys/prctl.h mode change 100644 => 100755 ulib/axlibc/include/sys/resource.h mode change 100644 => 100755 ulib/axlibc/include/sys/select.h create mode 100755 ulib/axlibc/include/sys/sendfile.h mode change 100644 => 100755 ulib/axlibc/include/sys/socket.h mode change 100644 => 100755 ulib/axlibc/include/sys/stat.h create mode 100755 ulib/axlibc/include/sys/statfs.h create mode 100755 ulib/axlibc/include/sys/statvfs.h create mode 100755 ulib/axlibc/include/sys/syscall.h mode change 100644 => 100755 ulib/axlibc/include/sys/sysinfo.h mode change 100644 => 100755 ulib/axlibc/include/sys/time.h mode change 100644 => 100755 ulib/axlibc/include/sys/types.h mode change 100644 => 100755 ulib/axlibc/include/sys/uio.h mode change 100644 => 100755 ulib/axlibc/include/sys/un.h mode change 100644 => 100755 ulib/axlibc/include/sys/utsname.h create mode 100755 ulib/axlibc/include/sys/vfs.h mode change 100644 => 100755 ulib/axlibc/include/sys/wait.h mode change 100644 => 100755 ulib/axlibc/include/syslog.h mode change 100644 => 100755 ulib/axlibc/include/termios.h mode change 100644 => 100755 ulib/axlibc/include/time.h mode change 100644 => 100755 ulib/axlibc/include/unistd.h mode change 100644 => 100755 ulib/axlibc/src/env.rs mode change 100644 => 100755 ulib/axlibc/src/errno.rs mode change 100644 => 100755 ulib/axlibc/src/fd_ops.rs mode change 100644 => 100755 ulib/axlibc/src/fs.rs mode change 100644 => 100755 ulib/axlibc/src/io.rs mode change 100644 => 100755 ulib/axlibc/src/io_mpx.rs mode change 100644 => 100755 ulib/axlibc/src/lib.rs mode change 100644 => 100755 ulib/axlibc/src/malloc.rs mode change 100644 => 100755 ulib/axlibc/src/mktime.rs mode change 100644 => 100755 ulib/axlibc/src/net.rs mode change 100644 => 100755 ulib/axlibc/src/pipe.rs mode change 100644 => 100755 ulib/axlibc/src/pthread.rs mode change 100644 => 100755 ulib/axlibc/src/rand.rs mode change 100644 => 100755 ulib/axlibc/src/resource.rs mode change 100644 => 100755 ulib/axlibc/src/setjmp.rs mode change 100644 => 100755 ulib/axlibc/src/signal.rs mode change 100644 => 100755 ulib/axlibc/src/strftime.rs mode change 100644 => 100755 ulib/axlibc/src/string.rs mode change 100644 => 100755 ulib/axlibc/src/strtod.rs mode change 100644 => 100755 ulib/axlibc/src/sys.rs mode change 100644 => 100755 ulib/axlibc/src/time.rs mode change 100644 => 100755 ulib/axlibc/src/unistd.rs mode change 100644 => 100755 ulib/axlibc/src/utils.rs mode change 100644 => 100755 ulib/axstd/Cargo.toml mode change 100644 => 100755 ulib/axstd/src/env.rs mode change 100644 => 100755 ulib/axstd/src/fs/dir.rs mode change 100644 => 100755 ulib/axstd/src/fs/file.rs mode change 100644 => 100755 ulib/axstd/src/fs/mod.rs mode change 100644 => 100755 ulib/axstd/src/io/mod.rs mode change 100644 => 100755 ulib/axstd/src/io/stdio.rs mode change 100644 => 100755 ulib/axstd/src/lib.rs mode change 100644 => 100755 ulib/axstd/src/macros.rs mode change 100644 => 100755 ulib/axstd/src/net/mod.rs mode change 100644 => 100755 ulib/axstd/src/net/socket_addr.rs mode change 100644 => 100755 ulib/axstd/src/net/tcp.rs mode change 100644 => 100755 ulib/axstd/src/net/udp.rs mode change 100644 => 100755 ulib/axstd/src/os.rs mode change 100644 => 100755 ulib/axstd/src/process.rs mode change 100644 => 100755 ulib/axstd/src/sync/mod.rs mode change 100644 => 100755 ulib/axstd/src/sync/mutex.rs mode change 100644 => 100755 ulib/axstd/src/thread/mod.rs mode change 100644 => 100755 ulib/axstd/src/thread/multi.rs mode change 100644 => 100755 ulib/axstd/src/time.rs diff --git a/.clang-format b/.clang-format old mode 100644 new mode 100755 diff --git a/.github/workflows/actions/setup-musl/action.yml b/.github/workflows/actions/setup-musl/action.yml old mode 100644 new mode 100755 diff --git a/.github/workflows/actions/setup-qemu/action.yml b/.github/workflows/actions/setup-qemu/action.yml old mode 100644 new mode 100755 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml old mode 100644 new mode 100755 diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml old mode 100644 new mode 100755 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml old mode 100644 new mode 100755 diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/Cargo.lock b/Cargo.lock old mode 100644 new mode 100755 index cbb859a16..02488f1ed --- a/Cargo.lock +++ b/Cargo.lock @@ -160,6 +160,13 @@ dependencies = [ "axstd", ] +[[package]] +name = "arceos-systime" +version = "0.1.0" +dependencies = [ + "axstd", +] + [[package]] name = "arceos-tls" version = "0.1.0" @@ -440,6 +447,7 @@ dependencies = [ "axfeat", "axio", "bindgen", + "log", ] [[package]] @@ -1093,6 +1101,7 @@ name = "flatten_objects" version = "0.1.0" dependencies = [ "bitmaps", + "log", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml old mode 100644 new mode 100755 index 4e6a14dc9..f53d6d7fb --- a/Cargo.toml +++ b/Cargo.toml @@ -61,6 +61,7 @@ members = [ "apps/display/draw_map", "apps/exception", "apps/helloworld", + "apps/systime", "apps/memtest", "apps/fs/shell", "apps/net/echoserver", diff --git a/LICENSE.MulanPSL2 b/LICENSE.MulanPSL2 old mode 100644 new mode 100755 diff --git a/Makefile b/Makefile old mode 100644 new mode 100755 index cbfc0d25a..77e20dc2f --- a/Makefile +++ b/Makefile @@ -240,4 +240,4 @@ clean_musl: rm -rf ulib/axmusl/build_* rm -rf ulib/axmusl/install -.PHONY: all build disasm run justrun debug clippy fmt fmt_c test test_no_fail_fast clean clean_c clean_musl doc disk_image +.PHONY: all build disasm run justrun debug clippy fmt fmt_c test test_no_fail_fast clean clean_c clean_musl doc disk_image \ No newline at end of file diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/api/arceos_api/Cargo.toml b/api/arceos_api/Cargo.toml old mode 100644 new mode 100755 diff --git a/api/arceos_api/src/imp/display.rs b/api/arceos_api/src/imp/display.rs old mode 100644 new mode 100755 diff --git a/api/arceos_api/src/imp/fs.rs b/api/arceos_api/src/imp/fs.rs old mode 100644 new mode 100755 diff --git a/api/arceos_api/src/imp/mem.rs b/api/arceos_api/src/imp/mem.rs old mode 100644 new mode 100755 diff --git a/api/arceos_api/src/imp/mod.rs b/api/arceos_api/src/imp/mod.rs old mode 100644 new mode 100755 diff --git a/api/arceos_api/src/imp/net.rs b/api/arceos_api/src/imp/net.rs old mode 100644 new mode 100755 diff --git a/api/arceos_api/src/imp/task.rs b/api/arceos_api/src/imp/task.rs old mode 100644 new mode 100755 diff --git a/api/arceos_api/src/lib.rs b/api/arceos_api/src/lib.rs old mode 100644 new mode 100755 diff --git a/api/arceos_api/src/macros.rs b/api/arceos_api/src/macros.rs old mode 100644 new mode 100755 diff --git a/api/arceos_posix_api/.gitignore b/api/arceos_posix_api/.gitignore old mode 100644 new mode 100755 diff --git a/api/arceos_posix_api/Cargo.toml b/api/arceos_posix_api/Cargo.toml old mode 100644 new mode 100755 diff --git a/api/arceos_posix_api/build.rs b/api/arceos_posix_api/build.rs old mode 100644 new mode 100755 index 6a8d6f7d2..d3815d559 --- a/api/arceos_posix_api/build.rs +++ b/api/arceos_posix_api/build.rs @@ -117,6 +117,7 @@ typedef struct {{ "RLIMIT_.*", "EAI_.*", "MAXADDRS", + "FIO.*", "ITIMER_.*", "SIG.*", "EINVAL", diff --git a/api/arceos_posix_api/ctypes.h b/api/arceos_posix_api/ctypes.h old mode 100644 new mode 100755 index 24907306a..b9227024b --- a/api/arceos_posix_api/ctypes.h +++ b/api/arceos_posix_api/ctypes.h @@ -28,3 +28,4 @@ #include #include #include +#include diff --git a/api/arceos_posix_api/src/imp/fd_ops.rs b/api/arceos_posix_api/src/imp/fd_ops.rs old mode 100644 new mode 100755 index e46283fa4..4b1bfff6e --- a/api/arceos_posix_api/src/imp/fd_ops.rs +++ b/api/arceos_posix_api/src/imp/fd_ops.rs @@ -28,6 +28,7 @@ pub trait FileLike: Send + Sync { fn into_any(self: Arc) -> Arc; fn poll(&self) -> LinuxResult; fn set_nonblocking(&self, nonblocking: bool) -> LinuxResult; + fn set_closeonexec(&self, closeonexec: bool) -> LinuxResult; } lazy_static::lazy_static! { @@ -100,6 +101,8 @@ pub fn sys_dup2(old_fd: c_int, new_fd: c_int) -> c_int { return Err(LinuxError::EBADF); } + close_file_like(new_fd).map(|_| 0); + let f = get_file_like(old_fd)?; FD_TABLE .write() @@ -145,6 +148,10 @@ pub fn sys_fcntl(fd: c_int, cmd: c_int, arg: usize) -> c_int { // TODO: Change fd flags dup_fd(fd) } + ctypes::F_SETFD => { + get_file_like(fd)?.set_closeonexec(arg & (ctypes::O_CLOEXEC as usize) > 0)?; + Ok(0) + } ctypes::F_SETFL => { if fd == 0 || fd == 1 || fd == 2 { return Ok(0); diff --git a/api/arceos_posix_api/src/imp/fs.rs b/api/arceos_posix_api/src/imp/fs.rs old mode 100644 new mode 100755 index 319dca9fd..b75dadb06 --- a/api/arceos_posix_api/src/imp/fs.rs +++ b/api/arceos_posix_api/src/imp/fs.rs @@ -6,9 +6,9 @@ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PSL v2 for more details. */ - +use crate::ctypes::off_t; use alloc::sync::Arc; -use core::ffi::{c_char, c_int}; +use core::ffi::{c_char, c_int, c_size_t, c_ssize_t, c_void}; use axerrno::{LinuxError, LinuxResult}; use axfs::fops::OpenOptions; @@ -43,7 +43,8 @@ impl File { impl FileLike for File { fn read(&self, buf: &mut [u8]) -> LinuxResult { - Ok(self.inner.lock().read(buf)?) + let read_len = self.inner.lock().read(buf)?; + Ok(read_len) } fn write(&self, buf: &[u8]) -> LinuxResult { @@ -82,6 +83,10 @@ impl FileLike for File { fn set_nonblocking(&self, _nonblocking: bool) -> LinuxResult { Ok(()) } + + fn set_closeonexec(&self, _closeonexec: bool) -> LinuxResult { + Ok(()) + } } /// Convert open flags to [`OpenOptions`]. @@ -120,8 +125,25 @@ pub fn sys_open(filename: *const c_char, flags: c_int, mode: ctypes::mode_t) -> debug!("sys_open <= {:?} {:#o} {:#o}", filename, flags, mode); syscall_body!(sys_open, { let options = flags_to_options(flags, mode); - let file = axfs::fops::File::open(filename?, &options)?; - File::new(file).add_to_fd_table() + /*let file = axfs::fops::File::open(filename?, &options)?; + File::new(file).add_to_fd_table()*/ + let res = axfs::fops::File::open(filename?, &options); + match res { + Ok(file) => { + let add_res = File::new(file).add_to_fd_table(); + match add_res { + Ok(num) => Ok(num), + Err(e) => { + error!("sys_open failed in add {}", e); + Err(e.into()) + } + } + } + Err(e) => { + error!("sys_open failed {}", e); + Err(e.into()) + } + } }) } @@ -133,8 +155,25 @@ pub fn sys_openat(_fd: usize, path: *const c_char, flags: c_int, mode: ctypes::m debug!("sys_openat <= {:?}, {:#o} {:#o}", path, flags, mode); syscall_body!(sys_openat, { let options = flags_to_options(flags, mode); - let file = axfs::fops::File::open(path?, &options)?; - File::new(file).add_to_fd_table() + //let file = axfs::fops::File::open(path?, &options)?; + let res = axfs::fops::File::open(path?, &options); + match res { + Ok(file) => { + let add_res = File::new(file).add_to_fd_table(); + match add_res { + Ok(num) => Ok(num), + Err(e) => { + error!("sys_open failed in add {}", e); + Err(e.into()) + } + } + } + Err(e) => { + error!("sys_open failed {}", e); + Err(e.into()) + } + } + //File::new(file).add_to_fd_table() }) } diff --git a/api/arceos_posix_api/src/imp/io.rs b/api/arceos_posix_api/src/imp/io.rs old mode 100644 new mode 100755 diff --git a/api/arceos_posix_api/src/imp/io_mpx/epoll.rs b/api/arceos_posix_api/src/imp/io_mpx/epoll.rs old mode 100644 new mode 100755 index 5323dc6ea..681bd1e0a --- a/api/arceos_posix_api/src/imp/io_mpx/epoll.rs +++ b/api/arceos_posix_api/src/imp/io_mpx/epoll.rs @@ -46,6 +46,7 @@ impl EpollInstance { } fn control(&self, op: usize, fd: usize, event: &ctypes::epoll_event) -> LinuxResult { + info!("lhw debug EpollInstance control"); match get_file_like(fd as c_int) { Ok(_) => {} Err(e) => return Err(e), @@ -53,6 +54,7 @@ impl EpollInstance { match op as u32 { ctypes::EPOLL_CTL_ADD => { + info!("lhw debug EpollInstance control add"); if let Entry::Vacant(e) = self.events.lock().entry(fd) { e.insert(*event); } else { @@ -60,6 +62,7 @@ impl EpollInstance { } } ctypes::EPOLL_CTL_MOD => { + info!("lhw debug EpollInstance control mod"); let mut events = self.events.lock(); if let Entry::Occupied(mut ocp) = events.entry(fd) { ocp.insert(*event); @@ -68,6 +71,7 @@ impl EpollInstance { } } ctypes::EPOLL_CTL_DEL => { + info!("lhw debug EpollInstance control del"); let mut events = self.events.lock(); if let Entry::Occupied(ocp) = events.entry(fd) { ocp.remove_entry(); @@ -85,10 +89,11 @@ impl EpollInstance { fn poll_all(&self, events: &mut [ctypes::epoll_event]) -> LinuxResult { let ready_list = self.events.lock(); let mut events_num = 0; - for (infd, ev) in ready_list.iter() { + //info!("lhw debug EpollInstance ready list loop {}",*infd); match get_file_like(*infd as c_int)?.poll() { Err(_) => { + info!("lhw debug err in poll all"); if (ev.events & ctypes::EPOLLERR) != 0 { events[events_num].events = ctypes::EPOLLERR; events[events_num].data = ev.data; @@ -96,6 +101,7 @@ impl EpollInstance { } } Ok(state) => { + //info!("lhw debug EpollInstance poll all ok {} {} {} {}",state.readable , (ev.events & ctypes::EPOLLIN), state.readable ,(ev.events & ctypes::EPOLLIN)); if state.readable && (ev.events & ctypes::EPOLLIN != 0) { events[events_num].events = ctypes::EPOLLIN; events[events_num].data = ev.data; @@ -109,7 +115,9 @@ impl EpollInstance { } } } + //info!("lhw debug EpollInstance ready list loop {} end",*infd); } + //info!("lhw debug EpollInstance poll all normal return"); Ok(events_num) } } @@ -144,6 +152,10 @@ impl FileLike for EpollInstance { fn set_nonblocking(&self, _nonblocking: bool) -> LinuxResult { Ok(()) } + + fn set_closeonexec(&self, _closeonexec: bool) -> LinuxResult { + Ok(()) + } } /// Creates a new epoll instance. @@ -215,7 +227,37 @@ pub unsafe fn sys_epoll_wait( loop { #[cfg(feature = "net")] axnet::poll_interfaces(); - let events_num = epoll_instance.poll_all(events)?; + let poll_all_res = epoll_instance.poll_all(events); + let mut events_num = 0; + match poll_all_res { + Ok(num) => events_num = num, + Err(e) => { + error!("sys epoll events err {:?}", e); + if e == LinuxError::EBADF { + let mut deleted_fd: usize = 0; + { + let mut ready_list = epoll_instance.events.lock(); + for (infd, ev) in ready_list.iter() { + match get_file_like(*infd as c_int) { + Ok(_) => {} + Err(_) => { + error!("sys epoll deleted fd err {}", *infd); + deleted_fd = *infd; + break; + } + } + } + } + { + let mut events = epoll_instance.events.lock(); + if let Entry::Occupied(ocp) = events.entry(deleted_fd) { + ocp.remove_entry(); + } + } + return Ok(0); + } + } + } if events_num > 0 { return Ok(events_num as c_int); } diff --git a/api/arceos_posix_api/src/imp/io_mpx/mod.rs b/api/arceos_posix_api/src/imp/io_mpx/mod.rs old mode 100644 new mode 100755 diff --git a/api/arceos_posix_api/src/imp/io_mpx/poll.rs b/api/arceos_posix_api/src/imp/io_mpx/poll.rs old mode 100644 new mode 100755 diff --git a/api/arceos_posix_api/src/imp/io_mpx/select.rs b/api/arceos_posix_api/src/imp/io_mpx/select.rs old mode 100644 new mode 100755 diff --git a/api/arceos_posix_api/src/imp/ioctl.rs b/api/arceos_posix_api/src/imp/ioctl.rs index f0f027f39..8c0365bd7 100644 --- a/api/arceos_posix_api/src/imp/ioctl.rs +++ b/api/arceos_posix_api/src/imp/ioctl.rs @@ -7,6 +7,8 @@ * See the Mulan PSL v2 for more details. */ +#[cfg(feature = "fd")] +use crate::imp::fd_ops::get_file_like; use axerrno::LinuxError; use core::ffi::c_int; @@ -15,6 +17,7 @@ pub const TCGETS: usize = 0x5401; pub const TIOCGPGRP: usize = 0x540F; pub const TIOCSPGRP: usize = 0x5410; pub const TIOCGWINSZ: usize = 0x5413; +pub const FIONBIO: usize = 21537; #[derive(Clone, Copy, Default)] pub struct ConsoleWinSize { @@ -28,12 +31,14 @@ pub struct ConsoleWinSize { /// currently only support fd = 1 pub fn sys_ioctl(fd: c_int, request: usize, data: usize) -> c_int { debug!("sys_ioctl <= fd: {}, request: {}", fd, request); - if fd != 1 { - debug!("Only support fd = 1"); - return -1; - } syscall_body!(sys_ioctl, { match request { + FIONBIO => { + unsafe { + get_file_like(fd)?.set_nonblocking(*(data as *const i32) > 0)?; + } + Ok(0) + } TIOCGWINSZ => { let winsize = data as *mut ConsoleWinSize; unsafe { diff --git a/api/arceos_posix_api/src/imp/mod.rs b/api/arceos_posix_api/src/imp/mod.rs old mode 100644 new mode 100755 diff --git a/api/arceos_posix_api/src/imp/net.rs b/api/arceos_posix_api/src/imp/net.rs old mode 100644 new mode 100755 index be4b94b46..28bcba6b4 --- a/api/arceos_posix_api/src/imp/net.rs +++ b/api/arceos_posix_api/src/imp/net.rs @@ -177,6 +177,10 @@ impl FileLike for Socket { } Ok(()) } + + fn set_closeonexec(&self, _closeonexec: bool) -> LinuxResult { + Ok(()) + } } impl From for ctypes::sockaddr_in { @@ -412,6 +416,7 @@ pub fn sys_recv( socket_fd, buf_ptr as usize, len, flag ); syscall_body!(sys_recv, { + info!("lhw debug in sys_recv"); if buf_ptr.is_null() { return Err(LinuxError::EFAULT); } diff --git a/api/arceos_posix_api/src/imp/pipe.rs b/api/arceos_posix_api/src/imp/pipe.rs old mode 100644 new mode 100755 index 98b84ef36..3823a1ad5 --- a/api/arceos_posix_api/src/imp/pipe.rs +++ b/api/arceos_posix_api/src/imp/pipe.rs @@ -197,6 +197,10 @@ impl FileLike for Pipe { fn set_nonblocking(&self, _nonblocking: bool) -> LinuxResult { Ok(()) } + + fn set_closeonexec(&self, _closeonexec: bool) -> LinuxResult { + Ok(()) + } } /// Create a pipe diff --git a/api/arceos_posix_api/src/imp/pthread/condvar.rs b/api/arceos_posix_api/src/imp/pthread/condvar.rs old mode 100644 new mode 100755 diff --git a/api/arceos_posix_api/src/imp/pthread/mod.rs b/api/arceos_posix_api/src/imp/pthread/mod.rs old mode 100644 new mode 100755 diff --git a/api/arceos_posix_api/src/imp/pthread/mutex.rs b/api/arceos_posix_api/src/imp/pthread/mutex.rs old mode 100644 new mode 100755 diff --git a/api/arceos_posix_api/src/imp/pthread/tsd.rs b/api/arceos_posix_api/src/imp/pthread/tsd.rs old mode 100644 new mode 100755 diff --git a/api/arceos_posix_api/src/imp/resources.rs b/api/arceos_posix_api/src/imp/resources.rs old mode 100644 new mode 100755 diff --git a/api/arceos_posix_api/src/imp/signal.rs b/api/arceos_posix_api/src/imp/signal.rs old mode 100644 new mode 100755 diff --git a/api/arceos_posix_api/src/imp/stdio.rs b/api/arceos_posix_api/src/imp/stdio.rs old mode 100644 new mode 100755 index 9f541bd70..62bdf9219 --- a/api/arceos_posix_api/src/imp/stdio.rs +++ b/api/arceos_posix_api/src/imp/stdio.rs @@ -140,6 +140,10 @@ impl super::fd_ops::FileLike for Stdin { fn set_nonblocking(&self, _nonblocking: bool) -> LinuxResult { Ok(()) } + + fn set_closeonexec(&self, _closeonexec: bool) -> LinuxResult { + Ok(()) + } } #[cfg(feature = "fd")] @@ -176,4 +180,8 @@ impl super::fd_ops::FileLike for Stdout { fn set_nonblocking(&self, _nonblocking: bool) -> LinuxResult { Ok(()) } + + fn set_closeonexec(&self, _closeonexec: bool) -> LinuxResult { + Ok(()) + } } diff --git a/api/arceos_posix_api/src/imp/sys.rs b/api/arceos_posix_api/src/imp/sys.rs old mode 100644 new mode 100755 diff --git a/api/arceos_posix_api/src/imp/task.rs b/api/arceos_posix_api/src/imp/task.rs old mode 100644 new mode 100755 diff --git a/api/arceos_posix_api/src/imp/time.rs b/api/arceos_posix_api/src/imp/time.rs old mode 100644 new mode 100755 diff --git a/api/arceos_posix_api/src/lib.rs b/api/arceos_posix_api/src/lib.rs old mode 100644 new mode 100755 index 29db61b26..1e523393d --- a/api/arceos_posix_api/src/lib.rs +++ b/api/arceos_posix_api/src/lib.rs @@ -17,6 +17,7 @@ #![feature(doc_cfg)] #![feature(doc_auto_cfg)] #![allow(clippy::missing_safety_doc)] +#![feature(c_size_t)] #[macro_use] extern crate axlog; diff --git a/api/arceos_posix_api/src/utils.rs b/api/arceos_posix_api/src/utils.rs old mode 100644 new mode 100755 diff --git a/api/axfeat/Cargo.toml b/api/axfeat/Cargo.toml old mode 100644 new mode 100755 diff --git a/api/axfeat/src/lib.rs b/api/axfeat/src/lib.rs old mode 100644 new mode 100755 diff --git a/apps/.gitignore b/apps/.gitignore old mode 100644 new mode 100755 diff --git a/apps/c/envtest/expect_info.out b/apps/c/envtest/expect_info.out old mode 100644 new mode 100755 diff --git a/apps/c/envtest/features.txt b/apps/c/envtest/features.txt old mode 100644 new mode 100755 diff --git a/apps/c/envtest/main.c b/apps/c/envtest/main.c old mode 100644 new mode 100755 diff --git a/apps/c/envtest/test_cmd b/apps/c/envtest/test_cmd old mode 100644 new mode 100755 diff --git a/apps/c/filetest/expect_info.out b/apps/c/filetest/expect_info.out old mode 100644 new mode 100755 diff --git a/apps/c/filetest/features.txt b/apps/c/filetest/features.txt old mode 100644 new mode 100755 diff --git a/apps/c/filetest/main.c b/apps/c/filetest/main.c old mode 100644 new mode 100755 diff --git a/apps/c/filetest/test_cmd b/apps/c/filetest/test_cmd old mode 100644 new mode 100755 diff --git a/apps/c/helloworld/expect_info.out b/apps/c/helloworld/expect_info.out old mode 100644 new mode 100755 diff --git a/apps/c/helloworld/expect_info_smp4.out b/apps/c/helloworld/expect_info_smp4.out old mode 100644 new mode 100755 diff --git a/apps/c/helloworld/main.c b/apps/c/helloworld/main.c old mode 100644 new mode 100755 diff --git a/apps/c/helloworld/test_cmd b/apps/c/helloworld/test_cmd old mode 100644 new mode 100755 diff --git a/apps/c/httpclient/axbuild.mk b/apps/c/httpclient/axbuild.mk old mode 100644 new mode 100755 diff --git a/apps/c/httpclient/expect_info.out b/apps/c/httpclient/expect_info.out old mode 100644 new mode 100755 diff --git a/apps/c/httpclient/features.txt b/apps/c/httpclient/features.txt old mode 100644 new mode 100755 diff --git a/apps/c/httpclient/httpclient.c b/apps/c/httpclient/httpclient.c old mode 100644 new mode 100755 diff --git a/apps/c/httpclient/test_cmd b/apps/c/httpclient/test_cmd old mode 100644 new mode 100755 diff --git a/apps/c/httpserver/axbuild.mk b/apps/c/httpserver/axbuild.mk old mode 100644 new mode 100755 diff --git a/apps/c/httpserver/features.txt b/apps/c/httpserver/features.txt old mode 100644 new mode 100755 diff --git a/apps/c/httpserver/httpserver.c b/apps/c/httpserver/httpserver.c old mode 100644 new mode 100755 diff --git a/apps/c/iperf/.gitignore b/apps/c/iperf/.gitignore old mode 100644 new mode 100755 diff --git a/apps/c/iperf/README.md b/apps/c/iperf/README.md old mode 100644 new mode 100755 diff --git a/apps/c/iperf/axbuild.mk b/apps/c/iperf/axbuild.mk old mode 100644 new mode 100755 diff --git a/apps/c/iperf/features.txt b/apps/c/iperf/features.txt old mode 100644 new mode 100755 diff --git a/apps/c/iperf/iperf.patch b/apps/c/iperf/iperf.patch old mode 100644 new mode 100755 diff --git a/apps/c/memtest/axbuild.mk b/apps/c/memtest/axbuild.mk old mode 100644 new mode 100755 diff --git a/apps/c/memtest/expect_trace.out b/apps/c/memtest/expect_trace.out old mode 100644 new mode 100755 diff --git a/apps/c/memtest/features.txt b/apps/c/memtest/features.txt old mode 100644 new mode 100755 diff --git a/apps/c/memtest/memtest.c b/apps/c/memtest/memtest.c old mode 100644 new mode 100755 diff --git a/apps/c/memtest/test_cmd b/apps/c/memtest/test_cmd old mode 100644 new mode 100755 diff --git a/apps/c/nginx/.gitignore b/apps/c/nginx/.gitignore new file mode 100755 index 000000000..ba4408f47 --- /dev/null +++ b/apps/c/nginx/.gitignore @@ -0,0 +1,2 @@ +nginx-app +*.img \ No newline at end of file diff --git a/apps/c/nginx/axbuild.mk b/apps/c/nginx/axbuild.mk new file mode 100755 index 000000000..bfb3e5f31 --- /dev/null +++ b/apps/c/nginx/axbuild.mk @@ -0,0 +1,33 @@ +#nginx-version := 1.24.0 +#nginx-dir := $(APP)/nginx-$(nginx-version) +#nginx-objs := nginx-$(nginx-version)/objs/nginx_app.o +nginx-dir := $(APP)/nginx-app +nginx-objs := nginx-app/objs/nginx_app.o + +app-objs := $(nginx-objs) + +CFLAGS += -Wno-format + +nginx-build-args := \ + CC=$(CC) \ + CFLAGS="$(CFLAGS)" \ + USE_JEMALLOC=no \ + -j + +ifneq ($(V),) + nginx-build-args += V=$(V) +endif + +$(nginx-dir): + git clone https://github.com/lhw2002426/nginx-app.git $(APP)/nginx-app + @echo "Download nginx source code" + +$(APP)/$(nginx-objs): build_nginx + +build_nginx: $(nginx-dir) + cd $(nginx-dir) && $(MAKE) $(nginx-build-args) + +clean_c:: + $(MAKE) -C $(nginx-dir) distclean + +.PHONY: build_nginx clean_c diff --git a/apps/c/nginx/create_nginx_img.sh b/apps/c/nginx/create_nginx_img.sh new file mode 100755 index 000000000..657982c3e --- /dev/null +++ b/apps/c/nginx/create_nginx_img.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +# From https://github.com/rafalh/rust-fatfs/blob/master/scripts/create-test-img.sh + +CUR_DIR=`dirname $0` + +echo $OUT_DIR +current_dir=$(pwd) +parent_dir1=$(dirname "$current_dir") +parent_dir2=$(dirname "$parent_dir1") +parent_dir3=$(dirname "$parent_dir2") + +create_test_img() { + local name=$1 + local blkcount=$2 + local fatSize=$3 + dd if=/dev/zero of="$name" bs=1024 count=$blkcount + mkfs.vfat -s 1 -F $fatSize -n "Test!" -i 12345678 "$name" + mkdir -p mnt + sudo mount -o loop "$name" mnt -o rw,uid=$USER,gid=$USER + mkdir -p "mnt/nginx/logs" + mkdir -p "mnt/etc" + echo "" >> "mnt/etc/localtime" + echo "root:x:0:0:root:/root:/bin/bash" >> "mnt/etc/passwd" + echo "root:x:0:" >> "mnt/etc/group" +# echo "" >> "mnt/nginx/logs/error.log" + mkdir -p "mnt/nginx/conf" + cp "$CUR_DIR/nginx.conf" "mnt/nginx/conf/nginx.conf" + cp "$CUR_DIR/mime.types" "mnt/nginx/conf/mime.types" + mkdir -p "mnt/html" + cp -r "$CUR_DIR/html" "mnt/" + sudo umount mnt +} + +create_test_img "$CUR_DIR/fat16.img" 2500 16 +create_test_img "$CUR_DIR/fat32.img" 40000 32 +echo $parent_dir3 +rm -f $parent_dir3/disk.img +cp fat32.img $parent_dir3/disk.img diff --git a/apps/c/nginx/features.txt b/apps/c/nginx/features.txt new file mode 100755 index 000000000..50b26cd31 --- /dev/null +++ b/apps/c/nginx/features.txt @@ -0,0 +1,13 @@ +alloc +paging +fp_simd +irq +multitask +fs +blkfs +net +pipe +epoll +poll +select +virtio-9p \ No newline at end of file diff --git a/apps/c/nginx/html/README.md b/apps/c/nginx/html/README.md new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/apps/c/nginx/html/README.md @@ -0,0 +1 @@ + diff --git a/apps/c/nginx/html/_404.md b/apps/c/nginx/html/_404.md new file mode 100644 index 000000000..c42d46c76 --- /dev/null +++ b/apps/c/nginx/html/_404.md @@ -0,0 +1 @@ +Oops, not found... diff --git a/apps/c/nginx/html/_coverpage.md b/apps/c/nginx/html/_coverpage.md new file mode 100644 index 000000000..21a5a2dfe --- /dev/null +++ b/apps/c/nginx/html/_coverpage.md @@ -0,0 +1,16 @@ +![](_media/logo.svg ':size=120x120') + +# syswonder 矽望泛在操作系统社区 + +> 针对实时非实时任务混合运行的边缘计算场景 + +> 面向非对称多处理器SoC(MCU, CPU, DSP等)硬件平台 + +> 用内存安全的Rust语言构建安全、高效、专用的新型态泛在操作系统 + +[ GitHub](https://github.com/syswonder) +[ 技术文档](https://report.syswonder.org) +[了解更多 ](#main) + + +![](_media/bg-bluesea.jpg) diff --git a/apps/c/nginx/html/_media/bg-bluesea.jpg b/apps/c/nginx/html/_media/bg-bluesea.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a9492ecb4404549e18bebe00471f891bd6f24ec4 GIT binary patch literal 122531 zcmbrlbyyrhv*?YxTYvz;WpVcecU|0dan}S(f_rfH#oe6*ci+V!xLfc5f!xhG@44rG ze}6TzGyTj{-P6CS?y8=7X8$h#-GakYl2ep}gNKKMQ-E!7f4AXcWk1^6z`?1i!U5pm z;LzZZ;R)anVI_Fj1_w_Lhx}h9C=YIlg`Csk- zoDmD)|F^{gg#Xb-f-6A$pE5$#ziNN`;qcKAs*vCi;c4Lz@Zk~h;r|Z8y@R!d4F6y9 zPYEW72uSeAa44u~=opwVg#kP`ctqGWL?jd>R1_pM6i;{rI7ECT0vcp)LRvf&NlhLi z3wJuyuhfZB#DzfK26{^_l0J_)=_I~jv~4X32CFyxzmh$RG-Mh>t{AlitW&)D&F4eG zq;5M*vVx!{9q;1Qfv{_coX?kCd0m@kbPO_bW)^^uu!w@9lAgYSp{1tq0r{L&GDZW8<^Xg~g@imDR1i{e#1!tUOEdYVs{|lR}K2aLg@w)R7-xXUvmuReKOk~S8sx?1l$;9wUd~N=3&Mo{Vxtd z7>Jxa3`IxxAB;7~<{yuzm$%P9rY|9(VgJpQoRa$AXyD@iz%@2C|A()C;C~1q|AV-* z`ya^b|4X?BCk=-HBY=4d85s%XpP-?kqN1T;qhr7}Y(gv?EZ9znPlS&P`%#e+6O&TW zQBqLS0T>tn{5<@!vc`X5jllo^Ze$e>3-Q0qhYuTErwJ`DGy6M|Ef_kLZ;H9xlciEE z2?@VOvdLm9ebtxu4D!#F>5Pu6N2$-G@2`$0f;ylNhrwR)0jEMpps)t2MUa~%5m@^>?YRjFEA|;?)J;%{A;{P(-p2L`=_U1D`Qo&{xp+Hc~iDc~~L#3tlq)z=R4xYAL*QVhUPL;X>_uYYd8LL`k58 zM!QpZgc|WN;}HXCbECACZUk=|rNjD|9Je(ydfb59>uiau=n0dZ-h|XwUGfkm4~4Pi z+EvS(YI;cmx$!SrWk3S$xA+X$c;&h>wPQH>;27W#O7Ky8m6g>h(X zjiM$=EjsfMZHR1eEIYT#_WYoX1iBax!zYI;Oa&0OhTV7;1_gb2;|_u%P>;r)h`t;k z%z+0qmPqNq+f~GG9zqk7(2z-$0t4|h6H-!niqNtoM$yDzpX!?a#n7%FtMXr@G()_|gIHlF$z zBPIkHe40YdNNsymkhxa#2!p#~*a;QAgkw}RloutEo`uR-qfp6Qh+aw|Q!jKsI3bgW zMo9T!6)Rk(AgWl>3#r9?Y$79$5xO1|ErpeZm8^uuMusj>Iqcmg%&I;Xt-6r zwJfczN^c{n(U&AaA4S8$@rA&vm&J{zT+$tT-ntRz4VTMXl6}cY+CqoxcPL3mDT5?6 zm0e;a8Qey(o^Uy|R9&=roCQ2|DB7j)92k}gSj4n^ePn*gQKd3fXjX;_QQA@pWJr}R z<(+hv9N`)&b)pK^I~F)PRSfz(1l{9Nt5M8`%~A)UC3gLK)FrH6ERa-C(<2Ftse2WH z8bS#YTZsygqH^shVLxU?+QiiIPxgS&Iv}0`fG?Sht2s(oKXjjwj6NfVfSRrS%e+3d z64H+C~;jKDZ!46J=I2frgkp0dJqJCTW{5C5bp`Wed$A`I|9$`SQUS z2g>qOklOy;65W>(0%9$I1|2Y!M<<0$#7%@Kn%0AkE+Iv%EejYHDaPP1HecSiCcz1X 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

$!m0gA|Ho;wfdX46to8(Zd_~|uq3wRs@(boh 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 literal 0 HcmV?d00001 diff --git a/apps/c/nginx/html/_media/car-ee.svg b/apps/c/nginx/html/_media/car-ee.svg new file mode 100644 index 000000000..9ea305a99 --- /dev/null +++ b/apps/c/nginx/html/_media/car-ee.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/c/nginx/html/_media/communities.svg b/apps/c/nginx/html/_media/communities.svg new file mode 100644 index 000000000..311f62f5c --- /dev/null +++ b/apps/c/nginx/html/_media/communities.svg @@ -0,0 +1,4 @@ + + + +
Syswonder
矽望开源社区
Syswonder...
面向不同应用场景的泛在操作系统
面向不同应用场景的泛在操作系统
rcore-os
开源社区
rcore-os...
learningOS
开源社区
learningOS...
基于Rust的操作系统技术探索
基于Rust的操作系统技术探索
开源操作系统教育
开源操作系统教育
Text is not SVG - cannot display
\ No newline at end of file diff --git a/apps/c/nginx/html/_media/custom.css b/apps/c/nginx/html/_media/custom.css new file mode 100644 index 000000000..e8fb9ac70 --- /dev/null +++ b/apps/c/nginx/html/_media/custom.css @@ -0,0 +1,49 @@ +.card { + box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2); + max-width: 300px; + margin: auto; + text-align: center; + padding:16px; +} + +/* Add rounded corners to the top left and the top right corner of the image */ +.card-img { + border-radius: 5px 5px 0 0; +} + +/* Float four columns side by side */ +.card-column { + float: left; + width: 25%; + padding: 0px 10px; +} + +/* Remove extra left and right margins, due to padding in columns */ +.card-row {margin: 0 -5px;} + +/* Clear floats after the columns */ +.card-row:after { + content: ""; + display: table; + clear: both; +} + +/* Responsive columns - one column layout (vertical) on small screens */ +@media screen and (max-width: 600px) { + .card-column { + width: 100%; + display: block; + margin-bottom: 20px; + } +} + +.footer { + padding: 2.5rem; + border-top: 1px solid #eaecef; + text-align: center; + color:#4e6e8e +} + +.sidebar>h1 a img{ + max-width: 120px; +} diff --git a/apps/c/nginx/html/_media/favicon.ico b/apps/c/nginx/html/_media/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..5312bde0e46318c6cc442d68bf0c85bbbc62a84c GIT binary patch literal 15406 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 literal 0 HcmV?d00001 diff --git a/apps/c/nginx/html/_media/logo.png b/apps/c/nginx/html/_media/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a529ca891861078e03f51124f6dec2f5c2b298e1 GIT binary patch literal 15865 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 L#=6DYxUl~NP0{Ih literal 0 HcmV?d00001 diff --git a/apps/c/nginx/html/_media/logo.svg b/apps/c/nginx/html/_media/logo.svg new file mode 100644 index 000000000..595e88415 --- /dev/null +++ b/apps/c/nginx/html/_media/logo.svg @@ -0,0 +1 @@ +矽望logo \ No newline at end of file diff --git a/apps/c/nginx/html/_media/os20years.svg b/apps/c/nginx/html/_media/os20years.svg new file mode 100644 index 000000000..42c4cf394 --- /dev/null +++ b/apps/c/nginx/html/_media/os20years.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/c/nginx/html/_media/overview.svg b/apps/c/nginx/html/_media/overview.svg new file mode 100644 index 000000000..6da898419 --- /dev/null +++ b/apps/c/nginx/html/_media/overview.svg @@ -0,0 +1,4 @@ + + + +







...
Asymmetric multiprocessing SoC hardware
Asymmetric multiprocessing SoC hardware
CPU
ARM A9
CPU...
MCU
MCU
CPU
CPU
GPU/NPU
GPU/NPU
DSP
DSP
I/O Devices
I/O Devices
Type 1 Hypervisor (separation kernel)
Type 1 Hypervisor (separation kernel)
linux
linux
management apps
management apps
syscall
syscall
zone0
zone0
lib-linux
lib-linux
libs-4-webcam
libs-4-webcam
single Linux app: webcam
single Linux app: webcam
funcall
funcall
unikernel os: single address space
unikernel os: single address space
zoneU
zoneU
lib-xiuos
lib-xiuos
realtime app
realtime app
zoneR
zoneR
funcall
funcall
zoneU
zoneU
unikernel os
unikernel os
Linux app
Linux app
lib-linux
lib-linux
funcall
funcall
RTOS
RTOS
Linux
Linux
Text is not SVG - cannot display
\ No newline at end of file diff --git a/apps/c/nginx/html/_media/qrcode_4_ubiquitousos.jpg b/apps/c/nginx/html/_media/qrcode_4_ubiquitousos.jpg new file mode 100644 index 0000000000000000000000000000000000000000..721aa535a4d1afcd384cf20eee572e8d8d6588cf GIT binary patch literal 27901 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 + + +
syswonder
syswonder
Text is not SVG - cannot display
\ No newline at end of file diff --git a/apps/c/nginx/html/_navbar.md b/apps/c/nginx/html/_navbar.md new file mode 100644 index 000000000..542627367 --- /dev/null +++ b/apps/c/nginx/html/_navbar.md @@ -0,0 +1,12 @@ +- [首页](/) +- [动态](/news/) +- [项目](/projects.md) +- [课程](/courses.md) +- 关于 + - [简介](/intro.md) + - [泛在操作系统](/uos.md) + - [社区组织](/community.md) + - [如何协作](/contrib.md) + - [联系我们](/contact.md) +- [:uk: English](/en/) + diff --git a/apps/c/nginx/html/_sidebar.md b/apps/c/nginx/html/_sidebar.md new file mode 100644 index 000000000..fb9762a5a --- /dev/null +++ b/apps/c/nginx/html/_sidebar.md @@ -0,0 +1,8 @@ + + +* [介绍](/intro.md) +* [动态](/news/news.md) +* [项目](/projects.md) +* [课程](/courses.md) +* [社区](/community.md) +* [协作](/contrib.md) diff --git a/apps/c/nginx/html/community.md b/apps/c/nginx/html/community.md new file mode 100644 index 000000000..90827cf0e --- /dev/null +++ b/apps/c/nginx/html/community.md @@ -0,0 +1,135 @@ +# 矽望开源社区 + +## 关于矽望社区 + +矽望社区和清华大学陈渝教授创建的rcore-os社区及learningOS社区互相支持,各有侧重。 + +矽望syswonder社区致力于泛在操作系统的开源发展与建设,关注面向不同应用场景的泛在操作系统构建及应用技术,推动泛在操作系统在不同领域的落地。矽望社区很多项目技术及参考实现来自rcore-os社区,贡献者培育及课程训练等主要依托learningOS社区。rcore-os主要探索基于Rust语言的系统软件(主要是Kernel、Hypervisor、Runtime、Driver等)设计与构造的新思路,learningos主要培养操作系统人才。三个社区相互支持与帮助,共同推动操作系统的发展。 + + + +![](_media/communities.svg) + +### rcore-os社区 + +[rcore-os开源社区](https://github.com/rcore-os/)主要包含了清华大学和国内外开源爱好者从2018年以来用Rust语言开发操作系统内核和其它相关组件的OS教学和科研探索。主要包括: + + - [用于教学的rCore-Tutorial v3 kernel](https://github.com/rcore-os/rCore-Tutorial-v3) + - [基于rCore-Tutorial v3 kernel的OS教材](https://github.com/rcore-os/rCore-Tutorial-Book-v3/) + - [支持Linux syscall的rCore kernel](https://github.com/rcore-os/rCore) + - [支持Linux/Zircon syscall的zCore kernel](https://github.com/rcore-os/zCore) + - [简单的Hypervisor:RVM](https://github.com/rcore-os/RVM) + - [组件化kernel框架:arceos](https://github.com/rcore-os/arceos) + +以及各种奇怪的OS、hypervisor、runtime、driver、与OS无关并可用于组合出不同OS的组件等(驱动,文件系统、网络协议栈等)。 + +### learningOS社区 + +[开源操作系统训练营learningOS](https://github.com/learningOS)作为一个面向OS教育的开源社区,致力于培养操作系统人才。它将建立一种长期持续发展的操作系统训练营模式,即各种操作系统相关的学习资源都开源并整理集中在一起,导师/助教和学生/爱好者之间基于要做的实验或项目不定期/定期的进行交流。学生/爱好者完成了一定程度的学习和训练后,除了自身得到能力的提升外,还可获得相关证书和就业/学习等机会和相关推荐等,推动他在未来的进一步发展。目前的主要项目包括: + +- [操作系统课程slides](https://github.com/LearningOS/os-lectures) +- [开源操作系统训练营课程](https://github.com/LearningOS/rust-based-os-comp2023) +- [Rust编程训练课程](https://github.com/LearningOS/rustlings) +- [内核实现比赛课程](https://github.com/LearningOS/oscomp-kernel-training) + +## 矽望社区文档 + +文档主仓库在 [https://github.com/syswonder/report](https://github.com/syswonder/report),提交报告的方法和[提交代码的方法](contrib.md)一致。 + +文档可以在线查看,可以访问 [https://report.syswonder.org](https://report.syswonder.org), 或者 [https://syswonder.github.io/report](https://syswonder.github.io/report) + + + +## 矽望开源技术委员会 + +

+ + +
+
+ caodg +
+

曹东刚

+

北京大学

+ 更多 +
+
+
+ +
+
+ ck +
+

陈康

+

清华大学

+ 更多 +
+
+
+
+ +--- + +
+
+
+ gy +
+

郭耀

+

北京大学

+ 更多 +
+
+
+ +
+
+ ld +
+

李栋

+

中科院计算所

+ 更多 +
+
+
+ + +
+
+ xdl +
+

薛栋梁

+

上海交通大学

+ 更多 +
+
+
+
+ +--- + +
+
+
+ zyw +
+

赵永望

+

浙江大学

+ 更多 +
+
+
+ +
+ + + diff --git a/apps/c/nginx/html/contact.md b/apps/c/nginx/html/contact.md new file mode 100644 index 000000000..219ff63cc --- /dev/null +++ b/apps/c/nginx/html/contact.md @@ -0,0 +1,25 @@ +# 联系我们 + + **开源仓库** + +主仓库在 Github [https://github.com/syswonder](https://github.com/syswonder) + +如果您有意参与项目开发,请将其下的项目设置为upstream + +我们在GitLink https://gitlink.org.cn/syswonder 也有镜像 + + **邮件列表** + +请访问 [https://maillist.syswonder.org](https://maillist.syswonder.org) +加入感兴趣项目的邮件列表,一起讨论。 + +邮件列表是推荐的交流方式。 + + + **微信公众号** + +重要信息将通过微信公众号“**泛在操作系统**”发布 + +![](_media/qrcode_4_ubiquitousos.jpg) + + diff --git a/apps/c/nginx/html/contrib.md b/apps/c/nginx/html/contrib.md new file mode 100644 index 000000000..eec751120 --- /dev/null +++ b/apps/c/nginx/html/contrib.md @@ -0,0 +1,95 @@ +# 如何用git协作 + +假定: + +- 你的github账号为 panda + +- 要贡献的上游仓库为 https://github.com/syswonder/syswonder-web.git + +- 你的个人主库为 https://github.com/panda/syswonder-web + +**1. Fork repo** + +在浏览器中打开上游主库 https://github.com/syswonder/syswonder-web + +点击右上角的"Fork" 按钮 + +**2. Clone repo** + +将Fork得到的个人主库 clone到本地 + +```bash +git clone https://github.com/panda/syswonder-web +``` + +!> 请记得将panda替换为您自己的用户名 + + +```bash +# 设置 upstream +git remote add upstream https://github.com/syswonder/syswonder-web.git +# 禁止直接向 upstream 推送代码 +git remote set-url --push upstream no_push +``` + +**3. work, commit & push** + +多人协作不要在主分支main上工作,要另建工作分支。 + +为本次工作创建一个分支,命名为 `dev` + +```bash +git checkout -b dev +``` + +此时就可以在该分支下工作了, 不断修改代码,不断 commit + +```bash +git add . + +git commit -m "your commit message" +``` + +如果经过测试,觉得在本地完成了代码工作,就可以将代码推送到自己的个人主库 +中了。 + +```bash +git push origin dev +``` + +push到自己的个人主库中后,就可以准备创建`Pull Request`了。 + +**4. pull request** + +为防冲突,先同步upstream + +```bash +git fetch upstream +git merge upstream/main +``` + +此时请确保本地位于工作分支。如果合并过程有冲突,要负责解决冲突,并提交。 + +将消解了冲突的最新本地代码,推送到个人主库的dev分支。 + +```bash +git push origin dev +``` + +到自己个人主库的首页, 准备 **Pull Request** , + +base repo 选择 syswonder/syswonder-web main + +head repo 选择 panda/syswonder-web dev + +提交,等待上游库管理员审核。 + +**5. sync origin main** + +```bash +git fetch upstream +git checkout main +git merge upstream/main +git push origin main +git checkout dev +``` diff --git a/apps/c/nginx/html/courses.md b/apps/c/nginx/html/courses.md new file mode 100644 index 000000000..7abd7e0d9 --- /dev/null +++ b/apps/c/nginx/html/courses.md @@ -0,0 +1,44 @@ +# 矽望开源课程 + +矽望社区开源课程目前主要依托社区参与人员作为教师主讲的各类课程,这些课程的相关资源均对外开放。 + +## 开源操作系统训练营 + + **当前课程: 2023春夏季开源OS训练营第三阶段 ArceOS** + +时间:2023年5月8日-5月26日 + +详情与报名:[https://os2edu.cn/course/109](https://os2edu.cn/course/109) + +**训练营资源** + +[https://github.com/learningOS](https://github.com/learningOS) + +!> 希望参与矽望社区项目的开发但之前没有相关开发经验的朋友,建议参加开源操作系统训练营,或自学[以往的训练营资料](https://github.com/learningOS)。 + +邮件列表:[rustos-tutorial@syswonder.org](https://maillist.syswonder.org/mailman3/lists/rustos-tutorial.syswonder.org/) + + +## Rust实现OS课程 + +本课程内容来自清华大学计算机系向勇、陈渝等老师开设主讲的操作系统课程。 + +OS 课程是计算机专业核心课,从计算机系统的视角进行内容组织与调整,以教学操 +作系统uCore/rCore和risc-v CPU为实验环境,讲授操作系统的概念、基本原理和 +实现技术,帮助学生了解和掌握大型复杂系统软件的分析方法和核心设计思路,并 +为学生充分利用操作系统功能进行应用软件研究和开发打下扎实的基础。 + +目前包括三部分内容: + +- **讲义** + +[ https://github.com/rcore-os/os-lectures](https://github.com/rcore-os/os-lectures/) + +- **教材** + +[ https://github.com/rcore-os/rCore-Tutorial-Book-v3](https://github.com/rcore-os/rCore-Tutorial-Book-v3) + +- **实验** + +[ https://github.com/rcore-os/rCore-Tutorial-v3](https://github.com/rcore-os/rCore-Tutorial-v3) + diff --git a/apps/c/nginx/html/en/_coverpage.md b/apps/c/nginx/html/en/_coverpage.md new file mode 100644 index 000000000..7e3f782fe --- /dev/null +++ b/apps/c/nginx/html/en/_coverpage.md @@ -0,0 +1,15 @@ +![](../_media/logo.svg ':size=120x120') + +# SYSWONDER Ubiquitous Operating System Community + +> For edge computing scenaros with mixed real-time and non-real-time jobs + +> On asymmetric multile processors SoC(MCU, CPU, DSP, etc) hardware + +> Building safe and efficent new ubiquitous OS in memory-safe Rust language + +[ GitHub](https://github.com/syswonder) +[ TechReports](https://report.syswonder.org) +[Readme ](#main) + +![](../_media/bg-bluesea.jpg) diff --git a/apps/c/nginx/html/en/_navbar.md b/apps/c/nginx/html/en/_navbar.md new file mode 100644 index 000000000..29755580f --- /dev/null +++ b/apps/c/nginx/html/en/_navbar.md @@ -0,0 +1,6 @@ +- [Home](/en/) +- [Introduction](/en/intro.md) +- [Projects](/en/projects.md) +- [Community](/en/community.md) +- [Contact](/en/contact.md) +- [:cn: 中文](/) diff --git a/apps/c/nginx/html/en/_sidebar.md b/apps/c/nginx/html/en/_sidebar.md new file mode 100644 index 000000000..7a8a33000 --- /dev/null +++ b/apps/c/nginx/html/en/_sidebar.md @@ -0,0 +1,5 @@ + + +* [Intro](/en/intro.md) +* [Community](/en/community.md) +* [Contact](/en/contact.md) diff --git a/apps/c/nginx/html/en/community.md b/apps/c/nginx/html/en/community.md new file mode 100644 index 000000000..b66d15d88 --- /dev/null +++ b/apps/c/nginx/html/en/community.md @@ -0,0 +1,17 @@ +# Syswonder Open Source Community + +## Open Source Technical Community + +**Chair** + +- Yu Chen, Tsinghua University + +**Members** + +- Donggang Cao, Peking University +- Kang Chen, Tsinghua University +- Yao Guo, Peking University +- Dong Li, Institute of Computing Technology, Chinese Academy of Sciences +- Dongliang Xue, Advanced Institute of Information Technology, Peking University + + diff --git a/apps/c/nginx/html/en/contact.md b/apps/c/nginx/html/en/contact.md new file mode 100644 index 000000000..9b21b808e --- /dev/null +++ b/apps/c/nginx/html/en/contact.md @@ -0,0 +1,21 @@ +# Contac us + + **Source Code Repository** + +The main repository is at Github [https://github.com/syswonder](https://github.com/syswonder) + +We also maintain mirrors at GitLink https://gitlink.org.cn/syswonder + + **Mail lists** + +Please visit [https://maillist.syswonder.org](https://maillist.syswonder.org) to join the related mail lists you are interested in. + +Mail list is the recommended way to discuss projects. + + **WeChat Official Account** + +Please follow the WeChat public account "UbiquitousOS" (Chinese name: 泛在操作系统) to get more UOS information. + +![](../_media/qrcode_4_ubiquitousos.jpg) + + diff --git a/apps/c/nginx/html/en/courses.md b/apps/c/nginx/html/en/courses.md new file mode 100644 index 000000000..caeebde98 --- /dev/null +++ b/apps/c/nginx/html/en/courses.md @@ -0,0 +1,5 @@ +# Syswonder tutorials + + + + diff --git a/apps/c/nginx/html/en/intro.md b/apps/c/nginx/html/en/intro.md new file mode 100644 index 000000000..cc5ed38e8 --- /dev/null +++ b/apps/c/nginx/html/en/intro.md @@ -0,0 +1,3 @@ +# Syswonder UOS Research Plan + + diff --git a/apps/c/nginx/html/en/projects.md b/apps/c/nginx/html/en/projects.md new file mode 100644 index 000000000..e7e48554d --- /dev/null +++ b/apps/c/nginx/html/en/projects.md @@ -0,0 +1,27 @@ +# Syswonder Open Source Projects + + +## rcore + +Reusable operating system kernel modules implemented in Rust. + +Mail list: [bulletin@syswonder.org](https://maillist.syswonder.org/mailman3/lists/bulletin.syswonder.org/) + +## sysHyper + +SysHyper is a separation kernel hypervisor implemented in Rust language. +It is highly simplified and optimized for time and space partitioning. +It is loaded by a Linux system. Once activated, it runs bare-metal, and +splits off parts of the system' resources and assigns them to Unikernel +OSs in different zones. The SysHyper design references much from [jailhouse](https://github.com/siemens/jailhouse). + +Mail list: [hypervisor@syswonder.org](https://maillist.syswonder.org/mailman3/lists/hypervisor.syswonder.org/) + +## rukos + +rukos (Rust UniKernel OS) is a [Unikernel](https://en.wikipedia.org/wiki/Unikernel) operating system, supporting Linux applications. rukos is built from the kernel framework [ArceOS](https://github.com/rcore-os/arceos). ArceOS defines a set of interfaces among different os modules. rukos addes/optimizes/replaces necessary modules to meet the requirements of different ubiquitous applications. As ArceOS, rukos is developped in type-safe Rust language. + +Repo: [rukos@github](https://github.com/syswonder/rukos) (open soon) + +Mail list: [unikernel@syswonder.org](https://maillist.syswonder.org/mailman3/lists/unikernel.syswonder.org/) + diff --git a/apps/c/nginx/html/index.html b/apps/c/nginx/html/index.html new file mode 100644 index 000000000..b7e003598 --- /dev/null +++ b/apps/c/nginx/html/index.html @@ -0,0 +1,92 @@ + + + + + Syswonder | 矽望泛在操作系统社区 + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + diff --git a/apps/c/nginx/html/intro.md b/apps/c/nginx/html/intro.md new file mode 100644 index 000000000..2d9538f34 --- /dev/null +++ b/apps/c/nginx/html/intro.md @@ -0,0 +1,185 @@ +# 矽望:是什么,为什么 + +## 简介 + +**矽望Syswonder是什么?** + + +矽望是一个开源社区,由一群系统软件爱好者自发形成,致力于探索和构建适合特定泛在应用场景的新形态操作系统。 + +在当前阶段,主要目标是针对实时非实时任务混合运行的边缘计算场景,如医疗设备、车辆控制、工业控制、无人系统等领域,面向非对称多处理器SoC(MCU, CPU, DSP等)新型硬件平台对现有操作系统管理机制带来的挑战,在操作系统架构和实现机制上尝试创新: + +- 在架构方面,现有宏内核存在系统复杂性高的问题,微内核存在性能差的问题,我们将借鉴separation kernel、unikernel等设计思想,探索新形态的操作系统架构,尝试新的应用运行和资源管理方式。 + +- 在实现机制方面,现有操作系统主要采用C语言实现,C语言代码容易存在内存方面的缺陷。我们将用内存安全的Rust语言构建安全、高效、专用的新型态泛在操作系统。 + +为了实现上述目标,社区将主要聚焦下述项目: + +- 一个轻量化的Type 1 hypervisor,主要遵循[separation kernel](https://en.wikipedia.org/wiki/Separation_kernel)思想,主要功能 + 是通过严格分区(zone)保证各个分区在时间和空间上的严格隔离,从而 + 可以同时支持各个分区独立互不干扰运行。分区常见的形式是轻量虚拟机。通过 + Type 1 hypervisor的分区隔离,实时RTOS和非实时的Linux或Android虚拟机可 + 以正常运行,满足各自的应用需求。separation kernel常见于面向高可靠高安全(safety)应用的操作系统,如[PikeOS](https://www.sysgo.com/fileadmin/user_upload/data/professional_article_download/SYSGO_PA_2019-03_Separation_Kernel_as_a_basis_for_certifiable_applications_and_systems.pdf)。 + 目前设计支持三种分区:承担系统管理任务的zone0,一般是简化版的Linux;承 + 担高算力计算任务的zoneU,一般是unikernel OS;承担实时计算任务的zoneR, + 一般是面向MCU的RTOS。 + +- 一个兼容Linux应用的轻量化库操作系统,主要遵循[unikernel](https://en.wikipedia.org/wiki/Unikernel)设计思想,考虑到边缘泛在计算场景下,应用通常数目有限且相对固定,因此将操作系统简化设计为只支持单应用,将内核功能封装为库,以系统调用的形式提供给应用,应用直接运行在内核态。这种库形态的操作系统应用性能会有极大提升,安全问题(security)主要交给底层的Type 1 hypervisor解决。库形态的操作系统需要良好的工具支持,以方便用户根据单一应用生成构造可运行的二进制镜像,如[unikraft](https://unikraft.org)。 + +- 一组用Rust语言实现的操作系统基础构件(component),如文件系统、网络协议栈、内存管理器、消息通信机制等。基于这些构件可实现特定的库操作系统。 + +- 对Hypervisor等关键系统进行形式化验证。 + +底层硬件方面,将面向非对称多处理器SoC(MCU, CPU, DSP等)新型硬件平台。前期将基于QEMU,之后将基于物理开发板进行。 + +![](_media/overview.svg) + +## 动因 + +为什么我们要开展上述研究工作?原因是我们认为目前的应用需求和运行平台及环 +境正在急剧变化,进入一个人机物融合泛在计算的新时代。而当前主流的通用操作 +系统如Linux、Android等在结构和特性等方面已经难以适应这种变化,亟需新形态 +的操作系统支撑,这种新形态的操作系统被北京大学教授、中科院院士梅宏称为[“ +泛在操作系统”](http://www.bulletin.cas.cn/publish_article/2022/1/20220105.htm)。 + +梅宏院士认为,由于泛在计算场景的领域行业特定性、泛在计算资源的广谱多样性 +和极端特异性,泛在操作系统的领域性和专用性将会比较突出,有必要面向不同的 +应用模式和场景构建不同的泛在操作系统。因此,不会有“大一统”的通用、普适的 +泛在操作系统,而是会存在领域或应用场景定制的多样性的泛在操作系统。梅宏院 +士同时提出了操作系统发展的“**20年周期律**”,认为操作系统已经进入新的20年 +发展周期,蕴含广阔的发展创新空间。 + +在这样的背景下,我们建立矽望开源社区,面向实时任务与非实时任务混合运行的 +边缘计算场景,开展新形态操作系统的探索研究与实验验证,希望能吸引汇聚国内 +外对此感兴趣的开发者,共同打造有影响力的成果产出。 + +### 操作系统的20年周期律 + +操作系统是计算系统的核心,也是信息产业生态的核心,更是信息时代安全的基石。 +操作系统向下管理各种硬件资源,向上为用户和应用程序提供服务支持。正是操作 +系统的出现,才使得计算机从早期的专用专属走向如今的通用大众,并带来计算机 +应用的繁荣。 + +考察操作系统几十年来的发展,其主要驱动力是面向计算机硬件的迅速发展,以更 +好、更高效地管理硬件资源并充分发挥硬件资源所提供的计算能力;同时,面向新 +的应用需求和用户需求,沉淀应用领域共性,提供更便利、易用的人机交互和应用 +支撑。因此,随着新型硬件资源的发展和新型应用模式的出现,操作系统不断演化 +和变迁。 + + +梳理操作系统发展的重要事件及其时间节点,其重大变迁存在“**20 年周期律**”,即 +每 20 年出现一次跨越式发展机遇,诞生新一代操作系统。主机计算时代(20 世 +纪 60—80 年代)的 IBM OS/360、DEC VMS 和 UNIX,个人计算时代( 20 世纪 80 + 年代—2000年)的微软 Windows 和开源 Linux,以及移动计算时代(2000—2020  +年)的谷歌 Android 和苹果 iOS 是各自时代的代表性操作系统,并引领了各自领 +域的操作系统生态。当然,“20 年周期律”并不是说操作系统的新生态取代了旧生 +态,而是新、旧生态并存,但新生态相比旧生态在装机数量和用户规模上却是 1—2 + 个数量级的扩张。 + +![](_media/os20years.svg) + + +在这个变迁过程中存在几个现象:每代操作系统形成规模、占领市场、形成垄 +断后,鲜有在原赛道上后发赶超的例子;原赛道的领先者均未在新型操作系统的新 +蓝海延续其成功,如 IBM 之于个人电脑(PC)操作系统市场、微软之于智能终端 +操作系统市场等;新生态的引领者均试图采用“农村包围城市”的策略进军原有生态, +如微软进军服务器操作系统市场、谷歌进军桌面操作系统市场等。 + +“20 年周期律”是源于计算机产业发展的“贝尔定律”,即计算设备约每 10 年完成  +1 次升级换代,设备数和用户数均增加至少 1 个数量级。客观而言,新型计算模 +式及激增的新型计算设备共同催生了新型应用,带来新的蓝海和巨大创新空间,间 +次推动操作系统的升级换代和新型操作系统的诞生,进而形成新的操作系统生态。 +在每次升级换代的阶段,原赛道的领先者可能因为“思维定式”和“路径依赖”,往往 +对新蓝海的机遇反应缓慢,因而痛失良机。而新形态的引领者往往都先占据了新蓝 +海的用户入口掌控权,如微软之于个人计算、谷歌之于万维网和移动计算。对于通 +用计算领域,领先者一旦建立并完善新的产业生态,就占有了生态主导权,后发者 +就很难有机会实现赶超。历史经验表明,如果希望在操作系统领域有所作为,就必 +须把握住新蓝海出现带来的宝贵机遇。 + +### 泛在操作系统 + +当前,随着互联网向人类社会和物理世界的全方位延伸,一个万物互联的人类社会、 +信息系统、物理空间(人机物)融合泛在计算(ubiquitous computing)的时代正 +在开启。据全球综合数据资料库Statista发布的数据,2019 年全球联网的物联网 +终端数量已达百亿,超过了非物联终端的数量,2025 年预计将突破 300 亿,未来 +千亿规模已然可期。 + +面向未来人机物融合泛在计算的新模式和新场景,软件定义一切、万物均需互联、 +一切皆可编程、人机物自然交互将是其基本特征。除传统计算设备(“机”)和新兴 +物联设备(“物”)外,“人”作为一种新的重要元素的参与,构成了极其复杂且动态 +多变的计算环境。 + +所谓泛在计算,是指计算无缝融入物理环境,无处不在、无迹可寻。泛在计算的环 +境多变、需求多样、场景复杂,要求硬件资源、数据资源、软件平台、应用软件具 +有柔性灵活的软件定义能力、动态适配能力、泛在互联能力和自然交互能力: + +- 面向“物”,海量的、更为轻量级的各类计算、传感设备带来系列管理调度新挑战; + +- 面向“人”,“人在回路”导致不确定的复杂交互和动态按需定制; + +- 面向“网”,物联场景带来低延迟更可靠的刚需; + +- 面向“应用”,动态多样性带来新的共性凝练需求……; + +这些均是现有操作系统尚不具备的能力。从“20 年周期律”的视角,千亿规模的各类泛 +在物联终端和新型的泛在计算模式的出现,意味着操作系统进入新的 20 年发展周 +期的条件已然具备,新的蓝海已然出现。 + +人机物融合泛在计算模式的新特征对新型操作系统带来的挑战是全方位的:既需要 +面临“云-管-边-端-物”乃至“人”的海量异构资源尤其是各种泛在化的“端”资源的有 +效管理,也需要进行各种多样化的新型应用的共性凝练,还需要支持和适应场景动 +态多变的复杂泛在计算环境,应对开放环境带来的安全可信挑战。 + +国内外学术界和产业界已有不少面向特定计算场景和新型业务需求的新型操作系统 +实践。例如,美国西北大学提出面向信物融合的先进制造操作系统计划;谷歌公司 +提出 Fuchsia OS 计划,用于支持桌面设备、移动终端、物联网设备及其互联;大 +众汽车公司启动 vw.os 汽车操作系统计划,尝试转型“软件公司”,将可能对上下 +游产业链产生变革性影响;阿里巴巴公司推出以驱动万物智能为目标的移动操作系 +统 AliOS;华为公司发布了面向全场景、全连接的智能终端操作系统鸿蒙 OS 和  +Open Harmony 等。此外,还出现了众多的物联网节点操作系统,如 FreeRTOS、 +RIOT、Zephyr、TinyOS、Contiki、Android Things 等,而这些均可归为针对泛在 +计算场景的操作系统。 + + +上述新型操作系统实践大多是从传统的嵌入式操作系统技术途径针对特定泛在计算 +场景进行切入和扩展,在资源管理、网络协同、人机交互、应用模式等方面分别进 +行了新的技术探索。嵌入式系统主要面向微控制器等资源受限环境,并且与物理世 +界直接交互,因此需要非常轻量化,并要保证实时性(时间确定性),嵌入式系统 +及其操作系统可被视为原始的“泛在计算”尝试。近年流行的物联网操作系统则在嵌 +入式操作系统的技术基础上,强调对“连接”及建立在连接基础上的分布计算甚至 +“云-边-端”融合计算的支持,从而支撑“万物互联”的目标。嵌入式操作系统和物联 +网操作系统技术体系过于碎片化,存在所谓的“昆虫纲问题”,在计算模型、共性凝 +练、人机交互、安全保障等方面均难以满足人机物融合泛在计算的需求。 + + +基于对各类新型操作系统研发实践的梳理和对泛在计算场景的理解,梅宏院士提出, +面向人机物融合泛在计算场景,需要“沉淀”一类新型操作系统——沿袭过去以计算模 +式分类操作系统的惯例,可称为“泛在操作系统”(Ubiquitous Operating System, +UOS)。 + +### 边缘泛在计算场景 + +医疗设备、车辆控制、工业控制、无人系统等领域是典型的边缘泛在计算场景,这 +些边缘场景的典型特点是高实时高可靠任务与高算力任务混合运行,硬件资源多样 +复杂,对操作系统提出了新的挑战。 + +以车用操作系统为例。车用操作系统分为车控操作系统和车载操作系统。其中,车 +控操作系统分为安全车控操作系统和智能驾驶操作系统,安全车控操作系统面向车 +辆控制领域,比如动力系统、底盘系统、车身系统等,对实时性和安全性要求极高, +相对成熟;智能驾驶操作系统面向智能驾驶领域,应用于智能驾驶域控制器等,除 +了实时性和安全性要求外,还需要高算力支持,智能驾驶操作系统是目前汽车操作 +系统领域的竞争焦点。车载操作系统面向信息娱乐和智能座舱,主要应用于车机中 +的控制系统,主要竞争者为QNX、Linux和Android,格局相对稳定。 + +随着汽车功能逐步向网联化、智能化发展,汽车的电子电气架构由传统分布式向集 +中式和融合式发展,未来的趋势是通过一台车载中央计算机提供所有的驾驶控制以 +及座舱娱乐功能,这对车载中央计算机上的车用操作系统提出了严重挑战,要求其 +要同时满足高实时、高安全、高算力、易定制的要求,还要有强大的生态,支持实 +现软件定义汽车的愿景。 + +![](_media/car-ee.svg) + +现有的操作系统都难以满足上述需求,无论是Linux或者QNX都存在某些方面的短板, +需要在新形态内核架构、采用新型安全编程语言实现、软硬协同机制、形式化验证 +等方面进行新的探索。 + diff --git a/apps/c/nginx/html/news/README.md b/apps/c/nginx/html/news/README.md new file mode 100644 index 000000000..e69de29bb diff --git a/apps/c/nginx/html/news/news.md b/apps/c/nginx/html/news/news.md new file mode 100644 index 000000000..efe29c352 --- /dev/null +++ b/apps/c/nginx/html/news/news.md @@ -0,0 +1,254 @@ +# 最新动态 + +--- + +## 社区活动 + + **20231103 Hypervisor讨论会** + +时间:2023年11月3日 + +地点:计算所254会议室 + +内容:[这里](https://maillist.syswonder.org/archives/list/hypervisor@syswonder.org/thread/ENWG64ZXDAEDDLPTTUB4TUZ2B4JOOBNP/) + + **20231027 Hypervisor讨论会** + +时间:2023年10月27日 + +地点:计算所254会议室 + +内容:[这里](https://maillist.syswonder.org/archives/list/hypervisor@syswonder.org/thread/QPAUKIOVCH637IYUBTANXO6UT6GX4AIK/) + + **20231020 Hypervisor讨论会** + +时间:2023年10月20日 + +地点:计算所254会议室 + +内容:[这里](https://maillist.syswonder.org/archives/list/hypervisor@syswonder.org/thread/AZXK3IOSQVLZFRSA5PZRQ3PARTYKFPUY/) + + **20231013 Hypervisor讨论会** + +时间:2023年10月13日 + +地点:北京大学 理科1号楼1504 + +内容:[这里](https://maillist.syswonder.org/archives/list/hypervisor@syswonder.org/thread/J57C543Y6PPTPGCST5EUF32Z5DM2N2LW/) + + **20230922 Hypervisor讨论会** + +时间:2023年9月22日 + +地点:计算所254会议室 + +内容:[这里](https://maillist.syswonder.org/archives/list/hypervisor@syswonder.org/thread/AKKP3XSMUMTY527DY3EY57D3RXQNFT3M/) + + **20230915 Hypervisor讨论会** + +时间:2023年9月15日 + +地点:北京大学 理科1号楼1504 + +内容:[这里](https://maillist.syswonder.org/archives/list/hypervisor@syswonder.org/thread/TQDQUA7ZKSJ3TRAJZR57ODGJKZ6BUDU6/) + + **20230901 Hypervisor讨论会** + +时间:2023年9月1日 + +地点:北京大学 理科一号楼1621 + +内容:[这里](https://maillist.syswonder.org/archives/list/hypervisor@syswonder.org/thread/AU7FMR2IG4Z55K3YQHCGYHTPOGNQIDCR/) + + **20230728 Hypervisor讨论会** + +时间:2023年7月28日 + +地点:北京大学 理科1号楼1504 + +内容:[这里](https://maillist.syswonder.org/archives/list/hypervisor@syswonder.org/thread/JWNXJJ7VSM3PJ4RMMWBIL7ZC3ELSY24F/) + + **20230714 Hypervisor讨论会** + +时间:2023年7月14日 + +地点:计算所254会议室 + +内容:[这里](https://maillist.syswonder.org/archives/list/hypervisor@syswonder.org/thread/BS4GRKN77SHDDUBO53W5GJ6PK4WFRQME/) + + **虚拟化Hypervisor专题课程** + +自2023年6月5日晚20:00,将开始《Hypervisor虚拟化专题》课程,共分6个专题: + +1. 莫策:Rust-Shyper 开源项目 +2. 胡柯洋:Rust-Shyper 在 树莓派4B 上的移植 +3. 李宇:RVH 与 QEMU/KVM +4. 陈岳:hcHyper 开源项目 +5. 齐呈祥:hypercraft 开源项目 +6. 季朋:virtio 介绍 + +2023年6月5日-6月30日,每周一、三、五晚上20-21点,共4周12次课程,欢迎大家报名参加学习! + +报名链接:https://os2edu.cn/course/120 + +关键字:课程, 培训, 训练 + + **20230630 Hypervisor讨论会** + +时间:2023年6月30日 + +地点:计算所1401 + +内容:[这里](https://maillist.syswonder.org/archives/list/hypervisor@syswonder.org/thread/VVKCKRZXARM3URYRLQZYN5ZJONMFOBWD/) + + **20230602 Hypervisor讨论会** + +时间:2023年6月2日 + +地点:北京大学 燕园大厦809会议室 + +内容:[这里](https://maillist.syswonder.org/archives/list/hypervisor@syswonder.org/thread/7QDVJZBRAURG27QWQBSHT3HMTDGJKF5M/) + + **20230526 Hypervisor讨论会** + +时间:2023年5月26日 + +地点:计算所254会议室 + +内容:[这里](https://maillist.syswonder.org/archives/list/hypervisor@syswonder.org/thread/Q3JXZA27GR6K2FZBIH4S5O2BJHQ4NL2X/) + + **2023春夏季开源OS训练营第三阶段 ArceOS** + +时间:2023年5月8日-5月26日 + +详情与报名:[https://os2edu.cn/course/109](https://os2edu.cn/course/109) + +关键字:课程, 培训, 训练 + + **20230519 Hypervisor讨论会** + +时间:2023年5月19日 + +地点:计算所254会议室 + +内容:[这里](https://maillist.syswonder.org/archives/list/hypervisor@syswonder.org/thread/WWFWGW27FZQPZFBFPBYAR7R7WE4YQLFL/) + + **20230512 Hypervisor讨论会** + +时间:2023年5月12日 + +地点:计算所422会议室 + +内容:[这里](https://maillist.syswonder.org/archives/list/hypervisor@syswonder.org/thread/Q5VGDD6ATGAUPKWALGLANHVJ4Y6P5WXU/) + + **20230428 Hypervisor讨论会** + +时间:2023年4月28日 + +地点:北京大学 理科1号楼1504 + +内容:[这里](https://maillist.syswonder.org/archives/list/hypervisor@syswonder.org/thread/HAIOYZAROAJKRSBBDEXIUWCH5B37NITK/) + + **20230421 Hypervisor讨论会** + +时间:2023年4月21日 + +地点:计算所254会议室 + +内容:[这里](https://maillist.syswonder.org/archives/list/hypervisor@syswonder.org/thread/DI7VM2ZF5P3BIGOZW3BEPE7XUOEUYGEX/) + + **20230414 Hypervisor讨论会** + +时间:2023年4月14日 + +地点:北京大学 理科1号楼1504 + +内容:[这里](https://maillist.syswonder.org/archives/list/hypervisor@syswonder.org/thread/557LS7KMDBTL4DOP4IHX5PCTPQXOIHC4/) + + **20230407 Hypervisor讨论会** + +时间:2023年4月7日 + +地点:北京大学 理科1号楼1504 + +内容:[这里](https://maillist.syswonder.org/archives/list/hypervisor@syswonder.org/thread/5UMVBROXVL75BGWUVR5KPK7KCKYSTEWF/) + + **20230331 Hypervisor讨论会** + +时间:2023年3月31日 + +地点:计算所850 + +内容:[这里](https://maillist.syswonder.org/archives/list/hypervisor@syswonder.org/thread/MCS4JOBAOTN2TIRUPHORNN2MT5UZXQBN/) + + **20230324 Hypervisor讨论会** + +时间:2023年3月24日 + +地点:启迪之星 云龙湖会议室 + +内容:[这里](https://maillist.syswonder.org/archives/list/hypervisor@syswonder.org/thread/H2N7LLOPLKCC3XHRXZJMIJIQSFPXAUNB/) + + **20230317 Hypervisor讨论会** + +时间:2023年3月17日 + +地点:计算所446 + +内容:[这里](https://maillist.syswonder.org/archives/list/hypervisor@syswonder.org/thread/UURXNQSM4OZPXAPNX6QAARENUHHNJRGH/) + + **20230315 王雷老师rust-shyper技术交流会** + +时间:2023年3月15日 + +地点:计算所801 + + **20230310 Hypervisor讨论会** + +时间:2023年3月10日 + +地点:计算所446 + +内容:[这里](https://maillist.syswonder.org/archives/list/hypervisor@syswonder.org/thread/AGZRNO2QZWL4O4CJMBGDN5Q42WNBBD7G/) + + **20230303 Hypervisor讨论会** + +时间:2023年3月3日 + +地点:计算所446 + +内容:[这里](https://maillist.syswonder.org/archives/list/hypervisor@syswonder.org/thread/KQW2DBUDWNSZ4CXDVZ7Q5QM2AQMCKBK5/) + + **20230216 第3次社区讨论会** + +时间:2023年2月16日 + +内容:[这里](https://maillist.syswonder.org/archives/list/bulletin@syswonder.org/message/ZQU6E25LAMGCOZMDDPGGGVWUCMEEUDFW/) + + **石磊老师关于Linux组件化实验的报告** + +时间:2023年2月12日20:00 + +主题:Linux组件化初步实验的结果和想法 + +扩展arceos等,形成unikernel形态,支持Linux系统调用和应用程序 + +内容: [这里](https://maillist.syswonder.org/archives/list/bulletin@syswonder.org/thread/F6DHJQ26KB2LB4AOLWVDVVAEGPD4P6PL/) + + **2023年第2次社区讨论会** + +时间:2023年2月5日20:30 + +主题:2022秋冬季训练营总结报告&组件化操作系统的技术交流 + +内容: [这里](https://maillist.syswonder.org/archives/list/bulletin@syswonder.org/thread/3HOUPTUZKPPSK6KWRHL3AR257CNAS35A/) + +[#TencentMeeting: 584-567-140](https://meeting.tencent.com/dm/ElqF4FerRXQ3) + + **2023年第1次社区讨论会** + +时间:2023年2月2日20:00 + +主题:社区项目介绍、安排与动员 + +[#TencentMeeting: 833-996-381](https://meeting.tencent.com/dm/swqv5Kw07MGu) diff --git a/apps/c/nginx/html/projects.md b/apps/c/nginx/html/projects.md new file mode 100644 index 000000000..a13b6fec5 --- /dev/null +++ b/apps/c/nginx/html/projects.md @@ -0,0 +1,17 @@ +# 矽望开源项目 + +## sysHyper + +Rust实现的Type-1虚拟机监视器(Hypervisor),采用基于基础构件的可重构设计思想,主要提供硬件资源虚拟化、分区安全隔离的能力。sysHyper的设计借鉴了[jailhouse](https://github.com/siemens/jailhouse)。 + +项目地址: [https://github.com/syswonder/sysHyper](https://github.com/syswonder/sysHyper) + +邮件列表: [hypervisor@syswonder.org](https://maillist.syswonder.org/mailman3/lists/hypervisor.syswonder.org/) + +## rukos + +rukos(Rust UniKernel OS)是单一内核操作系统[Unikernel](https://en.wikipedia.org/wiki/Unikernel),支持linux应用程序。rukos基于组件化的kernel框架[ArceOS](https://github.com/rcore-os/arceos)来构建。ArceOS定义了一系列的操作系统不同模块之间的交互接口。rukos致力于在此框架之上添加实际系统所需要的模块,以及替换和优化内建的模块,用以适配不同的应用场景。与ArceOS一样,rukos 使用Rust语言进行开发,能够充分利用Rust语言自身的安全特性,方便的构建工具以及快速发展的扩展库。 + +项目地址: [https://github.com/syswonder/rukos](https://github.com/syswonder/rukos) + +邮件列表: [unikernel@syswonder.org](https://maillist.syswonder.org/mailman3/lists/unikernel.syswonder.org/) diff --git a/apps/c/nginx/html/uos.md b/apps/c/nginx/html/uos.md new file mode 100644 index 000000000..49d05173d --- /dev/null +++ b/apps/c/nginx/html/uos.md @@ -0,0 +1,41 @@ +# 泛在操作系统相关信息 + + **梅宏教授对泛在操作系统的系统性阐述:** + +梅宏, 曹东刚, 谢涛. [泛在操作系统:面向人机物融合泛在计算的新蓝海](http://www.bulletin.cas.cn/publish_article/2022/1/20220105.htm). 中国科学院院刊, 2022, 37(1): 30-37 + +MEI Hong, CAO Donggang, XIE Tao. Ubiquitous Operating System: Toward the Blue Ocean of Human-cyber-physical Ternary Ubiquitous Computing. Bulletin of Chinese Academy of Sciences, 2022, 37(1): 30-37 + + [阅读PDF](http://www.bulletin.cas.cn/zgkxyyk/ch/reader/create_pdf.aspx?file_no=20220105&year_id=2022&quarter_id=1&falg=1) [阅读微信公众号](https://mp.weixin.qq.com/s/qrERzaEN_FuXy40MbW8Zyw) + + **泛在操作系统公众号** + +在微信中搜索 "泛在操作系统",或扫描下面的二维码 + +![](_media/qrcode_4_ubiquitousos.jpg) + + + **泛在操作系统社区** + +[CSDN UOS社区](https://bbs.csdn.net/forums/uos) + + **相关科技计划/科研项目** + +- 工信部 《[“十四五”软件和信息技术服务业发展规划](http://www.gov.cn/zhengce/zhengceku/2021-12/01/content_5655205.htm)》 + +> 专栏 5 “软件定义”创新应用培育 +> +> 构建“软件定义”技术体系。大力支持开展“软件定义”及泛在操作系统平台相关理论和技术研究,加强政产学研用对接,构建“软件定义”核心技术体系。 +> +> 培育“软件定义”创新应用生态。建立面向电子消费、高端装备、智能网联 汽车、智慧城市等典型行业领域的“软件定义”解决方案,组织开展试点示范。 培育一批核心技术、产品和系统解决方案提供商,推动产业联盟建设。探索“软件定义”生态发展与运营模式。 + +- 国家自然科学基金委 [“泛在操作系统及生态构建研究”专项](https://www.nsfc.gov.cn/publish/portal0/tab442/info81883.htm) + +> 本专项项目针对人机物融合的泛在计算环境带来的资源异构多样性和交互开放不确定性,探索泛在操作系统的结构模型与行为机理,构建包括泛在资源管理、轻量级虚拟化、感联知控共性框架、泛在应用支撑、全栈性能优化等在内的关键技术体系,并在工业互联网等典型场景中进行应用验证。 + +- 科技部重点研发计划项目 “软件定义的泛在操作系统与环境” + +> 面向人机物融合计算与应用的挑战,针对场景计算机的新型操作系统与环境需求,研究软件定义泛在操作系统基 础理论、系统结构、定义语言和成长演化机理... + + + diff --git a/apps/c/nginx/mime.types b/apps/c/nginx/mime.types new file mode 100755 index 000000000..dd757ddb4 --- /dev/null +++ b/apps/c/nginx/mime.types @@ -0,0 +1,98 @@ + +types { + text/markdown md; + text/html html htm shtml; + text/css css; + text/xml xml; + image/gif gif; + image/jpeg jpeg jpg; + application/javascript js; + application/atom+xml atom; + application/rss+xml rss; + + text/mathml mml; + text/plain txt; + text/vnd.sun.j2me.app-descriptor jad; + text/vnd.wap.wml wml; + text/x-component htc; + + image/png png; + image/svg+xml svg svgz; + image/tiff tif tiff; + image/vnd.wap.wbmp wbmp; + image/webp webp; + image/x-icon ico; + image/x-jng jng; + image/x-ms-bmp bmp; + + font/woff woff; + font/woff2 woff2; + + application/java-archive jar war ear; + application/json json; + application/mac-binhex40 hqx; + application/msword doc; + application/pdf pdf; + application/postscript ps eps ai; + application/rtf rtf; + application/vnd.apple.mpegurl m3u8; + application/vnd.google-earth.kml+xml kml; + application/vnd.google-earth.kmz kmz; + application/vnd.ms-excel xls; + application/vnd.ms-fontobject eot; + application/vnd.ms-powerpoint ppt; + application/vnd.oasis.opendocument.graphics odg; + application/vnd.oasis.opendocument.presentation odp; + application/vnd.oasis.opendocument.spreadsheet ods; + application/vnd.oasis.opendocument.text odt; + application/vnd.openxmlformats-officedocument.presentationml.presentation + pptx; + application/vnd.openxmlformats-officedocument.spreadsheetml.sheet + xlsx; + application/vnd.openxmlformats-officedocument.wordprocessingml.document + docx; + application/vnd.wap.wmlc wmlc; + application/x-7z-compressed 7z; + application/x-cocoa cco; + application/x-java-archive-diff jardiff; + application/x-java-jnlp-file jnlp; + application/x-makeself run; + application/x-perl pl pm; + application/x-pilot prc pdb; + application/x-rar-compressed rar; + application/x-redhat-package-manager rpm; + application/x-sea sea; + application/x-shockwave-flash swf; + application/x-stuffit sit; + application/x-tcl tcl tk; + application/x-x509-ca-cert der pem crt; + application/x-xpinstall xpi; + application/xhtml+xml xhtml; + application/xspf+xml xspf; + application/zip zip; + + application/octet-stream bin exe dll; + application/octet-stream deb; + application/octet-stream dmg; + application/octet-stream iso img; + application/octet-stream msi msp msm; + + audio/midi mid midi kar; + audio/mpeg mp3; + audio/ogg ogg; + audio/x-m4a m4a; + audio/x-realaudio ra; + + video/3gpp 3gpp 3gp; + video/mp2t ts; + video/mp4 mp4; + video/mpeg mpeg mpg; + video/quicktime mov; + video/webm webm; + video/x-flv flv; + video/x-m4v m4v; + video/x-mng mng; + video/x-ms-asf asx asf; + video/x-ms-wmv wmv; + video/x-msvideo avi; +} diff --git a/apps/c/nginx/nginx.conf b/apps/c/nginx/nginx.conf new file mode 100755 index 000000000..79345cd51 --- /dev/null +++ b/apps/c/nginx/nginx.conf @@ -0,0 +1,125 @@ + +#user nobody; +worker_processes 1; +daemon off; +master_process off; + +#error_log logs/error.log; +#error_log logs/error.log notice; +error_log logs/error.log debug; + +#pid logs/nginx.pid; + + +events { + worker_connections 32; +} + + +http { + include mime.types; + default_type application/octet-stream; + + #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + # '$status $body_bytes_sent "$http_referer" ' + # '"$http_user_agent" "$http_x_forwarded_for"'; + + #access_log logs/access.log main; + + #sendfile on; + #tcp_nopush on; + + #keepalive_timeout 0; + keepalive_timeout 65; + + #gzip on; + + server { + listen 5555; + server_name localhost; + + #charset koi8-r; + + #access_log logs/host.access.log main; + + index index.html; + + root /v9fs; + + location / { + try_files $uri $uri/ /404.html; + } + + error_page 404 /404.html; + location = /404.html { + root /v9fs; + } + + # redirect server error pages to the static page /50x.html + # + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /v9fs; + } + + # proxy the PHP scripts to Apache listening on 127.0.0.1:80 + # + #location ~ \.php$ { + # proxy_pass http://127.0.0.1; + #} + + # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 + # + #location ~ \.php$ { + # root html; + # fastcgi_pass 127.0.0.1:9000; + # fastcgi_index index.php; + # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; + # include fastcgi_params; + #} + + # deny access to .htaccess files, if Apache's document root + # concurs with nginx's one + # + #location ~ /\.ht { + # deny all; + #} + } + + + # another virtual host using mix of IP-, name-, and port-based configuration + # + #server { + # listen 8000; + # listen somename:8080; + # server_name somename alias another.alias; + + # location / { + # root html; + # index index.html index.htm; + # } + #} + + + # HTTPS server + # + #server { + # listen 443 ssl; + # server_name localhost; + + # ssl_certificate cert.pem; + # ssl_certificate_key cert.key; + + # ssl_session_cache shared:SSL:1m; + # ssl_session_timeout 5m; + + # ssl_ciphers HIGH:!aNULL:!MD5; + # ssl_prefer_server_ciphers on; + + # location / { + # root html; + # index index.html index.htm; + # } + #} + +} \ No newline at end of file diff --git a/apps/c/pthread/basic/expect_info_smp4_fifo.out b/apps/c/pthread/basic/expect_info_smp4_fifo.out old mode 100644 new mode 100755 diff --git a/apps/c/pthread/basic/features.txt b/apps/c/pthread/basic/features.txt old mode 100644 new mode 100755 diff --git a/apps/c/pthread/basic/main.c b/apps/c/pthread/basic/main.c old mode 100644 new mode 100755 diff --git a/apps/c/pthread/basic/test_cmd b/apps/c/pthread/basic/test_cmd old mode 100644 new mode 100755 diff --git a/apps/c/pthread/parallel/expect_info_smp4_fifo.out b/apps/c/pthread/parallel/expect_info_smp4_fifo.out old mode 100644 new mode 100755 diff --git a/apps/c/pthread/parallel/expect_info_smp4_rr.out b/apps/c/pthread/parallel/expect_info_smp4_rr.out old mode 100644 new mode 100755 diff --git a/apps/c/pthread/parallel/features.txt b/apps/c/pthread/parallel/features.txt old mode 100644 new mode 100755 diff --git a/apps/c/pthread/parallel/main.c b/apps/c/pthread/parallel/main.c old mode 100644 new mode 100755 diff --git a/apps/c/pthread/parallel/test_cmd b/apps/c/pthread/parallel/test_cmd old mode 100644 new mode 100755 diff --git a/apps/c/pthread/pipe/expect_info_smp4_fifo.out b/apps/c/pthread/pipe/expect_info_smp4_fifo.out old mode 100644 new mode 100755 diff --git a/apps/c/pthread/pipe/features.txt b/apps/c/pthread/pipe/features.txt old mode 100644 new mode 100755 diff --git a/apps/c/pthread/pipe/main.c b/apps/c/pthread/pipe/main.c old mode 100644 new mode 100755 diff --git a/apps/c/pthread/pipe/test_cmd b/apps/c/pthread/pipe/test_cmd old mode 100644 new mode 100755 diff --git a/apps/c/pthread/sleep/expect_info_smp4_fifo.out b/apps/c/pthread/sleep/expect_info_smp4_fifo.out old mode 100644 new mode 100755 diff --git a/apps/c/pthread/sleep/features.txt b/apps/c/pthread/sleep/features.txt old mode 100644 new mode 100755 diff --git a/apps/c/pthread/sleep/main.c b/apps/c/pthread/sleep/main.c old mode 100644 new mode 100755 diff --git a/apps/c/pthread/sleep/test_cmd b/apps/c/pthread/sleep/test_cmd old mode 100644 new mode 100755 diff --git a/apps/c/pthread/tsd/expect_info_smp4_fifo.out b/apps/c/pthread/tsd/expect_info_smp4_fifo.out old mode 100644 new mode 100755 diff --git a/apps/c/pthread/tsd/features.txt b/apps/c/pthread/tsd/features.txt old mode 100644 new mode 100755 diff --git a/apps/c/pthread/tsd/main.c b/apps/c/pthread/tsd/main.c old mode 100644 new mode 100755 diff --git a/apps/c/pthread/tsd/test_cmd b/apps/c/pthread/tsd/test_cmd old mode 100644 new mode 100755 diff --git a/apps/c/redis/.gitignore b/apps/c/redis/.gitignore old mode 100644 new mode 100755 diff --git a/apps/c/redis/Makefile b/apps/c/redis/Makefile old mode 100644 new mode 100755 diff --git a/apps/c/redis/README.md b/apps/c/redis/README.md old mode 100644 new mode 100755 diff --git a/apps/c/redis/axbuild.mk b/apps/c/redis/axbuild.mk old mode 100644 new mode 100755 index a6d99fdd9..d628d5152 --- a/apps/c/redis/axbuild.mk +++ b/apps/c/redis/axbuild.mk @@ -16,6 +16,8 @@ ifneq ($(V),) redis-build-args += V=$(V) endif +$(info redis-build-args $(redis-build-args) make $(MAKE)) + $(redis-dir): @echo "Download redis source code" wget https://github.com/redis/redis/archive/$(redis-version).tar.gz -P $(APP) diff --git a/apps/c/redis/features.txt b/apps/c/redis/features.txt old mode 100644 new mode 100755 index 71894bdb9..1c7fd084b --- a/apps/c/redis/features.txt +++ b/apps/c/redis/features.txt @@ -9,5 +9,7 @@ net pipe epoll poll +select +driver-ramdisk virtio-9p rtc diff --git a/apps/c/redis/redis.conf b/apps/c/redis/redis.conf old mode 100644 new mode 100755 diff --git a/apps/c/redis/redis.patch b/apps/c/redis/redis.patch old mode 100644 new mode 100755 diff --git a/apps/c/sqlite3/.gitignore b/apps/c/sqlite3/.gitignore old mode 100644 new mode 100755 diff --git a/apps/c/sqlite3/Makefile b/apps/c/sqlite3/Makefile old mode 100644 new mode 100755 diff --git a/apps/c/sqlite3/axbuild.mk b/apps/c/sqlite3/axbuild.mk old mode 100644 new mode 100755 diff --git a/apps/c/sqlite3/expect_info.out b/apps/c/sqlite3/expect_info.out old mode 100644 new mode 100755 diff --git a/apps/c/sqlite3/expect_info_again.out b/apps/c/sqlite3/expect_info_again.out old mode 100644 new mode 100755 diff --git a/apps/c/sqlite3/expect_info_ramdisk.out b/apps/c/sqlite3/expect_info_ramdisk.out old mode 100644 new mode 100755 diff --git a/apps/c/sqlite3/features.txt b/apps/c/sqlite3/features.txt old mode 100644 new mode 100755 diff --git a/apps/c/sqlite3/main.c b/apps/c/sqlite3/main.c old mode 100644 new mode 100755 diff --git a/apps/c/sqlite3/test_cmd b/apps/c/sqlite3/test_cmd old mode 100644 new mode 100755 diff --git a/apps/c/systime/features.txt b/apps/c/systime/features.txt old mode 100644 new mode 100755 diff --git a/apps/c/systime/main.c b/apps/c/systime/main.c old mode 100644 new mode 100755 diff --git a/apps/c/udpserver/axbuild.mk b/apps/c/udpserver/axbuild.mk old mode 100644 new mode 100755 diff --git a/apps/c/udpserver/features.txt b/apps/c/udpserver/features.txt old mode 100644 new mode 100755 diff --git a/apps/c/udpserver/udpserver.c b/apps/c/udpserver/udpserver.c old mode 100644 new mode 100755 diff --git a/apps/display/basic_painting/Cargo.toml b/apps/display/basic_painting/Cargo.toml old mode 100644 new mode 100755 diff --git a/apps/display/basic_painting/src/display.rs b/apps/display/basic_painting/src/display.rs old mode 100644 new mode 100755 diff --git a/apps/display/basic_painting/src/main.rs b/apps/display/basic_painting/src/main.rs old mode 100644 new mode 100755 diff --git a/apps/display/basic_painting/test_cmd b/apps/display/basic_painting/test_cmd old mode 100644 new mode 100755 diff --git a/apps/display/draw_map/Cargo.toml b/apps/display/draw_map/Cargo.toml old mode 100644 new mode 100755 diff --git a/apps/display/draw_map/pictures/map.bmp b/apps/display/draw_map/pictures/map.bmp old mode 100644 new mode 100755 diff --git a/apps/display/draw_map/src/display.rs b/apps/display/draw_map/src/display.rs old mode 100644 new mode 100755 diff --git a/apps/display/draw_map/src/main.rs b/apps/display/draw_map/src/main.rs old mode 100644 new mode 100755 diff --git a/apps/display/draw_map/test_cmd b/apps/display/draw_map/test_cmd old mode 100644 new mode 100755 diff --git a/apps/exception/Cargo.toml b/apps/exception/Cargo.toml old mode 100644 new mode 100755 diff --git a/apps/exception/expect_debug_aarch64.out b/apps/exception/expect_debug_aarch64.out old mode 100644 new mode 100755 diff --git a/apps/exception/expect_debug_riscv64.out b/apps/exception/expect_debug_riscv64.out old mode 100644 new mode 100755 diff --git a/apps/exception/expect_debug_x86_64.out b/apps/exception/expect_debug_x86_64.out old mode 100644 new mode 100755 diff --git a/apps/exception/src/main.rs b/apps/exception/src/main.rs old mode 100644 new mode 100755 diff --git a/apps/exception/test_cmd b/apps/exception/test_cmd old mode 100644 new mode 100755 diff --git a/apps/fs/shell/Cargo.toml b/apps/fs/shell/Cargo.toml old mode 100644 new mode 100755 diff --git a/apps/fs/shell/src/cmd.rs b/apps/fs/shell/src/cmd.rs old mode 100644 new mode 100755 diff --git a/apps/fs/shell/src/main.rs b/apps/fs/shell/src/main.rs old mode 100644 new mode 100755 diff --git a/apps/fs/shell/src/ramfs.rs b/apps/fs/shell/src/ramfs.rs old mode 100644 new mode 100755 diff --git a/apps/helloworld/Cargo.toml b/apps/helloworld/Cargo.toml old mode 100644 new mode 100755 diff --git a/apps/helloworld/expect_info.out b/apps/helloworld/expect_info.out old mode 100644 new mode 100755 diff --git a/apps/helloworld/expect_info_smp4.out b/apps/helloworld/expect_info_smp4.out old mode 100644 new mode 100755 diff --git a/apps/helloworld/src/main.rs b/apps/helloworld/src/main.rs old mode 100644 new mode 100755 diff --git a/apps/helloworld/test_cmd b/apps/helloworld/test_cmd old mode 100644 new mode 100755 diff --git a/apps/memtest/Cargo.toml b/apps/memtest/Cargo.toml old mode 100644 new mode 100755 diff --git a/apps/memtest/expect_trace.out b/apps/memtest/expect_trace.out old mode 100644 new mode 100755 diff --git a/apps/memtest/src/main.rs b/apps/memtest/src/main.rs old mode 100644 new mode 100755 diff --git a/apps/memtest/test_cmd b/apps/memtest/test_cmd old mode 100644 new mode 100755 diff --git a/apps/net/bwbench/Cargo.toml b/apps/net/bwbench/Cargo.toml old mode 100644 new mode 100755 diff --git a/apps/net/bwbench/src/main.rs b/apps/net/bwbench/src/main.rs old mode 100644 new mode 100755 diff --git a/apps/net/echoserver/Cargo.toml b/apps/net/echoserver/Cargo.toml old mode 100644 new mode 100755 diff --git a/apps/net/echoserver/src/main.rs b/apps/net/echoserver/src/main.rs old mode 100644 new mode 100755 diff --git a/apps/net/httpclient/Cargo.toml b/apps/net/httpclient/Cargo.toml old mode 100644 new mode 100755 diff --git a/apps/net/httpclient/expect_info.out b/apps/net/httpclient/expect_info.out old mode 100644 new mode 100755 diff --git a/apps/net/httpclient/expect_info_dns.out b/apps/net/httpclient/expect_info_dns.out old mode 100644 new mode 100755 diff --git a/apps/net/httpclient/src/main.rs b/apps/net/httpclient/src/main.rs old mode 100644 new mode 100755 diff --git a/apps/net/httpclient/test_cmd b/apps/net/httpclient/test_cmd old mode 100644 new mode 100755 diff --git a/apps/net/httpserver/Cargo.toml b/apps/net/httpserver/Cargo.toml old mode 100644 new mode 100755 diff --git a/apps/net/httpserver/src/main.rs b/apps/net/httpserver/src/main.rs old mode 100644 new mode 100755 diff --git a/apps/net/udpserver/Cargo.toml b/apps/net/udpserver/Cargo.toml old mode 100644 new mode 100755 diff --git a/apps/net/udpserver/src/main.rs b/apps/net/udpserver/src/main.rs old mode 100644 new mode 100755 diff --git a/apps/systime/Cargo.toml b/apps/systime/Cargo.toml new file mode 100755 index 000000000..3b59379ea --- /dev/null +++ b/apps/systime/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "arceos-systime" +version = "0.1.0" +edition = "2021" +authors = ["HwoWen Liu <1466397747@qq.com>"] + + +[dependencies] +axstd = { path = "../../ulib/axstd", optional = true ,features = ["rtc"]} diff --git a/apps/systime/src/main.rs b/apps/systime/src/main.rs new file mode 100755 index 000000000..1966e47ae --- /dev/null +++ b/apps/systime/src/main.rs @@ -0,0 +1,109 @@ +/* Copyright (c) [2023] [Syswonder Community] + * [Rukos] is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ +#![cfg_attr(feature = "axstd", no_std)] +#![cfg_attr(feature = "axstd", no_main)] + +#[cfg(feature = "axstd")] +use axstd::println; +#[cfg(feature = "axstd")] +use axstd::time::Instant; + +struct DateTime { + year: u64, + mon: u64, + mday: u64, + hour: u64, + min: u64, + sec: u64, +} + +fn convert_unix_time(unix_time: u64) -> DateTime { + let secs = unix_time; + + let t = secs; + let mut tdiv = t / 86400; + let mut tt = t % 86400; + let hour = tt / 3600; + println!("{},{}", tt, hour); + tt %= 3600; + let min = tt / 60; + tt %= 60; + let sec = tt; + let mut year = 1970; + let mut mon = 1; + + while tdiv >= 365 { + let days = if is_leap_year(year) { 366 } else { 365 }; + if tdiv >= days { + tdiv -= days; + year += 1; + } else { + break; + } + } + + while tdiv > 0 { + let days = days_in_month(mon, year); + if tdiv >= days { + tdiv -= days; + mon += 1; + } else { + break; + } + } + + let mday = tdiv + 1; + + DateTime { + year, + mon, + mday, + hour, + min, + sec, + } +} + +fn is_leap_year(year: u64) -> bool { + (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0) +} + +fn days_in_month(month: u64, year: u64) -> u64 { + match month { + 1 | 3 | 5 | 7 | 8 | 10 | 12 => 31, + 4 | 6 | 9 | 11 => 30, + 2 => { + if is_leap_year(year) { + 29 + } else { + 28 + } + } + _ => 0, + } +} + +#[cfg_attr(feature = "axstd", no_mangle)] +fn main() { + println!("test systime"); + let instant1 = Instant::now(); + let time1 = instant1.current_time(); + println!("time1 {:?}", time1); + let instant2 = Instant::now(); + let time2 = instant2.current_time(); + println!("time2 {:?}", time2); + let instant3 = Instant::now(); + let time3 = instant3.current_time().as_secs(); + println!("time3 {:?}", time3); + let date = convert_unix_time(time3); + println!( + "{:04}-{:02}-{:02} {:02}:{:02}:{:02}", + date.year, date.mon, date.mday, date.hour, date.min, date.sec + ); +} diff --git a/apps/task/parallel/Cargo.toml b/apps/task/parallel/Cargo.toml old mode 100644 new mode 100755 diff --git a/apps/task/parallel/expect_info_smp1_fifo.out b/apps/task/parallel/expect_info_smp1_fifo.out old mode 100644 new mode 100755 diff --git a/apps/task/parallel/expect_info_smp4_cfs.out b/apps/task/parallel/expect_info_smp4_cfs.out old mode 100644 new mode 100755 diff --git a/apps/task/parallel/expect_info_smp4_rr.out b/apps/task/parallel/expect_info_smp4_rr.out old mode 100644 new mode 100755 diff --git a/apps/task/parallel/src/main.rs b/apps/task/parallel/src/main.rs old mode 100644 new mode 100755 diff --git a/apps/task/parallel/test_cmd b/apps/task/parallel/test_cmd old mode 100644 new mode 100755 diff --git a/apps/task/priority/Cargo.toml b/apps/task/priority/Cargo.toml old mode 100644 new mode 100755 diff --git a/apps/task/priority/expect_info_smp1_cfs.out b/apps/task/priority/expect_info_smp1_cfs.out old mode 100644 new mode 100755 diff --git a/apps/task/priority/expect_info_smp1_fifo.out b/apps/task/priority/expect_info_smp1_fifo.out old mode 100644 new mode 100755 diff --git a/apps/task/priority/expect_info_smp1_rr.out b/apps/task/priority/expect_info_smp1_rr.out old mode 100644 new mode 100755 diff --git a/apps/task/priority/expect_info_smp4_cfs.out b/apps/task/priority/expect_info_smp4_cfs.out old mode 100644 new mode 100755 diff --git a/apps/task/priority/src/main.rs b/apps/task/priority/src/main.rs old mode 100644 new mode 100755 diff --git a/apps/task/priority/test_cmd b/apps/task/priority/test_cmd old mode 100644 new mode 100755 diff --git a/apps/task/sleep/Cargo.toml b/apps/task/sleep/Cargo.toml old mode 100644 new mode 100755 diff --git a/apps/task/sleep/expect_info_smp4_fifo.out b/apps/task/sleep/expect_info_smp4_fifo.out old mode 100644 new mode 100755 diff --git a/apps/task/sleep/expect_info_smp4_rr.out b/apps/task/sleep/expect_info_smp4_rr.out old mode 100644 new mode 100755 diff --git a/apps/task/sleep/src/main.rs b/apps/task/sleep/src/main.rs old mode 100644 new mode 100755 diff --git a/apps/task/sleep/test_cmd b/apps/task/sleep/test_cmd old mode 100644 new mode 100755 diff --git a/apps/task/tls/Cargo.toml b/apps/task/tls/Cargo.toml old mode 100644 new mode 100755 diff --git a/apps/task/tls/expect_info_smp1_fifo.out b/apps/task/tls/expect_info_smp1_fifo.out old mode 100644 new mode 100755 diff --git a/apps/task/tls/expect_info_smp4_rr.out b/apps/task/tls/expect_info_smp4_rr.out old mode 100644 new mode 100755 diff --git a/apps/task/tls/src/main.rs b/apps/task/tls/src/main.rs old mode 100644 new mode 100755 diff --git a/apps/task/tls/test_cmd b/apps/task/tls/test_cmd old mode 100644 new mode 100755 diff --git a/apps/task/yield/Cargo.toml b/apps/task/yield/Cargo.toml old mode 100644 new mode 100755 diff --git a/apps/task/yield/expect_debug_smp1_fifo.out b/apps/task/yield/expect_debug_smp1_fifo.out old mode 100644 new mode 100755 diff --git a/apps/task/yield/expect_info_smp4_fifo.out b/apps/task/yield/expect_info_smp4_fifo.out old mode 100644 new mode 100755 diff --git a/apps/task/yield/expect_info_smp4_rr.out b/apps/task/yield/expect_info_smp4_rr.out old mode 100644 new mode 100755 diff --git a/apps/task/yield/src/main.rs b/apps/task/yield/src/main.rs old mode 100644 new mode 100755 diff --git a/apps/task/yield/test_cmd b/apps/task/yield/test_cmd old mode 100644 new mode 100755 diff --git a/crates/allocator/Cargo.toml b/crates/allocator/Cargo.toml old mode 100644 new mode 100755 diff --git a/crates/allocator/benches/collections.rs b/crates/allocator/benches/collections.rs old mode 100644 new mode 100755 diff --git a/crates/allocator/benches/utils/mod.rs b/crates/allocator/benches/utils/mod.rs old mode 100644 new mode 100755 diff --git a/crates/allocator/src/bitmap.rs b/crates/allocator/src/bitmap.rs old mode 100644 new mode 100755 diff --git a/crates/allocator/src/buddy.rs b/crates/allocator/src/buddy.rs old mode 100644 new mode 100755 diff --git a/crates/allocator/src/lib.rs b/crates/allocator/src/lib.rs old mode 100644 new mode 100755 diff --git a/crates/allocator/src/slab.rs b/crates/allocator/src/slab.rs old mode 100644 new mode 100755 diff --git a/crates/allocator/src/tlsf.rs b/crates/allocator/src/tlsf.rs old mode 100644 new mode 100755 diff --git a/crates/allocator/tests/allocator.rs b/crates/allocator/tests/allocator.rs old mode 100644 new mode 100755 diff --git a/crates/arm_gic/Cargo.toml b/crates/arm_gic/Cargo.toml old mode 100644 new mode 100755 diff --git a/crates/arm_gic/src/gic_v2.rs b/crates/arm_gic/src/gic_v2.rs old mode 100644 new mode 100755 diff --git a/crates/arm_gic/src/lib.rs b/crates/arm_gic/src/lib.rs old mode 100644 new mode 100755 diff --git a/crates/arm_pl011/Cargo.toml b/crates/arm_pl011/Cargo.toml old mode 100644 new mode 100755 diff --git a/crates/arm_pl011/src/lib.rs b/crates/arm_pl011/src/lib.rs old mode 100644 new mode 100755 diff --git a/crates/arm_pl011/src/pl011.rs b/crates/arm_pl011/src/pl011.rs old mode 100644 new mode 100755 diff --git a/crates/axerrno/.gitignore b/crates/axerrno/.gitignore old mode 100644 new mode 100755 diff --git a/crates/axerrno/Cargo.toml b/crates/axerrno/Cargo.toml old mode 100644 new mode 100755 diff --git a/crates/axerrno/build.rs b/crates/axerrno/build.rs old mode 100644 new mode 100755 diff --git a/crates/axerrno/src/errno.h b/crates/axerrno/src/errno.h old mode 100644 new mode 100755 diff --git a/crates/axerrno/src/lib.rs b/crates/axerrno/src/lib.rs old mode 100644 new mode 100755 diff --git a/crates/axfs_devfs/Cargo.toml b/crates/axfs_devfs/Cargo.toml old mode 100644 new mode 100755 diff --git a/crates/axfs_devfs/src/dir.rs b/crates/axfs_devfs/src/dir.rs old mode 100644 new mode 100755 diff --git a/crates/axfs_devfs/src/lib.rs b/crates/axfs_devfs/src/lib.rs old mode 100644 new mode 100755 diff --git a/crates/axfs_devfs/src/null.rs b/crates/axfs_devfs/src/null.rs old mode 100644 new mode 100755 diff --git a/crates/axfs_devfs/src/tests.rs b/crates/axfs_devfs/src/tests.rs old mode 100644 new mode 100755 diff --git a/crates/axfs_devfs/src/zero.rs b/crates/axfs_devfs/src/zero.rs old mode 100644 new mode 100755 diff --git a/crates/axfs_ramfs/Cargo.toml b/crates/axfs_ramfs/Cargo.toml old mode 100644 new mode 100755 diff --git a/crates/axfs_ramfs/src/dir.rs b/crates/axfs_ramfs/src/dir.rs old mode 100644 new mode 100755 diff --git a/crates/axfs_ramfs/src/file.rs b/crates/axfs_ramfs/src/file.rs old mode 100644 new mode 100755 diff --git a/crates/axfs_ramfs/src/lib.rs b/crates/axfs_ramfs/src/lib.rs old mode 100644 new mode 100755 diff --git a/crates/axfs_ramfs/src/tests.rs b/crates/axfs_ramfs/src/tests.rs old mode 100644 new mode 100755 diff --git a/crates/axfs_vfs/Cargo.toml b/crates/axfs_vfs/Cargo.toml old mode 100644 new mode 100755 diff --git a/crates/axfs_vfs/src/lib.rs b/crates/axfs_vfs/src/lib.rs old mode 100644 new mode 100755 diff --git a/crates/axfs_vfs/src/macros.rs b/crates/axfs_vfs/src/macros.rs old mode 100644 new mode 100755 diff --git a/crates/axfs_vfs/src/path.rs b/crates/axfs_vfs/src/path.rs old mode 100644 new mode 100755 diff --git a/crates/axfs_vfs/src/structs.rs b/crates/axfs_vfs/src/structs.rs old mode 100644 new mode 100755 diff --git a/crates/axio/Cargo.toml b/crates/axio/Cargo.toml old mode 100644 new mode 100755 diff --git a/crates/axio/src/buffered/bufreader.rs b/crates/axio/src/buffered/bufreader.rs old mode 100644 new mode 100755 diff --git a/crates/axio/src/buffered/mod.rs b/crates/axio/src/buffered/mod.rs old mode 100644 new mode 100755 diff --git a/crates/axio/src/error.rs b/crates/axio/src/error.rs old mode 100644 new mode 100755 diff --git a/crates/axio/src/impls.rs b/crates/axio/src/impls.rs old mode 100644 new mode 100755 diff --git a/crates/axio/src/lib.rs b/crates/axio/src/lib.rs old mode 100644 new mode 100755 diff --git a/crates/axio/src/prelude.rs b/crates/axio/src/prelude.rs old mode 100644 new mode 100755 diff --git a/crates/capability/Cargo.toml b/crates/capability/Cargo.toml old mode 100644 new mode 100755 diff --git a/crates/capability/src/lib.rs b/crates/capability/src/lib.rs old mode 100644 new mode 100755 diff --git a/crates/crate_interface/Cargo.toml b/crates/crate_interface/Cargo.toml old mode 100644 new mode 100755 diff --git a/crates/crate_interface/README.md b/crates/crate_interface/README.md old mode 100644 new mode 100755 diff --git a/crates/crate_interface/src/lib.rs b/crates/crate_interface/src/lib.rs old mode 100644 new mode 100755 diff --git a/crates/crate_interface/tests/test_crate_interface.rs b/crates/crate_interface/tests/test_crate_interface.rs old mode 100644 new mode 100755 diff --git a/crates/driver_9p/Cargo.toml b/crates/driver_9p/Cargo.toml old mode 100644 new mode 100755 diff --git a/crates/driver_9p/src/lib.rs b/crates/driver_9p/src/lib.rs old mode 100644 new mode 100755 diff --git a/crates/driver_block/Cargo.toml b/crates/driver_block/Cargo.toml old mode 100644 new mode 100755 diff --git a/crates/driver_block/src/bcm2835sdhci.rs b/crates/driver_block/src/bcm2835sdhci.rs old mode 100644 new mode 100755 diff --git a/crates/driver_block/src/lib.rs b/crates/driver_block/src/lib.rs old mode 100644 new mode 100755 diff --git a/crates/driver_block/src/ramdisk.rs b/crates/driver_block/src/ramdisk.rs old mode 100644 new mode 100755 diff --git a/crates/driver_common/Cargo.toml b/crates/driver_common/Cargo.toml old mode 100644 new mode 100755 diff --git a/crates/driver_common/src/lib.rs b/crates/driver_common/src/lib.rs old mode 100644 new mode 100755 diff --git a/crates/driver_display/Cargo.toml b/crates/driver_display/Cargo.toml old mode 100644 new mode 100755 diff --git a/crates/driver_display/src/lib.rs b/crates/driver_display/src/lib.rs old mode 100644 new mode 100755 diff --git a/crates/driver_net/Cargo.toml b/crates/driver_net/Cargo.toml old mode 100644 new mode 100755 diff --git a/crates/driver_net/src/ixgbe.rs b/crates/driver_net/src/ixgbe.rs old mode 100644 new mode 100755 diff --git a/crates/driver_net/src/lib.rs b/crates/driver_net/src/lib.rs old mode 100644 new mode 100755 diff --git a/crates/driver_net/src/net_buf.rs b/crates/driver_net/src/net_buf.rs old mode 100644 new mode 100755 diff --git a/crates/driver_pci/Cargo.toml b/crates/driver_pci/Cargo.toml old mode 100644 new mode 100755 diff --git a/crates/driver_pci/src/lib.rs b/crates/driver_pci/src/lib.rs old mode 100644 new mode 100755 diff --git a/crates/driver_virtio/Cargo.toml b/crates/driver_virtio/Cargo.toml old mode 100644 new mode 100755 diff --git a/crates/driver_virtio/src/blk.rs b/crates/driver_virtio/src/blk.rs old mode 100644 new mode 100755 diff --git a/crates/driver_virtio/src/gpu.rs b/crates/driver_virtio/src/gpu.rs old mode 100644 new mode 100755 diff --git a/crates/driver_virtio/src/lib.rs b/crates/driver_virtio/src/lib.rs old mode 100644 new mode 100755 diff --git a/crates/driver_virtio/src/net.rs b/crates/driver_virtio/src/net.rs old mode 100644 new mode 100755 diff --git a/crates/driver_virtio/src/v9p.rs b/crates/driver_virtio/src/v9p.rs old mode 100644 new mode 100755 diff --git a/crates/dtb/Cargo.toml b/crates/dtb/Cargo.toml old mode 100644 new mode 100755 diff --git a/crates/dtb/src/lib.rs b/crates/dtb/src/lib.rs old mode 100644 new mode 100755 diff --git a/crates/dw_apb_uart/Cargo.toml b/crates/dw_apb_uart/Cargo.toml old mode 100644 new mode 100755 diff --git a/crates/dw_apb_uart/src/lib.rs b/crates/dw_apb_uart/src/lib.rs old mode 100644 new mode 100755 diff --git a/crates/flatten_objects/Cargo.toml b/crates/flatten_objects/Cargo.toml old mode 100644 new mode 100755 index aea72b5a7..189a72126 --- a/crates/flatten_objects/Cargo.toml +++ b/crates/flatten_objects/Cargo.toml @@ -10,4 +10,5 @@ repository = "https://github.com/rcore-os/arceos/tree/main/crates/flatten_object documentation = "https://rcore-os.github.io/arceos/flatten_objects/index.html" [dependencies] +log = "0.4" bitmaps = { version = "3.2", default-features = false } diff --git a/crates/flatten_objects/src/lib.rs b/crates/flatten_objects/src/lib.rs old mode 100644 new mode 100755 index 74a5f0702..3f9b0397c --- a/crates/flatten_objects/src/lib.rs +++ b/crates/flatten_objects/src/lib.rs @@ -59,6 +59,7 @@ pub struct FlattenObjects { count: usize, } +use log::info; impl FlattenObjects { /// Creates a new empty `FlattenObjects`. pub const fn new() -> Self { diff --git a/crates/handler_table/Cargo.toml b/crates/handler_table/Cargo.toml old mode 100644 new mode 100755 diff --git a/crates/handler_table/README.md b/crates/handler_table/README.md old mode 100644 new mode 100755 diff --git a/crates/handler_table/src/lib.rs b/crates/handler_table/src/lib.rs old mode 100644 new mode 100755 diff --git a/crates/kernel_guard/Cargo.toml b/crates/kernel_guard/Cargo.toml old mode 100644 new mode 100755 diff --git a/crates/kernel_guard/README.md b/crates/kernel_guard/README.md old mode 100644 new mode 100755 diff --git a/crates/kernel_guard/src/arch/aarch64.rs b/crates/kernel_guard/src/arch/aarch64.rs old mode 100644 new mode 100755 diff --git a/crates/kernel_guard/src/arch/mod.rs b/crates/kernel_guard/src/arch/mod.rs old mode 100644 new mode 100755 diff --git a/crates/kernel_guard/src/arch/riscv.rs b/crates/kernel_guard/src/arch/riscv.rs old mode 100644 new mode 100755 diff --git a/crates/kernel_guard/src/arch/x86.rs b/crates/kernel_guard/src/arch/x86.rs old mode 100644 new mode 100755 diff --git a/crates/kernel_guard/src/lib.rs b/crates/kernel_guard/src/lib.rs old mode 100644 new mode 100755 diff --git a/crates/lazy_init/Cargo.toml b/crates/lazy_init/Cargo.toml old mode 100644 new mode 100755 diff --git a/crates/lazy_init/src/lib.rs b/crates/lazy_init/src/lib.rs old mode 100644 new mode 100755 diff --git a/crates/linked_list/Cargo.toml b/crates/linked_list/Cargo.toml old mode 100644 new mode 100755 diff --git a/crates/linked_list/src/lib.rs b/crates/linked_list/src/lib.rs old mode 100644 new mode 100755 diff --git a/crates/linked_list/src/linked_list.rs b/crates/linked_list/src/linked_list.rs old mode 100644 new mode 100755 diff --git a/crates/linked_list/src/unsafe_list.rs b/crates/linked_list/src/unsafe_list.rs old mode 100644 new mode 100755 diff --git a/crates/memory_addr/Cargo.toml b/crates/memory_addr/Cargo.toml old mode 100644 new mode 100755 diff --git a/crates/memory_addr/README.md b/crates/memory_addr/README.md old mode 100644 new mode 100755 diff --git a/crates/memory_addr/src/lib.rs b/crates/memory_addr/src/lib.rs old mode 100644 new mode 100755 diff --git a/crates/page_table/Cargo.toml b/crates/page_table/Cargo.toml old mode 100644 new mode 100755 diff --git a/crates/page_table/src/arch/aarch64.rs b/crates/page_table/src/arch/aarch64.rs old mode 100644 new mode 100755 diff --git a/crates/page_table/src/arch/mod.rs b/crates/page_table/src/arch/mod.rs old mode 100644 new mode 100755 diff --git a/crates/page_table/src/arch/riscv.rs b/crates/page_table/src/arch/riscv.rs old mode 100644 new mode 100755 diff --git a/crates/page_table/src/arch/x86_64.rs b/crates/page_table/src/arch/x86_64.rs old mode 100644 new mode 100755 diff --git a/crates/page_table/src/bits64.rs b/crates/page_table/src/bits64.rs old mode 100644 new mode 100755 diff --git a/crates/page_table/src/lib.rs b/crates/page_table/src/lib.rs old mode 100644 new mode 100755 diff --git a/crates/page_table_entry/Cargo.toml b/crates/page_table_entry/Cargo.toml old mode 100644 new mode 100755 diff --git a/crates/page_table_entry/src/arch/aarch64.rs b/crates/page_table_entry/src/arch/aarch64.rs old mode 100644 new mode 100755 diff --git a/crates/page_table_entry/src/arch/mod.rs b/crates/page_table_entry/src/arch/mod.rs old mode 100644 new mode 100755 diff --git a/crates/page_table_entry/src/arch/riscv.rs b/crates/page_table_entry/src/arch/riscv.rs old mode 100644 new mode 100755 diff --git a/crates/page_table_entry/src/arch/x86_64.rs b/crates/page_table_entry/src/arch/x86_64.rs old mode 100644 new mode 100755 diff --git a/crates/page_table_entry/src/lib.rs b/crates/page_table_entry/src/lib.rs old mode 100644 new mode 100755 diff --git a/crates/percpu/Cargo.toml b/crates/percpu/Cargo.toml old mode 100644 new mode 100755 diff --git a/crates/percpu/build.rs b/crates/percpu/build.rs old mode 100644 new mode 100755 diff --git a/crates/percpu/src/imp.rs b/crates/percpu/src/imp.rs old mode 100644 new mode 100755 diff --git a/crates/percpu/src/lib.rs b/crates/percpu/src/lib.rs old mode 100644 new mode 100755 diff --git a/crates/percpu/src/naive.rs b/crates/percpu/src/naive.rs old mode 100644 new mode 100755 diff --git a/crates/percpu/test_percpu.x b/crates/percpu/test_percpu.x old mode 100644 new mode 100755 diff --git a/crates/percpu/tests/test_percpu.rs b/crates/percpu/tests/test_percpu.rs old mode 100644 new mode 100755 diff --git a/crates/percpu_macros/Cargo.toml b/crates/percpu_macros/Cargo.toml old mode 100644 new mode 100755 diff --git a/crates/percpu_macros/src/arch.rs b/crates/percpu_macros/src/arch.rs old mode 100644 new mode 100755 diff --git a/crates/percpu_macros/src/lib.rs b/crates/percpu_macros/src/lib.rs old mode 100644 new mode 100755 diff --git a/crates/percpu_macros/src/naive.rs b/crates/percpu_macros/src/naive.rs old mode 100644 new mode 100755 diff --git a/crates/ratio/Cargo.toml b/crates/ratio/Cargo.toml old mode 100644 new mode 100755 diff --git a/crates/ratio/src/lib.rs b/crates/ratio/src/lib.rs old mode 100644 new mode 100755 diff --git a/crates/scheduler/Cargo.toml b/crates/scheduler/Cargo.toml old mode 100644 new mode 100755 diff --git a/crates/scheduler/src/cfs.rs b/crates/scheduler/src/cfs.rs old mode 100644 new mode 100755 diff --git a/crates/scheduler/src/fifo.rs b/crates/scheduler/src/fifo.rs old mode 100644 new mode 100755 diff --git a/crates/scheduler/src/lib.rs b/crates/scheduler/src/lib.rs old mode 100644 new mode 100755 diff --git a/crates/scheduler/src/round_robin.rs b/crates/scheduler/src/round_robin.rs old mode 100644 new mode 100755 diff --git a/crates/scheduler/src/tests.rs b/crates/scheduler/src/tests.rs old mode 100644 new mode 100755 diff --git a/crates/slab_allocator/Cargo.toml b/crates/slab_allocator/Cargo.toml old mode 100644 new mode 100755 diff --git a/crates/slab_allocator/src/lib.rs b/crates/slab_allocator/src/lib.rs old mode 100644 new mode 100755 diff --git a/crates/slab_allocator/src/slab.rs b/crates/slab_allocator/src/slab.rs old mode 100644 new mode 100755 diff --git a/crates/slab_allocator/src/tests.rs b/crates/slab_allocator/src/tests.rs old mode 100644 new mode 100755 diff --git a/crates/spinlock/Cargo.toml b/crates/spinlock/Cargo.toml old mode 100644 new mode 100755 diff --git a/crates/spinlock/src/base.rs b/crates/spinlock/src/base.rs old mode 100644 new mode 100755 diff --git a/crates/spinlock/src/lib.rs b/crates/spinlock/src/lib.rs old mode 100644 new mode 100755 diff --git a/crates/timer_list/Cargo.toml b/crates/timer_list/Cargo.toml old mode 100644 new mode 100755 diff --git a/crates/timer_list/src/lib.rs b/crates/timer_list/src/lib.rs old mode 100644 new mode 100755 diff --git a/crates/tuple_for_each/Cargo.toml b/crates/tuple_for_each/Cargo.toml old mode 100644 new mode 100755 diff --git a/crates/tuple_for_each/src/lib.rs b/crates/tuple_for_each/src/lib.rs old mode 100644 new mode 100755 diff --git a/crates/tuple_for_each/tests/test_tuple_for_each.rs b/crates/tuple_for_each/tests/test_tuple_for_each.rs old mode 100644 new mode 100755 diff --git a/doc/README.md b/doc/README.md old mode 100644 new mode 100755 diff --git a/doc/apps_display.md b/doc/apps_display.md old mode 100644 new mode 100755 diff --git a/doc/apps_echoserver.md b/doc/apps_echoserver.md old mode 100644 new mode 100755 diff --git a/doc/apps_exception.md b/doc/apps_exception.md old mode 100644 new mode 100755 diff --git a/doc/apps_fs_shell.md b/doc/apps_fs_shell.md old mode 100644 new mode 100755 diff --git a/doc/apps_helloworld.md b/doc/apps_helloworld.md old mode 100644 new mode 100755 diff --git a/doc/apps_httpserver.md b/doc/apps_httpserver.md old mode 100644 new mode 100755 diff --git a/doc/apps_memtest.md b/doc/apps_memtest.md old mode 100644 new mode 100755 diff --git a/doc/apps_net-httpclient.md b/doc/apps_net-httpclient.md old mode 100644 new mode 100755 diff --git a/doc/apps_parallel.md b/doc/apps_parallel.md old mode 100644 new mode 100755 diff --git a/doc/apps_priority.md b/doc/apps_priority.md old mode 100644 new mode 100755 diff --git a/doc/apps_sleep.md b/doc/apps_sleep.md old mode 100644 new mode 100755 diff --git a/doc/apps_yield.md b/doc/apps_yield.md old mode 100644 new mode 100755 diff --git a/doc/build.md b/doc/build.md old mode 100644 new mode 100755 diff --git a/doc/figures/display.png b/doc/figures/display.png old mode 100644 new mode 100755 diff --git a/doc/figures/rukos.svg b/doc/figures/rukos.svg old mode 100644 new mode 100755 diff --git a/doc/init.md b/doc/init.md old mode 100644 new mode 100755 diff --git a/doc/ixgbe.md b/doc/ixgbe.md old mode 100644 new mode 100755 diff --git a/doc/platform_raspi4.md b/doc/platform_raspi4.md old mode 100644 new mode 100755 diff --git a/modules/ax9p/Cargo.toml b/modules/ax9p/Cargo.toml old mode 100644 new mode 100755 diff --git a/modules/ax9p/src/drv.rs b/modules/ax9p/src/drv.rs old mode 100644 new mode 100755 diff --git a/modules/ax9p/src/fs.rs b/modules/ax9p/src/fs.rs old mode 100644 new mode 100755 index 3dd5da9b3..0a3621461 --- a/modules/ax9p/src/fs.rs +++ b/modules/ax9p/src/fs.rs @@ -10,7 +10,7 @@ //! 9P filesystem used by [RukOS](https://github.com/rcore-os/arceos). //! //! The implementation is based on [`axfs_vfs`]. -use crate::drv::{self, Drv9pOps}; +use crate::drv::{self, Drv9pOps, _9P_MAX_PSIZE, _9P_MAX_QSIZE}; use alloc::{collections::BTreeMap, string::String, string::ToString, sync::Arc, sync::Weak}; use axfs_vfs::{ impl_vfs_non_dir_default, VfsDirEntry, VfsError, VfsNodeAttr, VfsNodeOps, VfsNodeRef, @@ -508,6 +508,41 @@ impl FileNode { protocol, } } + + /// Read data from the file at the given offset. + fn _read_at(&self, offset: u64, buf: &mut [u8]) -> VfsResult { + let mut dev = self.inner.write(); + let mut read_len = buf.len(); + const MAX_READ_LEN: usize = (_9P_MAX_PSIZE - 32) as usize; + if read_len > MAX_READ_LEN { + read_len = MAX_READ_LEN; + } + match dev.tread(*self.fid, offset, read_len as u32) { + Ok(content) => { + // should be more effient + for (i, byte) in content.iter().enumerate() { + buf[i] = *byte; + } + Ok(content.len()) + } + Err(_) => Err(VfsError::BadState), + } + } + + /// Write data to the file at the given offset. + fn _write_at(&self, offset: u64, buf: &[u8]) -> VfsResult { + let mut dev = self.inner.write(); + let mut pbuf = buf; + let write_len = buf.len(); + const MAX_WRITE_LEN: usize = (_9P_MAX_QSIZE - 32) as usize; + if write_len > MAX_WRITE_LEN { + pbuf = &buf[..write_len]; + } + match dev.twrite(*self.fid, offset, pbuf) { + Ok(_) => Ok(pbuf.len()), + Err(_) => Err(VfsError::BadState), + } + } } impl Drop for FileNode { diff --git a/modules/ax9p/src/lib.rs b/modules/ax9p/src/lib.rs old mode 100644 new mode 100755 diff --git a/modules/ax9p/src/netdev.rs b/modules/ax9p/src/netdev.rs old mode 100644 new mode 100755 diff --git a/modules/axalloc/Cargo.toml b/modules/axalloc/Cargo.toml old mode 100644 new mode 100755 diff --git a/modules/axalloc/src/lib.rs b/modules/axalloc/src/lib.rs old mode 100644 new mode 100755 diff --git a/modules/axalloc/src/page.rs b/modules/axalloc/src/page.rs old mode 100644 new mode 100755 diff --git a/modules/axconfig/Cargo.toml b/modules/axconfig/Cargo.toml old mode 100644 new mode 100755 diff --git a/modules/axconfig/build.rs b/modules/axconfig/build.rs old mode 100644 new mode 100755 diff --git a/modules/axconfig/defconfig.toml b/modules/axconfig/defconfig.toml old mode 100644 new mode 100755 diff --git a/modules/axconfig/src/lib.rs b/modules/axconfig/src/lib.rs old mode 100644 new mode 100755 diff --git a/modules/axdisplay/Cargo.toml b/modules/axdisplay/Cargo.toml old mode 100644 new mode 100755 diff --git a/modules/axdisplay/src/lib.rs b/modules/axdisplay/src/lib.rs old mode 100644 new mode 100755 diff --git a/modules/axdriver/Cargo.toml b/modules/axdriver/Cargo.toml old mode 100644 new mode 100755 diff --git a/modules/axdriver/build.rs b/modules/axdriver/build.rs old mode 100644 new mode 100755 diff --git a/modules/axdriver/src/bus/mmio.rs b/modules/axdriver/src/bus/mmio.rs old mode 100644 new mode 100755 diff --git a/modules/axdriver/src/bus/mod.rs b/modules/axdriver/src/bus/mod.rs old mode 100644 new mode 100755 diff --git a/modules/axdriver/src/bus/pci.rs b/modules/axdriver/src/bus/pci.rs old mode 100644 new mode 100755 diff --git a/modules/axdriver/src/drivers.rs b/modules/axdriver/src/drivers.rs old mode 100644 new mode 100755 diff --git a/modules/axdriver/src/dummy.rs b/modules/axdriver/src/dummy.rs old mode 100644 new mode 100755 diff --git a/modules/axdriver/src/ixgbe.rs b/modules/axdriver/src/ixgbe.rs old mode 100644 new mode 100755 diff --git a/modules/axdriver/src/lib.rs b/modules/axdriver/src/lib.rs old mode 100644 new mode 100755 diff --git a/modules/axdriver/src/macros.rs b/modules/axdriver/src/macros.rs old mode 100644 new mode 100755 diff --git a/modules/axdriver/src/prelude.rs b/modules/axdriver/src/prelude.rs old mode 100644 new mode 100755 diff --git a/modules/axdriver/src/structs/dyn.rs b/modules/axdriver/src/structs/dyn.rs old mode 100644 new mode 100755 diff --git a/modules/axdriver/src/structs/mod.rs b/modules/axdriver/src/structs/mod.rs old mode 100644 new mode 100755 diff --git a/modules/axdriver/src/structs/static.rs b/modules/axdriver/src/structs/static.rs old mode 100644 new mode 100755 diff --git a/modules/axdriver/src/virtio.rs b/modules/axdriver/src/virtio.rs old mode 100644 new mode 100755 diff --git a/modules/axfs/Cargo.toml b/modules/axfs/Cargo.toml old mode 100644 new mode 100755 diff --git a/modules/axfs/resources/create_test_img.sh b/modules/axfs/resources/create_test_img.sh index d51cef84d..618894b5d 100755 --- a/modules/axfs/resources/create_test_img.sh +++ b/modules/axfs/resources/create_test_img.sh @@ -22,9 +22,17 @@ create_test_img() { echo "Rust is cool!" >>"mnt/very/long/path/test.txt" mkdir -p "mnt/very-long-dir-name" echo "Rust is cool!" >>"mnt/very-long-dir-name/very-long-file-name.txt" - + mkdir -p "mnt/nginx/logs" + echo "" >> "mnt/nginx/logs/error.log" + mkdir -p "mnt/nginx/conf" + cp "/home/oslab/Desktop/rukos/apps/c/nginx/nginx.conf" "mnt/nginx/conf/nginx.conf" + cp "/home/oslab/Desktop/rukos/apps/c/nginx/mime.types" "mnt/nginx/conf/mime.types" + mkdir -p "mnt/html" + cp -r "/home/oslab/Desktop/rukos/apps/c/nginx/html" "mnt/" sudo umount mnt } create_test_img "$CUR_DIR/fat16.img" 2500 16 -create_test_img "$CUR_DIR/fat32.img" 34000 32 +create_test_img "$CUR_DIR/fat32.img" 40000 32 +rm -f /home/oslab/Desktop/rukos/disk.img +cp fat32.img /home/oslab/Desktop/rukos/disk.img diff --git a/modules/axfs/src/api/dir.rs b/modules/axfs/src/api/dir.rs old mode 100644 new mode 100755 diff --git a/modules/axfs/src/api/file.rs b/modules/axfs/src/api/file.rs old mode 100644 new mode 100755 diff --git a/modules/axfs/src/api/mod.rs b/modules/axfs/src/api/mod.rs old mode 100644 new mode 100755 diff --git a/modules/axfs/src/dev.rs b/modules/axfs/src/dev.rs old mode 100644 new mode 100755 diff --git a/modules/axfs/src/fops.rs b/modules/axfs/src/fops.rs old mode 100644 new mode 100755 index b2058bf3c..4f752f829 --- a/modules/axfs/src/fops.rs +++ b/modules/axfs/src/fops.rs @@ -122,6 +122,7 @@ impl OpenOptions { impl File { fn _open_at(dir: Option<&VfsNodeRef>, path: &str, opts: &OpenOptions) -> AxResult { + //info!("lhw debug in File openat begin"); debug!("open file: {} {:?}", path, opts); if !opts.is_valid() { return ax_err!(InvalidInput); @@ -145,6 +146,7 @@ impl File { // just open the existing node_option? }; + //info!("lhw debug in File openat 1"); let attr = node.get_attr()?; if attr.is_dir() @@ -156,11 +158,13 @@ impl File { if !perm_to_cap(attr.perm()).contains(access_cap) { return ax_err!(PermissionDenied); } - + //info!("lhw debug in File openat 2"); node.open()?; + //info!("lhw debug in File openat 3"); if opts.truncate { node.truncate(0)?; } + //info!("lhw debug in File openat 4"); Ok(Self { node: WithCap::new(node, access_cap), is_append: opts.append, @@ -196,6 +200,7 @@ impl File { /// It does not update the file cursor. pub fn read_at(&self, offset: u64, buf: &mut [u8]) -> AxResult { let node = self.node.access(Cap::READ)?; + info!("before fops readat"); let read_len = node.read_at(offset, buf)?; Ok(read_len) } @@ -349,6 +354,7 @@ impl Directory { impl Drop for File { fn drop(&mut self) { + info!("lhw debug drop File"); unsafe { self.node.access_unchecked().release().ok() }; } } diff --git a/modules/axfs/src/fs/fatfs.rs b/modules/axfs/src/fs/fatfs.rs old mode 100644 new mode 100755 index 623ca2a63..fec1f4a63 --- a/modules/axfs/src/fs/fatfs.rs +++ b/modules/axfs/src/fs/fatfs.rs @@ -82,16 +82,59 @@ impl VfsNodeOps for FileWrapper<'static> { Ok(VfsNodeAttr::new(perm, VfsNodeType::File, size, blocks)) } - fn read_at(&self, offset: u64, buf: &mut [u8]) -> VfsResult { + /*fn read_at(&self, offset: u64, buf: &mut [u8]) -> VfsResult { let mut file = self.0.lock(); file.seek(SeekFrom::Start(offset)).map_err(as_vfs_err)?; // TODO: more efficient - file.read(buf).map_err(as_vfs_err) + //info!("before fatfs readat file of {} bytes",buf.len()); + let read_len = file.read(buf).map_err(as_vfs_err)?; + //info!("read in fatfs readat read {} bytes file of {} bytes",read_len,buf.len()); + Ok(read_len) + }*/ + fn read_at(&self, offset: u64, buf: &mut [u8]) -> VfsResult { + let mut file = self.0.lock(); + file.seek(SeekFrom::Start(offset)).map_err(as_vfs_err)?; + + let mut total_read = 0; + while total_read < buf.len() { + let remaining = &mut buf[total_read..]; + let read_len = file.read(remaining).map_err(as_vfs_err)?; + + if read_len == 0 { + break; + } + + total_read += read_len; + } + + //info!("read in fatfs readat read {} bytes file of {} bytes",total_read,buf.len()); + + Ok(total_read) } - fn write_at(&self, offset: u64, buf: &[u8]) -> VfsResult { + /*fn write_at(&self, offset: u64, buf: &[u8]) -> VfsResult { let mut file = self.0.lock(); file.seek(SeekFrom::Start(offset)).map_err(as_vfs_err)?; // TODO: more efficient file.write(buf).map_err(as_vfs_err) + }*/ + fn write_at(&self, offset: u64, buf: &[u8]) -> VfsResult { + let mut file = self.0.lock(); + file.seek(SeekFrom::Start(offset)).map_err(as_vfs_err)?; // TODO: more efficient + + let mut total_write = 0; + while total_write < buf.len() { + let remaining = &buf[total_write..]; + let write_len = file.write(remaining).map_err(as_vfs_err)?; + + if write_len == 0 { + break; + } + + total_write += write_len; + } + + //info!("read in fatfs readat read {} bytes file of {} bytes",total_read,buf.len()); + + Ok(total_write) } fn truncate(&self, size: u64) -> VfsResult { @@ -221,7 +264,10 @@ impl fatfs::IoBase for Disk { impl Read for Disk { fn read(&mut self, mut buf: &mut [u8]) -> Result { let mut read_len = 0; + let mut read_cnt = 0; + //info!("before read in fatfs: file size: {}",buf.len()); while !buf.is_empty() { + read_cnt += 1; match self.read_one(buf) { Ok(0) => break, Ok(n) => { @@ -232,6 +278,7 @@ impl Read for Disk { Err(_) => return Err(()), } } + //info!("read in fatfs read {} bytes {} cnts from file of {} bytes",read_len,read_cnt,buf.len()); Ok(read_len) } } diff --git a/modules/axfs/src/fs/mod.rs b/modules/axfs/src/fs/mod.rs old mode 100644 new mode 100755 diff --git a/modules/axfs/src/fs/myfs.rs b/modules/axfs/src/fs/myfs.rs old mode 100644 new mode 100755 diff --git a/modules/axfs/src/lib.rs b/modules/axfs/src/lib.rs old mode 100644 new mode 100755 diff --git a/modules/axfs/src/mounts.rs b/modules/axfs/src/mounts.rs old mode 100644 new mode 100755 diff --git a/modules/axfs/src/root.rs b/modules/axfs/src/root.rs old mode 100644 new mode 100755 diff --git a/modules/axfs/tests/test_common/mod.rs b/modules/axfs/tests/test_common/mod.rs old mode 100644 new mode 100755 diff --git a/modules/axfs/tests/test_fatfs.rs b/modules/axfs/tests/test_fatfs.rs old mode 100644 new mode 100755 diff --git a/modules/axfs/tests/test_ramfs.rs b/modules/axfs/tests/test_ramfs.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/.gitignore b/modules/axhal/.gitignore old mode 100644 new mode 100755 diff --git a/modules/axhal/Cargo.toml b/modules/axhal/Cargo.toml old mode 100644 new mode 100755 diff --git a/modules/axhal/build.rs b/modules/axhal/build.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/linker.lds.S b/modules/axhal/linker.lds.S old mode 100644 new mode 100755 diff --git a/modules/axhal/src/arch/aarch64/context.rs b/modules/axhal/src/arch/aarch64/context.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/arch/aarch64/mod.rs b/modules/axhal/src/arch/aarch64/mod.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/arch/aarch64/trap.S b/modules/axhal/src/arch/aarch64/trap.S old mode 100644 new mode 100755 diff --git a/modules/axhal/src/arch/aarch64/trap.rs b/modules/axhal/src/arch/aarch64/trap.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/arch/mod.rs b/modules/axhal/src/arch/mod.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/arch/riscv/context.rs b/modules/axhal/src/arch/riscv/context.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/arch/riscv/macros.rs b/modules/axhal/src/arch/riscv/macros.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/arch/riscv/mod.rs b/modules/axhal/src/arch/riscv/mod.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/arch/riscv/trap.S b/modules/axhal/src/arch/riscv/trap.S old mode 100644 new mode 100755 diff --git a/modules/axhal/src/arch/riscv/trap.rs b/modules/axhal/src/arch/riscv/trap.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/arch/x86_64/context.rs b/modules/axhal/src/arch/x86_64/context.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/arch/x86_64/gdt.rs b/modules/axhal/src/arch/x86_64/gdt.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/arch/x86_64/idt.rs b/modules/axhal/src/arch/x86_64/idt.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/arch/x86_64/mod.rs b/modules/axhal/src/arch/x86_64/mod.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/arch/x86_64/trap.S b/modules/axhal/src/arch/x86_64/trap.S old mode 100644 new mode 100755 diff --git a/modules/axhal/src/arch/x86_64/trap.rs b/modules/axhal/src/arch/x86_64/trap.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/cpu.rs b/modules/axhal/src/cpu.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/irq.rs b/modules/axhal/src/irq.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/lib.rs b/modules/axhal/src/lib.rs old mode 100644 new mode 100755 index 0fe6ee1ca..8a65f05f5 --- a/modules/axhal/src/lib.rs +++ b/modules/axhal/src/lib.rs @@ -39,6 +39,7 @@ #![feature(const_maybe_uninit_zeroed)] #![feature(const_option)] #![feature(doc_auto_cfg)] +#![feature(core_intrinsics)] #[allow(unused_imports)] #[macro_use] diff --git a/modules/axhal/src/mem.rs b/modules/axhal/src/mem.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/paging.rs b/modules/axhal/src/paging.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/aarch64_bsta1000b/dw_apb_uart.rs b/modules/axhal/src/platform/aarch64_bsta1000b/dw_apb_uart.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/aarch64_bsta1000b/mem.rs b/modules/axhal/src/platform/aarch64_bsta1000b/mem.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/aarch64_bsta1000b/misc.rs b/modules/axhal/src/platform/aarch64_bsta1000b/misc.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/aarch64_bsta1000b/mod.rs b/modules/axhal/src/platform/aarch64_bsta1000b/mod.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/aarch64_bsta1000b/mp.rs b/modules/axhal/src/platform/aarch64_bsta1000b/mp.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/aarch64_common/boot.rs b/modules/axhal/src/platform/aarch64_common/boot.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/aarch64_common/generic_timer.rs b/modules/axhal/src/platform/aarch64_common/generic_timer.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/aarch64_common/gic.rs b/modules/axhal/src/platform/aarch64_common/gic.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/aarch64_common/mod.rs b/modules/axhal/src/platform/aarch64_common/mod.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/aarch64_common/pl011.rs b/modules/axhal/src/platform/aarch64_common/pl011.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/aarch64_common/pl031.rs b/modules/axhal/src/platform/aarch64_common/pl031.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/aarch64_common/psci.rs b/modules/axhal/src/platform/aarch64_common/psci.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/aarch64_qemu_virt/mem.rs b/modules/axhal/src/platform/aarch64_qemu_virt/mem.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/aarch64_qemu_virt/mod.rs b/modules/axhal/src/platform/aarch64_qemu_virt/mod.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/aarch64_qemu_virt/mp.rs b/modules/axhal/src/platform/aarch64_qemu_virt/mp.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/aarch64_raspi/mem.rs b/modules/axhal/src/platform/aarch64_raspi/mem.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/aarch64_raspi/mod.rs b/modules/axhal/src/platform/aarch64_raspi/mod.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/aarch64_raspi/mp.rs b/modules/axhal/src/platform/aarch64_raspi/mp.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/dummy/mod.rs b/modules/axhal/src/platform/dummy/mod.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/mod.rs b/modules/axhal/src/platform/mod.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/riscv64_qemu_virt/boot.rs b/modules/axhal/src/platform/riscv64_qemu_virt/boot.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/riscv64_qemu_virt/console.rs b/modules/axhal/src/platform/riscv64_qemu_virt/console.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/riscv64_qemu_virt/irq.rs b/modules/axhal/src/platform/riscv64_qemu_virt/irq.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/riscv64_qemu_virt/mem.rs b/modules/axhal/src/platform/riscv64_qemu_virt/mem.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/riscv64_qemu_virt/misc.rs b/modules/axhal/src/platform/riscv64_qemu_virt/misc.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/riscv64_qemu_virt/mod.rs b/modules/axhal/src/platform/riscv64_qemu_virt/mod.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/riscv64_qemu_virt/mp.rs b/modules/axhal/src/platform/riscv64_qemu_virt/mp.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/riscv64_qemu_virt/time.rs b/modules/axhal/src/platform/riscv64_qemu_virt/time.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/x86_pc/ap_start.S b/modules/axhal/src/platform/x86_pc/ap_start.S old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/x86_pc/apic.rs b/modules/axhal/src/platform/x86_pc/apic.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/x86_pc/boot.rs b/modules/axhal/src/platform/x86_pc/boot.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/x86_pc/dtables.rs b/modules/axhal/src/platform/x86_pc/dtables.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/x86_pc/mem.rs b/modules/axhal/src/platform/x86_pc/mem.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/x86_pc/misc.rs b/modules/axhal/src/platform/x86_pc/misc.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/x86_pc/mod.rs b/modules/axhal/src/platform/x86_pc/mod.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/x86_pc/mp.rs b/modules/axhal/src/platform/x86_pc/mp.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/x86_pc/multiboot.S b/modules/axhal/src/platform/x86_pc/multiboot.S old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/x86_pc/rtc.rs b/modules/axhal/src/platform/x86_pc/rtc.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/x86_pc/time.rs b/modules/axhal/src/platform/x86_pc/time.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/platform/x86_pc/uart16550.rs b/modules/axhal/src/platform/x86_pc/uart16550.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/time.rs b/modules/axhal/src/time.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/tls.rs b/modules/axhal/src/tls.rs old mode 100644 new mode 100755 diff --git a/modules/axhal/src/trap.rs b/modules/axhal/src/trap.rs old mode 100644 new mode 100755 diff --git a/modules/axlog/Cargo.toml b/modules/axlog/Cargo.toml old mode 100644 new mode 100755 diff --git a/modules/axlog/src/lib.rs b/modules/axlog/src/lib.rs old mode 100644 new mode 100755 diff --git a/modules/axnet/Cargo.toml b/modules/axnet/Cargo.toml old mode 100644 new mode 100755 diff --git a/modules/axnet/src/lib.rs b/modules/axnet/src/lib.rs old mode 100644 new mode 100755 diff --git a/modules/axnet/src/smoltcp_impl/addr.rs b/modules/axnet/src/smoltcp_impl/addr.rs old mode 100644 new mode 100755 diff --git a/modules/axnet/src/smoltcp_impl/bench.rs b/modules/axnet/src/smoltcp_impl/bench.rs old mode 100644 new mode 100755 diff --git a/modules/axnet/src/smoltcp_impl/dns.rs b/modules/axnet/src/smoltcp_impl/dns.rs old mode 100644 new mode 100755 diff --git a/modules/axnet/src/smoltcp_impl/listen_table.rs b/modules/axnet/src/smoltcp_impl/listen_table.rs old mode 100644 new mode 100755 diff --git a/modules/axnet/src/smoltcp_impl/mod.rs b/modules/axnet/src/smoltcp_impl/mod.rs old mode 100644 new mode 100755 diff --git a/modules/axnet/src/smoltcp_impl/tcp.rs b/modules/axnet/src/smoltcp_impl/tcp.rs old mode 100644 new mode 100755 index b3da5d079..e62e7ea79 --- a/modules/axnet/src/smoltcp_impl/tcp.rs +++ b/modules/axnet/src/smoltcp_impl/tcp.rs @@ -10,6 +10,7 @@ use core::cell::UnsafeCell; use core::net::SocketAddr; use core::sync::atomic::{AtomicBool, AtomicU8, Ordering}; +use core::time::Duration; use axerrno::{ax_err, ax_err_type, AxError, AxResult}; use axio::PollState; @@ -172,6 +173,7 @@ impl TcpSocket { self.block_on(|| { let PollState { writable, .. } = self.poll_connect()?; if !writable { + //info!("lhw debug block on connect"); Err(AxError::WouldBlock) } else if self.get_state() == STATE_CONNECTED { Ok(()) @@ -280,6 +282,8 @@ impl TcpSocket { /// Receives data from the socket, stores it in the given buffer. pub fn recv(&self, buf: &mut [u8]) -> AxResult { + let no_block = self.is_nonblocking(); + //self.set_nonblocking(true); if self.is_connecting() { return Err(AxError::WouldBlock); } else if !self.is_connected() { @@ -288,7 +292,7 @@ impl TcpSocket { // SAFETY: `self.handle` should be initialized in a connected socket. let handle = unsafe { self.handle.get().read().unwrap() }; - self.block_on(|| { + let res = self.block_on(|| { SOCKET_SET.with_socket_mut::(handle, |socket| { if !socket.is_active() { // not open @@ -302,17 +306,23 @@ impl TcpSocket { let len = socket .recv_slice(buf) .map_err(|_| ax_err_type!(BadState, "socket recv() failed"))?; + //info!("Buffer content: {:x?}", &buf); Ok(len) } else { // no more data + //info!("lhw debug block on recv no data"); Err(AxError::WouldBlock) } }) - }) + }); + info!("lhw debug in smoltcp_impl recv end"); + //self.set_nonblocking(no_block); + res } /// Transmits data in the given buffer. pub fn send(&self, buf: &[u8]) -> AxResult { + //info!("lhw debug in smoltcp_impl send"); if self.is_connecting() { return Err(AxError::WouldBlock); } else if !self.is_connected() { @@ -335,6 +345,7 @@ impl TcpSocket { Ok(len) } else { // tx buffer is full + //info!("lhw debug block on send buffer is full"); Err(AxError::WouldBlock) } }) @@ -495,6 +506,7 @@ impl TcpSocket { match f() { Ok(t) => return Ok(t), Err(AxError::WouldBlock) => axtask::yield_now(), + //Err(AxError::WouldBlock) => axtask::sleep(Duration::from_nanos(100)), Err(e) => return Err(e), } } @@ -504,6 +516,7 @@ impl TcpSocket { impl Drop for TcpSocket { fn drop(&mut self) { + info!("lhw debug drop tcp"); self.shutdown().ok(); // Safe because we have mut reference to `self`. if let Some(handle) = unsafe { self.handle.get().read() } { diff --git a/modules/axnet/src/smoltcp_impl/udp.rs b/modules/axnet/src/smoltcp_impl/udp.rs old mode 100644 new mode 100755 diff --git a/modules/axruntime/Cargo.toml b/modules/axruntime/Cargo.toml old mode 100644 new mode 100755 diff --git a/modules/axruntime/src/env.rs b/modules/axruntime/src/env.rs old mode 100644 new mode 100755 diff --git a/modules/axruntime/src/lang_items.rs b/modules/axruntime/src/lang_items.rs old mode 100644 new mode 100755 diff --git a/modules/axruntime/src/lib.rs b/modules/axruntime/src/lib.rs old mode 100644 new mode 100755 diff --git a/modules/axruntime/src/mp.rs b/modules/axruntime/src/mp.rs old mode 100644 new mode 100755 diff --git a/modules/axruntime/src/signal.rs b/modules/axruntime/src/signal.rs old mode 100644 new mode 100755 diff --git a/modules/axruntime/src/trap.rs b/modules/axruntime/src/trap.rs old mode 100644 new mode 100755 diff --git a/modules/axsync/Cargo.toml b/modules/axsync/Cargo.toml old mode 100644 new mode 100755 diff --git a/modules/axsync/src/lib.rs b/modules/axsync/src/lib.rs old mode 100644 new mode 100755 diff --git a/modules/axsync/src/mutex.rs b/modules/axsync/src/mutex.rs old mode 100644 new mode 100755 diff --git a/modules/axtask/Cargo.toml b/modules/axtask/Cargo.toml old mode 100644 new mode 100755 diff --git a/modules/axtask/src/api.rs b/modules/axtask/src/api.rs old mode 100644 new mode 100755 diff --git a/modules/axtask/src/api_s.rs b/modules/axtask/src/api_s.rs old mode 100644 new mode 100755 diff --git a/modules/axtask/src/lib.rs b/modules/axtask/src/lib.rs old mode 100644 new mode 100755 diff --git a/modules/axtask/src/loadavg.rs b/modules/axtask/src/loadavg.rs old mode 100644 new mode 100755 diff --git a/modules/axtask/src/run_queue.rs b/modules/axtask/src/run_queue.rs old mode 100644 new mode 100755 index e90c9c802..c39d95a3b --- a/modules/axtask/src/run_queue.rs +++ b/modules/axtask/src/run_queue.rs @@ -171,6 +171,7 @@ impl AxRunQueue { // Safety: IRQs must be disabled at this time. IDLE_TASK.current_ref_raw().get_unchecked().clone() }); + //info!("lhw debug task switch {} to {}",prev.as_task_ref() as *const AxTaskRef as usize, &next as *const AxTaskRef as usize); self.switch_to(prev, next); } diff --git a/modules/axtask/src/task.rs b/modules/axtask/src/task.rs old mode 100644 new mode 100755 diff --git a/modules/axtask/src/tests.rs b/modules/axtask/src/tests.rs old mode 100644 new mode 100755 diff --git a/modules/axtask/src/timers.rs b/modules/axtask/src/timers.rs old mode 100644 new mode 100755 diff --git a/modules/axtask/src/tsd.rs b/modules/axtask/src/tsd.rs old mode 100644 new mode 100755 diff --git a/modules/axtask/src/wait_queue.rs b/modules/axtask/src/wait_queue.rs old mode 100644 new mode 100755 diff --git a/platforms/aarch64-bsta1000b.toml b/platforms/aarch64-bsta1000b.toml old mode 100644 new mode 100755 diff --git a/platforms/aarch64-qemu-virt.toml b/platforms/aarch64-qemu-virt.toml old mode 100644 new mode 100755 diff --git a/platforms/aarch64-raspi4.toml b/platforms/aarch64-raspi4.toml old mode 100644 new mode 100755 diff --git a/platforms/riscv64-qemu-virt.toml b/platforms/riscv64-qemu-virt.toml old mode 100644 new mode 100755 diff --git a/platforms/x86_64-pc-oslab.toml b/platforms/x86_64-pc-oslab.toml old mode 100644 new mode 100755 diff --git a/platforms/x86_64-qemu-q35.toml b/platforms/x86_64-qemu-q35.toml old mode 100644 new mode 100755 diff --git a/rust-toolchain.toml b/rust-toolchain.toml old mode 100644 new mode 100755 diff --git a/scripts/make/bsta1000b-fada.mk b/scripts/make/bsta1000b-fada.mk old mode 100644 new mode 100755 diff --git a/scripts/make/build.mk b/scripts/make/build.mk old mode 100644 new mode 100755 index 529014c8a..b5a6d3fe9 --- a/scripts/make/build.mk +++ b/scripts/make/build.mk @@ -48,6 +48,9 @@ else ifeq ($(APP_TYPE), c) endif endif +$(info lhw print feat $(AX_FEAT) ||| $(LIB_FEAT)) +$(info lhw print out bin & elf $(OUT_BIN) ||| $(OUT_ELF)) + $(OUT_DIR): $(call run_cmd,mkdir,-p $@) diff --git a/scripts/make/build_c.mk b/scripts/make/build_c.mk old mode 100644 new mode 100755 index cb92d1673..d74535229 --- a/scripts/make/build_c.mk +++ b/scripts/make/build_c.mk @@ -55,9 +55,13 @@ $(obj_dir): $(obj_dir)/%.o: $(src_dir)/%.c $(last_cflags) $(call run_cmd,$(CC),$(CFLAGS) -c -o $@ $<) +$(info lhw $(obj_dir)/%.o:$(src_dir)/%.c $(last_cflags)) +$(info run_cmd,$(CC),$(CFLAGS) -c -o $@ $<) $(c_lib): $(obj_dir) _check_need_rebuild $(ulib_obj) $(call run_cmd,$(AR),rcs $@ $(ulib_obj)) +$(info lhw $(c_lib): $(obj_dir) _check_need_rebuild $(ulib_obj)) +$(info run_cmd,$(AR),rcs $@ $(ulib_obj)) app-objs := main.o @@ -67,10 +71,15 @@ app-objs := $(addprefix $(APP)/,$(app-objs)) $(APP)/%.o: $(APP)/%.c $(ulib_hdr) $(call run_cmd,$(CC),$(CFLAGS) $(APP_CFLAGS) -c -o $@ $<) +$(info lhw $(APP)/%.o: $(APP)/%.c $(ulib_hdr)) +$(info run_cmd,$(CC),$(CFLAGS) $(APP_CFLAGS) -c -o $@ $<) + $(OUT_ELF): $(c_lib) $(rust_lib) $(libgcc) $(app-objs) @printf " $(CYAN_C)Linking$(END_C) $(OUT_ELF)\n" $(call run_cmd,$(LD),$(LDFLAGS) $^ -o $@) +$(info lhw $(OUT_ELF): $(c_lib) $(rust_lib) $(libgcc) $(app-objs)) +$(info run_cmd,$(LD),$(LDFLAGS) $^ -o $@) $(APP)/axbuild.mk: ; diff --git a/scripts/make/build_musl.mk b/scripts/make/build_musl.mk index 74ae50028..df169cd42 100644 --- a/scripts/make/build_musl.mk +++ b/scripts/make/build_musl.mk @@ -7,7 +7,9 @@ muslibc_dir := ulib/axmusl build_dir := $(muslibc_dir)/build_musl_$(ARCH) musl_dir := $(muslibc_dir)/musl-$(musl_version) inc_dir := $(muslibc_dir)/install/include +#inc_dir := $(muslibc_dir)/musl-$(musl_version)/include c_lib := $(muslibc_dir)/install/lib/libc.a +#c_lib := $(muslibc_dir)/musl-$(musl_version)/lib/libc.a libgcc := CFLAGS += -nostdinc -fno-builtin -ffreestanding -Wall @@ -46,6 +48,7 @@ ifeq ($(wildcard $(build_dir)),) endif mkdir -p $(build_dir) cd $(build_dir) && ../musl-1.2.3/configure --prefix=../install --exec-prefix=../ --syslibdir=../install/lib --disable-shared ARCH=$(AX_ARCH) CC=$(CC) CROSS_COMPILE=$(CROSS_COMPILE) CFLAGS=$(CFLAGS) +# cd $(build_dir) && ../musl-1.2.3/configure --prefix=../imusl-$(musl_version) --exec-prefix=../ --syslibdir=../musl-$(musl_version)/lib --disable-shared ARCH=$(AX_ARCH) CC=$(CC) CROSS_COMPILE=$(CROSS_COMPILE) CFLAGS=$(CFLAGS) cd $(build_dir) && $(MAKE) -j && $(MAKE) install endif diff --git a/scripts/make/cargo.mk b/scripts/make/cargo.mk old mode 100644 new mode 100755 diff --git a/scripts/make/features.mk b/scripts/make/features.mk old mode 100644 new mode 100755 index 69b5b84e9..12ccbc2c6 --- a/scripts/make/features.mk +++ b/scripts/make/features.mk @@ -72,4 +72,4 @@ lib_feat += $(filter $(lib_features),$(FEATURES)) AX_FEAT := $(strip $(addprefix $(ax_feat_prefix),$(ax_feat))) LIB_FEAT := $(strip $(addprefix $(lib_feat_prefix),$(lib_feat))) -APP_FEAT := $(strip $(shell echo $(APP_FEATURES) | tr ',' ' ')) +APP_FEAT := $(strip $(shell echo $(APP_FEATURES) | tr ',' ' ')) \ No newline at end of file diff --git a/scripts/make/qemu.mk b/scripts/make/qemu.mk old mode 100644 new mode 100755 diff --git a/scripts/make/raspi4.mk b/scripts/make/raspi4.mk old mode 100644 new mode 100755 diff --git a/scripts/make/test.mk b/scripts/make/test.mk old mode 100644 new mode 100755 diff --git a/scripts/make/utils.mk b/scripts/make/utils.mk old mode 100644 new mode 100755 diff --git a/tools/.gitignore b/tools/.gitignore old mode 100644 new mode 100755 diff --git a/tools/bsta1000b/bsta1000b-fada.dtb b/tools/bsta1000b/bsta1000b-fada.dtb old mode 100644 new mode 100755 diff --git a/tools/bwbench_client/Cargo.toml b/tools/bwbench_client/Cargo.toml old mode 100644 new mode 100755 diff --git a/tools/bwbench_client/README.md b/tools/bwbench_client/README.md old mode 100644 new mode 100755 diff --git a/tools/bwbench_client/src/device.rs b/tools/bwbench_client/src/device.rs old mode 100644 new mode 100755 diff --git a/tools/bwbench_client/src/main.rs b/tools/bwbench_client/src/main.rs old mode 100644 new mode 100755 diff --git a/tools/deptool/Cargo.toml b/tools/deptool/Cargo.toml old mode 100644 new mode 100755 diff --git a/tools/deptool/Makefile b/tools/deptool/Makefile old mode 100644 new mode 100755 diff --git a/tools/deptool/README.md b/tools/deptool/README.md old mode 100644 new mode 100755 diff --git a/tools/deptool/src/cmd_builder.rs b/tools/deptool/src/cmd_builder.rs old mode 100644 new mode 100755 diff --git a/tools/deptool/src/cmd_parser.rs b/tools/deptool/src/cmd_parser.rs old mode 100644 new mode 100755 diff --git a/tools/deptool/src/d2_generator.rs b/tools/deptool/src/d2_generator.rs old mode 100644 new mode 100755 diff --git a/tools/deptool/src/lib.rs b/tools/deptool/src/lib.rs old mode 100644 new mode 100755 diff --git a/tools/deptool/src/main.rs b/tools/deptool/src/main.rs old mode 100644 new mode 100755 diff --git a/tools/deptool/src/mermaid_generator.rs b/tools/deptool/src/mermaid_generator.rs old mode 100644 new mode 100755 diff --git a/tools/raspi4/common/docker.mk b/tools/raspi4/common/docker.mk old mode 100644 new mode 100755 diff --git a/tools/raspi4/common/format.mk b/tools/raspi4/common/format.mk old mode 100644 new mode 100755 diff --git a/tools/raspi4/common/operating_system.mk b/tools/raspi4/common/operating_system.mk old mode 100644 new mode 100755 diff --git a/tools/raspi4/common/serial/minipush/progressbar_patch.rb b/tools/raspi4/common/serial/minipush/progressbar_patch.rb old mode 100644 new mode 100755 diff --git a/ulib/axlibc/.gitignore b/ulib/axlibc/.gitignore old mode 100644 new mode 100755 diff --git a/ulib/axlibc/Cargo.toml b/ulib/axlibc/Cargo.toml old mode 100644 new mode 100755 index e52584de2..d72f13a9b --- a/ulib/axlibc/Cargo.toml +++ b/ulib/axlibc/Cargo.toml @@ -53,6 +53,7 @@ epoll = ["arceos_posix_api/epoll"] random-hw = [] [dependencies] +log = "0.4" axfeat = { path = "../../api/axfeat" } arceos_posix_api = { path = "../../api/arceos_posix_api" } axio = { path = "../../crates/axio" } diff --git a/ulib/axlibc/build.rs b/ulib/axlibc/build.rs old mode 100644 new mode 100755 diff --git a/ulib/axlibc/c/assert.c b/ulib/axlibc/c/assert.c old mode 100644 new mode 100755 diff --git a/ulib/axlibc/c/atomic.h b/ulib/axlibc/c/atomic.h new file mode 100755 index 000000000..96c1552d6 --- /dev/null +++ b/ulib/axlibc/c/atomic.h @@ -0,0 +1,333 @@ +#ifndef _ATOMIC_H +#define _ATOMIC_H + +#include + +#include "atomic_arch.h" + +#ifdef a_ll + +#ifndef a_pre_llsc +#define a_pre_llsc() +#endif + +#ifndef a_post_llsc +#define a_post_llsc() +#endif + +#ifndef a_cas +#define a_cas a_cas +static inline int a_cas(volatile int *p, int t, int s) +{ + int old; + a_pre_llsc(); + do old = a_ll(p); + while (old==t && !a_sc(p, s)); + a_post_llsc(); + return old; +} +#endif + +#ifndef a_swap +#define a_swap a_swap +static inline int a_swap(volatile int *p, int v) +{ + int old; + a_pre_llsc(); + do old = a_ll(p); + while (!a_sc(p, v)); + a_post_llsc(); + return old; +} +#endif + +#ifndef a_fetch_add +#define a_fetch_add a_fetch_add +static inline int a_fetch_add(volatile int *p, int v) +{ + int old; + a_pre_llsc(); + do old = a_ll(p); + while (!a_sc(p, (unsigned)old + v)); + a_post_llsc(); + return old; +} +#endif + +#ifndef a_fetch_and +#define a_fetch_and a_fetch_and +static inline int a_fetch_and(volatile int *p, int v) +{ + int old; + a_pre_llsc(); + do old = a_ll(p); + while (!a_sc(p, old & v)); + a_post_llsc(); + return old; +} +#endif + +#ifndef a_fetch_or +#define a_fetch_or a_fetch_or +static inline int a_fetch_or(volatile int *p, int v) +{ + int old; + a_pre_llsc(); + do old = a_ll(p); + while (!a_sc(p, old | v)); + a_post_llsc(); + return old; +} +#endif + +#endif + +#ifdef a_ll_p + +#ifndef a_cas_p +#define a_cas_p a_cas_p +static inline void *a_cas_p(volatile void *p, void *t, void *s) +{ + void *old; + a_pre_llsc(); + do old = a_ll_p(p); + while (old==t && !a_sc_p(p, s)); + a_post_llsc(); + return old; +} +#endif + +#endif + +#ifndef a_cas +#error missing definition of a_cas +#endif + +#ifndef a_swap +#define a_swap a_swap +static inline int a_swap(volatile int *p, int v) +{ + int old; + do old = *p; + while (a_cas(p, old, v) != old); + return old; +} +#endif + +#ifndef a_fetch_add +#define a_fetch_add a_fetch_add +static inline int a_fetch_add(volatile int *p, int v) +{ + int old; + do old = *p; + while (a_cas(p, old, (unsigned)old+v) != old); + return old; +} +#endif + +#ifndef a_fetch_and +#define a_fetch_and a_fetch_and +static inline int a_fetch_and(volatile int *p, int v) +{ + int old; + do old = *p; + while (a_cas(p, old, old&v) != old); + return old; +} +#endif +#ifndef a_fetch_or +#define a_fetch_or a_fetch_or +static inline int a_fetch_or(volatile int *p, int v) +{ + int old; + do old = *p; + while (a_cas(p, old, old|v) != old); + return old; +} +#endif + +#ifndef a_and +#define a_and a_and +static inline void a_and(volatile int *p, int v) +{ + a_fetch_and(p, v); +} +#endif + +#ifndef a_or +#define a_or a_or +static inline void a_or(volatile int *p, int v) +{ + a_fetch_or(p, v); +} +#endif + +#ifndef a_inc +#define a_inc a_inc +static inline void a_inc(volatile int *p) +{ + a_fetch_add(p, 1); +} +#endif + +#ifndef a_dec +#define a_dec a_dec +static inline void a_dec(volatile int *p) +{ + a_fetch_add(p, -1); +} +#endif + +#ifndef a_store +#define a_store a_store +static inline void a_store(volatile int *p, int v) +{ +#ifdef a_barrier + a_barrier(); + *p = v; + a_barrier(); +#else + a_swap(p, v); +#endif +} +#endif + +#ifndef a_barrier +#define a_barrier a_barrier +static void a_barrier() +{ + volatile int tmp = 0; + a_cas(&tmp, 0, 0); +} +#endif + +#ifndef a_spin +#define a_spin a_barrier +#endif + +#ifndef a_and_64 +#define a_and_64 a_and_64 +static inline void a_and_64(volatile uint64_t *p, uint64_t v) +{ + union { uint64_t v; uint32_t r[2]; } u = { v }; + if (u.r[0]+1) a_and((int *)p, u.r[0]); + if (u.r[1]+1) a_and((int *)p+1, u.r[1]); +} +#endif + +#ifndef a_or_64 +#define a_or_64 a_or_64 +static inline void a_or_64(volatile uint64_t *p, uint64_t v) +{ + union { uint64_t v; uint32_t r[2]; } u = { v }; + if (u.r[0]) a_or((int *)p, u.r[0]); + if (u.r[1]) a_or((int *)p+1, u.r[1]); +} +#endif + +#ifndef a_cas_p +typedef char a_cas_p_undefined_but_pointer_not_32bit[-sizeof(char) == 0xffffffff ? 1 : -1]; +#define a_cas_p a_cas_p +static inline void *a_cas_p(volatile void *p, void *t, void *s) +{ + return (void *)a_cas((volatile int *)p, (int)t, (int)s); +} +#endif + +#ifndef a_or_l +#define a_or_l a_or_l +static inline void a_or_l(volatile void *p, long v) +{ + if (sizeof(long) == sizeof(int)) a_or(p, v); + else a_or_64(p, v); +} +#endif + +#ifndef a_crash +#define a_crash a_crash +static inline void a_crash() +{ + *(volatile char *)0=0; +} +#endif + +#ifndef a_ctz_32 +#define a_ctz_32 a_ctz_32 +static inline int a_ctz_32(uint32_t x) +{ +#ifdef a_clz_32 + return 31-a_clz_32(x&-x); +#else + static const char debruijn32[32] = { + 0, 1, 23, 2, 29, 24, 19, 3, 30, 27, 25, 11, 20, 8, 4, 13, + 31, 22, 28, 18, 26, 10, 7, 12, 21, 17, 9, 6, 16, 5, 15, 14 + }; + return debruijn32[(x&-x)*0x076be629 >> 27]; +#endif +} +#endif + +#ifndef a_ctz_64 +#define a_ctz_64 a_ctz_64 +static inline int a_ctz_64(uint64_t x) +{ + static const char debruijn64[64] = { + 0, 1, 2, 53, 3, 7, 54, 27, 4, 38, 41, 8, 34, 55, 48, 28, + 62, 5, 39, 46, 44, 42, 22, 9, 24, 35, 59, 56, 49, 18, 29, 11, + 63, 52, 6, 26, 37, 40, 33, 47, 61, 45, 43, 21, 23, 58, 17, 10, + 51, 25, 36, 32, 60, 20, 57, 16, 50, 31, 19, 15, 30, 14, 13, 12 + }; + if (sizeof(long) < 8) { + uint32_t y = x; + if (!y) { + y = x>>32; + return 32 + a_ctz_32(y); + } + return a_ctz_32(y); + } + return debruijn64[(x&-x)*0x022fdd63cc95386dull >> 58]; +} +#endif + +static inline int a_ctz_l(unsigned long x) +{ + return (sizeof(long) < 8) ? a_ctz_32(x) : a_ctz_64(x); +} + +#ifndef a_clz_64 +#define a_clz_64 a_clz_64 +static inline int a_clz_64(uint64_t x) +{ +#ifdef a_clz_32 + if (x>>32) + return a_clz_32(x>>32); + return a_clz_32(x) + 32; +#else + uint32_t y; + int r; + if (x>>32) y=x>>32, r=0; else y=x, r=32; + if (y>>16) y>>=16; else r |= 16; + if (y>>8) y>>=8; else r |= 8; + if (y>>4) y>>=4; else r |= 4; + if (y>>2) y>>=2; else r |= 2; + return r | !(y>>1); +#endif +} +#endif + +#ifndef a_clz_32 +#define a_clz_32 a_clz_32 +static inline int a_clz_32(uint32_t x) +{ + x >>= 1; + x |= x >> 1; + x |= x >> 2; + x |= x >> 4; + x |= x >> 8; + x |= x >> 16; + x++; + return 31-a_ctz_32(x); +} +#endif + +#endif diff --git a/ulib/axlibc/c/atomic_arch.h b/ulib/axlibc/c/atomic_arch.h new file mode 100755 index 000000000..40fefc25b --- /dev/null +++ b/ulib/axlibc/c/atomic_arch.h @@ -0,0 +1,82 @@ +#define a_ll a_ll +static inline int a_ll(volatile int *p) +{ + int v; + __asm__ __volatile__ ("ldaxr %w0,%1" : "=r"(v) : "Q"(*p)); + return v; +} + +#define a_sc a_sc +static inline int a_sc(volatile int *p, int v) +{ + int r; + __asm__ __volatile__ ("stlxr %w0,%w2,%1" : "=&r"(r), "=Q"(*p) : "r"(v) : "memory"); + return !r; +} + +#define a_barrier a_barrier +static inline void a_barrier() +{ + __asm__ __volatile__ ("dmb ish" : : : "memory"); +} + +#define a_cas a_cas +static inline int a_cas(volatile int *p, int t, int s) +{ + int old; + do { + old = a_ll(p); + if (old != t) { + a_barrier(); + break; + } + } while (!a_sc(p, s)); + return old; +} + +#define a_ll_p a_ll_p +static inline void *a_ll_p(volatile void *p) +{ + void *v; + __asm__ __volatile__ ("ldaxr %0, %1" : "=r"(v) : "Q"(*(void *volatile *)p)); + return v; +} + +#define a_sc_p a_sc_p +static inline int a_sc_p(volatile int *p, void *v) +{ + int r; + __asm__ __volatile__ ("stlxr %w0,%2,%1" : "=&r"(r), "=Q"(*(void *volatile *)p) : "r"(v) : "memory"); + return !r; +} + +#define a_cas_p a_cas_p +static inline void *a_cas_p(volatile void *p, void *t, void *s) +{ + void *old; + do { + old = a_ll_p(p); + if (old != t) { + a_barrier(); + break; + } + } while (!a_sc_p(p, s)); + return old; +} + +#define a_ctz_64 a_ctz_64 +static inline int a_ctz_64(uint64_t x) +{ + __asm__( + " rbit %0, %1\n" + " clz %0, %0\n" + : "=r"(x) : "r"(x)); + return x; +} + +#define a_clz_64 a_clz_64 +static inline int a_clz_64(uint64_t x) +{ + __asm__("clz %0, %1" : "=r"(x) : "r"(x)); + return x; +} diff --git a/ulib/axlibc/c/ctype.c b/ulib/axlibc/c/ctype.c old mode 100644 new mode 100755 diff --git a/ulib/axlibc/c/dirent.c b/ulib/axlibc/c/dirent.c old mode 100644 new mode 100755 diff --git a/ulib/axlibc/c/dlfcn.c b/ulib/axlibc/c/dlfcn.c old mode 100644 new mode 100755 diff --git a/ulib/axlibc/c/fcntl.c b/ulib/axlibc/c/fcntl.c old mode 100644 new mode 100755 index 61f8e979b..5faed8a9b --- a/ulib/axlibc/c/fcntl.c +++ b/ulib/axlibc/c/fcntl.c @@ -62,4 +62,12 @@ int sync_file_range(int fd, off_t pos, off_t len, unsigned flags) return 0; } +// TODO +int openat(int dirfd, const char *pathname, int flags, ...) +{ + unimplemented(); + return 0; +} + + #endif // AX_CONFIG_FS diff --git a/ulib/axlibc/c/flock.c b/ulib/axlibc/c/flock.c old mode 100644 new mode 100755 diff --git a/ulib/axlibc/c/fnmatch.c b/ulib/axlibc/c/fnmatch.c old mode 100644 new mode 100755 diff --git a/ulib/axlibc/c/glob.c b/ulib/axlibc/c/glob.c old mode 100644 new mode 100755 diff --git a/ulib/axlibc/c/grp.c b/ulib/axlibc/c/grp.c new file mode 100755 index 000000000..5517e31ea --- /dev/null +++ b/ulib/axlibc/c/grp.c @@ -0,0 +1,46 @@ +/* Copyright (c) [2023] [Syswonder Community] + * [Rukos] is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +#include +#include +#include +#include +#include + +/* Group members */ +static char *g_members__[] = { AX_DEFAULT_USER, NULL }; + +/* Default group */ +static struct group g__ = { + .gr_name = AX_DEFAULT_GROUP, + .gr_passwd = AX_DEFAULT_PASS, + .gr_gid = AX_DEFAULT_GID, + .gr_mem = g_members__, +}; + +// TODO +int initgroups(const char *user, gid_t group) +{ + unimplemented(); + return 0; +} + +struct group *getgrnam(const char *name) +{ + struct group *res; + + if (name && !strcmp(name, g__.gr_name)) + res = &g__; + else { + res = NULL; + errno = ENOENT; + } + + return res; +} diff --git a/ulib/axlibc/c/ioctl.c b/ulib/axlibc/c/ioctl.c old mode 100644 new mode 100755 index 9c961bb76..11ee86c3d --- a/ulib/axlibc/c/ioctl.c +++ b/ulib/axlibc/c/ioctl.c @@ -9,10 +9,18 @@ #include #include +#include + +int ax_ioctl(int fd, int cmd, size_t arg); // TODO -int ioctl(int __fd, int __request, ...) +int ioctl(int fd, int request, ...) { - unimplemented(); - return 0; + unsigned long arg; + va_list ap; + va_start(ap, request); + arg = va_arg(ap, unsigned long); + va_end(ap); + + return ax_ioctl(fd, request, arg); } diff --git a/ulib/axlibc/c/libgen.c b/ulib/axlibc/c/libgen.c old mode 100644 new mode 100755 diff --git a/ulib/axlibc/c/libm.c b/ulib/axlibc/c/libm.c old mode 100644 new mode 100755 diff --git a/ulib/axlibc/c/libm.h b/ulib/axlibc/c/libm.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/c/locale.c b/ulib/axlibc/c/locale.c old mode 100644 new mode 100755 diff --git a/ulib/axlibc/c/log.c b/ulib/axlibc/c/log.c old mode 100644 new mode 100755 diff --git a/ulib/axlibc/c/math.c b/ulib/axlibc/c/math.c old mode 100644 new mode 100755 diff --git a/ulib/axlibc/c/mmap.c b/ulib/axlibc/c/mmap.c old mode 100644 new mode 100755 index a9786dba9..dd8a5c986 --- a/ulib/axlibc/c/mmap.c +++ b/ulib/axlibc/c/mmap.c @@ -10,18 +10,28 @@ #include #include #include +#include // TODO: void *mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off) { - unimplemented(); - return MAP_FAILED; + //unimplemented(); + //return MAP_FAILED; + int *res = malloc(len); + if (res == NULL) { + return NULL; + } + printf("use malloc imp mmap: addr: %p len: %d res: %p\n",addr,len,res); + printf("if i can acess res: %d",*res); + return res; } // TODO: int munmap(void *addr, size_t length) { - unimplemented(); + //unimplemented(); + //return 0; + free(addr); return 0; } diff --git a/ulib/axlibc/c/netdb.c b/ulib/axlibc/c/netdb.c new file mode 100755 index 000000000..a2638457f --- /dev/null +++ b/ulib/axlibc/c/netdb.c @@ -0,0 +1,19 @@ +/* Copyright (c) [2023] [Syswonder Community] + * [Rukos] is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +#include +#include + + +// TODO +struct hostent *gethostbyname(const char *name) +{ + unimplemented(); + return 0; +} \ No newline at end of file diff --git a/ulib/axlibc/c/network.c b/ulib/axlibc/c/network.c old mode 100644 new mode 100755 diff --git a/ulib/axlibc/c/nscd.h b/ulib/axlibc/c/nscd.h new file mode 100755 index 000000000..9a53c3283 --- /dev/null +++ b/ulib/axlibc/c/nscd.h @@ -0,0 +1,44 @@ +#ifndef NSCD_H +#define NSCD_H + +#include + +#define NSCDVERSION 2 +#define GETPWBYNAME 0 +#define GETPWBYUID 1 +#define GETGRBYNAME 2 +#define GETGRBYGID 3 +#define GETINITGR 15 + +#define REQVERSION 0 +#define REQTYPE 1 +#define REQKEYLEN 2 +#define REQ_LEN 3 + +#define PWVERSION 0 +#define PWFOUND 1 +#define PWNAMELEN 2 +#define PWPASSWDLEN 3 +#define PWUID 4 +#define PWGID 5 +#define PWGECOSLEN 6 +#define PWDIRLEN 7 +#define PWSHELLLEN 8 +#define PW_LEN 9 + +#define GRVERSION 0 +#define GRFOUND 1 +#define GRNAMELEN 2 +#define GRPASSWDLEN 3 +#define GRGID 4 +#define GRMEMCNT 5 +#define GR_LEN 6 + +#define INITGRVERSION 0 +#define INITGRFOUND 1 +#define INITGRNGRPS 2 +#define INITGR_LEN 3 + +FILE *__nscd_query(int32_t req, const char *key, int32_t *buf, size_t len, int *swap); + +#endif diff --git a/ulib/axlibc/c/nscd_query.c b/ulib/axlibc/c/nscd_query.c new file mode 100755 index 000000000..c4419db4e --- /dev/null +++ b/ulib/axlibc/c/nscd_query.c @@ -0,0 +1,116 @@ +#include +#include +#include +#include +#include +#include +#include +#include "nscd.h" +#include + +static const struct { + short sun_family; + char sun_path[21]; +} addr = { + AF_UNIX, + "/var/run/nscd/socket" +}; + +FILE *__nscd_query(int32_t req, const char *key, int32_t *buf, size_t len, int *swap) +{ + size_t i; + int fd; + FILE *f = 0; + int32_t req_buf[REQ_LEN] = { + NSCDVERSION, + req, + strnlen(key,LOGIN_NAME_MAX)+1 + }; + struct msghdr msg = { + .msg_iov = (struct iovec[]){ + {&req_buf, sizeof(req_buf)}, + {(char*)key, strlen(key)+1} + }, + .msg_iovlen = 2 + }; + int errno_save = errno; + + *swap = 0; +retry: + memset(buf, 0, len); + buf[0] = NSCDVERSION; + + fd = socket(PF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0); + if (fd < 0) { + if (errno == EAFNOSUPPORT) { + f = fopen("/dev/null", "re"); + if (f) + errno = errno_save; + return f; + } + return 0; + } + + if(!(f = fdopen(fd, "r"))) { + close(fd); + return 0; + } + + if (req_buf[2] > LOGIN_NAME_MAX) + return f; + + if (connect(fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) { + /* If there isn't a running nscd we simulate a "not found" + * result and the caller is responsible for calling + * fclose on the (unconnected) socket. The value of + * errno must be left unchanged in this case. */ + if (errno == EACCES || errno == ECONNREFUSED || errno == ENOENT) { + errno = errno_save; + return f; + } + goto error; + } + + if (sendmsg(fd, &msg, MSG_NOSIGNAL) < 0) + goto error; + + if (!fread(buf, len, 1, f)) { + /* If the VERSION entry mismatches nscd will disconnect. The + * most likely cause is that the endianness mismatched. So, we + * byteswap and try once more. (if we already swapped, just + * fail out) + */ + if (ferror(f)) goto error; + if (!*swap) { + fclose(f); + for (i = 0; i < sizeof(req_buf)/sizeof(req_buf[0]); i++) { + req_buf[i] = bswap_32(req_buf[i]); + } + *swap = 1; + goto retry; + } else { + errno = EIO; + goto error; + } + } + + if (*swap) { + for (i = 0; i < len/sizeof(buf[0]); i++) { + buf[i] = bswap_32(buf[i]); + } + } + + /* The first entry in every nscd response is the version number. This + * really shouldn't happen, and is evidence of some form of malformed + * response. + */ + if(buf[0] != NSCDVERSION) { + errno = EIO; + goto error; + } + + return f; +error: + fclose(f); + return 0; +} diff --git a/ulib/axlibc/c/pow.c b/ulib/axlibc/c/pow.c old mode 100644 new mode 100755 diff --git a/ulib/axlibc/c/prctl.c b/ulib/axlibc/c/prctl.c new file mode 100755 index 000000000..73b44936f --- /dev/null +++ b/ulib/axlibc/c/prctl.c @@ -0,0 +1,18 @@ +/* Copyright (c) [2023] [Syswonder Community] + * [Rukos] is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +#include +#include + +// TODO +int prctl(int option, ...) +{ + unimplemented(); + return 0; +} diff --git a/ulib/axlibc/c/printf.c b/ulib/axlibc/c/printf.c old mode 100644 new mode 100755 diff --git a/ulib/axlibc/c/printf.h b/ulib/axlibc/c/printf.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/c/printf_config.h b/ulib/axlibc/c/printf_config.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/c/pthread.c b/ulib/axlibc/c/pthread.c old mode 100644 new mode 100755 diff --git a/ulib/axlibc/c/pwd.c b/ulib/axlibc/c/pwd.c old mode 100644 new mode 100755 index 3beb91cb3..95c441838 --- a/ulib/axlibc/c/pwd.c +++ b/ulib/axlibc/c/pwd.c @@ -9,15 +9,45 @@ #include #include +#include +#include +#include +/* Default passwd */ +static struct passwd pw__ = { + .pw_name = AX_DEFAULT_USER, + .pw_passwd = AX_DEFAULT_PASS, + .pw_uid = AX_DEFAULT_UID, + .pw_gid = AX_DEFAULT_GID, + .pw_gecos = AX_DEFAULT_USER, + .pw_dir = "/", + .pw_shell = "", +}; + +// TODO int getpwnam_r(const char *name, struct passwd *pw, char *buf, size_t size, struct passwd **res) { unimplemented(); return 0; } +// TODO int getpwuid_r(uid_t uid, struct passwd *pw, char *buf, size_t size, struct passwd **res) { unimplemented(); return 0; } + +struct passwd *getpwnam(const char *name) +{ + struct passwd *pwd; + + if (name && !strcmp(name, pw__.pw_name)) + pwd = &pw__; + else { + pwd = NULL; + errno = ENOENT; + } + + return pwd; +} diff --git a/ulib/axlibc/c/resource.c b/ulib/axlibc/c/resource.c old mode 100644 new mode 100755 index c008a7200..f5ac3ef56 --- a/ulib/axlibc/c/resource.c +++ b/ulib/axlibc/c/resource.c @@ -17,3 +17,10 @@ int getrusage(int __who, struct rusage *__usage) unimplemented(); return 0; } + +// TODO +int setpriority(int which, id_t who, int prio) +{ + unimplemented(); + return 0; +} diff --git a/ulib/axlibc/c/sched.c b/ulib/axlibc/c/sched.c old mode 100644 new mode 100755 index 7910af645..8380a1274 --- a/ulib/axlibc/c/sched.c +++ b/ulib/axlibc/c/sched.c @@ -16,3 +16,9 @@ int sched_setaffinity(pid_t __pid, size_t __cpusetsize, const cpu_set_t *__cpuse unimplemented(); return 0; } + +int sched_yield(void) +{ + unimplemented(); + return 0; +} diff --git a/ulib/axlibc/c/select.c b/ulib/axlibc/c/select.c old mode 100644 new mode 100755 index b8103434e..5ef483bb2 --- a/ulib/axlibc/c/select.c +++ b/ulib/axlibc/c/select.c @@ -23,4 +23,11 @@ int pselect(int n, fd_set *restrict rfds, fd_set *restrict wfds, fd_set *restric return 0; } +int select(int n, fd_set *__restrict rfds, fd_set *__restrict wfds, fd_set *__restrict efds, + struct timeval *__restrict tv) +{ + unimplemented(); + return 0; +} + #endif // AX_CONFIG_SELECT diff --git a/ulib/axlibc/c/semaphore.c b/ulib/axlibc/c/semaphore.c new file mode 100755 index 000000000..eec59287d --- /dev/null +++ b/ulib/axlibc/c/semaphore.c @@ -0,0 +1,39 @@ +/* Copyright (c) [2023] [Syswonder Community] + * [Rukos] is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +#include +#include + +// TODO +int sem_destroy(sem_t *sem) +{ + unimplemented(); + return 0; +} + +// TODO +int sem_init(sem_t *sem, int pshared, unsigned int value) +{ + unimplemented(); + return 0; +} + +// TODO +int sem_post(sem_t *sem) +{ + unimplemented(); + return 0; +} + +// TODO +int sem_wait(sem_t *sem) +{ + unimplemented(); + return 0; +} diff --git a/ulib/axlibc/c/sendfile.c b/ulib/axlibc/c/sendfile.c new file mode 100755 index 000000000..a4a86654f --- /dev/null +++ b/ulib/axlibc/c/sendfile.c @@ -0,0 +1,16 @@ +/* Copyright (c) [2023] [Syswonder Community] + * [Rukos] is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +#include +#include + +ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count){ + unimplemented(); + return 0; +} \ No newline at end of file diff --git a/ulib/axlibc/c/signal.c b/ulib/axlibc/c/signal.c old mode 100644 new mode 100755 index 961ad99f8..f5f8af4d7 --- a/ulib/axlibc/c/signal.c +++ b/ulib/axlibc/c/signal.c @@ -76,6 +76,18 @@ int pthread_sigmask(int __how, const sigset_t *restrict __newmask, sigset_t *res return 0; } +// TODO +int sigprocmask(int how, const sigset_t *__restrict set, sigset_t *__restrict oldset) +{ + unimplemented(); + return 0; +} +int sigsuspend(const sigset_t *mask) +{ + unimplemented(); + return 0; +} + #ifdef AX_CONFIG_MULTITASK // TODO int pthread_kill(pthread_t t, int sig) diff --git a/ulib/axlibc/c/socket.c b/ulib/axlibc/c/socket.c old mode 100644 new mode 100755 index b2b4d10e1..e7f8f0bbb --- a/ulib/axlibc/c/socket.c +++ b/ulib/axlibc/c/socket.c @@ -77,4 +77,18 @@ ssize_t sendmsg(int fd, const struct msghdr *msg, int flags) return ax_sendmsg(fd, msg, flags); } +// TODO +ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags) +{ + unimplemented(); + return 0; +} + +// TODO +int socketpair(int domain, int type, int protocol, int sv[2]) +{ + unimplemented(); + return 0; +} + #endif // AX_CONFIG_NET diff --git a/ulib/axlibc/c/stat.c b/ulib/axlibc/c/stat.c old mode 100644 new mode 100755 diff --git a/ulib/axlibc/c/statfs.c b/ulib/axlibc/c/statfs.c new file mode 100755 index 000000000..9c4cbd742 --- /dev/null +++ b/ulib/axlibc/c/statfs.c @@ -0,0 +1,18 @@ +/* Copyright (c) [2023] [Syswonder Community] + * [Rukos] is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +#include +#include + +// TODO +int statfs(const char *path, struct statfs *buf) +{ + unimplemented(); + return 0; +} diff --git a/ulib/axlibc/c/stdio.c b/ulib/axlibc/c/stdio.c old mode 100644 new mode 100755 diff --git a/ulib/axlibc/c/stdlib.c b/ulib/axlibc/c/stdlib.c old mode 100644 new mode 100755 index 7a98cb34c..78bc32dc0 --- a/ulib/axlibc/c/stdlib.c +++ b/ulib/axlibc/c/stdlib.c @@ -615,3 +615,103 @@ int system(const char *cmd) unimplemented(); return 0; } + +// TODO +char *realpath(const char *restrict path, char *restrict resolved_path) +{ + unimplemented(); + return 0; +} + +#define SIZE_ALIGN (4*sizeof(size_t)) +#define SIZE_MASK (-SIZE_ALIGN) +#define OVERHEAD (2*sizeof(size_t)) +#define MMAP_THRESHOLD (0x1c00*SIZE_ALIGN) +#define DONTCARE 16 +#define RECLAIM 163840 + +#define CHUNK_SIZE(c) ((c)->csize & -2) +#define CHUNK_PSIZE(c) ((c)->psize & -2) +#define PREV_CHUNK(c) ((struct chunk *)((char *)(c) - CHUNK_PSIZE(c))) +#define NEXT_CHUNK(c) ((struct chunk *)((char *)(c) + CHUNK_SIZE(c))) +#define MEM_TO_CHUNK(p) (struct chunk *)((char *)(p) - OVERHEAD) +#define CHUNK_TO_MEM(c) (void *)((char *)(c) + OVERHEAD) +#define BIN_TO_CHUNK(i) (MEM_TO_CHUNK(&mal.bins[i].head)) + +#define C_INUSE ((size_t)1) + +#define IS_MMAPPED(c) !((c)->csize & (C_INUSE)) + +struct chunk { + size_t psize, csize; + struct chunk *next, *prev; +}; + +void __bin_chunk(struct chunk *) +{ + unimplemented(); + return; +} + +void *aligned_alloc(size_t align, size_t len) +{ + unsigned char *mem, *new; + + if ((align & -align) != align) { + errno = EINVAL; + return 0; + } + + /*if (len > SIZE_MAX - align || + (__malloc_replaced && !__aligned_alloc_replaced)) { + errno = ENOMEM; + return 0; + }*/ + if (len > SIZE_MAX - align) { + errno = ENOMEM; + return 0; + } + + if (align <= SIZE_ALIGN) + return malloc(len); + + if (!(mem = malloc(len + align-1))) + return 0; + + new = (void *)((uintptr_t)mem + align-1 & -align); + if (new == mem) return mem; + + struct chunk *c = MEM_TO_CHUNK(mem); + struct chunk *n = MEM_TO_CHUNK(new); + + if (IS_MMAPPED(c)) { + /* Apply difference between aligned and original + * address to the "extra" field of mmapped chunk. */ + n->psize = c->psize + (new-mem); + n->csize = c->csize - (new-mem); + return new; + } + + struct chunk *t = NEXT_CHUNK(c); + + /* Split the allocated chunk into two chunks. The aligned part + * that will be used has the size in its footer reduced by the + * difference between the aligned and original addresses, and + * the resulting size copied to its header. A new header and + * footer are written for the split-off part to be freed. */ + n->psize = c->csize = C_INUSE | (new-mem); + n->csize = t->psize -= new-mem; + + __bin_chunk(c); + return new; +} + +// TODO +int posix_memalign(void **res, size_t align, size_t len) +{ + if (align < sizeof(void *)) return EINVAL; + void *mem = aligned_alloc(align, len); + if (!mem) return errno; + *res = mem; + return 0; +} diff --git a/ulib/axlibc/c/string.c b/ulib/axlibc/c/string.c old mode 100644 new mode 100755 diff --git a/ulib/axlibc/c/syslog.c b/ulib/axlibc/c/syslog.c old mode 100644 new mode 100755 diff --git a/ulib/axlibc/c/time.c b/ulib/axlibc/c/time.c old mode 100644 new mode 100755 diff --git a/ulib/axlibc/c/uio.c b/ulib/axlibc/c/uio.c new file mode 100755 index 000000000..31c685ce1 --- /dev/null +++ b/ulib/axlibc/c/uio.c @@ -0,0 +1,32 @@ +/* Copyright (c) [2023] [Syswonder Community] + * [Rukos] is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +#include +#include + +// TODO +ssize_t readv(int fd, const struct iovec *iov, int iovcnt) +{ + unimplemented(); + return 0; +} + +// TODO +ssize_t preadv(int fd, const struct iovec *iov, int iovcnt, off_t offset) +{ + unimplemented(); + return 0; +} + +// TODO +ssize_t pwritev(int fd, const struct iovec *iov, int iovcnt, off_t offset) +{ + unimplemented(); + return 0; +} diff --git a/ulib/axlibc/c/unistd.c b/ulib/axlibc/c/unistd.c old mode 100644 new mode 100755 index 2bf7ea047..c4c9754be --- a/ulib/axlibc/c/unistd.c +++ b/ulib/axlibc/c/unistd.c @@ -14,6 +14,14 @@ #include #include #include +#include + +// TODO: +pid_t getppid(void) +{ + unimplemented(); + return 0; +} // TODO: uid_t geteuid(void) @@ -29,6 +37,13 @@ uid_t getuid(void) return 0; } +// TODO +int setuid (uid_t __uid) +{ + unimplemented(); + return 0; +} + // TODO pid_t setsid(void) { @@ -36,6 +51,13 @@ pid_t setsid(void) return 0; } +// TODO +int setgid(gid_t gid) +{ + unimplemented(); + return 0; +} + // TODO int isatty(int fd) { @@ -43,6 +65,46 @@ int isatty(int fd) return 0; } +// TODO +int getpagesize(void) +{ + unimplemented(); + return 0; +} + +// TODO +ssize_t pread(int fd, void *buf, size_t count, off_t offset) +{ + unimplemented(); + return 0; +} + +// TODO +ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset) +{ + unimplemented(); + return 0; +} + +// TODO +int gethostname(char *name, size_t len) +{ + size_t i; + struct utsname uts; + if (uname(&uts)) return -1; + if (len > sizeof uts.nodename) len = sizeof uts.nodename; + for (i=0; i +#include + +static __inline uint16_t __bswap_16(uint16_t __x) +{ + return __x<<8 | __x>>8; +} + +static __inline uint32_t __bswap_32(uint32_t __x) +{ + return __x>>24 | __x>>8&0xff00 | __x<<8&0xff0000 | __x<<24; +} + +static __inline uint64_t __bswap_64(uint64_t __x) +{ + return __bswap_32(__x)+0ULL<<32 | __bswap_32(__x>>32); +} + +#define bswap_16(x) __bswap_16(x) +#define bswap_32(x) __bswap_32(x) +#define bswap_64(x) __bswap_64(x) + +#endif diff --git a/ulib/axlibc/include/crypt.h b/ulib/axlibc/include/crypt.h new file mode 100755 index 000000000..07de21698 --- /dev/null +++ b/ulib/axlibc/include/crypt.h @@ -0,0 +1,20 @@ +#ifndef _CRYPT_H +#define _CRYPT_H + +#ifdef __cplusplus +extern "C" { +#endif + +struct crypt_data { + int initialized; + char __buf[256]; +}; + +char *crypt(const char *, const char *); +char *crypt_r(const char *, const char *, struct crypt_data *); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ulib/axlibc/include/ctype.h b/ulib/axlibc/include/ctype.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/dirent.h b/ulib/axlibc/include/dirent.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/dlfcn.h b/ulib/axlibc/include/dlfcn.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/endian.h b/ulib/axlibc/include/endian.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/errno.h b/ulib/axlibc/include/errno.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/fcntl.h b/ulib/axlibc/include/fcntl.h old mode 100644 new mode 100755 index 2f693d004..978b7f29c --- a/ulib/axlibc/include/fcntl.h +++ b/ulib/axlibc/include/fcntl.h @@ -12,6 +12,8 @@ #include +#define AT_SYMLINK_NOFOLLOW 0x100 + #define O_CREAT 0100 #define O_EXCL 0200 #define O_NOCTTY 0400 @@ -130,4 +132,6 @@ int sync_file_range(int, off_t, off_t, unsigned); int open(const char *filename, int flags, ...); +int openat(int, const char *, int, ...); + #endif diff --git a/ulib/axlibc/include/features.h b/ulib/axlibc/include/features.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/float.h b/ulib/axlibc/include/float.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/fnmatch.h b/ulib/axlibc/include/fnmatch.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/glob.h b/ulib/axlibc/include/glob.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/grp.h b/ulib/axlibc/include/grp.h new file mode 100755 index 000000000..27e8c5e6c --- /dev/null +++ b/ulib/axlibc/include/grp.h @@ -0,0 +1,53 @@ +#ifndef _GRP_H +#define _GRP_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#define __NEED_size_t +#define __NEED_gid_t + +#ifdef _GNU_SOURCE +#define __NEED_FILE +#endif + +#include + +struct group { + char *gr_name; + char *gr_passwd; + gid_t gr_gid; + char **gr_mem; +}; + +struct group *getgrgid(gid_t); +struct group *getgrnam(const char *); + +int getgrgid_r(gid_t, struct group *, char *, size_t, struct group **); +int getgrnam_r(const char *, struct group *, char *, size_t, struct group **); + +#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE) +struct group *getgrent(void); +void endgrent(void); +void setgrent(void); +#endif + +#ifdef _GNU_SOURCE +struct group *fgetgrent(FILE *); +int putgrent(const struct group *, FILE *); +#endif + +#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) +int getgrouplist(const char *, gid_t, gid_t *, int *); +int setgroups(size_t, const gid_t *); +int initgroups(const char *, gid_t); +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ulib/axlibc/include/inttypes.h b/ulib/axlibc/include/inttypes.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/ksigaction.h b/ulib/axlibc/include/ksigaction.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/langinfo.h b/ulib/axlibc/include/langinfo.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/libgen.h b/ulib/axlibc/include/libgen.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/limits.h b/ulib/axlibc/include/limits.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/locale.h b/ulib/axlibc/include/locale.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/malloc.h b/ulib/axlibc/include/malloc.h new file mode 100755 index 000000000..32c0acb00 --- /dev/null +++ b/ulib/axlibc/include/malloc.h @@ -0,0 +1,25 @@ +#ifndef _MALLOC_H +#define _MALLOC_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define __NEED_size_t + +#include + +//void *malloc (size_t); +//void *calloc (size_t, size_t); +//void *realloc (void *, size_t); +void free (void *); +void *valloc (size_t); +void *memalign(size_t, size_t); + +size_t malloc_usable_size(void *); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ulib/axlibc/include/math.h b/ulib/axlibc/include/math.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/memory.h b/ulib/axlibc/include/memory.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/netdb.h b/ulib/axlibc/include/netdb.h old mode 100644 new mode 100755 index 315c59f6c..5e10a18bb --- a/ulib/axlibc/include/netdb.h +++ b/ulib/axlibc/include/netdb.h @@ -89,6 +89,39 @@ int getaddrinfo(const char *, const char *, const struct addrinfo *, struct addr void freeaddrinfo(struct addrinfo *); const char *gai_strerror(int __ecode); +/* Legacy functions follow (marked OBsolete in SUS) */ + +struct netent { + char *n_name; + char **n_aliases; + int n_addrtype; + uint32_t n_net; +}; + +struct hostent { + char *h_name; + char **h_aliases; + int h_addrtype; + int h_length; + char **h_addr_list; +}; +#define h_addr h_addr_list[0] + +struct servent { + char *s_name; + char **s_aliases; + int s_port; + char *s_proto; +}; + +struct protoent { + char *p_name; + char **p_aliases; + int p_proto; +}; + +struct hostent *gethostbyname (const char *); + #endif // AX_CONFIG_NET #endif // _NETDB_H diff --git a/ulib/axlibc/include/netinet/in.h b/ulib/axlibc/include/netinet/in.h old mode 100644 new mode 100755 index 48684aafb..8487a848c --- a/ulib/axlibc/include/netinet/in.h +++ b/ulib/axlibc/include/netinet/in.h @@ -20,6 +20,11 @@ uint16_t htons(uint16_t); uint32_t ntohl(uint32_t); uint16_t ntohs(uint16_t); +#define INADDR_ANY ((in_addr_t) 0x00000000) +#define INADDR_BROADCAST ((in_addr_t) 0xffffffff) +#define INADDR_NONE ((in_addr_t) 0xffffffff) +#define INADDR_LOOPBACK ((in_addr_t) 0x7f000001) + #define IPPROTO_IP 0 #define IPPROTO_HOPOPTS 0 #define IPPROTO_ICMP 1 @@ -135,4 +140,6 @@ struct sockaddr_in6 { uint32_t sin6_scope_id; }; + + #endif // _NETINET_IN_H diff --git a/ulib/axlibc/include/netinet/tcp.h b/ulib/axlibc/include/netinet/tcp.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/poll.h b/ulib/axlibc/include/poll.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/pthread.h b/ulib/axlibc/include/pthread.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/pwd.h b/ulib/axlibc/include/pwd.h old mode 100644 new mode 100755 index 6d6c647ef..ac348266d --- a/ulib/axlibc/include/pwd.h +++ b/ulib/axlibc/include/pwd.h @@ -15,6 +15,13 @@ #include #include +//todo move into other file +#define AX_DEFAULT_USER "root" +#define AX_DEFAULT_GROUP "root" +#define AX_DEFAULT_PASS "" +#define AX_DEFAULT_UID 0 +#define AX_DEFAULT_GID 0 + #define NSCDVERSION 2 #define GETPWBYNAME 0 #define GETPWBYUID 1 @@ -51,4 +58,6 @@ struct passwd { int getpwuid_r(uid_t, struct passwd *, char *, size_t, struct passwd **); int getpwnam_r(const char *, struct passwd *, char *, size_t, struct passwd **); +struct passwd *getpwnam (const char *); + #endif // _PWD_H diff --git a/ulib/axlibc/include/regex.h b/ulib/axlibc/include/regex.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/sched.h b/ulib/axlibc/include/sched.h old mode 100644 new mode 100755 index b98ef7a30..4f09cfeb5 --- a/ulib/axlibc/include/sched.h +++ b/ulib/axlibc/include/sched.h @@ -57,4 +57,6 @@ typedef struct cpu_set_t { int sched_setaffinity(pid_t, size_t, const cpu_set_t *); +int sched_yield(void); + #endif // _SCHED_H diff --git a/ulib/axlibc/include/semaphore.h b/ulib/axlibc/include/semaphore.h new file mode 100755 index 000000000..7df891073 --- /dev/null +++ b/ulib/axlibc/include/semaphore.h @@ -0,0 +1,40 @@ +#ifndef _SEMAPHORE_H +#define _SEMAPHORE_H +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#define __NEED_time_t +#define __NEED_struct_timespec +#include + +#include +#include + +#define SEM_FAILED ((sem_t *)0) + +typedef struct { + volatile int __val[4*sizeof(long)/sizeof(int)]; +} sem_t; + +int sem_close(sem_t *); +int sem_destroy(sem_t *); +int sem_getvalue(sem_t *__restrict, int *__restrict); +int sem_init(sem_t *, int, unsigned); +sem_t *sem_open(const char *, int, ...); +int sem_post(sem_t *); +int sem_timedwait(sem_t *__restrict, const struct timespec *__restrict); +int sem_trywait(sem_t *); +int sem_unlink(const char *); +int sem_wait(sem_t *); + +#if _REDIR_TIME64 +__REDIR(sem_timedwait, __sem_timedwait_time64); +#endif + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ulib/axlibc/include/setjmp.h b/ulib/axlibc/include/setjmp.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/signal.h b/ulib/axlibc/include/signal.h old mode 100644 new mode 100755 index cda590492..343ae6973 --- a/ulib/axlibc/include/signal.h +++ b/ulib/axlibc/include/signal.h @@ -176,6 +176,8 @@ struct sigaction { #define sa_handler __sa_handler.sa_handler #define sa_sigaction __sa_handler.sa_sigaction +int sigprocmask(int, const sigset_t *__restrict, sigset_t *__restrict); +int sigsuspend(const sigset_t *); void (*signal(int, void (*)(int)))(int); int sigaction(int, const struct sigaction *__restrict, struct sigaction *__restrict); int sigemptyset(sigset_t *); diff --git a/ulib/axlibc/include/stdarg.h b/ulib/axlibc/include/stdarg.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/stdbool.h b/ulib/axlibc/include/stdbool.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/stddef.h b/ulib/axlibc/include/stddef.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/stdint.h b/ulib/axlibc/include/stdint.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/stdio.h b/ulib/axlibc/include/stdio.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/stdlib.h b/ulib/axlibc/include/stdlib.h old mode 100644 new mode 100755 index 284863044..5ec3a4f58 --- a/ulib/axlibc/include/stdlib.h +++ b/ulib/axlibc/include/stdlib.h @@ -23,6 +23,8 @@ #define EXIT_FAILURE 1 #define EXIT_SUCCESS 0 +int posix_memalign (void **, size_t, size_t); + long long atoll(const char *nptr); float strtof(const char *__restrict, char **__restrict); @@ -33,6 +35,7 @@ unsigned long strtoul(const char *nptr, char **endptr, int base); long long strtoll(const char *nptr, char **endptr, int base); unsigned long long strtoull(const char *nptr, char **endptr, int base); +char *realpath (const char *__restrict, char *__restrict); int rand(void); void srand(unsigned); long random(void); diff --git a/ulib/axlibc/include/string.h b/ulib/axlibc/include/string.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/strings.h b/ulib/axlibc/include/strings.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/sys/epoll.h b/ulib/axlibc/include/sys/epoll.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/sys/eventfd.h b/ulib/axlibc/include/sys/eventfd.h new file mode 100755 index 000000000..dc5c88f04 --- /dev/null +++ b/ulib/axlibc/include/sys/eventfd.h @@ -0,0 +1,26 @@ +#ifndef _SYS_EVENTFD_H +#define _SYS_EVENTFD_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +typedef uint64_t eventfd_t; + +#define EFD_SEMAPHORE 1 +#define EFD_CLOEXEC O_CLOEXEC +#define EFD_NONBLOCK O_NONBLOCK + +int eventfd(unsigned int, int); +int eventfd_read(int, eventfd_t *); +int eventfd_write(int, eventfd_t); + + +#ifdef __cplusplus +} +#endif + +#endif /* sys/eventfd.h */ diff --git a/ulib/axlibc/include/sys/file.h b/ulib/axlibc/include/sys/file.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/sys/ioctl.h b/ulib/axlibc/include/sys/ioctl.h old mode 100644 new mode 100755 index 374b8215b..939633786 --- a/ulib/axlibc/include/sys/ioctl.h +++ b/ulib/axlibc/include/sys/ioctl.h @@ -10,6 +10,8 @@ #ifndef __SYS_IOCTL_H__ #define __SYS_IOCTL_H__ +#define FIOASYNC 0x5452 + #define TCGETS 0x5401 #define TCSETS 0x5402 #define TCSETSW 0x5403 diff --git a/ulib/axlibc/include/sys/mman.h b/ulib/axlibc/include/sys/mman.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/sys/param.h b/ulib/axlibc/include/sys/param.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/sys/prctl.h b/ulib/axlibc/include/sys/prctl.h old mode 100644 new mode 100755 index 98ad279aa..df3f4c8b4 --- a/ulib/axlibc/include/sys/prctl.h +++ b/ulib/axlibc/include/sys/prctl.h @@ -10,4 +10,8 @@ #ifndef _SYS_PRCTL_H #define _SYS_PRCTL_H +#define PR_SET_DUMPABLE 4 + +int prctl (int, ...); + #endif // _SYS_PRCTL_H diff --git a/ulib/axlibc/include/sys/resource.h b/ulib/axlibc/include/sys/resource.h old mode 100644 new mode 100755 index f0709f98b..309653567 --- a/ulib/axlibc/include/sys/resource.h +++ b/ulib/axlibc/include/sys/resource.h @@ -10,7 +10,9 @@ #ifndef _SYS_RESOURCE_H #define _SYS_RESOURCE_H +#define __NEED_id_t #include +#include typedef unsigned long long rlim_t; @@ -19,6 +21,10 @@ struct rlimit { rlim_t rlim_max; }; +#define PRIO_PROCESS 0 +#define PRIO_PGRP 1 +#define PRIO_USER 2 + #define RLIMIT_CPU 0 #define RLIMIT_FSIZE 1 #define RLIMIT_DATA 2 @@ -69,4 +75,5 @@ int getrlimit(int __resource, struct rlimit *__rlimits); int getrusage(int __who, struct rusage *__usage); +int setpriority (int, id_t, int); #endif diff --git a/ulib/axlibc/include/sys/select.h b/ulib/axlibc/include/sys/select.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/sys/sendfile.h b/ulib/axlibc/include/sys/sendfile.h new file mode 100755 index 000000000..e7570d8e5 --- /dev/null +++ b/ulib/axlibc/include/sys/sendfile.h @@ -0,0 +1,22 @@ +#ifndef _SYS_SENDFILE_H +#define _SYS_SENDFILE_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +ssize_t sendfile(int, int, off_t *, size_t); + +#if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE) +#define sendfile64 sendfile +#define off64_t off_t +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ulib/axlibc/include/sys/socket.h b/ulib/axlibc/include/sys/socket.h old mode 100644 new mode 100755 index e558c6307..0747959fc --- a/ulib/axlibc/include/sys/socket.h +++ b/ulib/axlibc/include/sys/socket.h @@ -77,6 +77,7 @@ ssize_t sendto(int, const void *, size_t, int, const struct sockaddr *, socklen_ ssize_t recvfrom(int, void *__restrict, size_t, int, struct sockaddr *__restrict, socklen_t *__restrict); ssize_t sendmsg(int, const struct msghdr *, int); +ssize_t recvmsg (int, struct msghdr *, int); int getsockopt(int, int, int, void *__restrict, socklen_t *__restrict); int setsockopt(int, int, int, const void *, socklen_t); @@ -84,6 +85,18 @@ int setsockopt(int, int, int, const void *, socklen_t); int getsockname(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict addrlen); int getpeername(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict addrlen); +int socketpair (int, int, int, int [2]); + +#define SCM_RIGHTS 0x01 +#define SCM_CREDENTIALS 0x02 + +#define MSG_OOB 0x0001 +#define MSG_PEEK 0x0002 +#define MSG_DONTROUTE 0x0004 +#define MSG_CTRUNC 0x0008 +#define MSG_PROXY 0x0010 +#define MSG_TRUNC 0x0020 + #define SO_BINDTODEVICE 25 #define SO_ATTACH_FILTER 26 #define SO_DETACH_FILTER 27 @@ -329,4 +342,10 @@ int getpeername(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict #define CMSG_ALIGN(len) (((len) + sizeof (size_t) - 1) & (size_t) ~(sizeof (size_t) - 1)) #define CMSG_SPACE(len) (CMSG_ALIGN (len) + CMSG_ALIGN (sizeof (struct cmsghdr))) #define CMSG_LEN(len) (CMSG_ALIGN (sizeof (struct cmsghdr)) + (len)) +struct linger { + int l_onoff; + int l_linger; +}; + + #endif // __SOCKET_H__ diff --git a/ulib/axlibc/include/sys/stat.h b/ulib/axlibc/include/sys/stat.h old mode 100644 new mode 100755 index f73d2a3fd..a062629c3 --- a/ulib/axlibc/include/sys/stat.h +++ b/ulib/axlibc/include/sys/stat.h @@ -25,9 +25,9 @@ struct stat { off_t st_size; /* total size, in bytes*/ blksize_t st_blksize; /* blocksize for filesystem I/O*/ blkcnt_t st_blocks; /* number of blocks allocated*/ - struct timespec st_atime; /* time of last access*/ - struct timespec st_mtime; /* time of last modification*/ - struct timespec st_ctime; /* time of last status change*/ + struct timespec st_atim; /* time of last access*/ + struct timespec st_mtim; /* time of last modification*/ + struct timespec st_ctim; /* time of last status change*/ }; #if defined(__aarch64__) diff --git a/ulib/axlibc/include/sys/statfs.h b/ulib/axlibc/include/sys/statfs.h new file mode 100755 index 000000000..6f4c6230f --- /dev/null +++ b/ulib/axlibc/include/sys/statfs.h @@ -0,0 +1,32 @@ +#ifndef _SYS_STATFS_H +#define _SYS_STATFS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#include + +typedef struct __fsid_t { + int __val[2]; +} fsid_t; + +#include + +int statfs (const char *, struct statfs *); +int fstatfs (int, struct statfs *); + +#if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE) +#define statfs64 statfs +#define fstatfs64 fstatfs +#define fsblkcnt64_t fsblkcnt_t +#define fsfilcnt64_t fsfilcnt_t +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ulib/axlibc/include/sys/statvfs.h b/ulib/axlibc/include/sys/statvfs.h new file mode 100755 index 000000000..793490b6d --- /dev/null +++ b/ulib/axlibc/include/sys/statvfs.h @@ -0,0 +1,56 @@ +#ifndef _SYS_STATVFS_H +#define _SYS_STATVFS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#define __NEED_fsblkcnt_t +#define __NEED_fsfilcnt_t +#include + +struct statvfs { + unsigned long f_bsize, f_frsize; + fsblkcnt_t f_blocks, f_bfree, f_bavail; + fsfilcnt_t f_files, f_ffree, f_favail; +#if __BYTE_ORDER == __LITTLE_ENDIAN + unsigned long f_fsid; + unsigned :8*(2*sizeof(int)-sizeof(long)); +#else + unsigned :8*(2*sizeof(int)-sizeof(long)); + unsigned long f_fsid; +#endif + unsigned long f_flag, f_namemax; + int __reserved[6]; +}; + +int statvfs (const char *__restrict, struct statvfs *__restrict); +int fstatvfs (int, struct statvfs *); + +#define ST_RDONLY 1 +#define ST_NOSUID 2 +#define ST_NODEV 4 +#define ST_NOEXEC 8 +#define ST_SYNCHRONOUS 16 +#define ST_MANDLOCK 64 +#define ST_WRITE 128 +#define ST_APPEND 256 +#define ST_IMMUTABLE 512 +#define ST_NOATIME 1024 +#define ST_NODIRATIME 2048 +#define ST_RELATIME 4096 + +#if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE) +#define statvfs64 statvfs +#define fstatvfs64 fstatvfs +#define fsblkcnt64_t fsblkcnt_t +#define fsfilcnt64_t fsfilcnt_t +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ulib/axlibc/include/sys/syscall.h b/ulib/axlibc/include/sys/syscall.h new file mode 100755 index 000000000..24987ddf2 --- /dev/null +++ b/ulib/axlibc/include/sys/syscall.h @@ -0,0 +1,6 @@ +#ifndef _SYS_SYSCALL_H +#define _SYS_SYSCALL_H + +#include + +#endif diff --git a/ulib/axlibc/include/sys/sysinfo.h b/ulib/axlibc/include/sys/sysinfo.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/sys/time.h b/ulib/axlibc/include/sys/time.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/sys/types.h b/ulib/axlibc/include/sys/types.h old mode 100644 new mode 100755 index 1020f1cfe..bfaac7e42 --- a/ulib/axlibc/include/sys/types.h +++ b/ulib/axlibc/include/sys/types.h @@ -12,7 +12,12 @@ #include +typedef char *caddr_t; typedef unsigned char u_char; +typedef unsigned short u_short, ushort; +typedef unsigned u_int, uint; +typedef unsigned long u_long, ulong; + typedef unsigned mode_t; typedef uint32_t nlink_t; diff --git a/ulib/axlibc/include/sys/uio.h b/ulib/axlibc/include/sys/uio.h old mode 100644 new mode 100755 index 27a0a0902..08a4a4561 --- a/ulib/axlibc/include/sys/uio.h +++ b/ulib/axlibc/include/sys/uio.h @@ -18,5 +18,9 @@ struct iovec { }; ssize_t writev(int, const struct iovec *, int); +ssize_t readv (int, const struct iovec *, int); + +ssize_t preadv (int, const struct iovec *, int, off_t); +ssize_t pwritev (int, const struct iovec *, int, off_t); #endif diff --git a/ulib/axlibc/include/sys/un.h b/ulib/axlibc/include/sys/un.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/sys/utsname.h b/ulib/axlibc/include/sys/utsname.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/sys/vfs.h b/ulib/axlibc/include/sys/vfs.h new file mode 100755 index 000000000..a899db276 --- /dev/null +++ b/ulib/axlibc/include/sys/vfs.h @@ -0,0 +1 @@ +#include diff --git a/ulib/axlibc/include/sys/wait.h b/ulib/axlibc/include/sys/wait.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/syslog.h b/ulib/axlibc/include/syslog.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/termios.h b/ulib/axlibc/include/termios.h old mode 100644 new mode 100755 diff --git a/ulib/axlibc/include/time.h b/ulib/axlibc/include/time.h old mode 100644 new mode 100755 index 3103f3893..42be6c067 --- a/ulib/axlibc/include/time.h +++ b/ulib/axlibc/include/time.h @@ -18,6 +18,8 @@ #define CLOCK_MONOTONIC 1 #define CLOCKS_PER_SEC 1000000L +#define __tm_gmtoff tm_gmtoff + struct tm { int tm_sec; /* seconds of minute */ int tm_min; /* minutes of hour */ diff --git a/ulib/axlibc/include/unistd.h b/ulib/axlibc/include/unistd.h old mode 100644 new mode 100755 index 288f4a91b..beb8656d3 --- a/ulib/axlibc/include/unistd.h +++ b/ulib/axlibc/include/unistd.h @@ -14,6 +14,8 @@ #include #include +#define _SC_LEVEL1_DCACHE_LINESIZE 130 + #define STDIN_FILENO 0 #define STDOUT_FILENO 1 #define STDERR_FILENO 2 @@ -40,6 +42,8 @@ ssize_t write(int, const void *, size_t); ssize_t pread(int, void *, size_t, off_t); ssize_t pwrite(int, const void *, size_t, off_t); +ssize_t pread64(int, void *, size_t, off_t); + int chown(const char *, uid_t, gid_t); int fchown(int, uid_t, gid_t); int lchown(const char *, uid_t, gid_t); @@ -79,6 +83,8 @@ pid_t fork(void); int execve(const char *, char *const[], char *const[]); _Noreturn void _exit(int); +int getpagesize(void); + pid_t getpid(void); pid_t getppid(void); pid_t getpgrp(void); @@ -102,6 +108,10 @@ int seteuid(uid_t); int setgid(gid_t); int setegid(gid_t); +int gethostname(char *, size_t); + +int chown(const char *, uid_t, gid_t); + long sysconf(int); #define _SC_ARG_MAX 0 diff --git a/ulib/axlibc/src/env.rs b/ulib/axlibc/src/env.rs old mode 100644 new mode 100755 diff --git a/ulib/axlibc/src/errno.rs b/ulib/axlibc/src/errno.rs old mode 100644 new mode 100755 diff --git a/ulib/axlibc/src/fd_ops.rs b/ulib/axlibc/src/fd_ops.rs old mode 100644 new mode 100755 diff --git a/ulib/axlibc/src/fs.rs b/ulib/axlibc/src/fs.rs old mode 100644 new mode 100755 diff --git a/ulib/axlibc/src/io.rs b/ulib/axlibc/src/io.rs old mode 100644 new mode 100755 index f3bdfd7cf..76d6670e9 --- a/ulib/axlibc/src/io.rs +++ b/ulib/axlibc/src/io.rs @@ -9,6 +9,8 @@ use core::ffi::{c_int, c_void}; +#[cfg(feature = "fd")] +use arceos_posix_api::sys_ioctl; use arceos_posix_api::{sys_read, sys_write, sys_writev}; use crate::{ctypes, utils::e}; @@ -39,3 +41,13 @@ pub unsafe extern "C" fn writev( ) -> ctypes::ssize_t { e(sys_writev(fd, iov, iocnt) as _) as _ } + +use log::info; +/// Manipulate file descriptor. +/// +/// TODO: `SET/GET` command is ignored +#[cfg(feature = "fd")] +#[no_mangle] +pub unsafe extern "C" fn ax_ioctl(fd: c_int, req: c_int, arg: usize) -> c_int { + e(sys_ioctl(fd, req.try_into().unwrap(), arg)) +} diff --git a/ulib/axlibc/src/io_mpx.rs b/ulib/axlibc/src/io_mpx.rs old mode 100644 new mode 100755 index 2565196b3..3af607058 --- a/ulib/axlibc/src/io_mpx.rs +++ b/ulib/axlibc/src/io_mpx.rs @@ -26,7 +26,7 @@ use arceos_posix_api::{sys_epoll_create, sys_epoll_ctl, sys_epoll_wait}; pub unsafe extern "C" fn epoll_create(size: c_int) -> c_int { e(sys_epoll_create(size)) } - +use log::info; /// Control interface for an epoll file descriptor #[cfg(feature = "epoll")] #[no_mangle] diff --git a/ulib/axlibc/src/lib.rs b/ulib/axlibc/src/lib.rs old mode 100644 new mode 100755 index 66056ca3c..fa6634dc1 --- a/ulib/axlibc/src/lib.rs +++ b/ulib/axlibc/src/lib.rs @@ -41,6 +41,7 @@ #![feature(naked_functions)] #![feature(thread_local)] #![allow(clippy::missing_safety_doc)] +#![feature(c_size_t)] #[cfg(feature = "alloc")] extern crate alloc; diff --git a/ulib/axlibc/src/malloc.rs b/ulib/axlibc/src/malloc.rs old mode 100644 new mode 100755 diff --git a/ulib/axlibc/src/mktime.rs b/ulib/axlibc/src/mktime.rs old mode 100644 new mode 100755 diff --git a/ulib/axlibc/src/net.rs b/ulib/axlibc/src/net.rs old mode 100644 new mode 100755 diff --git a/ulib/axlibc/src/pipe.rs b/ulib/axlibc/src/pipe.rs old mode 100644 new mode 100755 diff --git a/ulib/axlibc/src/pthread.rs b/ulib/axlibc/src/pthread.rs old mode 100644 new mode 100755 diff --git a/ulib/axlibc/src/rand.rs b/ulib/axlibc/src/rand.rs old mode 100644 new mode 100755 diff --git a/ulib/axlibc/src/resource.rs b/ulib/axlibc/src/resource.rs old mode 100644 new mode 100755 diff --git a/ulib/axlibc/src/setjmp.rs b/ulib/axlibc/src/setjmp.rs old mode 100644 new mode 100755 diff --git a/ulib/axlibc/src/signal.rs b/ulib/axlibc/src/signal.rs old mode 100644 new mode 100755 diff --git a/ulib/axlibc/src/strftime.rs b/ulib/axlibc/src/strftime.rs old mode 100644 new mode 100755 diff --git a/ulib/axlibc/src/string.rs b/ulib/axlibc/src/string.rs old mode 100644 new mode 100755 diff --git a/ulib/axlibc/src/strtod.rs b/ulib/axlibc/src/strtod.rs old mode 100644 new mode 100755 diff --git a/ulib/axlibc/src/sys.rs b/ulib/axlibc/src/sys.rs old mode 100644 new mode 100755 diff --git a/ulib/axlibc/src/time.rs b/ulib/axlibc/src/time.rs old mode 100644 new mode 100755 diff --git a/ulib/axlibc/src/unistd.rs b/ulib/axlibc/src/unistd.rs old mode 100644 new mode 100755 index bc2f1352e..c452920e3 --- a/ulib/axlibc/src/unistd.rs +++ b/ulib/axlibc/src/unistd.rs @@ -6,9 +6,9 @@ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PSL v2 for more details. */ - use arceos_posix_api::{sys_exit, sys_getpid}; use core::ffi::c_int; +use log::info; #[cfg(feature = "signal")] use { crate::getitimer, @@ -16,7 +16,6 @@ use { arceos_posix_api::sys_setitimer, core::ffi::c_uint, }; - /// Get current thread ID. #[no_mangle] pub unsafe extern "C" fn getpid() -> c_int { diff --git a/ulib/axlibc/src/utils.rs b/ulib/axlibc/src/utils.rs old mode 100644 new mode 100755 diff --git a/ulib/axmusl/.gitignore b/ulib/axmusl/.gitignore index 53e1983f5..3ce89bec7 100644 --- a/ulib/axmusl/.gitignore +++ b/ulib/axmusl/.gitignore @@ -1,3 +1,3 @@ build_* install -musl-* +musl-* \ No newline at end of file diff --git a/ulib/axmusl/src/syscall/mod.rs b/ulib/axmusl/src/syscall/mod.rs index 3af40c382..e2b5ab07b 100644 --- a/ulib/axmusl/src/syscall/mod.rs +++ b/ulib/axmusl/src/syscall/mod.rs @@ -59,6 +59,7 @@ pub fn syscall(syscall_id: SyscallId, args: [usize; 6]) -> isize { args[1] as *const core::ffi::c_char, args[2] as c_int, ) as _, + SyscallId::FCHOWNAT => 0, #[cfg(feature = "fs")] SyscallId::RENAMEAT => arceos_posix_api::sys_renameat( args[0] as c_int, @@ -185,6 +186,7 @@ pub fn syscall(syscall_id: SyscallId, args: [usize; 6]) -> isize { args[2] as *mut usize, args[3], ) as _, + SyscallId::UNAME => 0, SyscallId::GETRLIMIT => { arceos_posix_api::sys_getrlimit(args[0] as c_int, args[1] as *mut ctypes::rlimit) as _ @@ -197,6 +199,7 @@ pub fn syscall(syscall_id: SyscallId, args: [usize; 6]) -> isize { #[cfg(feature = "multitask")] SyscallId::GETPID => arceos_posix_api::sys_getpid() as _, + SyscallId::GETEUID => 0, SyscallId::SYSINFO => { arceos_posix_api::sys_sysinfo(args[0] as *mut ctypes::sysinfo) as _ } diff --git a/ulib/axmusl/src/syscall/syscall_id.rs b/ulib/axmusl/src/syscall/syscall_id.rs index a72b9dd94..be4210718 100644 --- a/ulib/axmusl/src/syscall/syscall_id.rs +++ b/ulib/axmusl/src/syscall/syscall_id.rs @@ -27,6 +27,7 @@ pub enum SyscallId { MKDIRAT = 34, #[cfg(feature = "fs")] UNLINKAT = 35, + FCHOWNAT = 54, #[cfg(feature = "fs")] RENAMEAT = 38, #[cfg(feature = "fs")] @@ -66,11 +67,13 @@ pub enum SyscallId { SCHED_YIELD = 124, RT_SIGACTION = 134, RT_SIGPROCMASK = 135, + UNAME = 160, GETRLIMIT = 163, SETRLIMIT = 164, UMASK = 166, #[cfg(feature = "multitask")] GETPID = 172, + GETEUID = 175, SYSINFO = 179, #[cfg(feature = "net")] SOCKET = 198, diff --git a/ulib/axstd/Cargo.toml b/ulib/axstd/Cargo.toml old mode 100644 new mode 100755 diff --git a/ulib/axstd/src/env.rs b/ulib/axstd/src/env.rs old mode 100644 new mode 100755 diff --git a/ulib/axstd/src/fs/dir.rs b/ulib/axstd/src/fs/dir.rs old mode 100644 new mode 100755 diff --git a/ulib/axstd/src/fs/file.rs b/ulib/axstd/src/fs/file.rs old mode 100644 new mode 100755 diff --git a/ulib/axstd/src/fs/mod.rs b/ulib/axstd/src/fs/mod.rs old mode 100644 new mode 100755 diff --git a/ulib/axstd/src/io/mod.rs b/ulib/axstd/src/io/mod.rs old mode 100644 new mode 100755 diff --git a/ulib/axstd/src/io/stdio.rs b/ulib/axstd/src/io/stdio.rs old mode 100644 new mode 100755 diff --git a/ulib/axstd/src/lib.rs b/ulib/axstd/src/lib.rs old mode 100644 new mode 100755 diff --git a/ulib/axstd/src/macros.rs b/ulib/axstd/src/macros.rs old mode 100644 new mode 100755 diff --git a/ulib/axstd/src/net/mod.rs b/ulib/axstd/src/net/mod.rs old mode 100644 new mode 100755 diff --git a/ulib/axstd/src/net/socket_addr.rs b/ulib/axstd/src/net/socket_addr.rs old mode 100644 new mode 100755 diff --git a/ulib/axstd/src/net/tcp.rs b/ulib/axstd/src/net/tcp.rs old mode 100644 new mode 100755 diff --git a/ulib/axstd/src/net/udp.rs b/ulib/axstd/src/net/udp.rs old mode 100644 new mode 100755 diff --git a/ulib/axstd/src/os.rs b/ulib/axstd/src/os.rs old mode 100644 new mode 100755 diff --git a/ulib/axstd/src/process.rs b/ulib/axstd/src/process.rs old mode 100644 new mode 100755 diff --git a/ulib/axstd/src/sync/mod.rs b/ulib/axstd/src/sync/mod.rs old mode 100644 new mode 100755 diff --git a/ulib/axstd/src/sync/mutex.rs b/ulib/axstd/src/sync/mutex.rs old mode 100644 new mode 100755 diff --git a/ulib/axstd/src/thread/mod.rs b/ulib/axstd/src/thread/mod.rs old mode 100644 new mode 100755 diff --git a/ulib/axstd/src/thread/multi.rs b/ulib/axstd/src/thread/multi.rs old mode 100644 new mode 100755 diff --git a/ulib/axstd/src/time.rs b/ulib/axstd/src/time.rs old mode 100644 new mode 100755 index f1153b268..835802b97 --- a/ulib/axstd/src/time.rs +++ b/ulib/axstd/src/time.rs @@ -25,6 +25,11 @@ impl Instant { Instant(arceos_api::time::ax_current_time()) } + /// return time value + pub fn current_time(&self) -> Duration { + self.0 + } + /// Returns the amount of time elapsed from another instant to this one, /// or zero duration if that instant is later than this one. ///