diff --git a/data/bin/arch b/data/loongarch_musl/bin/arch similarity index 100% rename from data/bin/arch rename to data/loongarch_musl/bin/arch diff --git a/data/bin/ash b/data/loongarch_musl/bin/ash similarity index 100% rename from data/bin/ash rename to data/loongarch_musl/bin/ash diff --git a/data/bin/base32 b/data/loongarch_musl/bin/base32 similarity index 100% rename from data/bin/base32 rename to data/loongarch_musl/bin/base32 diff --git a/data/bin/base64 b/data/loongarch_musl/bin/base64 similarity index 100% rename from data/bin/base64 rename to data/loongarch_musl/bin/base64 diff --git a/data/loongarch_musl/bin/busybox b/data/loongarch_musl/bin/busybox new file mode 100755 index 00000000..5e326deb Binary files /dev/null and b/data/loongarch_musl/bin/busybox differ diff --git a/data/bin/cat b/data/loongarch_musl/bin/cat similarity index 100% rename from data/bin/cat rename to data/loongarch_musl/bin/cat diff --git a/data/bin/chattr b/data/loongarch_musl/bin/chattr similarity index 100% rename from data/bin/chattr rename to data/loongarch_musl/bin/chattr diff --git a/data/bin/chgrp b/data/loongarch_musl/bin/chgrp similarity index 100% rename from data/bin/chgrp rename to data/loongarch_musl/bin/chgrp diff --git a/data/bin/chmod b/data/loongarch_musl/bin/chmod similarity index 100% rename from data/bin/chmod rename to data/loongarch_musl/bin/chmod diff --git a/data/bin/chown b/data/loongarch_musl/bin/chown similarity index 100% rename from data/bin/chown rename to data/loongarch_musl/bin/chown diff --git a/data/bin/conspy b/data/loongarch_musl/bin/conspy similarity index 100% rename from data/bin/conspy rename to data/loongarch_musl/bin/conspy diff --git a/data/bin/cp b/data/loongarch_musl/bin/cp similarity index 100% rename from data/bin/cp rename to data/loongarch_musl/bin/cp diff --git a/data/bin/cpio b/data/loongarch_musl/bin/cpio similarity index 100% rename from data/bin/cpio rename to data/loongarch_musl/bin/cpio diff --git a/data/bin/cttyhack b/data/loongarch_musl/bin/cttyhack similarity index 100% rename from data/bin/cttyhack rename to data/loongarch_musl/bin/cttyhack diff --git a/data/bin/date b/data/loongarch_musl/bin/date similarity index 100% rename from data/bin/date rename to data/loongarch_musl/bin/date diff --git a/data/bin/dd b/data/loongarch_musl/bin/dd similarity index 100% rename from data/bin/dd rename to data/loongarch_musl/bin/dd diff --git a/data/bin/df b/data/loongarch_musl/bin/df similarity index 100% rename from data/bin/df rename to data/loongarch_musl/bin/df diff --git a/data/bin/dmesg b/data/loongarch_musl/bin/dmesg similarity index 100% rename from data/bin/dmesg rename to data/loongarch_musl/bin/dmesg diff --git a/data/bin/dnsdomainname b/data/loongarch_musl/bin/dnsdomainname similarity index 100% rename from data/bin/dnsdomainname rename to data/loongarch_musl/bin/dnsdomainname diff --git a/data/bin/dumpkmap b/data/loongarch_musl/bin/dumpkmap similarity index 100% rename from data/bin/dumpkmap rename to data/loongarch_musl/bin/dumpkmap diff --git a/data/bin/echo b/data/loongarch_musl/bin/echo similarity index 100% rename from data/bin/echo rename to data/loongarch_musl/bin/echo diff --git a/data/bin/ed b/data/loongarch_musl/bin/ed similarity index 100% rename from data/bin/ed rename to data/loongarch_musl/bin/ed diff --git a/data/bin/egrep b/data/loongarch_musl/bin/egrep similarity index 100% rename from data/bin/egrep rename to data/loongarch_musl/bin/egrep diff --git a/data/bin/false b/data/loongarch_musl/bin/false similarity index 100% rename from data/bin/false rename to data/loongarch_musl/bin/false diff --git a/data/bin/fatattr b/data/loongarch_musl/bin/fatattr similarity index 100% rename from data/bin/fatattr rename to data/loongarch_musl/bin/fatattr diff --git a/data/bin/fdflush b/data/loongarch_musl/bin/fdflush similarity index 100% rename from data/bin/fdflush rename to data/loongarch_musl/bin/fdflush diff --git a/data/bin/fgrep b/data/loongarch_musl/bin/fgrep similarity index 100% rename from data/bin/fgrep rename to data/loongarch_musl/bin/fgrep diff --git a/data/bin/fsync b/data/loongarch_musl/bin/fsync similarity index 100% rename from data/bin/fsync rename to data/loongarch_musl/bin/fsync diff --git a/data/bin/getopt b/data/loongarch_musl/bin/getopt similarity index 100% rename from data/bin/getopt rename to data/loongarch_musl/bin/getopt diff --git a/data/bin/grep b/data/loongarch_musl/bin/grep similarity index 100% rename from data/bin/grep rename to data/loongarch_musl/bin/grep diff --git a/data/bin/gunzip b/data/loongarch_musl/bin/gunzip similarity index 100% rename from data/bin/gunzip rename to data/loongarch_musl/bin/gunzip diff --git a/data/bin/gzip b/data/loongarch_musl/bin/gzip similarity index 100% rename from data/bin/gzip rename to data/loongarch_musl/bin/gzip diff --git a/data/bin/hostname b/data/loongarch_musl/bin/hostname similarity index 100% rename from data/bin/hostname rename to data/loongarch_musl/bin/hostname diff --git a/data/bin/hush b/data/loongarch_musl/bin/hush similarity index 100% rename from data/bin/hush rename to data/loongarch_musl/bin/hush diff --git a/data/bin/ionice b/data/loongarch_musl/bin/ionice similarity index 100% rename from data/bin/ionice rename to data/loongarch_musl/bin/ionice diff --git a/data/bin/iostat b/data/loongarch_musl/bin/iostat similarity index 100% rename from data/bin/iostat rename to data/loongarch_musl/bin/iostat diff --git a/data/bin/ipcalc b/data/loongarch_musl/bin/ipcalc similarity index 100% rename from data/bin/ipcalc rename to data/loongarch_musl/bin/ipcalc diff --git a/data/bin/kbd_mode b/data/loongarch_musl/bin/kbd_mode similarity index 100% rename from data/bin/kbd_mode rename to data/loongarch_musl/bin/kbd_mode diff --git a/data/bin/kill b/data/loongarch_musl/bin/kill similarity index 100% rename from data/bin/kill rename to data/loongarch_musl/bin/kill diff --git a/data/bin/link b/data/loongarch_musl/bin/link similarity index 100% rename from data/bin/link rename to data/loongarch_musl/bin/link diff --git a/data/bin/linux32 b/data/loongarch_musl/bin/linux32 similarity index 100% rename from data/bin/linux32 rename to data/loongarch_musl/bin/linux32 diff --git a/data/bin/linux64 b/data/loongarch_musl/bin/linux64 similarity index 100% rename from data/bin/linux64 rename to data/loongarch_musl/bin/linux64 diff --git a/data/bin/ln b/data/loongarch_musl/bin/ln similarity index 100% rename from data/bin/ln rename to data/loongarch_musl/bin/ln diff --git a/data/bin/login b/data/loongarch_musl/bin/login similarity index 100% rename from data/bin/login rename to data/loongarch_musl/bin/login diff --git a/data/bin/ls b/data/loongarch_musl/bin/ls similarity index 100% rename from data/bin/ls rename to data/loongarch_musl/bin/ls diff --git a/data/bin/lsattr b/data/loongarch_musl/bin/lsattr similarity index 100% rename from data/bin/lsattr rename to data/loongarch_musl/bin/lsattr diff --git a/data/bin/lzop b/data/loongarch_musl/bin/lzop similarity index 100% rename from data/bin/lzop rename to data/loongarch_musl/bin/lzop diff --git a/data/bin/makemime b/data/loongarch_musl/bin/makemime similarity index 100% rename from data/bin/makemime rename to data/loongarch_musl/bin/makemime diff --git a/data/bin/mkdir b/data/loongarch_musl/bin/mkdir similarity index 100% rename from data/bin/mkdir rename to data/loongarch_musl/bin/mkdir diff --git a/data/bin/mknod b/data/loongarch_musl/bin/mknod similarity index 100% rename from data/bin/mknod rename to data/loongarch_musl/bin/mknod diff --git a/data/bin/mktemp b/data/loongarch_musl/bin/mktemp similarity index 100% rename from data/bin/mktemp rename to data/loongarch_musl/bin/mktemp diff --git a/data/bin/more b/data/loongarch_musl/bin/more similarity index 100% rename from data/bin/more rename to data/loongarch_musl/bin/more diff --git a/data/bin/mount b/data/loongarch_musl/bin/mount similarity index 100% rename from data/bin/mount rename to data/loongarch_musl/bin/mount diff --git a/data/bin/mountpoint b/data/loongarch_musl/bin/mountpoint similarity index 100% rename from data/bin/mountpoint rename to data/loongarch_musl/bin/mountpoint diff --git a/data/bin/mpstat b/data/loongarch_musl/bin/mpstat similarity index 100% rename from data/bin/mpstat rename to data/loongarch_musl/bin/mpstat diff --git a/data/bin/mt b/data/loongarch_musl/bin/mt similarity index 100% rename from data/bin/mt rename to data/loongarch_musl/bin/mt diff --git a/data/bin/mv b/data/loongarch_musl/bin/mv similarity index 100% rename from data/bin/mv rename to data/loongarch_musl/bin/mv diff --git a/data/bin/netstat b/data/loongarch_musl/bin/netstat similarity index 100% rename from data/bin/netstat rename to data/loongarch_musl/bin/netstat diff --git a/data/bin/nice b/data/loongarch_musl/bin/nice similarity index 100% rename from data/bin/nice rename to data/loongarch_musl/bin/nice diff --git a/data/bin/pidof b/data/loongarch_musl/bin/pidof similarity index 100% rename from data/bin/pidof rename to data/loongarch_musl/bin/pidof diff --git a/data/bin/ping b/data/loongarch_musl/bin/ping similarity index 100% rename from data/bin/ping rename to data/loongarch_musl/bin/ping diff --git a/data/bin/ping6 b/data/loongarch_musl/bin/ping6 similarity index 100% rename from data/bin/ping6 rename to data/loongarch_musl/bin/ping6 diff --git a/data/bin/pipe_progress b/data/loongarch_musl/bin/pipe_progress similarity index 100% rename from data/bin/pipe_progress rename to data/loongarch_musl/bin/pipe_progress diff --git a/data/bin/printenv b/data/loongarch_musl/bin/printenv similarity index 100% rename from data/bin/printenv rename to data/loongarch_musl/bin/printenv diff --git a/data/bin/ps b/data/loongarch_musl/bin/ps similarity index 100% rename from data/bin/ps rename to data/loongarch_musl/bin/ps diff --git a/data/bin/pwd b/data/loongarch_musl/bin/pwd similarity index 100% rename from data/bin/pwd rename to data/loongarch_musl/bin/pwd diff --git a/data/bin/reformime b/data/loongarch_musl/bin/reformime similarity index 100% rename from data/bin/reformime rename to data/loongarch_musl/bin/reformime diff --git a/data/bin/resume b/data/loongarch_musl/bin/resume similarity index 100% rename from data/bin/resume rename to data/loongarch_musl/bin/resume diff --git a/data/bin/rev b/data/loongarch_musl/bin/rev similarity index 100% rename from data/bin/rev rename to data/loongarch_musl/bin/rev diff --git a/data/bin/rm b/data/loongarch_musl/bin/rm similarity index 100% rename from data/bin/rm rename to data/loongarch_musl/bin/rm diff --git a/data/bin/rmdir b/data/loongarch_musl/bin/rmdir similarity index 100% rename from data/bin/rmdir rename to data/loongarch_musl/bin/rmdir diff --git a/data/bin/rpm b/data/loongarch_musl/bin/rpm similarity index 100% rename from data/bin/rpm rename to data/loongarch_musl/bin/rpm diff --git a/data/bin/run-parts b/data/loongarch_musl/bin/run-parts similarity index 100% rename from data/bin/run-parts rename to data/loongarch_musl/bin/run-parts diff --git a/data/bin/scriptreplay b/data/loongarch_musl/bin/scriptreplay similarity index 100% rename from data/bin/scriptreplay rename to data/loongarch_musl/bin/scriptreplay diff --git a/data/bin/sed b/data/loongarch_musl/bin/sed similarity index 100% rename from data/bin/sed rename to data/loongarch_musl/bin/sed diff --git a/data/bin/setarch b/data/loongarch_musl/bin/setarch similarity index 100% rename from data/bin/setarch rename to data/loongarch_musl/bin/setarch diff --git a/data/bin/setpriv b/data/loongarch_musl/bin/setpriv similarity index 100% rename from data/bin/setpriv rename to data/loongarch_musl/bin/setpriv diff --git a/data/bin/setserial b/data/loongarch_musl/bin/setserial similarity index 100% rename from data/bin/setserial rename to data/loongarch_musl/bin/setserial diff --git a/data/bin/sh b/data/loongarch_musl/bin/sh similarity index 100% rename from data/bin/sh rename to data/loongarch_musl/bin/sh diff --git a/data/bin/sleep b/data/loongarch_musl/bin/sleep similarity index 100% rename from data/bin/sleep rename to data/loongarch_musl/bin/sleep diff --git a/data/bin/stat b/data/loongarch_musl/bin/stat similarity index 100% rename from data/bin/stat rename to data/loongarch_musl/bin/stat diff --git a/data/bin/stty b/data/loongarch_musl/bin/stty similarity index 100% rename from data/bin/stty rename to data/loongarch_musl/bin/stty diff --git a/data/bin/su b/data/loongarch_musl/bin/su similarity index 100% rename from data/bin/su rename to data/loongarch_musl/bin/su diff --git a/data/bin/sync b/data/loongarch_musl/bin/sync similarity index 100% rename from data/bin/sync rename to data/loongarch_musl/bin/sync diff --git a/data/bin/tar b/data/loongarch_musl/bin/tar similarity index 100% rename from data/bin/tar rename to data/loongarch_musl/bin/tar diff --git a/data/bin/touch b/data/loongarch_musl/bin/touch similarity index 100% rename from data/bin/touch rename to data/loongarch_musl/bin/touch diff --git a/data/bin/true b/data/loongarch_musl/bin/true similarity index 100% rename from data/bin/true rename to data/loongarch_musl/bin/true diff --git a/data/bin/umount b/data/loongarch_musl/bin/umount similarity index 100% rename from data/bin/umount rename to data/loongarch_musl/bin/umount diff --git a/data/bin/uname b/data/loongarch_musl/bin/uname similarity index 100% rename from data/bin/uname rename to data/loongarch_musl/bin/uname diff --git a/data/bin/usleep b/data/loongarch_musl/bin/usleep similarity index 100% rename from data/bin/usleep rename to data/loongarch_musl/bin/usleep diff --git a/data/bin/vi b/data/loongarch_musl/bin/vi similarity index 100% rename from data/bin/vi rename to data/loongarch_musl/bin/vi diff --git a/data/bin/watch b/data/loongarch_musl/bin/watch similarity index 100% rename from data/bin/watch rename to data/loongarch_musl/bin/watch diff --git a/data/bin/zcat b/data/loongarch_musl/bin/zcat similarity index 100% rename from data/bin/zcat rename to data/loongarch_musl/bin/zcat diff --git a/data/dev/.gitkeep b/data/loongarch_musl/dev/.gitkeep similarity index 100% rename from data/dev/.gitkeep rename to data/loongarch_musl/dev/.gitkeep diff --git a/data/etc/init.d/rcS b/data/loongarch_musl/etc/init.d/rcS similarity index 100% rename from data/etc/init.d/rcS rename to data/loongarch_musl/etc/init.d/rcS diff --git a/data/etc/inittab b/data/loongarch_musl/etc/inittab similarity index 100% rename from data/etc/inittab rename to data/loongarch_musl/etc/inittab diff --git a/data/etc/profile b/data/loongarch_musl/etc/profile similarity index 100% rename from data/etc/profile rename to data/loongarch_musl/etc/profile diff --git a/data/linuxrc b/data/loongarch_musl/linuxrc similarity index 100% rename from data/linuxrc rename to data/loongarch_musl/linuxrc diff --git a/data/proc/.gitkeep b/data/loongarch_musl/proc/.gitkeep similarity index 100% rename from data/proc/.gitkeep rename to data/loongarch_musl/proc/.gitkeep diff --git a/data/sbin/acpid b/data/loongarch_musl/sbin/acpid similarity index 100% rename from data/sbin/acpid rename to data/loongarch_musl/sbin/acpid diff --git a/data/sbin/adjtimex b/data/loongarch_musl/sbin/adjtimex similarity index 100% rename from data/sbin/adjtimex rename to data/loongarch_musl/sbin/adjtimex diff --git a/data/sbin/arp b/data/loongarch_musl/sbin/arp similarity index 100% rename from data/sbin/arp rename to data/loongarch_musl/sbin/arp diff --git a/data/sbin/blkid b/data/loongarch_musl/sbin/blkid similarity index 100% rename from data/sbin/blkid rename to data/loongarch_musl/sbin/blkid diff --git a/data/sbin/blockdev b/data/loongarch_musl/sbin/blockdev similarity index 100% rename from data/sbin/blockdev rename to data/loongarch_musl/sbin/blockdev diff --git a/data/sbin/bootchartd b/data/loongarch_musl/sbin/bootchartd similarity index 100% rename from data/sbin/bootchartd rename to data/loongarch_musl/sbin/bootchartd diff --git a/data/sbin/depmod b/data/loongarch_musl/sbin/depmod similarity index 100% rename from data/sbin/depmod rename to data/loongarch_musl/sbin/depmod diff --git a/data/sbin/devmem b/data/loongarch_musl/sbin/devmem similarity index 100% rename from data/sbin/devmem rename to data/loongarch_musl/sbin/devmem diff --git a/data/sbin/fbsplash b/data/loongarch_musl/sbin/fbsplash similarity index 100% rename from data/sbin/fbsplash rename to data/loongarch_musl/sbin/fbsplash diff --git a/data/sbin/fdisk b/data/loongarch_musl/sbin/fdisk similarity index 100% rename from data/sbin/fdisk rename to data/loongarch_musl/sbin/fdisk diff --git a/data/sbin/findfs b/data/loongarch_musl/sbin/findfs similarity index 100% rename from data/sbin/findfs rename to data/loongarch_musl/sbin/findfs diff --git a/data/sbin/freeramdisk b/data/loongarch_musl/sbin/freeramdisk similarity index 100% rename from data/sbin/freeramdisk rename to data/loongarch_musl/sbin/freeramdisk diff --git a/data/sbin/fsck b/data/loongarch_musl/sbin/fsck similarity index 100% rename from data/sbin/fsck rename to data/loongarch_musl/sbin/fsck diff --git a/data/sbin/fsck.minix b/data/loongarch_musl/sbin/fsck.minix similarity index 100% rename from data/sbin/fsck.minix rename to data/loongarch_musl/sbin/fsck.minix diff --git a/data/sbin/fstrim b/data/loongarch_musl/sbin/fstrim similarity index 100% rename from data/sbin/fstrim rename to data/loongarch_musl/sbin/fstrim diff --git a/data/sbin/getty b/data/loongarch_musl/sbin/getty similarity index 100% rename from data/sbin/getty rename to data/loongarch_musl/sbin/getty diff --git a/data/sbin/halt b/data/loongarch_musl/sbin/halt similarity index 100% rename from data/sbin/halt rename to data/loongarch_musl/sbin/halt diff --git a/data/sbin/hdparm b/data/loongarch_musl/sbin/hdparm similarity index 100% rename from data/sbin/hdparm rename to data/loongarch_musl/sbin/hdparm diff --git a/data/sbin/hwclock b/data/loongarch_musl/sbin/hwclock similarity index 100% rename from data/sbin/hwclock rename to data/loongarch_musl/sbin/hwclock diff --git a/data/sbin/ifconfig b/data/loongarch_musl/sbin/ifconfig similarity index 100% rename from data/sbin/ifconfig rename to data/loongarch_musl/sbin/ifconfig diff --git a/data/sbin/ifdown b/data/loongarch_musl/sbin/ifdown similarity index 100% rename from data/sbin/ifdown rename to data/loongarch_musl/sbin/ifdown diff --git a/data/sbin/ifenslave b/data/loongarch_musl/sbin/ifenslave similarity index 100% rename from data/sbin/ifenslave rename to data/loongarch_musl/sbin/ifenslave diff --git a/data/sbin/ifup b/data/loongarch_musl/sbin/ifup similarity index 100% rename from data/sbin/ifup rename to data/loongarch_musl/sbin/ifup diff --git a/data/sbin/init b/data/loongarch_musl/sbin/init similarity index 100% rename from data/sbin/init rename to data/loongarch_musl/sbin/init diff --git a/data/sbin/insmod b/data/loongarch_musl/sbin/insmod similarity index 100% rename from data/sbin/insmod rename to data/loongarch_musl/sbin/insmod diff --git a/data/sbin/ip b/data/loongarch_musl/sbin/ip similarity index 100% rename from data/sbin/ip rename to data/loongarch_musl/sbin/ip diff --git a/data/sbin/ipaddr b/data/loongarch_musl/sbin/ipaddr similarity index 100% rename from data/sbin/ipaddr rename to data/loongarch_musl/sbin/ipaddr diff --git a/data/sbin/iplink b/data/loongarch_musl/sbin/iplink similarity index 100% rename from data/sbin/iplink rename to data/loongarch_musl/sbin/iplink diff --git a/data/sbin/ipneigh b/data/loongarch_musl/sbin/ipneigh similarity index 100% rename from data/sbin/ipneigh rename to data/loongarch_musl/sbin/ipneigh diff --git a/data/sbin/iproute b/data/loongarch_musl/sbin/iproute similarity index 100% rename from data/sbin/iproute rename to data/loongarch_musl/sbin/iproute diff --git a/data/sbin/iprule b/data/loongarch_musl/sbin/iprule similarity index 100% rename from data/sbin/iprule rename to data/loongarch_musl/sbin/iprule diff --git a/data/sbin/iptunnel b/data/loongarch_musl/sbin/iptunnel similarity index 100% rename from data/sbin/iptunnel rename to data/loongarch_musl/sbin/iptunnel diff --git a/data/sbin/klogd b/data/loongarch_musl/sbin/klogd similarity index 100% rename from data/sbin/klogd rename to data/loongarch_musl/sbin/klogd diff --git a/data/sbin/loadkmap b/data/loongarch_musl/sbin/loadkmap similarity index 100% rename from data/sbin/loadkmap rename to data/loongarch_musl/sbin/loadkmap diff --git a/data/sbin/logread b/data/loongarch_musl/sbin/logread similarity index 100% rename from data/sbin/logread rename to data/loongarch_musl/sbin/logread diff --git a/data/sbin/losetup b/data/loongarch_musl/sbin/losetup similarity index 100% rename from data/sbin/losetup rename to data/loongarch_musl/sbin/losetup diff --git a/data/sbin/lsmod b/data/loongarch_musl/sbin/lsmod similarity index 100% rename from data/sbin/lsmod rename to data/loongarch_musl/sbin/lsmod diff --git a/data/sbin/makedevs b/data/loongarch_musl/sbin/makedevs similarity index 100% rename from data/sbin/makedevs rename to data/loongarch_musl/sbin/makedevs diff --git a/data/sbin/mdev b/data/loongarch_musl/sbin/mdev similarity index 100% rename from data/sbin/mdev rename to data/loongarch_musl/sbin/mdev diff --git a/data/sbin/mkdosfs b/data/loongarch_musl/sbin/mkdosfs similarity index 100% rename from data/sbin/mkdosfs rename to data/loongarch_musl/sbin/mkdosfs diff --git a/data/sbin/mke2fs b/data/loongarch_musl/sbin/mke2fs similarity index 100% rename from data/sbin/mke2fs rename to data/loongarch_musl/sbin/mke2fs diff --git a/data/sbin/mkfs.ext2 b/data/loongarch_musl/sbin/mkfs.ext2 similarity index 100% rename from data/sbin/mkfs.ext2 rename to data/loongarch_musl/sbin/mkfs.ext2 diff --git a/data/sbin/mkfs.minix b/data/loongarch_musl/sbin/mkfs.minix similarity index 100% rename from data/sbin/mkfs.minix rename to data/loongarch_musl/sbin/mkfs.minix diff --git a/data/sbin/mkfs.vfat b/data/loongarch_musl/sbin/mkfs.vfat similarity index 100% rename from data/sbin/mkfs.vfat rename to data/loongarch_musl/sbin/mkfs.vfat diff --git a/data/sbin/mkswap b/data/loongarch_musl/sbin/mkswap similarity index 100% rename from data/sbin/mkswap rename to data/loongarch_musl/sbin/mkswap diff --git a/data/sbin/modinfo b/data/loongarch_musl/sbin/modinfo similarity index 100% rename from data/sbin/modinfo rename to data/loongarch_musl/sbin/modinfo diff --git a/data/sbin/modprobe b/data/loongarch_musl/sbin/modprobe similarity index 100% rename from data/sbin/modprobe rename to data/loongarch_musl/sbin/modprobe diff --git a/data/sbin/nameif b/data/loongarch_musl/sbin/nameif similarity index 100% rename from data/sbin/nameif rename to data/loongarch_musl/sbin/nameif diff --git a/data/sbin/pivot_root b/data/loongarch_musl/sbin/pivot_root similarity index 100% rename from data/sbin/pivot_root rename to data/loongarch_musl/sbin/pivot_root diff --git a/data/sbin/poweroff b/data/loongarch_musl/sbin/poweroff similarity index 100% rename from data/sbin/poweroff rename to data/loongarch_musl/sbin/poweroff diff --git a/data/sbin/raidautorun b/data/loongarch_musl/sbin/raidautorun similarity index 100% rename from data/sbin/raidautorun rename to data/loongarch_musl/sbin/raidautorun diff --git a/data/sbin/reboot b/data/loongarch_musl/sbin/reboot similarity index 100% rename from data/sbin/reboot rename to data/loongarch_musl/sbin/reboot diff --git a/data/sbin/rmmod b/data/loongarch_musl/sbin/rmmod similarity index 100% rename from data/sbin/rmmod rename to data/loongarch_musl/sbin/rmmod diff --git a/data/sbin/route b/data/loongarch_musl/sbin/route similarity index 100% rename from data/sbin/route rename to data/loongarch_musl/sbin/route diff --git a/data/sbin/run-init b/data/loongarch_musl/sbin/run-init similarity index 100% rename from data/sbin/run-init rename to data/loongarch_musl/sbin/run-init diff --git a/data/sbin/runlevel b/data/loongarch_musl/sbin/runlevel similarity index 100% rename from data/sbin/runlevel rename to data/loongarch_musl/sbin/runlevel diff --git a/data/sbin/setconsole b/data/loongarch_musl/sbin/setconsole similarity index 100% rename from data/sbin/setconsole rename to data/loongarch_musl/sbin/setconsole diff --git a/data/sbin/slattach b/data/loongarch_musl/sbin/slattach similarity index 100% rename from data/sbin/slattach rename to data/loongarch_musl/sbin/slattach diff --git a/data/sbin/start-stop-daemon b/data/loongarch_musl/sbin/start-stop-daemon similarity index 100% rename from data/sbin/start-stop-daemon rename to data/loongarch_musl/sbin/start-stop-daemon diff --git a/data/sbin/sulogin b/data/loongarch_musl/sbin/sulogin similarity index 100% rename from data/sbin/sulogin rename to data/loongarch_musl/sbin/sulogin diff --git a/data/sbin/swapoff b/data/loongarch_musl/sbin/swapoff similarity index 100% rename from data/sbin/swapoff rename to data/loongarch_musl/sbin/swapoff diff --git a/data/sbin/swapon b/data/loongarch_musl/sbin/swapon similarity index 100% rename from data/sbin/swapon rename to data/loongarch_musl/sbin/swapon diff --git a/data/sbin/switch_root b/data/loongarch_musl/sbin/switch_root similarity index 100% rename from data/sbin/switch_root rename to data/loongarch_musl/sbin/switch_root diff --git a/data/sbin/sysctl b/data/loongarch_musl/sbin/sysctl similarity index 100% rename from data/sbin/sysctl rename to data/loongarch_musl/sbin/sysctl diff --git a/data/sbin/syslogd b/data/loongarch_musl/sbin/syslogd similarity index 100% rename from data/sbin/syslogd rename to data/loongarch_musl/sbin/syslogd diff --git a/data/sbin/tunctl b/data/loongarch_musl/sbin/tunctl similarity index 100% rename from data/sbin/tunctl rename to data/loongarch_musl/sbin/tunctl diff --git a/data/sbin/udhcpc b/data/loongarch_musl/sbin/udhcpc similarity index 100% rename from data/sbin/udhcpc rename to data/loongarch_musl/sbin/udhcpc diff --git a/data/sbin/uevent b/data/loongarch_musl/sbin/uevent similarity index 100% rename from data/sbin/uevent rename to data/loongarch_musl/sbin/uevent diff --git a/data/sbin/vconfig b/data/loongarch_musl/sbin/vconfig similarity index 100% rename from data/sbin/vconfig rename to data/loongarch_musl/sbin/vconfig diff --git a/data/sbin/watchdog b/data/loongarch_musl/sbin/watchdog similarity index 100% rename from data/sbin/watchdog rename to data/loongarch_musl/sbin/watchdog diff --git a/data/sbin/zcip b/data/loongarch_musl/sbin/zcip similarity index 100% rename from data/sbin/zcip rename to data/loongarch_musl/sbin/zcip diff --git a/data/sys/.gitkeep b/data/loongarch_musl/sys/.gitkeep similarity index 100% rename from data/sys/.gitkeep rename to data/loongarch_musl/sys/.gitkeep diff --git a/data/usr/bin/[ b/data/loongarch_musl/usr/bin/[ similarity index 100% rename from data/usr/bin/[ rename to data/loongarch_musl/usr/bin/[ diff --git a/data/usr/bin/[[ b/data/loongarch_musl/usr/bin/[[ similarity index 100% rename from data/usr/bin/[[ rename to data/loongarch_musl/usr/bin/[[ diff --git a/data/usr/bin/ascii b/data/loongarch_musl/usr/bin/ascii similarity index 100% rename from data/usr/bin/ascii rename to data/loongarch_musl/usr/bin/ascii diff --git a/data/usr/bin/awk b/data/loongarch_musl/usr/bin/awk similarity index 100% rename from data/usr/bin/awk rename to data/loongarch_musl/usr/bin/awk diff --git a/data/usr/bin/basename b/data/loongarch_musl/usr/bin/basename similarity index 100% rename from data/usr/bin/basename rename to data/loongarch_musl/usr/bin/basename diff --git a/data/usr/bin/bc b/data/loongarch_musl/usr/bin/bc similarity index 100% rename from data/usr/bin/bc rename to data/loongarch_musl/usr/bin/bc diff --git a/data/usr/bin/beep b/data/loongarch_musl/usr/bin/beep similarity index 100% rename from data/usr/bin/beep rename to data/loongarch_musl/usr/bin/beep diff --git a/data/usr/bin/blkdiscard b/data/loongarch_musl/usr/bin/blkdiscard similarity index 100% rename from data/usr/bin/blkdiscard rename to data/loongarch_musl/usr/bin/blkdiscard diff --git a/data/usr/bin/bunzip2 b/data/loongarch_musl/usr/bin/bunzip2 similarity index 100% rename from data/usr/bin/bunzip2 rename to data/loongarch_musl/usr/bin/bunzip2 diff --git a/data/usr/bin/bzcat b/data/loongarch_musl/usr/bin/bzcat similarity index 100% rename from data/usr/bin/bzcat rename to data/loongarch_musl/usr/bin/bzcat diff --git a/data/usr/bin/bzip2 b/data/loongarch_musl/usr/bin/bzip2 similarity index 100% rename from data/usr/bin/bzip2 rename to data/loongarch_musl/usr/bin/bzip2 diff --git a/data/usr/bin/cal b/data/loongarch_musl/usr/bin/cal similarity index 100% rename from data/usr/bin/cal rename to data/loongarch_musl/usr/bin/cal diff --git a/data/usr/bin/chpst b/data/loongarch_musl/usr/bin/chpst similarity index 100% rename from data/usr/bin/chpst rename to data/loongarch_musl/usr/bin/chpst diff --git a/data/usr/bin/chrt b/data/loongarch_musl/usr/bin/chrt similarity index 100% rename from data/usr/bin/chrt rename to data/loongarch_musl/usr/bin/chrt diff --git a/data/usr/bin/chvt b/data/loongarch_musl/usr/bin/chvt similarity index 100% rename from data/usr/bin/chvt rename to data/loongarch_musl/usr/bin/chvt diff --git a/data/usr/bin/cksum b/data/loongarch_musl/usr/bin/cksum similarity index 100% rename from data/usr/bin/cksum rename to data/loongarch_musl/usr/bin/cksum diff --git a/data/usr/bin/clear b/data/loongarch_musl/usr/bin/clear similarity index 100% rename from data/usr/bin/clear rename to data/loongarch_musl/usr/bin/clear diff --git a/data/usr/bin/cmp b/data/loongarch_musl/usr/bin/cmp similarity index 100% rename from data/usr/bin/cmp rename to data/loongarch_musl/usr/bin/cmp diff --git a/data/usr/bin/comm b/data/loongarch_musl/usr/bin/comm similarity index 100% rename from data/usr/bin/comm rename to data/loongarch_musl/usr/bin/comm diff --git a/data/usr/bin/crc32 b/data/loongarch_musl/usr/bin/crc32 similarity index 100% rename from data/usr/bin/crc32 rename to data/loongarch_musl/usr/bin/crc32 diff --git a/data/usr/bin/crontab b/data/loongarch_musl/usr/bin/crontab similarity index 100% rename from data/usr/bin/crontab rename to data/loongarch_musl/usr/bin/crontab diff --git a/data/usr/bin/cryptpw b/data/loongarch_musl/usr/bin/cryptpw similarity index 100% rename from data/usr/bin/cryptpw rename to data/loongarch_musl/usr/bin/cryptpw diff --git a/data/usr/bin/cut b/data/loongarch_musl/usr/bin/cut similarity index 100% rename from data/usr/bin/cut rename to data/loongarch_musl/usr/bin/cut diff --git a/data/usr/bin/dc b/data/loongarch_musl/usr/bin/dc similarity index 100% rename from data/usr/bin/dc rename to data/loongarch_musl/usr/bin/dc diff --git a/data/usr/bin/deallocvt b/data/loongarch_musl/usr/bin/deallocvt similarity index 100% rename from data/usr/bin/deallocvt rename to data/loongarch_musl/usr/bin/deallocvt diff --git a/data/usr/bin/diff b/data/loongarch_musl/usr/bin/diff similarity index 100% rename from data/usr/bin/diff rename to data/loongarch_musl/usr/bin/diff diff --git a/data/usr/bin/dirname b/data/loongarch_musl/usr/bin/dirname similarity index 100% rename from data/usr/bin/dirname rename to data/loongarch_musl/usr/bin/dirname diff --git a/data/usr/bin/dos2unix b/data/loongarch_musl/usr/bin/dos2unix similarity index 100% rename from data/usr/bin/dos2unix rename to data/loongarch_musl/usr/bin/dos2unix diff --git a/data/usr/bin/dpkg b/data/loongarch_musl/usr/bin/dpkg similarity index 100% rename from data/usr/bin/dpkg rename to data/loongarch_musl/usr/bin/dpkg diff --git a/data/usr/bin/dpkg-deb b/data/loongarch_musl/usr/bin/dpkg-deb similarity index 100% rename from data/usr/bin/dpkg-deb rename to data/loongarch_musl/usr/bin/dpkg-deb diff --git a/data/usr/bin/du b/data/loongarch_musl/usr/bin/du similarity index 100% rename from data/usr/bin/du rename to data/loongarch_musl/usr/bin/du diff --git a/data/usr/bin/dumpleases b/data/loongarch_musl/usr/bin/dumpleases similarity index 100% rename from data/usr/bin/dumpleases rename to data/loongarch_musl/usr/bin/dumpleases diff --git a/data/usr/bin/eject b/data/loongarch_musl/usr/bin/eject similarity index 100% rename from data/usr/bin/eject rename to data/loongarch_musl/usr/bin/eject diff --git a/data/usr/bin/env b/data/loongarch_musl/usr/bin/env similarity index 100% rename from data/usr/bin/env rename to data/loongarch_musl/usr/bin/env diff --git a/data/usr/bin/envdir b/data/loongarch_musl/usr/bin/envdir similarity index 100% rename from data/usr/bin/envdir rename to data/loongarch_musl/usr/bin/envdir diff --git a/data/usr/bin/envuidgid b/data/loongarch_musl/usr/bin/envuidgid similarity index 100% rename from data/usr/bin/envuidgid rename to data/loongarch_musl/usr/bin/envuidgid diff --git a/data/usr/bin/expand b/data/loongarch_musl/usr/bin/expand similarity index 100% rename from data/usr/bin/expand rename to data/loongarch_musl/usr/bin/expand diff --git a/data/usr/bin/expr b/data/loongarch_musl/usr/bin/expr similarity index 100% rename from data/usr/bin/expr rename to data/loongarch_musl/usr/bin/expr diff --git a/data/usr/bin/factor b/data/loongarch_musl/usr/bin/factor similarity index 100% rename from data/usr/bin/factor rename to data/loongarch_musl/usr/bin/factor diff --git a/data/usr/bin/fallocate b/data/loongarch_musl/usr/bin/fallocate similarity index 100% rename from data/usr/bin/fallocate rename to data/loongarch_musl/usr/bin/fallocate diff --git a/data/usr/bin/fgconsole b/data/loongarch_musl/usr/bin/fgconsole similarity index 100% rename from data/usr/bin/fgconsole rename to data/loongarch_musl/usr/bin/fgconsole diff --git a/data/usr/bin/find b/data/loongarch_musl/usr/bin/find similarity index 100% rename from data/usr/bin/find rename to data/loongarch_musl/usr/bin/find diff --git a/data/usr/bin/flock b/data/loongarch_musl/usr/bin/flock similarity index 100% rename from data/usr/bin/flock rename to data/loongarch_musl/usr/bin/flock diff --git a/data/usr/bin/fold b/data/loongarch_musl/usr/bin/fold similarity index 100% rename from data/usr/bin/fold rename to data/loongarch_musl/usr/bin/fold diff --git a/data/usr/bin/free b/data/loongarch_musl/usr/bin/free similarity index 100% rename from data/usr/bin/free rename to data/loongarch_musl/usr/bin/free diff --git a/data/usr/bin/ftpget b/data/loongarch_musl/usr/bin/ftpget similarity index 100% rename from data/usr/bin/ftpget rename to data/loongarch_musl/usr/bin/ftpget diff --git a/data/usr/bin/ftpput b/data/loongarch_musl/usr/bin/ftpput similarity index 100% rename from data/usr/bin/ftpput rename to data/loongarch_musl/usr/bin/ftpput diff --git a/data/usr/bin/fuser b/data/loongarch_musl/usr/bin/fuser similarity index 100% rename from data/usr/bin/fuser rename to data/loongarch_musl/usr/bin/fuser diff --git a/data/usr/bin/getfattr b/data/loongarch_musl/usr/bin/getfattr similarity index 100% rename from data/usr/bin/getfattr rename to data/loongarch_musl/usr/bin/getfattr diff --git a/data/usr/bin/groups b/data/loongarch_musl/usr/bin/groups similarity index 100% rename from data/usr/bin/groups rename to data/loongarch_musl/usr/bin/groups diff --git a/data/usr/bin/hd b/data/loongarch_musl/usr/bin/hd similarity index 100% rename from data/usr/bin/hd rename to data/loongarch_musl/usr/bin/hd diff --git a/data/usr/bin/head b/data/loongarch_musl/usr/bin/head similarity index 100% rename from data/usr/bin/head rename to data/loongarch_musl/usr/bin/head diff --git a/data/usr/bin/hexdump b/data/loongarch_musl/usr/bin/hexdump similarity index 100% rename from data/usr/bin/hexdump rename to data/loongarch_musl/usr/bin/hexdump diff --git a/data/usr/bin/hexedit b/data/loongarch_musl/usr/bin/hexedit similarity index 100% rename from data/usr/bin/hexedit rename to data/loongarch_musl/usr/bin/hexedit diff --git a/data/usr/bin/hostid b/data/loongarch_musl/usr/bin/hostid similarity index 100% rename from data/usr/bin/hostid rename to data/loongarch_musl/usr/bin/hostid diff --git a/data/usr/bin/id b/data/loongarch_musl/usr/bin/id similarity index 100% rename from data/usr/bin/id rename to data/loongarch_musl/usr/bin/id diff --git a/data/usr/bin/install b/data/loongarch_musl/usr/bin/install similarity index 100% rename from data/usr/bin/install rename to data/loongarch_musl/usr/bin/install diff --git a/data/usr/bin/ipcrm b/data/loongarch_musl/usr/bin/ipcrm similarity index 100% rename from data/usr/bin/ipcrm rename to data/loongarch_musl/usr/bin/ipcrm diff --git a/data/usr/bin/ipcs b/data/loongarch_musl/usr/bin/ipcs similarity index 100% rename from data/usr/bin/ipcs rename to data/loongarch_musl/usr/bin/ipcs diff --git a/data/usr/bin/killall b/data/loongarch_musl/usr/bin/killall similarity index 100% rename from data/usr/bin/killall rename to data/loongarch_musl/usr/bin/killall diff --git a/data/usr/bin/last b/data/loongarch_musl/usr/bin/last similarity index 100% rename from data/usr/bin/last rename to data/loongarch_musl/usr/bin/last diff --git a/data/usr/bin/less b/data/loongarch_musl/usr/bin/less similarity index 100% rename from data/usr/bin/less rename to data/loongarch_musl/usr/bin/less diff --git a/data/usr/bin/logger b/data/loongarch_musl/usr/bin/logger similarity index 100% rename from data/usr/bin/logger rename to data/loongarch_musl/usr/bin/logger diff --git a/data/usr/bin/logname b/data/loongarch_musl/usr/bin/logname similarity index 100% rename from data/usr/bin/logname rename to data/loongarch_musl/usr/bin/logname diff --git a/data/usr/bin/lpq b/data/loongarch_musl/usr/bin/lpq similarity index 100% rename from data/usr/bin/lpq rename to data/loongarch_musl/usr/bin/lpq diff --git a/data/usr/bin/lpr b/data/loongarch_musl/usr/bin/lpr similarity index 100% rename from data/usr/bin/lpr rename to data/loongarch_musl/usr/bin/lpr diff --git a/data/usr/bin/lsof b/data/loongarch_musl/usr/bin/lsof similarity index 100% rename from data/usr/bin/lsof rename to data/loongarch_musl/usr/bin/lsof diff --git a/data/usr/bin/lspci b/data/loongarch_musl/usr/bin/lspci similarity index 100% rename from data/usr/bin/lspci rename to data/loongarch_musl/usr/bin/lspci diff --git a/data/usr/bin/lsscsi b/data/loongarch_musl/usr/bin/lsscsi similarity index 100% rename from data/usr/bin/lsscsi rename to data/loongarch_musl/usr/bin/lsscsi diff --git a/data/usr/bin/lsusb b/data/loongarch_musl/usr/bin/lsusb similarity index 100% rename from data/usr/bin/lsusb rename to data/loongarch_musl/usr/bin/lsusb diff --git a/data/usr/bin/lzcat b/data/loongarch_musl/usr/bin/lzcat similarity index 100% rename from data/usr/bin/lzcat rename to data/loongarch_musl/usr/bin/lzcat diff --git a/data/usr/bin/lzma b/data/loongarch_musl/usr/bin/lzma similarity index 100% rename from data/usr/bin/lzma rename to data/loongarch_musl/usr/bin/lzma diff --git a/data/usr/bin/man b/data/loongarch_musl/usr/bin/man similarity index 100% rename from data/usr/bin/man rename to data/loongarch_musl/usr/bin/man diff --git a/data/usr/bin/md5sum b/data/loongarch_musl/usr/bin/md5sum similarity index 100% rename from data/usr/bin/md5sum rename to data/loongarch_musl/usr/bin/md5sum diff --git a/data/usr/bin/mesg b/data/loongarch_musl/usr/bin/mesg similarity index 100% rename from data/usr/bin/mesg rename to data/loongarch_musl/usr/bin/mesg diff --git a/data/usr/bin/microcom b/data/loongarch_musl/usr/bin/microcom similarity index 100% rename from data/usr/bin/microcom rename to data/loongarch_musl/usr/bin/microcom diff --git a/data/usr/bin/mkfifo b/data/loongarch_musl/usr/bin/mkfifo similarity index 100% rename from data/usr/bin/mkfifo rename to data/loongarch_musl/usr/bin/mkfifo diff --git a/data/usr/bin/mkpasswd b/data/loongarch_musl/usr/bin/mkpasswd similarity index 100% rename from data/usr/bin/mkpasswd rename to data/loongarch_musl/usr/bin/mkpasswd diff --git a/data/usr/bin/nc b/data/loongarch_musl/usr/bin/nc similarity index 100% rename from data/usr/bin/nc rename to data/loongarch_musl/usr/bin/nc diff --git a/data/usr/bin/nl b/data/loongarch_musl/usr/bin/nl similarity index 100% rename from data/usr/bin/nl rename to data/loongarch_musl/usr/bin/nl diff --git a/data/usr/bin/nmeter b/data/loongarch_musl/usr/bin/nmeter similarity index 100% rename from data/usr/bin/nmeter rename to data/loongarch_musl/usr/bin/nmeter diff --git a/data/usr/bin/nohup b/data/loongarch_musl/usr/bin/nohup similarity index 100% rename from data/usr/bin/nohup rename to data/loongarch_musl/usr/bin/nohup diff --git a/data/usr/bin/nproc b/data/loongarch_musl/usr/bin/nproc similarity index 100% rename from data/usr/bin/nproc rename to data/loongarch_musl/usr/bin/nproc diff --git a/data/usr/bin/nsenter b/data/loongarch_musl/usr/bin/nsenter similarity index 100% rename from data/usr/bin/nsenter rename to data/loongarch_musl/usr/bin/nsenter diff --git a/data/usr/bin/nslookup b/data/loongarch_musl/usr/bin/nslookup similarity index 100% rename from data/usr/bin/nslookup rename to data/loongarch_musl/usr/bin/nslookup diff --git a/data/usr/bin/od b/data/loongarch_musl/usr/bin/od similarity index 100% rename from data/usr/bin/od rename to data/loongarch_musl/usr/bin/od diff --git a/data/usr/bin/openvt b/data/loongarch_musl/usr/bin/openvt similarity index 100% rename from data/usr/bin/openvt rename to data/loongarch_musl/usr/bin/openvt diff --git a/data/usr/bin/passwd b/data/loongarch_musl/usr/bin/passwd similarity index 100% rename from data/usr/bin/passwd rename to data/loongarch_musl/usr/bin/passwd diff --git a/data/usr/bin/paste b/data/loongarch_musl/usr/bin/paste similarity index 100% rename from data/usr/bin/paste rename to data/loongarch_musl/usr/bin/paste diff --git a/data/usr/bin/patch b/data/loongarch_musl/usr/bin/patch similarity index 100% rename from data/usr/bin/patch rename to data/loongarch_musl/usr/bin/patch diff --git a/data/usr/bin/pgrep b/data/loongarch_musl/usr/bin/pgrep similarity index 100% rename from data/usr/bin/pgrep rename to data/loongarch_musl/usr/bin/pgrep diff --git a/data/usr/bin/pkill b/data/loongarch_musl/usr/bin/pkill similarity index 100% rename from data/usr/bin/pkill rename to data/loongarch_musl/usr/bin/pkill diff --git a/data/usr/bin/pmap b/data/loongarch_musl/usr/bin/pmap similarity index 100% rename from data/usr/bin/pmap rename to data/loongarch_musl/usr/bin/pmap diff --git a/data/usr/bin/printf b/data/loongarch_musl/usr/bin/printf similarity index 100% rename from data/usr/bin/printf rename to data/loongarch_musl/usr/bin/printf diff --git a/data/usr/bin/pscan b/data/loongarch_musl/usr/bin/pscan similarity index 100% rename from data/usr/bin/pscan rename to data/loongarch_musl/usr/bin/pscan diff --git a/data/usr/bin/pstree b/data/loongarch_musl/usr/bin/pstree similarity index 100% rename from data/usr/bin/pstree rename to data/loongarch_musl/usr/bin/pstree diff --git a/data/usr/bin/pwdx b/data/loongarch_musl/usr/bin/pwdx similarity index 100% rename from data/usr/bin/pwdx rename to data/loongarch_musl/usr/bin/pwdx diff --git a/data/usr/bin/readlink b/data/loongarch_musl/usr/bin/readlink similarity index 100% rename from data/usr/bin/readlink rename to data/loongarch_musl/usr/bin/readlink diff --git a/data/usr/bin/realpath b/data/loongarch_musl/usr/bin/realpath similarity index 100% rename from data/usr/bin/realpath rename to data/loongarch_musl/usr/bin/realpath diff --git a/data/usr/bin/renice b/data/loongarch_musl/usr/bin/renice similarity index 100% rename from data/usr/bin/renice rename to data/loongarch_musl/usr/bin/renice diff --git a/data/usr/bin/reset b/data/loongarch_musl/usr/bin/reset similarity index 100% rename from data/usr/bin/reset rename to data/loongarch_musl/usr/bin/reset diff --git a/data/usr/bin/resize b/data/loongarch_musl/usr/bin/resize similarity index 100% rename from data/usr/bin/resize rename to data/loongarch_musl/usr/bin/resize diff --git a/data/usr/bin/rpm2cpio b/data/loongarch_musl/usr/bin/rpm2cpio similarity index 100% rename from data/usr/bin/rpm2cpio rename to data/loongarch_musl/usr/bin/rpm2cpio diff --git a/data/usr/bin/runsv b/data/loongarch_musl/usr/bin/runsv similarity index 100% rename from data/usr/bin/runsv rename to data/loongarch_musl/usr/bin/runsv diff --git a/data/usr/bin/runsvdir b/data/loongarch_musl/usr/bin/runsvdir similarity index 100% rename from data/usr/bin/runsvdir rename to data/loongarch_musl/usr/bin/runsvdir diff --git a/data/usr/bin/rx b/data/loongarch_musl/usr/bin/rx similarity index 100% rename from data/usr/bin/rx rename to data/loongarch_musl/usr/bin/rx diff --git a/data/usr/bin/script b/data/loongarch_musl/usr/bin/script similarity index 100% rename from data/usr/bin/script rename to data/loongarch_musl/usr/bin/script diff --git a/data/usr/bin/seq b/data/loongarch_musl/usr/bin/seq similarity index 100% rename from data/usr/bin/seq rename to data/loongarch_musl/usr/bin/seq diff --git a/data/usr/bin/setfattr b/data/loongarch_musl/usr/bin/setfattr similarity index 100% rename from data/usr/bin/setfattr rename to data/loongarch_musl/usr/bin/setfattr diff --git a/data/usr/bin/setkeycodes b/data/loongarch_musl/usr/bin/setkeycodes similarity index 100% rename from data/usr/bin/setkeycodes rename to data/loongarch_musl/usr/bin/setkeycodes diff --git a/data/usr/bin/setsid b/data/loongarch_musl/usr/bin/setsid similarity index 100% rename from data/usr/bin/setsid rename to data/loongarch_musl/usr/bin/setsid diff --git a/data/usr/bin/setuidgid b/data/loongarch_musl/usr/bin/setuidgid similarity index 100% rename from data/usr/bin/setuidgid rename to data/loongarch_musl/usr/bin/setuidgid diff --git a/data/usr/bin/sha1sum b/data/loongarch_musl/usr/bin/sha1sum similarity index 100% rename from data/usr/bin/sha1sum rename to data/loongarch_musl/usr/bin/sha1sum diff --git a/data/usr/bin/sha256sum b/data/loongarch_musl/usr/bin/sha256sum similarity index 100% rename from data/usr/bin/sha256sum rename to data/loongarch_musl/usr/bin/sha256sum diff --git a/data/usr/bin/sha384sum b/data/loongarch_musl/usr/bin/sha384sum similarity index 100% rename from data/usr/bin/sha384sum rename to data/loongarch_musl/usr/bin/sha384sum diff --git a/data/usr/bin/sha3sum b/data/loongarch_musl/usr/bin/sha3sum similarity index 100% rename from data/usr/bin/sha3sum rename to data/loongarch_musl/usr/bin/sha3sum diff --git a/data/usr/bin/sha512sum b/data/loongarch_musl/usr/bin/sha512sum similarity index 100% rename from data/usr/bin/sha512sum rename to data/loongarch_musl/usr/bin/sha512sum diff --git a/data/usr/bin/showkey b/data/loongarch_musl/usr/bin/showkey similarity index 100% rename from data/usr/bin/showkey rename to data/loongarch_musl/usr/bin/showkey diff --git a/data/usr/bin/shred b/data/loongarch_musl/usr/bin/shred similarity index 100% rename from data/usr/bin/shred rename to data/loongarch_musl/usr/bin/shred diff --git a/data/usr/bin/shuf b/data/loongarch_musl/usr/bin/shuf similarity index 100% rename from data/usr/bin/shuf rename to data/loongarch_musl/usr/bin/shuf diff --git a/data/usr/bin/smemcap b/data/loongarch_musl/usr/bin/smemcap similarity index 100% rename from data/usr/bin/smemcap rename to data/loongarch_musl/usr/bin/smemcap diff --git a/data/usr/bin/softlimit b/data/loongarch_musl/usr/bin/softlimit similarity index 100% rename from data/usr/bin/softlimit rename to data/loongarch_musl/usr/bin/softlimit diff --git a/data/usr/bin/sort b/data/loongarch_musl/usr/bin/sort similarity index 100% rename from data/usr/bin/sort rename to data/loongarch_musl/usr/bin/sort diff --git a/data/usr/bin/split b/data/loongarch_musl/usr/bin/split similarity index 100% rename from data/usr/bin/split rename to data/loongarch_musl/usr/bin/split diff --git a/data/usr/bin/ssl_client b/data/loongarch_musl/usr/bin/ssl_client similarity index 100% rename from data/usr/bin/ssl_client rename to data/loongarch_musl/usr/bin/ssl_client diff --git a/data/usr/bin/strings b/data/loongarch_musl/usr/bin/strings similarity index 100% rename from data/usr/bin/strings rename to data/loongarch_musl/usr/bin/strings diff --git a/data/usr/bin/sum b/data/loongarch_musl/usr/bin/sum similarity index 100% rename from data/usr/bin/sum rename to data/loongarch_musl/usr/bin/sum diff --git a/data/usr/bin/sv b/data/loongarch_musl/usr/bin/sv similarity index 100% rename from data/usr/bin/sv rename to data/loongarch_musl/usr/bin/sv diff --git a/data/usr/bin/svc b/data/loongarch_musl/usr/bin/svc similarity index 100% rename from data/usr/bin/svc rename to data/loongarch_musl/usr/bin/svc diff --git a/data/usr/bin/svok b/data/loongarch_musl/usr/bin/svok similarity index 100% rename from data/usr/bin/svok rename to data/loongarch_musl/usr/bin/svok diff --git a/data/usr/bin/tac b/data/loongarch_musl/usr/bin/tac similarity index 100% rename from data/usr/bin/tac rename to data/loongarch_musl/usr/bin/tac diff --git a/data/usr/bin/tail b/data/loongarch_musl/usr/bin/tail similarity index 100% rename from data/usr/bin/tail rename to data/loongarch_musl/usr/bin/tail diff --git a/data/usr/bin/taskset b/data/loongarch_musl/usr/bin/taskset similarity index 100% rename from data/usr/bin/taskset rename to data/loongarch_musl/usr/bin/taskset diff --git a/data/usr/bin/tcpsvd b/data/loongarch_musl/usr/bin/tcpsvd similarity index 100% rename from data/usr/bin/tcpsvd rename to data/loongarch_musl/usr/bin/tcpsvd diff --git a/data/usr/bin/tee b/data/loongarch_musl/usr/bin/tee similarity index 100% rename from data/usr/bin/tee rename to data/loongarch_musl/usr/bin/tee diff --git a/data/usr/bin/telnet b/data/loongarch_musl/usr/bin/telnet similarity index 100% rename from data/usr/bin/telnet rename to data/loongarch_musl/usr/bin/telnet diff --git a/data/usr/bin/test b/data/loongarch_musl/usr/bin/test similarity index 100% rename from data/usr/bin/test rename to data/loongarch_musl/usr/bin/test diff --git a/data/usr/bin/tftp b/data/loongarch_musl/usr/bin/tftp similarity index 100% rename from data/usr/bin/tftp rename to data/loongarch_musl/usr/bin/tftp diff --git a/data/usr/bin/time b/data/loongarch_musl/usr/bin/time similarity index 100% rename from data/usr/bin/time rename to data/loongarch_musl/usr/bin/time diff --git a/data/usr/bin/timeout b/data/loongarch_musl/usr/bin/timeout similarity index 100% rename from data/usr/bin/timeout rename to data/loongarch_musl/usr/bin/timeout diff --git a/data/usr/bin/top b/data/loongarch_musl/usr/bin/top similarity index 100% rename from data/usr/bin/top rename to data/loongarch_musl/usr/bin/top diff --git a/data/usr/bin/tr b/data/loongarch_musl/usr/bin/tr similarity index 100% rename from data/usr/bin/tr rename to data/loongarch_musl/usr/bin/tr diff --git a/data/usr/bin/traceroute b/data/loongarch_musl/usr/bin/traceroute similarity index 100% rename from data/usr/bin/traceroute rename to data/loongarch_musl/usr/bin/traceroute diff --git a/data/usr/bin/traceroute6 b/data/loongarch_musl/usr/bin/traceroute6 similarity index 100% rename from data/usr/bin/traceroute6 rename to data/loongarch_musl/usr/bin/traceroute6 diff --git a/data/usr/bin/tree b/data/loongarch_musl/usr/bin/tree similarity index 100% rename from data/usr/bin/tree rename to data/loongarch_musl/usr/bin/tree diff --git a/data/usr/bin/truncate b/data/loongarch_musl/usr/bin/truncate similarity index 100% rename from data/usr/bin/truncate rename to data/loongarch_musl/usr/bin/truncate diff --git a/data/usr/bin/ts b/data/loongarch_musl/usr/bin/ts similarity index 100% rename from data/usr/bin/ts rename to data/loongarch_musl/usr/bin/ts diff --git a/data/usr/bin/tsort b/data/loongarch_musl/usr/bin/tsort similarity index 100% rename from data/usr/bin/tsort rename to data/loongarch_musl/usr/bin/tsort diff --git a/data/usr/bin/tty b/data/loongarch_musl/usr/bin/tty similarity index 100% rename from data/usr/bin/tty rename to data/loongarch_musl/usr/bin/tty diff --git a/data/usr/bin/ttysize b/data/loongarch_musl/usr/bin/ttysize similarity index 100% rename from data/usr/bin/ttysize rename to data/loongarch_musl/usr/bin/ttysize diff --git a/data/usr/bin/udhcpc6 b/data/loongarch_musl/usr/bin/udhcpc6 similarity index 100% rename from data/usr/bin/udhcpc6 rename to data/loongarch_musl/usr/bin/udhcpc6 diff --git a/data/usr/bin/udpsvd b/data/loongarch_musl/usr/bin/udpsvd similarity index 100% rename from data/usr/bin/udpsvd rename to data/loongarch_musl/usr/bin/udpsvd diff --git a/data/usr/bin/unexpand b/data/loongarch_musl/usr/bin/unexpand similarity index 100% rename from data/usr/bin/unexpand rename to data/loongarch_musl/usr/bin/unexpand diff --git a/data/usr/bin/uniq b/data/loongarch_musl/usr/bin/uniq similarity index 100% rename from data/usr/bin/uniq rename to data/loongarch_musl/usr/bin/uniq diff --git a/data/usr/bin/unix2dos b/data/loongarch_musl/usr/bin/unix2dos similarity index 100% rename from data/usr/bin/unix2dos rename to data/loongarch_musl/usr/bin/unix2dos diff --git a/data/usr/bin/unlink b/data/loongarch_musl/usr/bin/unlink similarity index 100% rename from data/usr/bin/unlink rename to data/loongarch_musl/usr/bin/unlink diff --git a/data/usr/bin/unlzma b/data/loongarch_musl/usr/bin/unlzma similarity index 100% rename from data/usr/bin/unlzma rename to data/loongarch_musl/usr/bin/unlzma diff --git a/data/usr/bin/unshare b/data/loongarch_musl/usr/bin/unshare similarity index 100% rename from data/usr/bin/unshare rename to data/loongarch_musl/usr/bin/unshare diff --git a/data/usr/bin/unxz b/data/loongarch_musl/usr/bin/unxz similarity index 100% rename from data/usr/bin/unxz rename to data/loongarch_musl/usr/bin/unxz diff --git a/data/usr/bin/unzip b/data/loongarch_musl/usr/bin/unzip similarity index 100% rename from data/usr/bin/unzip rename to data/loongarch_musl/usr/bin/unzip diff --git a/data/usr/bin/uptime b/data/loongarch_musl/usr/bin/uptime similarity index 100% rename from data/usr/bin/uptime rename to data/loongarch_musl/usr/bin/uptime diff --git a/data/usr/bin/users b/data/loongarch_musl/usr/bin/users similarity index 100% rename from data/usr/bin/users rename to data/loongarch_musl/usr/bin/users diff --git a/data/usr/bin/uudecode b/data/loongarch_musl/usr/bin/uudecode similarity index 100% rename from data/usr/bin/uudecode rename to data/loongarch_musl/usr/bin/uudecode diff --git a/data/usr/bin/uuencode b/data/loongarch_musl/usr/bin/uuencode similarity index 100% rename from data/usr/bin/uuencode rename to data/loongarch_musl/usr/bin/uuencode diff --git a/data/usr/bin/vlock b/data/loongarch_musl/usr/bin/vlock similarity index 100% rename from data/usr/bin/vlock rename to data/loongarch_musl/usr/bin/vlock diff --git a/data/usr/bin/volname b/data/loongarch_musl/usr/bin/volname similarity index 100% rename from data/usr/bin/volname rename to data/loongarch_musl/usr/bin/volname diff --git a/data/usr/bin/w b/data/loongarch_musl/usr/bin/w similarity index 100% rename from data/usr/bin/w rename to data/loongarch_musl/usr/bin/w diff --git a/data/usr/bin/wall b/data/loongarch_musl/usr/bin/wall similarity index 100% rename from data/usr/bin/wall rename to data/loongarch_musl/usr/bin/wall diff --git a/data/usr/bin/wc b/data/loongarch_musl/usr/bin/wc similarity index 100% rename from data/usr/bin/wc rename to data/loongarch_musl/usr/bin/wc diff --git a/data/usr/bin/wget b/data/loongarch_musl/usr/bin/wget similarity index 100% rename from data/usr/bin/wget rename to data/loongarch_musl/usr/bin/wget diff --git a/data/usr/bin/which b/data/loongarch_musl/usr/bin/which similarity index 100% rename from data/usr/bin/which rename to data/loongarch_musl/usr/bin/which diff --git a/data/usr/bin/who b/data/loongarch_musl/usr/bin/who similarity index 100% rename from data/usr/bin/who rename to data/loongarch_musl/usr/bin/who diff --git a/data/usr/bin/whoami b/data/loongarch_musl/usr/bin/whoami similarity index 100% rename from data/usr/bin/whoami rename to data/loongarch_musl/usr/bin/whoami diff --git a/data/usr/bin/whois b/data/loongarch_musl/usr/bin/whois similarity index 100% rename from data/usr/bin/whois rename to data/loongarch_musl/usr/bin/whois diff --git a/data/usr/bin/xargs b/data/loongarch_musl/usr/bin/xargs similarity index 100% rename from data/usr/bin/xargs rename to data/loongarch_musl/usr/bin/xargs diff --git a/data/usr/bin/xxd b/data/loongarch_musl/usr/bin/xxd similarity index 100% rename from data/usr/bin/xxd rename to data/loongarch_musl/usr/bin/xxd diff --git a/data/usr/bin/xz b/data/loongarch_musl/usr/bin/xz similarity index 100% rename from data/usr/bin/xz rename to data/loongarch_musl/usr/bin/xz diff --git a/data/usr/bin/xzcat b/data/loongarch_musl/usr/bin/xzcat similarity index 100% rename from data/usr/bin/xzcat rename to data/loongarch_musl/usr/bin/xzcat diff --git a/data/usr/bin/yes b/data/loongarch_musl/usr/bin/yes similarity index 100% rename from data/usr/bin/yes rename to data/loongarch_musl/usr/bin/yes diff --git a/data/usr/sbin/add-shell b/data/loongarch_musl/usr/sbin/add-shell similarity index 100% rename from data/usr/sbin/add-shell rename to data/loongarch_musl/usr/sbin/add-shell diff --git a/data/usr/sbin/addgroup b/data/loongarch_musl/usr/sbin/addgroup similarity index 100% rename from data/usr/sbin/addgroup rename to data/loongarch_musl/usr/sbin/addgroup diff --git a/data/usr/sbin/adduser b/data/loongarch_musl/usr/sbin/adduser similarity index 100% rename from data/usr/sbin/adduser rename to data/loongarch_musl/usr/sbin/adduser diff --git a/data/usr/sbin/arping b/data/loongarch_musl/usr/sbin/arping similarity index 100% rename from data/usr/sbin/arping rename to data/loongarch_musl/usr/sbin/arping diff --git a/data/usr/sbin/brctl b/data/loongarch_musl/usr/sbin/brctl similarity index 100% rename from data/usr/sbin/brctl rename to data/loongarch_musl/usr/sbin/brctl diff --git a/data/usr/sbin/chat b/data/loongarch_musl/usr/sbin/chat similarity index 100% rename from data/usr/sbin/chat rename to data/loongarch_musl/usr/sbin/chat diff --git a/data/usr/sbin/chpasswd b/data/loongarch_musl/usr/sbin/chpasswd similarity index 100% rename from data/usr/sbin/chpasswd rename to data/loongarch_musl/usr/sbin/chpasswd diff --git a/data/usr/sbin/chroot b/data/loongarch_musl/usr/sbin/chroot similarity index 100% rename from data/usr/sbin/chroot rename to data/loongarch_musl/usr/sbin/chroot diff --git a/data/usr/sbin/crond b/data/loongarch_musl/usr/sbin/crond similarity index 100% rename from data/usr/sbin/crond rename to data/loongarch_musl/usr/sbin/crond diff --git a/data/usr/sbin/delgroup b/data/loongarch_musl/usr/sbin/delgroup similarity index 100% rename from data/usr/sbin/delgroup rename to data/loongarch_musl/usr/sbin/delgroup diff --git a/data/usr/sbin/deluser b/data/loongarch_musl/usr/sbin/deluser similarity index 100% rename from data/usr/sbin/deluser rename to data/loongarch_musl/usr/sbin/deluser diff --git a/data/usr/sbin/dhcprelay b/data/loongarch_musl/usr/sbin/dhcprelay similarity index 100% rename from data/usr/sbin/dhcprelay rename to data/loongarch_musl/usr/sbin/dhcprelay diff --git a/data/usr/sbin/dnsd b/data/loongarch_musl/usr/sbin/dnsd similarity index 100% rename from data/usr/sbin/dnsd rename to data/loongarch_musl/usr/sbin/dnsd diff --git a/data/usr/sbin/ether-wake b/data/loongarch_musl/usr/sbin/ether-wake similarity index 100% rename from data/usr/sbin/ether-wake rename to data/loongarch_musl/usr/sbin/ether-wake diff --git a/data/usr/sbin/fakeidentd b/data/loongarch_musl/usr/sbin/fakeidentd similarity index 100% rename from data/usr/sbin/fakeidentd rename to data/loongarch_musl/usr/sbin/fakeidentd diff --git a/data/usr/sbin/fbset b/data/loongarch_musl/usr/sbin/fbset similarity index 100% rename from data/usr/sbin/fbset rename to data/loongarch_musl/usr/sbin/fbset diff --git a/data/usr/sbin/fdformat b/data/loongarch_musl/usr/sbin/fdformat similarity index 100% rename from data/usr/sbin/fdformat rename to data/loongarch_musl/usr/sbin/fdformat diff --git a/data/usr/sbin/fsfreeze b/data/loongarch_musl/usr/sbin/fsfreeze similarity index 100% rename from data/usr/sbin/fsfreeze rename to data/loongarch_musl/usr/sbin/fsfreeze diff --git a/data/usr/sbin/ftpd b/data/loongarch_musl/usr/sbin/ftpd similarity index 100% rename from data/usr/sbin/ftpd rename to data/loongarch_musl/usr/sbin/ftpd diff --git a/data/usr/sbin/httpd b/data/loongarch_musl/usr/sbin/httpd similarity index 100% rename from data/usr/sbin/httpd rename to data/loongarch_musl/usr/sbin/httpd diff --git a/data/usr/sbin/i2cdetect b/data/loongarch_musl/usr/sbin/i2cdetect similarity index 100% rename from data/usr/sbin/i2cdetect rename to data/loongarch_musl/usr/sbin/i2cdetect diff --git a/data/usr/sbin/i2cdump b/data/loongarch_musl/usr/sbin/i2cdump similarity index 100% rename from data/usr/sbin/i2cdump rename to data/loongarch_musl/usr/sbin/i2cdump diff --git a/data/usr/sbin/i2cget b/data/loongarch_musl/usr/sbin/i2cget similarity index 100% rename from data/usr/sbin/i2cget rename to data/loongarch_musl/usr/sbin/i2cget diff --git a/data/usr/sbin/i2cset b/data/loongarch_musl/usr/sbin/i2cset similarity index 100% rename from data/usr/sbin/i2cset rename to data/loongarch_musl/usr/sbin/i2cset diff --git a/data/usr/sbin/i2ctransfer b/data/loongarch_musl/usr/sbin/i2ctransfer similarity index 100% rename from data/usr/sbin/i2ctransfer rename to data/loongarch_musl/usr/sbin/i2ctransfer diff --git a/data/usr/sbin/ifplugd b/data/loongarch_musl/usr/sbin/ifplugd similarity index 100% rename from data/usr/sbin/ifplugd rename to data/loongarch_musl/usr/sbin/ifplugd diff --git a/data/usr/sbin/inetd b/data/loongarch_musl/usr/sbin/inetd similarity index 100% rename from data/usr/sbin/inetd rename to data/loongarch_musl/usr/sbin/inetd diff --git a/data/usr/sbin/killall5 b/data/loongarch_musl/usr/sbin/killall5 similarity index 100% rename from data/usr/sbin/killall5 rename to data/loongarch_musl/usr/sbin/killall5 diff --git a/data/usr/sbin/loadfont b/data/loongarch_musl/usr/sbin/loadfont similarity index 100% rename from data/usr/sbin/loadfont rename to data/loongarch_musl/usr/sbin/loadfont diff --git a/data/usr/sbin/lpd b/data/loongarch_musl/usr/sbin/lpd similarity index 100% rename from data/usr/sbin/lpd rename to data/loongarch_musl/usr/sbin/lpd diff --git a/data/usr/sbin/mim b/data/loongarch_musl/usr/sbin/mim similarity index 100% rename from data/usr/sbin/mim rename to data/loongarch_musl/usr/sbin/mim diff --git a/data/usr/sbin/nanddump b/data/loongarch_musl/usr/sbin/nanddump similarity index 100% rename from data/usr/sbin/nanddump rename to data/loongarch_musl/usr/sbin/nanddump diff --git a/data/usr/sbin/nandwrite b/data/loongarch_musl/usr/sbin/nandwrite similarity index 100% rename from data/usr/sbin/nandwrite rename to data/loongarch_musl/usr/sbin/nandwrite diff --git a/data/usr/sbin/nbd-client b/data/loongarch_musl/usr/sbin/nbd-client similarity index 100% rename from data/usr/sbin/nbd-client rename to data/loongarch_musl/usr/sbin/nbd-client diff --git a/data/usr/sbin/nologin b/data/loongarch_musl/usr/sbin/nologin similarity index 100% rename from data/usr/sbin/nologin rename to data/loongarch_musl/usr/sbin/nologin diff --git a/data/usr/sbin/ntpd b/data/loongarch_musl/usr/sbin/ntpd similarity index 100% rename from data/usr/sbin/ntpd rename to data/loongarch_musl/usr/sbin/ntpd diff --git a/data/usr/sbin/partprobe b/data/loongarch_musl/usr/sbin/partprobe similarity index 100% rename from data/usr/sbin/partprobe rename to data/loongarch_musl/usr/sbin/partprobe diff --git a/data/usr/sbin/popmaildir b/data/loongarch_musl/usr/sbin/popmaildir similarity index 100% rename from data/usr/sbin/popmaildir rename to data/loongarch_musl/usr/sbin/popmaildir diff --git a/data/usr/sbin/powertop b/data/loongarch_musl/usr/sbin/powertop similarity index 100% rename from data/usr/sbin/powertop rename to data/loongarch_musl/usr/sbin/powertop diff --git a/data/usr/sbin/rdate b/data/loongarch_musl/usr/sbin/rdate similarity index 100% rename from data/usr/sbin/rdate rename to data/loongarch_musl/usr/sbin/rdate diff --git a/data/usr/sbin/rdev b/data/loongarch_musl/usr/sbin/rdev similarity index 100% rename from data/usr/sbin/rdev rename to data/loongarch_musl/usr/sbin/rdev diff --git a/data/usr/sbin/readahead b/data/loongarch_musl/usr/sbin/readahead similarity index 100% rename from data/usr/sbin/readahead rename to data/loongarch_musl/usr/sbin/readahead diff --git a/data/usr/sbin/readprofile b/data/loongarch_musl/usr/sbin/readprofile similarity index 100% rename from data/usr/sbin/readprofile rename to data/loongarch_musl/usr/sbin/readprofile diff --git a/data/usr/sbin/remove-shell b/data/loongarch_musl/usr/sbin/remove-shell similarity index 100% rename from data/usr/sbin/remove-shell rename to data/loongarch_musl/usr/sbin/remove-shell diff --git a/data/usr/sbin/rtcwake b/data/loongarch_musl/usr/sbin/rtcwake similarity index 100% rename from data/usr/sbin/rtcwake rename to data/loongarch_musl/usr/sbin/rtcwake diff --git a/data/usr/sbin/seedrng b/data/loongarch_musl/usr/sbin/seedrng similarity index 100% rename from data/usr/sbin/seedrng rename to data/loongarch_musl/usr/sbin/seedrng diff --git a/data/usr/sbin/sendmail b/data/loongarch_musl/usr/sbin/sendmail similarity index 100% rename from data/usr/sbin/sendmail rename to data/loongarch_musl/usr/sbin/sendmail diff --git a/data/usr/sbin/setfont b/data/loongarch_musl/usr/sbin/setfont similarity index 100% rename from data/usr/sbin/setfont rename to data/loongarch_musl/usr/sbin/setfont diff --git a/data/usr/sbin/setlogcons b/data/loongarch_musl/usr/sbin/setlogcons similarity index 100% rename from data/usr/sbin/setlogcons rename to data/loongarch_musl/usr/sbin/setlogcons diff --git a/data/usr/sbin/svlogd b/data/loongarch_musl/usr/sbin/svlogd similarity index 100% rename from data/usr/sbin/svlogd rename to data/loongarch_musl/usr/sbin/svlogd diff --git a/data/usr/sbin/telnetd b/data/loongarch_musl/usr/sbin/telnetd similarity index 100% rename from data/usr/sbin/telnetd rename to data/loongarch_musl/usr/sbin/telnetd diff --git a/data/usr/sbin/tftpd b/data/loongarch_musl/usr/sbin/tftpd similarity index 100% rename from data/usr/sbin/tftpd rename to data/loongarch_musl/usr/sbin/tftpd diff --git a/data/usr/sbin/ubiattach b/data/loongarch_musl/usr/sbin/ubiattach similarity index 100% rename from data/usr/sbin/ubiattach rename to data/loongarch_musl/usr/sbin/ubiattach diff --git a/data/usr/sbin/ubidetach b/data/loongarch_musl/usr/sbin/ubidetach similarity index 100% rename from data/usr/sbin/ubidetach rename to data/loongarch_musl/usr/sbin/ubidetach diff --git a/data/usr/sbin/ubimkvol b/data/loongarch_musl/usr/sbin/ubimkvol similarity index 100% rename from data/usr/sbin/ubimkvol rename to data/loongarch_musl/usr/sbin/ubimkvol diff --git a/data/usr/sbin/ubirename b/data/loongarch_musl/usr/sbin/ubirename similarity index 100% rename from data/usr/sbin/ubirename rename to data/loongarch_musl/usr/sbin/ubirename diff --git a/data/usr/sbin/ubirmvol b/data/loongarch_musl/usr/sbin/ubirmvol similarity index 100% rename from data/usr/sbin/ubirmvol rename to data/loongarch_musl/usr/sbin/ubirmvol diff --git a/data/usr/sbin/ubirsvol b/data/loongarch_musl/usr/sbin/ubirsvol similarity index 100% rename from data/usr/sbin/ubirsvol rename to data/loongarch_musl/usr/sbin/ubirsvol diff --git a/data/usr/sbin/ubiupdatevol b/data/loongarch_musl/usr/sbin/ubiupdatevol similarity index 100% rename from data/usr/sbin/ubiupdatevol rename to data/loongarch_musl/usr/sbin/ubiupdatevol diff --git a/data/usr/sbin/udhcpd b/data/loongarch_musl/usr/sbin/udhcpd similarity index 100% rename from data/usr/sbin/udhcpd rename to data/loongarch_musl/usr/sbin/udhcpd diff --git a/data/risc-v_musl/bin/arch b/data/risc-v_musl/bin/arch new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/arch @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/ash b/data/risc-v_musl/bin/ash new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/ash @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/base32 b/data/risc-v_musl/bin/base32 new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/base32 @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/base64 b/data/risc-v_musl/bin/base64 new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/base64 @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/bin/busybox b/data/risc-v_musl/bin/busybox similarity index 100% rename from data/bin/busybox rename to data/risc-v_musl/bin/busybox diff --git a/data/risc-v_musl/bin/cat b/data/risc-v_musl/bin/cat new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/cat @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/chattr b/data/risc-v_musl/bin/chattr new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/chattr @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/chgrp b/data/risc-v_musl/bin/chgrp new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/chgrp @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/chmod b/data/risc-v_musl/bin/chmod new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/chmod @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/chown b/data/risc-v_musl/bin/chown new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/chown @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/conspy b/data/risc-v_musl/bin/conspy new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/conspy @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/cp b/data/risc-v_musl/bin/cp new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/cp @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/cpio b/data/risc-v_musl/bin/cpio new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/cpio @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/cttyhack b/data/risc-v_musl/bin/cttyhack new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/cttyhack @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/date b/data/risc-v_musl/bin/date new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/date @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/dd b/data/risc-v_musl/bin/dd new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/dd @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/df b/data/risc-v_musl/bin/df new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/df @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/dmesg b/data/risc-v_musl/bin/dmesg new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/dmesg @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/dnsdomainname b/data/risc-v_musl/bin/dnsdomainname new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/dnsdomainname @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/dumpkmap b/data/risc-v_musl/bin/dumpkmap new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/dumpkmap @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/echo b/data/risc-v_musl/bin/echo new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/echo @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/ed b/data/risc-v_musl/bin/ed new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/ed @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/egrep b/data/risc-v_musl/bin/egrep new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/egrep @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/false b/data/risc-v_musl/bin/false new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/false @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/fatattr b/data/risc-v_musl/bin/fatattr new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/fatattr @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/fdflush b/data/risc-v_musl/bin/fdflush new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/fdflush @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/fgrep b/data/risc-v_musl/bin/fgrep new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/fgrep @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/fsync b/data/risc-v_musl/bin/fsync new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/fsync @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/getopt b/data/risc-v_musl/bin/getopt new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/getopt @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/grep b/data/risc-v_musl/bin/grep new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/grep @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/gunzip b/data/risc-v_musl/bin/gunzip new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/gunzip @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/gzip b/data/risc-v_musl/bin/gzip new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/gzip @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/hostname b/data/risc-v_musl/bin/hostname new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/hostname @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/hush b/data/risc-v_musl/bin/hush new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/hush @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/ionice b/data/risc-v_musl/bin/ionice new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/ionice @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/iostat b/data/risc-v_musl/bin/iostat new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/iostat @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/ipcalc b/data/risc-v_musl/bin/ipcalc new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/ipcalc @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/bin/iperf3 b/data/risc-v_musl/bin/iperf3 similarity index 100% rename from data/bin/iperf3 rename to data/risc-v_musl/bin/iperf3 diff --git a/data/risc-v_musl/bin/kbd_mode b/data/risc-v_musl/bin/kbd_mode new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/kbd_mode @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/kill b/data/risc-v_musl/bin/kill new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/kill @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/link b/data/risc-v_musl/bin/link new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/link @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/linux32 b/data/risc-v_musl/bin/linux32 new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/linux32 @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/linux64 b/data/risc-v_musl/bin/linux64 new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/linux64 @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/ln b/data/risc-v_musl/bin/ln new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/ln @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/login b/data/risc-v_musl/bin/login new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/login @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/ls b/data/risc-v_musl/bin/ls new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/ls @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/lsattr b/data/risc-v_musl/bin/lsattr new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/lsattr @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/lzop b/data/risc-v_musl/bin/lzop new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/lzop @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/makemime b/data/risc-v_musl/bin/makemime new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/makemime @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/mkdir b/data/risc-v_musl/bin/mkdir new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/mkdir @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/mknod b/data/risc-v_musl/bin/mknod new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/mknod @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/mktemp b/data/risc-v_musl/bin/mktemp new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/mktemp @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/more b/data/risc-v_musl/bin/more new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/more @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/mount b/data/risc-v_musl/bin/mount new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/mount @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/mountpoint b/data/risc-v_musl/bin/mountpoint new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/mountpoint @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/mpstat b/data/risc-v_musl/bin/mpstat new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/mpstat @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/mt b/data/risc-v_musl/bin/mt new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/mt @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/mv b/data/risc-v_musl/bin/mv new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/mv @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/bin/netperf b/data/risc-v_musl/bin/netperf similarity index 100% rename from data/bin/netperf rename to data/risc-v_musl/bin/netperf diff --git a/data/bin/netserver b/data/risc-v_musl/bin/netserver similarity index 100% rename from data/bin/netserver rename to data/risc-v_musl/bin/netserver diff --git a/data/risc-v_musl/bin/netstat b/data/risc-v_musl/bin/netstat new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/netstat @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/nice b/data/risc-v_musl/bin/nice new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/nice @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/pidof b/data/risc-v_musl/bin/pidof new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/pidof @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/ping b/data/risc-v_musl/bin/ping new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/ping @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/ping6 b/data/risc-v_musl/bin/ping6 new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/ping6 @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/pipe_progress b/data/risc-v_musl/bin/pipe_progress new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/pipe_progress @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/printenv b/data/risc-v_musl/bin/printenv new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/printenv @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/ps b/data/risc-v_musl/bin/ps new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/ps @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/pwd b/data/risc-v_musl/bin/pwd new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/pwd @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/reformime b/data/risc-v_musl/bin/reformime new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/reformime @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/resume b/data/risc-v_musl/bin/resume new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/resume @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/rev b/data/risc-v_musl/bin/rev new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/rev @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/rm b/data/risc-v_musl/bin/rm new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/rm @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/rmdir b/data/risc-v_musl/bin/rmdir new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/rmdir @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/rpm b/data/risc-v_musl/bin/rpm new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/rpm @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/run-parts b/data/risc-v_musl/bin/run-parts new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/run-parts @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/scriptreplay b/data/risc-v_musl/bin/scriptreplay new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/scriptreplay @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/sed b/data/risc-v_musl/bin/sed new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/sed @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/setarch b/data/risc-v_musl/bin/setarch new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/setarch @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/setpriv b/data/risc-v_musl/bin/setpriv new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/setpriv @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/setserial b/data/risc-v_musl/bin/setserial new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/setserial @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/sh b/data/risc-v_musl/bin/sh new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/sh @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/sleep b/data/risc-v_musl/bin/sleep new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/sleep @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/stat b/data/risc-v_musl/bin/stat new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/stat @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/stty b/data/risc-v_musl/bin/stty new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/stty @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/su b/data/risc-v_musl/bin/su new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/su @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/sync b/data/risc-v_musl/bin/sync new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/sync @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/tar b/data/risc-v_musl/bin/tar new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/tar @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/touch b/data/risc-v_musl/bin/touch new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/touch @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/true b/data/risc-v_musl/bin/true new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/true @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/umount b/data/risc-v_musl/bin/umount new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/umount @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/uname b/data/risc-v_musl/bin/uname new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/uname @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/usleep b/data/risc-v_musl/bin/usleep new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/usleep @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/vi b/data/risc-v_musl/bin/vi new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/vi @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/watch b/data/risc-v_musl/bin/watch new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/watch @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/bin/zcat b/data/risc-v_musl/bin/zcat new file mode 120000 index 00000000..c3fa8102 --- /dev/null +++ b/data/risc-v_musl/bin/zcat @@ -0,0 +1 @@ +busybox \ No newline at end of file diff --git a/data/risc-v_musl/dev/.gitkeep b/data/risc-v_musl/dev/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/data/risc-v_musl/etc/init.d/rcS b/data/risc-v_musl/etc/init.d/rcS new file mode 100755 index 00000000..cde3274b --- /dev/null +++ b/data/risc-v_musl/etc/init.d/rcS @@ -0,0 +1,55 @@ +#!/bin/sh +# +# Minimal System Initialization Script for BusyBox + +# 打印信息,确认脚本已启动 +echo "--- Starting Minimal BusyBox System ---" + +# --- 1. 挂载伪文件系统 --- +# procfs: 进程信息 +/bin/mount -t proc none /proc +# sysfs: 内核设备信息 +/bin/mount -t sysfs none /sys +# tmpfs/devtmpfs: 临时文件系统和设备文件 +/bin/mount -t tmpfs none /tmp +# /dev: 设备节点 +# 说明:即使内核已经提前挂载 /dev,这里再次 mount 也不会影响后续流程; +# 且内核对 mount("/dev") 做了特殊处理:会在挂载 tmpfs 后自动 init_dev() 重建设备节点。 +/bin/mount -t tmpfs none /dev + +# --- 2. 处理设备文件 --- +# mdev 是 BusyBox 中用于创建设备文件 (/dev/null, /dev/console 等) 的工具 +# -s 选项扫描 /sys/class 和 /sys/block 并创建相应的设备文件 + +# 现在转为由mount中进行特判,自动创建设备文件 +# echo "Populating /dev via mdev..." +# /sbin/mdev -s + +# --- 3. 系统配置 --- + +# 设置默认主机名 +DEFAULT_HOSTNAME="comix" + +# 检查 /etc/hostname 文件是否存在 +if [ -f /etc/hostname ]; then + # 如果文件存在,从文件中读取并设置主机名 + /bin/hostname -F /etc/hostname + echo "Hostname set from /etc/hostname." +else + # 如果文件不存在,使用默认值 comix 设置主机名 + /bin/hostname "$DEFAULT_HOSTNAME" + echo "Warning: /etc/hostname not found. Hostname set to default: $DEFAULT_HOSTNAME" +fi + +# 执行 /etc/fstab 中定义的挂载 +echo "Mounting file systems via fstab..." +/bin/mount -a + +# 启动日志服务 (可选,如果配置了 syslogd) +# /sbin/syslogd +# /sbin/klogd + +echo "System initialization finished." + +echo "rcS finished; spawning shell on ttyS0 via inittab" +exit 0 diff --git a/data/risc-v_musl/etc/inittab b/data/risc-v_musl/etc/inittab new file mode 100644 index 00000000..99bcd680 --- /dev/null +++ b/data/risc-v_musl/etc/inittab @@ -0,0 +1,23 @@ +# 格式: ::: + +# 1. SYSINIT: 系统启动时执行的第一个脚本 +# 通常是 rcS 脚本,负责挂载 /proc, /sys 等 +::sysinit:/etc/init.d/rcS + +# 2. ASKFIRST: 启动第一个控制台的 shell +# tty1 是标准的虚拟控制台,如果连接了显示器和键盘,就会在这里启动 shell。 +# Disabled on headless QEMU. Use ttyS0 only. +# tty1::askfirst:-/bin/sh + +# 3. RESPAWN: 启动串行控制台的 shell +# ttyS0 是第一个串行端口,常用于嵌入式系统的调试终端。 +# respawn 意味着如果 shell 意外退出,init 会自动重启它。 +# 将 BusyBox /bin/sh 的 stdin/stdout/stderr 显式绑定到 ttyS0,避免 stdio/console 混淆 +ttyS0::respawn:/bin/sh -i < /dev/ttyS0 > /dev/ttyS0 2>&1 + +# 4. CTRLALTDEL: 响应 Ctrl-Alt-Del 组合键 +::ctrlaltdel:/sbin/reboot + +# 5. SHUTDOWN: 系统关机前执行的脚本 +::shutdown:/bin/umount -a -r +::shutdown:/sbin/swapoff -a diff --git a/data/risc-v_musl/etc/profile b/data/risc-v_musl/etc/profile new file mode 100644 index 00000000..a953a6e4 --- /dev/null +++ b/data/risc-v_musl/etc/profile @@ -0,0 +1,13 @@ +#!/bin/sh +# BusyBox login shell profile for comix +# Ensure we always show a clear root prompt and sane TTY modes on ttyS0 + +# Minimal, deterministic prompt +export PS1="/ # " + +# Make sure CR/LF and echo are sane when running on UART +stty onlcr icrnl echo icanon 2>/dev/null || true + +# PATH +export PATH=/sbin:/bin:/usr/sbin:/usr/bin + diff --git a/data/iperf_testcode.sh b/data/risc-v_musl/iperf_testcode.sh similarity index 100% rename from data/iperf_testcode.sh rename to data/risc-v_musl/iperf_testcode.sh diff --git a/data/lib/ld-musl-riscv64-sf.so.1 b/data/risc-v_musl/lib/ld-musl-riscv64-sf.so.1 similarity index 100% rename from data/lib/ld-musl-riscv64-sf.so.1 rename to data/risc-v_musl/lib/ld-musl-riscv64-sf.so.1 diff --git a/data/lib/libc.so b/data/risc-v_musl/lib/libc.so similarity index 100% rename from data/lib/libc.so rename to data/risc-v_musl/lib/libc.so diff --git a/data/risc-v_musl/linuxrc b/data/risc-v_musl/linuxrc new file mode 120000 index 00000000..f9f73421 --- /dev/null +++ b/data/risc-v_musl/linuxrc @@ -0,0 +1 @@ +bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/proc/.gitkeep b/data/risc-v_musl/proc/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/data/risc-v_musl/sbin/acpid b/data/risc-v_musl/sbin/acpid new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/acpid @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/adjtimex b/data/risc-v_musl/sbin/adjtimex new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/adjtimex @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/arp b/data/risc-v_musl/sbin/arp new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/arp @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/blkid b/data/risc-v_musl/sbin/blkid new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/blkid @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/blockdev b/data/risc-v_musl/sbin/blockdev new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/blockdev @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/bootchartd b/data/risc-v_musl/sbin/bootchartd new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/bootchartd @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/depmod b/data/risc-v_musl/sbin/depmod new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/depmod @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/devmem b/data/risc-v_musl/sbin/devmem new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/devmem @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/fbsplash b/data/risc-v_musl/sbin/fbsplash new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/fbsplash @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/fdisk b/data/risc-v_musl/sbin/fdisk new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/fdisk @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/findfs b/data/risc-v_musl/sbin/findfs new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/findfs @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/freeramdisk b/data/risc-v_musl/sbin/freeramdisk new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/freeramdisk @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/fsck b/data/risc-v_musl/sbin/fsck new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/fsck @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/fsck.minix b/data/risc-v_musl/sbin/fsck.minix new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/fsck.minix @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/fstrim b/data/risc-v_musl/sbin/fstrim new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/fstrim @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/getty b/data/risc-v_musl/sbin/getty new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/getty @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/halt b/data/risc-v_musl/sbin/halt new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/halt @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/hdparm b/data/risc-v_musl/sbin/hdparm new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/hdparm @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/hwclock b/data/risc-v_musl/sbin/hwclock new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/hwclock @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/ifconfig b/data/risc-v_musl/sbin/ifconfig new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/ifconfig @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/ifdown b/data/risc-v_musl/sbin/ifdown new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/ifdown @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/ifenslave b/data/risc-v_musl/sbin/ifenslave new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/ifenslave @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/ifup b/data/risc-v_musl/sbin/ifup new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/ifup @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/init b/data/risc-v_musl/sbin/init new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/init @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/insmod b/data/risc-v_musl/sbin/insmod new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/insmod @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/ip b/data/risc-v_musl/sbin/ip new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/ip @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/ipaddr b/data/risc-v_musl/sbin/ipaddr new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/ipaddr @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/iplink b/data/risc-v_musl/sbin/iplink new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/iplink @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/ipneigh b/data/risc-v_musl/sbin/ipneigh new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/ipneigh @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/iproute b/data/risc-v_musl/sbin/iproute new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/iproute @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/iprule b/data/risc-v_musl/sbin/iprule new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/iprule @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/iptunnel b/data/risc-v_musl/sbin/iptunnel new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/iptunnel @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/klogd b/data/risc-v_musl/sbin/klogd new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/klogd @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/loadkmap b/data/risc-v_musl/sbin/loadkmap new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/loadkmap @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/logread b/data/risc-v_musl/sbin/logread new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/logread @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/losetup b/data/risc-v_musl/sbin/losetup new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/losetup @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/lsmod b/data/risc-v_musl/sbin/lsmod new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/lsmod @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/makedevs b/data/risc-v_musl/sbin/makedevs new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/makedevs @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/mdev b/data/risc-v_musl/sbin/mdev new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/mdev @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/mkdosfs b/data/risc-v_musl/sbin/mkdosfs new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/mkdosfs @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/mke2fs b/data/risc-v_musl/sbin/mke2fs new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/mke2fs @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/mkfs.ext2 b/data/risc-v_musl/sbin/mkfs.ext2 new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/mkfs.ext2 @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/mkfs.minix b/data/risc-v_musl/sbin/mkfs.minix new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/mkfs.minix @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/mkfs.vfat b/data/risc-v_musl/sbin/mkfs.vfat new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/mkfs.vfat @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/mkswap b/data/risc-v_musl/sbin/mkswap new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/mkswap @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/modinfo b/data/risc-v_musl/sbin/modinfo new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/modinfo @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/modprobe b/data/risc-v_musl/sbin/modprobe new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/modprobe @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/nameif b/data/risc-v_musl/sbin/nameif new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/nameif @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/pivot_root b/data/risc-v_musl/sbin/pivot_root new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/pivot_root @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/poweroff b/data/risc-v_musl/sbin/poweroff new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/poweroff @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/raidautorun b/data/risc-v_musl/sbin/raidautorun new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/raidautorun @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/reboot b/data/risc-v_musl/sbin/reboot new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/reboot @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/rmmod b/data/risc-v_musl/sbin/rmmod new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/rmmod @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/route b/data/risc-v_musl/sbin/route new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/route @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/run-init b/data/risc-v_musl/sbin/run-init new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/run-init @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/runlevel b/data/risc-v_musl/sbin/runlevel new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/runlevel @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/setconsole b/data/risc-v_musl/sbin/setconsole new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/setconsole @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/slattach b/data/risc-v_musl/sbin/slattach new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/slattach @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/start-stop-daemon b/data/risc-v_musl/sbin/start-stop-daemon new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/start-stop-daemon @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/sulogin b/data/risc-v_musl/sbin/sulogin new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/sulogin @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/swapoff b/data/risc-v_musl/sbin/swapoff new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/swapoff @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/swapon b/data/risc-v_musl/sbin/swapon new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/swapon @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/switch_root b/data/risc-v_musl/sbin/switch_root new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/switch_root @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/sysctl b/data/risc-v_musl/sbin/sysctl new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/sysctl @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/syslogd b/data/risc-v_musl/sbin/syslogd new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/syslogd @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/tunctl b/data/risc-v_musl/sbin/tunctl new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/tunctl @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/udhcpc b/data/risc-v_musl/sbin/udhcpc new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/udhcpc @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/uevent b/data/risc-v_musl/sbin/uevent new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/uevent @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/vconfig b/data/risc-v_musl/sbin/vconfig new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/vconfig @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/watchdog b/data/risc-v_musl/sbin/watchdog new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/watchdog @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sbin/zcip b/data/risc-v_musl/sbin/zcip new file mode 120000 index 00000000..71259713 --- /dev/null +++ b/data/risc-v_musl/sbin/zcip @@ -0,0 +1 @@ +../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/sys/.gitkeep b/data/risc-v_musl/sys/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/data/risc-v_musl/usr/bin/[ b/data/risc-v_musl/usr/bin/[ new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/[ @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/[[ b/data/risc-v_musl/usr/bin/[[ new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/[[ @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/ascii b/data/risc-v_musl/usr/bin/ascii new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/ascii @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/awk b/data/risc-v_musl/usr/bin/awk new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/awk @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/basename b/data/risc-v_musl/usr/bin/basename new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/basename @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/bc b/data/risc-v_musl/usr/bin/bc new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/bc @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/beep b/data/risc-v_musl/usr/bin/beep new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/beep @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/blkdiscard b/data/risc-v_musl/usr/bin/blkdiscard new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/blkdiscard @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/bunzip2 b/data/risc-v_musl/usr/bin/bunzip2 new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/bunzip2 @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/bzcat b/data/risc-v_musl/usr/bin/bzcat new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/bzcat @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/bzip2 b/data/risc-v_musl/usr/bin/bzip2 new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/bzip2 @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/cal b/data/risc-v_musl/usr/bin/cal new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/cal @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/chpst b/data/risc-v_musl/usr/bin/chpst new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/chpst @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/chrt b/data/risc-v_musl/usr/bin/chrt new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/chrt @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/chvt b/data/risc-v_musl/usr/bin/chvt new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/chvt @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/cksum b/data/risc-v_musl/usr/bin/cksum new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/cksum @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/clear b/data/risc-v_musl/usr/bin/clear new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/clear @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/cmp b/data/risc-v_musl/usr/bin/cmp new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/cmp @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/comm b/data/risc-v_musl/usr/bin/comm new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/comm @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/crc32 b/data/risc-v_musl/usr/bin/crc32 new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/crc32 @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/crontab b/data/risc-v_musl/usr/bin/crontab new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/crontab @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/cryptpw b/data/risc-v_musl/usr/bin/cryptpw new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/cryptpw @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/cut b/data/risc-v_musl/usr/bin/cut new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/cut @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/dc b/data/risc-v_musl/usr/bin/dc new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/dc @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/deallocvt b/data/risc-v_musl/usr/bin/deallocvt new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/deallocvt @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/diff b/data/risc-v_musl/usr/bin/diff new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/diff @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/dirname b/data/risc-v_musl/usr/bin/dirname new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/dirname @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/dos2unix b/data/risc-v_musl/usr/bin/dos2unix new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/dos2unix @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/dpkg b/data/risc-v_musl/usr/bin/dpkg new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/dpkg @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/dpkg-deb b/data/risc-v_musl/usr/bin/dpkg-deb new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/dpkg-deb @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/du b/data/risc-v_musl/usr/bin/du new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/du @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/dumpleases b/data/risc-v_musl/usr/bin/dumpleases new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/dumpleases @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/eject b/data/risc-v_musl/usr/bin/eject new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/eject @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/env b/data/risc-v_musl/usr/bin/env new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/env @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/envdir b/data/risc-v_musl/usr/bin/envdir new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/envdir @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/envuidgid b/data/risc-v_musl/usr/bin/envuidgid new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/envuidgid @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/expand b/data/risc-v_musl/usr/bin/expand new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/expand @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/expr b/data/risc-v_musl/usr/bin/expr new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/expr @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/factor b/data/risc-v_musl/usr/bin/factor new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/factor @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/fallocate b/data/risc-v_musl/usr/bin/fallocate new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/fallocate @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/fgconsole b/data/risc-v_musl/usr/bin/fgconsole new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/fgconsole @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/find b/data/risc-v_musl/usr/bin/find new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/find @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/flock b/data/risc-v_musl/usr/bin/flock new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/flock @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/fold b/data/risc-v_musl/usr/bin/fold new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/fold @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/free b/data/risc-v_musl/usr/bin/free new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/free @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/ftpget b/data/risc-v_musl/usr/bin/ftpget new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/ftpget @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/ftpput b/data/risc-v_musl/usr/bin/ftpput new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/ftpput @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/fuser b/data/risc-v_musl/usr/bin/fuser new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/fuser @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/getfattr b/data/risc-v_musl/usr/bin/getfattr new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/getfattr @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/groups b/data/risc-v_musl/usr/bin/groups new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/groups @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/hd b/data/risc-v_musl/usr/bin/hd new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/hd @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/head b/data/risc-v_musl/usr/bin/head new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/head @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/hexdump b/data/risc-v_musl/usr/bin/hexdump new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/hexdump @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/hexedit b/data/risc-v_musl/usr/bin/hexedit new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/hexedit @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/hostid b/data/risc-v_musl/usr/bin/hostid new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/hostid @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/id b/data/risc-v_musl/usr/bin/id new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/id @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/install b/data/risc-v_musl/usr/bin/install new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/install @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/ipcrm b/data/risc-v_musl/usr/bin/ipcrm new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/ipcrm @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/ipcs b/data/risc-v_musl/usr/bin/ipcs new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/ipcs @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/killall b/data/risc-v_musl/usr/bin/killall new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/killall @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/last b/data/risc-v_musl/usr/bin/last new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/last @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/less b/data/risc-v_musl/usr/bin/less new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/less @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/logger b/data/risc-v_musl/usr/bin/logger new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/logger @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/logname b/data/risc-v_musl/usr/bin/logname new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/logname @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/lpq b/data/risc-v_musl/usr/bin/lpq new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/lpq @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/lpr b/data/risc-v_musl/usr/bin/lpr new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/lpr @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/lsof b/data/risc-v_musl/usr/bin/lsof new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/lsof @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/lspci b/data/risc-v_musl/usr/bin/lspci new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/lspci @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/lsscsi b/data/risc-v_musl/usr/bin/lsscsi new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/lsscsi @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/lsusb b/data/risc-v_musl/usr/bin/lsusb new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/lsusb @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/lzcat b/data/risc-v_musl/usr/bin/lzcat new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/lzcat @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/lzma b/data/risc-v_musl/usr/bin/lzma new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/lzma @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/man b/data/risc-v_musl/usr/bin/man new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/man @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/md5sum b/data/risc-v_musl/usr/bin/md5sum new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/md5sum @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/mesg b/data/risc-v_musl/usr/bin/mesg new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/mesg @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/microcom b/data/risc-v_musl/usr/bin/microcom new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/microcom @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/mkfifo b/data/risc-v_musl/usr/bin/mkfifo new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/mkfifo @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/mkpasswd b/data/risc-v_musl/usr/bin/mkpasswd new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/mkpasswd @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/nc b/data/risc-v_musl/usr/bin/nc new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/nc @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/nl b/data/risc-v_musl/usr/bin/nl new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/nl @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/nmeter b/data/risc-v_musl/usr/bin/nmeter new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/nmeter @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/nohup b/data/risc-v_musl/usr/bin/nohup new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/nohup @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/nproc b/data/risc-v_musl/usr/bin/nproc new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/nproc @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/nsenter b/data/risc-v_musl/usr/bin/nsenter new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/nsenter @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/nslookup b/data/risc-v_musl/usr/bin/nslookup new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/nslookup @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/od b/data/risc-v_musl/usr/bin/od new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/od @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/openvt b/data/risc-v_musl/usr/bin/openvt new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/openvt @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/passwd b/data/risc-v_musl/usr/bin/passwd new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/passwd @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/paste b/data/risc-v_musl/usr/bin/paste new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/paste @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/patch b/data/risc-v_musl/usr/bin/patch new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/patch @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/pgrep b/data/risc-v_musl/usr/bin/pgrep new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/pgrep @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/pkill b/data/risc-v_musl/usr/bin/pkill new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/pkill @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/pmap b/data/risc-v_musl/usr/bin/pmap new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/pmap @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/printf b/data/risc-v_musl/usr/bin/printf new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/printf @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/pscan b/data/risc-v_musl/usr/bin/pscan new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/pscan @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/pstree b/data/risc-v_musl/usr/bin/pstree new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/pstree @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/pwdx b/data/risc-v_musl/usr/bin/pwdx new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/pwdx @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/readlink b/data/risc-v_musl/usr/bin/readlink new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/readlink @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/realpath b/data/risc-v_musl/usr/bin/realpath new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/realpath @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/renice b/data/risc-v_musl/usr/bin/renice new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/renice @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/reset b/data/risc-v_musl/usr/bin/reset new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/reset @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/resize b/data/risc-v_musl/usr/bin/resize new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/resize @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/rpm2cpio b/data/risc-v_musl/usr/bin/rpm2cpio new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/rpm2cpio @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/runsv b/data/risc-v_musl/usr/bin/runsv new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/runsv @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/runsvdir b/data/risc-v_musl/usr/bin/runsvdir new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/runsvdir @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/rx b/data/risc-v_musl/usr/bin/rx new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/rx @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/script b/data/risc-v_musl/usr/bin/script new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/script @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/seq b/data/risc-v_musl/usr/bin/seq new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/seq @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/setfattr b/data/risc-v_musl/usr/bin/setfattr new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/setfattr @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/setkeycodes b/data/risc-v_musl/usr/bin/setkeycodes new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/setkeycodes @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/setsid b/data/risc-v_musl/usr/bin/setsid new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/setsid @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/setuidgid b/data/risc-v_musl/usr/bin/setuidgid new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/setuidgid @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/sha1sum b/data/risc-v_musl/usr/bin/sha1sum new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/sha1sum @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/sha256sum b/data/risc-v_musl/usr/bin/sha256sum new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/sha256sum @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/sha384sum b/data/risc-v_musl/usr/bin/sha384sum new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/sha384sum @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/sha3sum b/data/risc-v_musl/usr/bin/sha3sum new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/sha3sum @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/sha512sum b/data/risc-v_musl/usr/bin/sha512sum new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/sha512sum @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/showkey b/data/risc-v_musl/usr/bin/showkey new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/showkey @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/shred b/data/risc-v_musl/usr/bin/shred new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/shred @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/shuf b/data/risc-v_musl/usr/bin/shuf new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/shuf @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/smemcap b/data/risc-v_musl/usr/bin/smemcap new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/smemcap @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/softlimit b/data/risc-v_musl/usr/bin/softlimit new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/softlimit @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/sort b/data/risc-v_musl/usr/bin/sort new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/sort @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/split b/data/risc-v_musl/usr/bin/split new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/split @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/ssl_client b/data/risc-v_musl/usr/bin/ssl_client new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/ssl_client @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/strings b/data/risc-v_musl/usr/bin/strings new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/strings @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/sum b/data/risc-v_musl/usr/bin/sum new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/sum @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/sv b/data/risc-v_musl/usr/bin/sv new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/sv @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/svc b/data/risc-v_musl/usr/bin/svc new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/svc @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/svok b/data/risc-v_musl/usr/bin/svok new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/svok @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/tac b/data/risc-v_musl/usr/bin/tac new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/tac @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/tail b/data/risc-v_musl/usr/bin/tail new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/tail @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/taskset b/data/risc-v_musl/usr/bin/taskset new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/taskset @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/tcpsvd b/data/risc-v_musl/usr/bin/tcpsvd new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/tcpsvd @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/tee b/data/risc-v_musl/usr/bin/tee new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/tee @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/telnet b/data/risc-v_musl/usr/bin/telnet new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/telnet @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/test b/data/risc-v_musl/usr/bin/test new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/test @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/tftp b/data/risc-v_musl/usr/bin/tftp new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/tftp @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/time b/data/risc-v_musl/usr/bin/time new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/time @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/timeout b/data/risc-v_musl/usr/bin/timeout new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/timeout @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/top b/data/risc-v_musl/usr/bin/top new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/top @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/tr b/data/risc-v_musl/usr/bin/tr new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/tr @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/traceroute b/data/risc-v_musl/usr/bin/traceroute new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/traceroute @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/traceroute6 b/data/risc-v_musl/usr/bin/traceroute6 new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/traceroute6 @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/tree b/data/risc-v_musl/usr/bin/tree new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/tree @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/truncate b/data/risc-v_musl/usr/bin/truncate new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/truncate @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/ts b/data/risc-v_musl/usr/bin/ts new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/ts @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/tsort b/data/risc-v_musl/usr/bin/tsort new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/tsort @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/tty b/data/risc-v_musl/usr/bin/tty new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/tty @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/ttysize b/data/risc-v_musl/usr/bin/ttysize new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/ttysize @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/udhcpc6 b/data/risc-v_musl/usr/bin/udhcpc6 new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/udhcpc6 @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/udpsvd b/data/risc-v_musl/usr/bin/udpsvd new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/udpsvd @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/unexpand b/data/risc-v_musl/usr/bin/unexpand new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/unexpand @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/uniq b/data/risc-v_musl/usr/bin/uniq new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/uniq @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/unix2dos b/data/risc-v_musl/usr/bin/unix2dos new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/unix2dos @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/unlink b/data/risc-v_musl/usr/bin/unlink new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/unlink @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/unlzma b/data/risc-v_musl/usr/bin/unlzma new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/unlzma @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/unshare b/data/risc-v_musl/usr/bin/unshare new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/unshare @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/unxz b/data/risc-v_musl/usr/bin/unxz new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/unxz @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/unzip b/data/risc-v_musl/usr/bin/unzip new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/unzip @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/uptime b/data/risc-v_musl/usr/bin/uptime new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/uptime @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/users b/data/risc-v_musl/usr/bin/users new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/users @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/uudecode b/data/risc-v_musl/usr/bin/uudecode new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/uudecode @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/uuencode b/data/risc-v_musl/usr/bin/uuencode new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/uuencode @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/vlock b/data/risc-v_musl/usr/bin/vlock new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/vlock @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/volname b/data/risc-v_musl/usr/bin/volname new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/volname @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/w b/data/risc-v_musl/usr/bin/w new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/w @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/wall b/data/risc-v_musl/usr/bin/wall new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/wall @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/wc b/data/risc-v_musl/usr/bin/wc new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/wc @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/wget b/data/risc-v_musl/usr/bin/wget new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/wget @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/which b/data/risc-v_musl/usr/bin/which new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/which @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/who b/data/risc-v_musl/usr/bin/who new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/who @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/whoami b/data/risc-v_musl/usr/bin/whoami new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/whoami @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/whois b/data/risc-v_musl/usr/bin/whois new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/whois @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/xargs b/data/risc-v_musl/usr/bin/xargs new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/xargs @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/xxd b/data/risc-v_musl/usr/bin/xxd new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/xxd @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/xz b/data/risc-v_musl/usr/bin/xz new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/xz @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/xzcat b/data/risc-v_musl/usr/bin/xzcat new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/xzcat @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/bin/yes b/data/risc-v_musl/usr/bin/yes new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/bin/yes @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/add-shell b/data/risc-v_musl/usr/sbin/add-shell new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/add-shell @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/addgroup b/data/risc-v_musl/usr/sbin/addgroup new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/addgroup @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/adduser b/data/risc-v_musl/usr/sbin/adduser new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/adduser @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/arping b/data/risc-v_musl/usr/sbin/arping new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/arping @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/brctl b/data/risc-v_musl/usr/sbin/brctl new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/brctl @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/chat b/data/risc-v_musl/usr/sbin/chat new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/chat @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/chpasswd b/data/risc-v_musl/usr/sbin/chpasswd new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/chpasswd @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/chroot b/data/risc-v_musl/usr/sbin/chroot new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/chroot @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/crond b/data/risc-v_musl/usr/sbin/crond new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/crond @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/delgroup b/data/risc-v_musl/usr/sbin/delgroup new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/delgroup @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/deluser b/data/risc-v_musl/usr/sbin/deluser new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/deluser @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/dhcprelay b/data/risc-v_musl/usr/sbin/dhcprelay new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/dhcprelay @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/dnsd b/data/risc-v_musl/usr/sbin/dnsd new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/dnsd @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/ether-wake b/data/risc-v_musl/usr/sbin/ether-wake new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/ether-wake @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/fakeidentd b/data/risc-v_musl/usr/sbin/fakeidentd new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/fakeidentd @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/fbset b/data/risc-v_musl/usr/sbin/fbset new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/fbset @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/fdformat b/data/risc-v_musl/usr/sbin/fdformat new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/fdformat @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/fsfreeze b/data/risc-v_musl/usr/sbin/fsfreeze new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/fsfreeze @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/ftpd b/data/risc-v_musl/usr/sbin/ftpd new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/ftpd @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/httpd b/data/risc-v_musl/usr/sbin/httpd new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/httpd @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/i2cdetect b/data/risc-v_musl/usr/sbin/i2cdetect new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/i2cdetect @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/i2cdump b/data/risc-v_musl/usr/sbin/i2cdump new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/i2cdump @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/i2cget b/data/risc-v_musl/usr/sbin/i2cget new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/i2cget @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/i2cset b/data/risc-v_musl/usr/sbin/i2cset new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/i2cset @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/i2ctransfer b/data/risc-v_musl/usr/sbin/i2ctransfer new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/i2ctransfer @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/ifplugd b/data/risc-v_musl/usr/sbin/ifplugd new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/ifplugd @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/inetd b/data/risc-v_musl/usr/sbin/inetd new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/inetd @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/killall5 b/data/risc-v_musl/usr/sbin/killall5 new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/killall5 @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/loadfont b/data/risc-v_musl/usr/sbin/loadfont new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/loadfont @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/lpd b/data/risc-v_musl/usr/sbin/lpd new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/lpd @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/mim b/data/risc-v_musl/usr/sbin/mim new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/mim @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/nanddump b/data/risc-v_musl/usr/sbin/nanddump new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/nanddump @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/nandwrite b/data/risc-v_musl/usr/sbin/nandwrite new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/nandwrite @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/nbd-client b/data/risc-v_musl/usr/sbin/nbd-client new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/nbd-client @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/nologin b/data/risc-v_musl/usr/sbin/nologin new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/nologin @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/ntpd b/data/risc-v_musl/usr/sbin/ntpd new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/ntpd @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/partprobe b/data/risc-v_musl/usr/sbin/partprobe new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/partprobe @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/popmaildir b/data/risc-v_musl/usr/sbin/popmaildir new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/popmaildir @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/powertop b/data/risc-v_musl/usr/sbin/powertop new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/powertop @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/rdate b/data/risc-v_musl/usr/sbin/rdate new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/rdate @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/rdev b/data/risc-v_musl/usr/sbin/rdev new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/rdev @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/readahead b/data/risc-v_musl/usr/sbin/readahead new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/readahead @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/readprofile b/data/risc-v_musl/usr/sbin/readprofile new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/readprofile @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/remove-shell b/data/risc-v_musl/usr/sbin/remove-shell new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/remove-shell @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/rtcwake b/data/risc-v_musl/usr/sbin/rtcwake new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/rtcwake @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/seedrng b/data/risc-v_musl/usr/sbin/seedrng new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/seedrng @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/sendmail b/data/risc-v_musl/usr/sbin/sendmail new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/sendmail @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/setfont b/data/risc-v_musl/usr/sbin/setfont new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/setfont @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/setlogcons b/data/risc-v_musl/usr/sbin/setlogcons new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/setlogcons @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/svlogd b/data/risc-v_musl/usr/sbin/svlogd new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/svlogd @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/telnetd b/data/risc-v_musl/usr/sbin/telnetd new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/telnetd @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/tftpd b/data/risc-v_musl/usr/sbin/tftpd new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/tftpd @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/ubiattach b/data/risc-v_musl/usr/sbin/ubiattach new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/ubiattach @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/ubidetach b/data/risc-v_musl/usr/sbin/ubidetach new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/ubidetach @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/ubimkvol b/data/risc-v_musl/usr/sbin/ubimkvol new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/ubimkvol @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/ubirename b/data/risc-v_musl/usr/sbin/ubirename new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/ubirename @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/ubirmvol b/data/risc-v_musl/usr/sbin/ubirmvol new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/ubirmvol @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/ubirsvol b/data/risc-v_musl/usr/sbin/ubirsvol new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/ubirsvol @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/ubiupdatevol b/data/risc-v_musl/usr/sbin/ubiupdatevol new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/ubiupdatevol @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/data/risc-v_musl/usr/sbin/udhcpd b/data/risc-v_musl/usr/sbin/udhcpd new file mode 120000 index 00000000..f948f1a7 --- /dev/null +++ b/data/risc-v_musl/usr/sbin/udhcpd @@ -0,0 +1 @@ +../../bin/busybox \ No newline at end of file diff --git a/document/SUMMARY.md b/document/SUMMARY.md index 55db7179..e1fd6fed 100644 --- a/document/SUMMARY.md +++ b/document/SUMMARY.md @@ -102,6 +102,11 @@ - [多核启动](arch/riscv/smp_boot.md) - [核间中断 (IPI)](arch/riscv/ipi.md) +## LoongArch64 + +- [LoongArch64](arch/loongarch/README.md) + - [启动与用户态运行修复总结(comix-1 当前分支)](arch/loongarch/bringup_userland.md) + --- diff --git a/document/arch/loongarch/README.md b/document/arch/loongarch/README.md new file mode 100644 index 00000000..cb9ca0cc --- /dev/null +++ b/document/arch/loongarch/README.md @@ -0,0 +1,4 @@ +# LoongArch64 + +- [启动与用户态运行修复总结(comix-1 当前分支)](bringup_userland.md) + diff --git a/document/arch/loongarch/bringup_userland.md b/document/arch/loongarch/bringup_userland.md new file mode 100644 index 00000000..00dfe20e --- /dev/null +++ b/document/arch/loongarch/bringup_userland.md @@ -0,0 +1,202 @@ +# LoongArch64 启动与用户态运行修复总结(comix-1 当前分支) + +本文档总结当前分支中,为了让 comix 在 LoongArch64 架构下能够**稳定完成启动、进入并持续运行用户态程序(busybox init / shell)**而做的一组修复与对齐工作。重点目标是:让 LoongArch 的整体启动语义尽可能与 RISC-V 路径一致(尤其是 `/dev` 等挂载点由 rcS 负责挂载),并且把“卡在 trap / 无法进入用户态 / 用户态一运行就异常”的问题收敛到可解释、可复现、可继续演进的状态。 + +--- + +## 1. 背景与目标 + +### 1.1 现象概述(修复前) + +LoongArch64 上曾出现以下典型现象(可单独出现或互相叠加): + +- `kernel_execve("/sbin/init")` 之后无法稳定进入用户态,串口输出停止或在 GDB 中反复停在 `trap_entry`。 +- 即使偶尔能进入用户态执行少量 syscall,也很快出现用户态异常: + - `estat` 指示地址相关异常(如地址错、权限错等), + - `badv` 出现 `0x9000...` 这一类**内核高地址**,明显是用户态不应访问的区域。 +- init 进程行为异常(例如 busybox 提示必须是 PID 1,或内核侧找不到 init 进程)。 +- `/dev/ttyS0` 等设备节点缺失,导致 rcS 无法起交互 shell。 + +### 1.2 修复目标 + +- **可靠进入用户态并持续运行**:用户态能完成 `init -> rcS -> spawn shell`,至少出现 `/ #` 提示符。 +- **启动流程对齐**:LoongArch 与 RISC-V 的职责边界一致: + - 内核负责挂载根文件系统(Ext4 root)。 + - `/dev /proc /sys /tmp` 等由用户态 rcS 执行 `mount` 完成。 + - 内核在 `mount("/dev")` 时做必要的内核侧初始化(创建设备节点)。 +- **可调试性**:提供足够的日志/断点点位,能明确区分: + - trap 入口保存/恢复错误 + - TLB refill 错误 + - 用户栈/TLS 约定问题 + - rootfs/挂载点目录缺失等“系统集成”问题 + +--- + +## 2. 关键问题定位方法(建议保留) + +### 2.1 典型 GDB/寄存器观察点 + +当卡在 `trap_entry` 或用户态异常时,优先观察: + +- `ESTAT/ERA/BADV/BADI`: + - `ESTAT` 的 `ecode/esubcode` 用来区分 syscall / page fault / 地址错 / 指令错。 + - `ERA` 是异常发生时的 PC(用户态异常时通常在 `0x12...` 这类用户映射区)。 + - `BADV` 是访问地址(若出现在 `0x9000...`,高度怀疑寄存器现场被内核保存/恢复逻辑污染)。 + - `BADI` 是故障指令(可用来对照用户 ELF 的指令流)。 + +### 2.2 “用户态 BADV 指向 0x9000...” 的含义 + +这是本次最有信息量的信号之一:用户程序在执行正常指令时,某个寄存器被污染成内核高地址(或某个指针被写错),从而产生“用户态非法访问内核区”。这种现象在 LoongArch 上最常见的根因是: + +- trap 入口保存现场写错槽位(TrapFrame 布局与汇编保存顺序不一致),或 +- trap 返回恢复现场读错槽位,导致用户寄存器恢复后被污染。 + +--- + +## 3. 修复项总览(按子系统) + +### 3.1 启动入口与 DTB(设备树)指针探测 + +**问题**:QEMU/固件传入 DTB 指针的寄存器约定不稳定;直接使用错误指针会导致 FDT 解析失败,影响设备初始化。 + +**修复**:在汇编入口 `_start` 中对候选 DTB 地址做 magic 检查,选择有效指针后写入全局 `DTP`(保存物理地址,由 Rust 侧再转换直映虚拟地址)。 + +- 相关文件: + - `os/src/arch/loongarch/boot/entry.S` + +### 3.2 TLB Refill:可用的 refill 入口与“不要踩 CSR” + +**问题**:用户态运行时大量缺页/首次访问需要 TLB refill;若 refill 入口不正确或破坏了 trap 入口依赖的 CSR/寄存器,会表现为随机 trap storm 或直接卡死。 + +**修复**: + +- 使用 `lddir/ldpte/tlbfill` 的硬件辅助页表遍历路径实现 `tlb_refill_entry`。 +- refill 入口只使用 `CSR 0x8b (TLBRSAVE)` 保存/恢复 `$t0`,避免覆写 `KSAVE/KSCRATCH` 一类 CSR,从而不干扰 `trap_entry` 的 TrapFrame 指针机制。 + +- 相关文件: + - `os/src/arch/loongarch/trap/trap_entry.S` + +### 3.3 trap_entry / __restore:寄存器现场保存/恢复一致性(核心) + +**问题**:TrapFrame 与汇编保存/恢复顺序不一致会直接导致: + +- 用户态 syscall 返回后寄存器被污染(例如 s0..s8 偏移错一位), +- 进而出现用户态 `BADV=0x9000...` 的非法访存异常。 + +**修复**: + +- trap 入口先把原始 `$a0/$t1` 写入 scratch CSR,再读取 `KScratch0` 中的 TrapFrame 指针; +- 保存/恢复时严格按 LoongArch ABI 寄存器编号对应 TrapFrame 槽位; +- 修正了 callee-saved 区(`$s0..$s8`)的槽位映射,避免“漏存 $s0 导致整段错位”。 + +- 相关文件: + - `os/src/arch/loongarch/trap/trap_entry.S` + - `os/src/arch/loongarch/trap/trap_frame.rs`(TrapFrame 结构与 exec 初始化) + - `os/src/arch/loongarch/trap/trap_handler.rs`(用户态异常打印、syscall 分发与 restore) + +### 3.4 用户态 TLS/TP 与用户栈布局(musl/busybox 依赖) + +**问题**:许多 LoongArch Linux-ABI 用户程序依赖 `$tp` 作为 TLS 指针;如果 execve 后 `$tp` 没有按约定设置,早期 libc 初始化可能会崩。 + +**修复**: + +- 在用户栈顶预留一页作为 TLS/TCB 区域; +- 将 `$tp` 设置为该页内一个稳定的对齐地址,并写入最小 self-pointer(满足常见 libc 期望); +- 在用户栈中构造 `argc/argv/envp/auxv`(包含 `AT_PHDR/AT_ENTRY/AT_PLATFORM/AT_RANDOM/AT_EXECFN` 等); +- `set_exec_trap_frame()` 将 `tp/sp/a0/a1/a2` 等寄存器按 LoongArch ABI 写入 TrapFrame。 + +- 相关文件: + - `os/src/arch/loongarch/kernel/task.rs`(`setup_stack_layout()`) + - `os/src/kernel/task/task_struct.rs`(execve 路径调用与写回) + - `os/src/arch/loongarch/trap/trap_frame.rs` + +### 3.5 FPU 使能(EUEN.FPE) + +**问题**:部分用户程序会在非常早的阶段执行 FP 指令;若未启用基础 FPU,会出现异常或非预期行为。 + +**修复**:在 LoongArch 启动早期设置 `EUEN.FPE = 1`。 + +- 相关文件: + - `os/src/arch/loongarch/boot/mod.rs` + +### 3.6 启动流程与任务模型对齐(init PID=1、idle_task) + +**问题**: + +- busybox init 要求自己是 PID 1;如果内核创建的 init task 不是 TID/PID 1,会直接报错。 +- 调度器在 runqueue 为空时会切换到每 CPU 的 idle_task;若未设置,会触发 panic。 + +**修复**: + +- LoongArch `rest_init()` 固定创建 init 任务为 `tid=pid=1`(与 RISC-V 一致)。 +- 在 CPU0 预先创建并登记 idle 任务(不加入 runqueue,仅作为兜底)。 + +- 相关文件: + - `os/src/arch/loongarch/boot/mod.rs` + +### 3.7 `/dev` 挂载与设备节点:让 LoongArch 与 RISC-V 行为一致 + +**问题根因**(为什么 RISC-V 没问题而 LoongArch 出问题): + +- 运行时镜像由 `os/build.rs` 从 `data/_musl` 目录生成: + - `fs-riscv.img` 根目录自带 `/dev /proc /sys` 等目录; + - `fs-loongarch.img` 根目录不包含 `/dev`(也可能不包含 `/proc /sys`)。 +- RISC-V 路径把 `/dev` 挂载留给 rcS,并依赖内核对 `mount("/dev")` 的特殊处理自动 `init_dev()`;因为 `/dev` 目录存在,所以工作正常。 +- LoongArch 若沿用“rcS 挂载 /dev”,但镜像里没有 `/dev` 目录,则挂载点不存在,后续 `init_dev()` 无法创建 `/dev/ttyS0`,最终出现 `can't open /dev/ttyS0`。 + +**修复策略**: + +1) **启动流程对齐**:LoongArch 与 RISC-V 一样,把 `/dev(/proc,/sys,/tmp)` 的挂载交给用户态 rcS 完成。 + +- `os/src/arch/loongarch/boot/mod.rs` +- `data/loongarch_musl/etc/init.d/rcS` + +2) **内核兜底**:在 `SYS_MOUNT` 的特殊分支中,为 `/dev /proc /sys /tmp` 增加“挂载点目录不存在则先创建”的逻辑,然后再执行挂载动作;`/dev` 分支继续在挂载 tmpfs 后调用 `init_dev()` 创建设备节点。 + +- `os/src/kernel/syscall/fs.rs` + +> 这使得:即使某个架构的 rootfs 镜像缺少挂载点目录,rcS 的挂载也不会因为“目录不存在”而失败,从而让启动语义更稳健、更一致。 + +--- + +## 4. 启动流程对齐总结(RISC-V vs LoongArch) + +对齐后的关键点: + +- 两个架构都在内核 init task 中挂载/初始化 Ext4 root(作为根文件系统)。 +- `/dev /proc /sys /tmp` 均由用户态 rcS 执行 `mount` 完成。 +- 内核在 `SYS_MOUNT` 中对这些 target 做特殊处理: + - `/dev`:挂载 tmpfs 后自动 `init_dev()` 创建设备节点; + - `/proc`:`init_procfs()`; + - `/sys`:`init_sysfs()`; + - `/tmp`:`mount_tmpfs()`; + - 并在进入这些特殊处理前确保挂载点目录存在。 + +--- + +## 5. 验证结果(当前分支) + +### 5.1 运行验证 + +使用: + +- `make run ARCH=loongarch` + +预期能观察到: + +- `/sbin/init` 启动并执行 rcS, +- 后续出现 shell 提示符(例如 `/ #`),说明用户态已经稳定运行并能进行基本交互。 + +### 5.2 验证点解释 + +- 能连续看到大量 syscall(包含 `mount`、`openat`、`read/write`、`clone` 等)且不再出现用户态 `BADV=0x9000...` 类型的地址异常,说明 trap 保存/恢复与 TLB refill 已经基本稳定。 +- shell 能起则说明 `/dev/ttyS0` 已存在且可打开(这依赖 rcS mount("/dev") + 内核 init_dev())。 + +--- + +## 6. 后续建议(非阻塞) + +1) **rootfs 内容对齐**:建议让 `data/loongarch_musl` 也包含 `/dev /proc /sys` 等空目录,使镜像结构更接近 `data/risc-v_musl`,减少对内核“兜底创建目录”的依赖。 +2) **减少调试噪声**:目前 LoongArch trap/syscall 输出较多(用于 bringup);在稳定后可逐步降级为 `pr_debug` 或加开关。 +3) **设备/网络完善**:virtio-net 可能仍会报 `DeviceNotReady`,这属于设备初始化/驱动完善方向,与“能进用户态”已解耦。 + diff --git a/os/Makefile b/os/Makefile index ed7660f3..dcc0196f 100644 --- a/os/Makefile +++ b/os/Makefile @@ -4,6 +4,7 @@ # 架构选择: riscv (默认) 或 loongarch ARCH ?= riscv +export ARCH LOG ?= # 根据架构设置变量 @@ -23,6 +24,7 @@ else GDB_ARCH_SETUP := -ex "set arch riscv:rv64" endif + # =============================================== # 核心目标 # =============================================== diff --git a/os/build.rs b/os/build.rs index 83f11591..aa42771e 100644 --- a/os/build.rs +++ b/os/build.rs @@ -135,25 +135,64 @@ fn main() { // 3.2: 非测试模式下创建完整的运行时镜像 if !is_test { - let fs_img_path = PathBuf::from(&manifest_dir).join("fs.img"); - let data_dir = project_root.join("data"); + let target = env::var("TARGET").unwrap_or_default(); + let arch_key = match env::var("ARCH") { + Ok(val) if !val.is_empty() => { + if val.contains("loongarch") { + "loongarch" + } else { + "riscv" + } + } + _ => { + if target.contains("loongarch") { + "loongarch" + } else { + "riscv" + } + } + }; + let fs_img_name = format!("fs-{}.img", arch_key); + let fs_img_path = PathBuf::from(&manifest_dir).join(&fs_img_name); + let data_dir = if arch_key == "loongarch" { + project_root.join("data").join("loongarch_musl") + } else { + project_root.join("data").join("risc-v_musl") + }; // user_bin_dir 已经在上面通过 user_dir 引用了, user/bin let user_bin_dir = user_dir.join("bin"); + let arch_stamp = PathBuf::from(&out_dir).join(format!("fs_img_arch_{}.txt", arch_key)); // 检查依赖 - let dependencies = vec![data_dir, user_bin_dir]; + println!("cargo:rerun-if-changed={}", data_dir.display()); + let dependencies = vec![data_dir.clone(), user_bin_dir]; + + let force_rebuild = match fs::read_to_string(&arch_stamp) { + Ok(saved) => saved.trim() != arch_key, + Err(_) => true, + }; + if force_rebuild { + println!( + "cargo:warning=[build.rs] Arch changed ({}), forcing fs.img rebuild.", + arch_key + ); + } - if should_rebuild(&fs_img_path, &dependencies) { + if force_rebuild || should_rebuild(&fs_img_path, &dependencies) { println!( "cargo:warning=[build.rs] Creating full ext4 runtime image (4GB) at fs.img..." ); - create_full_ext4_image(&fs_img_path, &project_root); + create_full_ext4_image(&fs_img_path, &data_dir, &project_root); + let _ = fs::write(&arch_stamp, format!("{}\n", arch_key)); println!( "cargo:warning=[build.rs] Runtime image created: {}", fs_img_path.display() ); } else { - println!("cargo:warning=[build.rs] fs.img is up to date, skipping regeneration."); + println!( + "cargo:warning=[build.rs] {} is up to date, skipping regeneration.", + fs_img_name + ); } } } @@ -312,7 +351,7 @@ fn create_empty_ext4_image(path: &PathBuf, size_mb: usize) { } /// 创建完整的 ext4 镜像 (包含 data/ 和 user/bin/) -fn create_full_ext4_image(path: &PathBuf, project_root: &Path) { +fn create_full_ext4_image(path: &PathBuf, data_dir: &Path, project_root: &Path) { const IMG_SIZE_MB: usize = 4096; // 4GB const BLOCK_SIZE: usize = 1024 * 1024; @@ -329,11 +368,14 @@ fn create_full_ext4_image(path: &PathBuf, project_root: &Path) { } fs::create_dir_all(&temp_root).expect("Failed to create temp directory"); - // 2. 复制 data/ 目录的内容到临时根目录 - let data_dir = project_root.join("data"); + // 2. 复制 data 目录的内容到临时根目录 if data_dir.exists() { - copy_dir_recursive(&data_dir, &temp_root).expect("Failed to copy data directory"); - println!("cargo:warning=[build.rs] Copied data/ to temp root"); + copy_dir_recursive(&data_dir.to_path_buf(), &temp_root) + .expect("Failed to copy data directory"); + println!( + "cargo:warning=[build.rs] Copied {} to temp root", + data_dir.display() + ); } // 3. 创建 /home/user/bin 目录并复制 user/bin diff --git a/os/qemu-loongarch-run.sh b/os/qemu-loongarch-run.sh index 01609d3b..0723ca26 100755 --- a/os/qemu-loongarch-run.sh +++ b/os/qemu-loongarch-run.sh @@ -7,7 +7,8 @@ MODE=${2:-run} # 参数定义(对齐评测指令) mem="4G" smp="1" -fs="fs.img" +arch="${ARCH:-loongarch}" +fs="fs-${arch}.img" disk="disk-la.img" # 创建空磁盘镜像(如果不存在) @@ -28,6 +29,14 @@ QEMU_ARGS=( if [ -f "$fs" ]; then QEMU_ARGS+=(-drive file="$fs",if=none,format=raw,id=x0) QEMU_ARGS+=(-device virtio-blk-pci,drive=x0) +elif [ -f "fs.img" ]; then + fs="fs.img" + QEMU_ARGS+=(-drive file="$fs",if=none,format=raw,id=x0) + QEMU_ARGS+=(-device virtio-blk-pci,drive=x0) +else + echo "Error: ${fs} not found!" + echo "Please run 'cargo build' first to generate the filesystem image." + exit 1 fi # Virtio Network 设备 diff --git a/os/qemu-run.sh b/os/qemu-run.sh index 9821584b..cca54559 100755 --- a/os/qemu-run.sh +++ b/os/qemu-run.sh @@ -6,7 +6,8 @@ BIN_FILE="${ELF_FILE%.*}.bin" os_file="$BIN_FILE" mem="4G" smp="${SMP:-1}" # 从环境变量读取,默认为 1 -fs="fs.img" +arch="${ARCH:-riscv}" +fs="fs-${arch}.img" disk="disk.img" # 1. 转换为纯二进制 @@ -14,13 +15,17 @@ rust-objcopy --strip-all "$ELF_FILE" -O binary "$BIN_FILE" # 2. 检查 fs.img (1GB Ext4 文件系统) # 镜像应该由 build.rs 在编译时创建 -if [ ! -f "fs.img" ]; then - echo "Error: fs.img not found!" - echo "Please run 'cargo build' first to generate the filesystem image." - exit 1 +if [ ! -f "$fs" ]; then + if [ -f "fs.img" ]; then + fs="fs.img" + else + echo "Error: ${fs} not found!" + echo "Please run 'cargo build' first to generate the filesystem image." + exit 1 + fi fi -echo "Using existing fs.img (1GB Ext4 filesystem)" +echo "Using existing ${fs} (1GB Ext4 filesystem)" # 3. 运行 QEMU QEMU_ARGS="-machine virt \ @@ -52,4 +57,4 @@ else echo "Starting QEMU in normal run mode." fi -qemu-system-riscv64 $QEMU_ARGS \ No newline at end of file +qemu-system-riscv64 $QEMU_ARGS diff --git a/os/src/arch/loongarch/boot/entry.S b/os/src/arch/loongarch/boot/entry.S index 4fe965c4..b27ae333 100644 --- a/os/src/arch/loongarch/boot/entry.S +++ b/os/src/arch/loongarch/boot/entry.S @@ -11,7 +11,7 @@ # - DMW0: VSEG=0x8, VA 0x8xxx -> PA 0x0xxx (Uncached, MMIO) # - DMW1: VSEG=0x9, VA 0x9xxx -> PA 0x0xxx (Cached, 内存) # -_start: + _start: # ========================================== # 1. 配置 DMW (Direct Mapping Window) # ========================================== @@ -25,23 +25,63 @@ _start: li.d $t0, (0x9 << 60) | (1 << 4) | 0x1 csrwr $t0, 0x181 # CSR_DMW1 - # ========================================== - # 2. 保存设备树地址 - # LoongArch virt: a0=UEFI 标志(1), a2=EFI system table - # FDT 固定放在 0x0010_0000 - # ========================================== - la.global $t1, DTP - beqz $a0, 1f - li.d $t0, 0x00100000 - st.d $t0, $t1, 0 - b 2f -1: - st.d $a0, $t1, 0 -2: + # ========================================== + # 2. 保存设备树地址 (DTP: physical address) + # + # QEMU/firmware 传入的 DTB 指针在不同环境下可能位于不同参数寄存器。 + # 为避免写入错误指针导致 FDT::from_ptr 解析失败,这里通过检查 + # DTB magic (0xd00dfeed) 来选择有效地址。 + # + # 约定: + # - 优先尝试 a1 / a2(常见固件约定) + # - 其次尝试 0x0010_0000(部分固件会固定放置) + # - DTP 存储“物理地址”,Rust 侧再转换为直映虚拟地址 + # ========================================== + la.global $t1, DTP - # ========================================== - # 3. 设置栈指针 - # ========================================== + li.d $t4, 0x0000ffffffffffff # PHYS_ADDR_MASK + li.d $t5, 0x9000000000000000 # DMW1 base (cached) + # DTB magic is stored big-endian on disk/memory; on little-endian CPU a plain + # 32-bit load observes the byte-swapped value 0xedfe0dd0. + li.d $t6, 0xedfe0dd0 # FDT_MAGIC (as observed by ld.wu) + + # Try a1 (if non-zero and aligned) + beqz $a1, 1f + andi $t7, $a1, 0x7 + bnez $t7, 1f + and $t0, $a1, $t4 # candidate physical + or $t2, $t0, $t5 # direct-mapped virtual + ld.wu $t3, $t2, 0 + beq $t3, $t6, 3f + 1: + + # Try a2 (if non-zero and aligned) + beqz $a2, 2f + andi $t7, $a2, 0x7 + bnez $t7, 2f + and $t0, $a2, $t4 + or $t2, $t0, $t5 + ld.wu $t3, $t2, 0 + beq $t3, $t6, 3f + 2: + + # Try fixed 0x0010_0000 + li.d $t0, 0x00100000 + or $t2, $t0, $t5 + ld.wu $t3, $t2, 0 + beq $t3, $t6, 3f + + # Fallback: keep 0 (device tree disabled) + move $t0, $zero + b 4f + 3: + # $t0 already holds candidate physical + 4: + st.d $t0, $t1, 0 + + # ========================================== + # 3. 设置栈指针 + # ========================================== la.global $sp, boot_stack_top # ========================================== diff --git a/os/src/arch/loongarch/boot/mod.rs b/os/src/arch/loongarch/boot/mod.rs index 31837525..637a8c81 100644 --- a/os/src/arch/loongarch/boot/mod.rs +++ b/os/src/arch/loongarch/boot/mod.rs @@ -40,7 +40,8 @@ global_asm!(include_str!("entry.S")); /// 并且当这个函数结束时,应该切换到第一个任务的上下文 pub fn rest_init() { earlyprintln!("[Boot] rest_init: creating init task"); - let tid = TASK_MANAGER.lock().allocate_tid(); + // init 进程必须使用 TID/PID 1,不从分配器获取(分配器从 2 开始)。 + let tid = 1; let kstack_tracker = alloc_contig_frames(4).expect("kthread_spawn: failed to alloc kstack"); let trap_frame_tracker = alloc_frame().expect("kthread_spawn: failed to alloc trap_frame"); let fd_table = fd_table::FDTable::new(); @@ -86,9 +87,20 @@ pub fn rest_init() { // init 任务运行在 CPU 0 task.on_cpu = Some(0); let task = task.into_shared(); + + // 为 CPU0 创建 idle 任务,避免调度器在 runqueue 为空时 panic。 + // idle 任务不加入运行队列,但会作为兜底任务被切换运行。 + { + let _guard = crate::sync::PreemptGuard::new(); + let cpu = current_cpu(); + if cpu.idle_task.is_none() { + cpu.idle_task = Some(create_idle_task(0)); + } + } + unsafe { // KScratch0 <- TrapFrame 指针 - asm!("csrwr {0}, 0x48", in(reg) ptr as usize, options(nostack, preserves_flags)); + asm!("csrwr {0}, 0x30", in(reg) ptr as usize, options(nostack, preserves_flags)); } TASK_MANAGER.lock().add_task(task.clone()); { @@ -111,6 +123,62 @@ pub fn rest_init() { } } +/// Idle 循环:等待中断;被定时器中断唤醒后由 trap/scheduler 决定是否调度。 +fn idle_loop() -> ! { + loop { + if !crate::arch::intr::are_interrupts_enabled() { + unsafe { crate::arch::intr::enable_interrupts() }; + } + unsafe { + core::arch::asm!("idle 0"); + } + } +} + +/// 为指定 CPU 创建 idle 任务(LoongArch 版本) +fn create_idle_task(cpu_id: usize) -> crate::kernel::SharedTask { + use crate::arch::trap::TrapFrame; + use crate::mm::frame_allocator::alloc_contig_frames; + use crate::vfs::fd_table::FDTable; + + // idle 任务从 TID 分配器正常分配(从 2 开始) + let tid = TASK_MANAGER.lock().allocate_tid(); + + // 分配最小资源 + let kstack_tracker = + alloc_contig_frames(1).expect("Failed to allocate kernel stack for idle task"); + let trap_frame_tracker = alloc_frame().expect("Failed to allocate trap frame for idle task"); + + // 创建最小化的内核线程 + let mut task = TaskStruct::ktask_create( + tid, + tid, // pid = tid + 0, // ppid = 0 (no parent) + TaskStruct::empty_children(), + kstack_tracker, + trap_frame_tracker, + Arc::new(SpinLock::new(SignalHandlerTable::new())), + SignalFlags::empty(), + Arc::new(SpinLock::new(SignalPending::empty())), + Arc::new(SpinLock::new(UtsNamespace::default())), + Arc::new(SpinLock::new(RlimitStruct::new(INIT_RLIMITS))), + Arc::new(FDTable::new()), + Arc::new(SpinLock::new(FsStruct::new(None, None))), + ); + + // 设置 TrapFrame 指向 idle_loop + let tf = task.trap_frame_ptr.load(Ordering::SeqCst); + unsafe { + core::ptr::write(tf, TrapFrame::zero_init()); + (*tf).set_kernel_trap_frame(idle_loop as usize, 0, task.kstack_base); + } + + task.on_cpu = Some(cpu_id); + let task = task.into_shared(); + TASK_MANAGER.lock().add_task(task.clone()); + task +} + /// 内核的第一个任务 /// PID = 1 /// 负责进行剩余的初始化工作 @@ -135,23 +203,10 @@ fn init() { pr_info!("[Init] Continuing without filesystem..."); } - // // 挂载 /dev 并创建设备节点 - // if let Err(e) = crate::fs::mount_tmpfs("/dev", 0) { - // pr_err!("[Init] Failed to mount /dev: {:?}", e); - // } else if let Err(e) = crate::fs::init_dev() { - // pr_err!("[Init] Failed to create devices: {:?}", e); - // } - - // LoongArch 目录目前为脚手架:用户态与块设备引导可能尚未就绪。 - // 若 /sbin/init 可用则尝试进入用户态,否则保持在内核中运行。 - if crate::vfs::vfs_lookup("/sbin/init").is_ok() { - kernel_execve("/sbin/init", &["/sbin/init"], &[]); - } - - pr_info!("[Init] /sbin/init not found; staying in kernel loop"); - loop { - yield_task(); - } + // /dev(/proc,/sys,/tmp) 的挂载交给用户态 rcS: + // - rcS 会执行 `mount -t tmpfs none /dev` 等 + // - 内核在 mount("/dev") 的系统调用里会自动 init_dev() 创建设备节点 + kernel_execve("/sbin/init", &["/sbin/init"], &[]); } /// 内核守护线程 @@ -212,6 +267,11 @@ fn create_kthreadd() { pub fn main(hartid: usize) { clear_bss(); + // Enable base floating-point instructions (EUEN.FPE). Many LoongArch Linux-ABI + // user programs are built with floating-point enabled and may execute FP + // instructions very early during startup. + loongArch64::register::euen::set_fpe(true); + run_early_tests(); earlyprintln!("[Boot] Hello, world!"); diff --git a/os/src/arch/loongarch/constant.rs b/os/src/arch/loongarch/constant.rs index e90a6fda..1108e5a3 100644 --- a/os/src/arch/loongarch/constant.rs +++ b/os/src/arch/loongarch/constant.rs @@ -11,10 +11,10 @@ pub const UART_BASE: usize = 0x1fe001e0; pub const STACK_ALIGN_MASK: usize = 0xF; /// LoongArch64 地址空间常量 -/// 用户空间: 0x0000_0000_0000_0000 - 0x0000_ffff_ffff_ffff +/// 用户空间: 0x0000_0000_0000_0000 - 0x0000_003f_ffff_ffff (39-bit) /// 内核空间: 0x9000_0000_0000_0000 - 0xffff_ffff_ffff_ffff pub const USER_BASE: usize = 0x0000_0000_0000_0000; -pub const USER_TOP: usize = 0x0000_ffff_ffff_ffff; +pub const USER_TOP: usize = 0x0000_003f_ffff_ffff; pub const KERNEL_BASE: usize = 0x9000_0000_0000_0000; /// 兼容 RISC-V 的地址空间常量 @@ -36,12 +36,22 @@ pub const CSR_CRMD_PLV_MASK: usize = 0b11; // 特权级掩码 pub const CSR_CRMD_IE: usize = 1 << 2; // 全局中断使能 pub const CSR_CRMD_DA: usize = 1 << 3; // 直接地址翻译模式 pub const CSR_CRMD_PG: usize = 1 << 4; // 分页使能 +pub const CSR_CRMD_DATF_MASK: usize = 0b11 << 5; // 取指访问类型 +pub const CSR_CRMD_DATM_MASK: usize = 0b11 << 7; // 读写访问类型 +pub const CSR_CRMD_DAT_CC: usize = 0b01; // Coherent Cached + +/// PRMD (异常前模式信息) +pub const PRMD_PPLV_MASK: usize = 0b11; +pub const PRMD_PIE: usize = 1 << 2; +pub const PRMD_PPLV_USER: usize = 0b11; /// ECFG (异常配置) pub const CSR_ECFG_LIE_MASK: usize = 0x1fff; // 局部中断使能掩码 /// EENTRY (异常入口地址) pub const CSR_EENTRY: u32 = 0xc; +/// TLBRENT (TLB refill 入口地址) +pub const CSR_TLBRENT: u32 = 0x88; /// BADV (错误地址寄存器) pub const CSR_BADV: u32 = 0x7; diff --git a/os/src/arch/loongarch/ipi.rs b/os/src/arch/loongarch/ipi.rs index 6248e599..3295e9fc 100644 --- a/os/src/arch/loongarch/ipi.rs +++ b/os/src/arch/loongarch/ipi.rs @@ -1,7 +1,7 @@ -//! LoongArch64 IPI(占位符实现) +//! LoongArch64 IPI(单核下的最小实现) //! -//! 目前 LoongArch 端尚未完成多核/中断控制器支持。 -//! 为了让通用调度/任务迁移逻辑在 LoongArch 目标上通过编译,这里提供最小 no-op 接口。 +//! 目前 LoongArch 端尚未接入多核 IPI 硬件。 +//! 单核环境下 IPI 调用不需要实际发起中断,保留接口以复用通用调度/任务迁移逻辑。 /// IPI 类型(用于与 RISC-V 端保持接口一致) #[derive(Debug, Clone, Copy, PartialEq, Eq)] @@ -12,20 +12,20 @@ pub enum IpiType { TlbFlush, } -/// 发送单个 IPI(占位符:当前为 no-op) +/// 发送单个 IPI(单核下为 no-op) #[inline] pub fn send_ipi(_target_cpu: usize, _ipi_type: IpiType) {} -/// 按 hart mask 发送 IPI(占位符:当前为 no-op) +/// 按 hart mask 发送 IPI(单核下为 no-op) #[inline] pub fn send_ipi_many(_hart_mask: usize, _ipi_type: IpiType) {} -/// 发送 reschedule IPI(占位符:当前为 no-op) +/// 发送 reschedule IPI(单核下为 no-op) #[inline] pub fn send_reschedule_ipi(cpu: usize) { send_ipi(cpu, IpiType::Reschedule); } -/// 向所有 CPU 发送 TLB flush IPI(占位符:当前为 no-op) +/// 向所有 CPU 发送 TLB flush IPI(单核下为 no-op) #[inline] pub fn send_tlb_flush_ipi_all() {} diff --git a/os/src/arch/loongarch/kernel/mod.rs b/os/src/arch/loongarch/kernel/mod.rs index 45c3d7c0..ed31ca62 100644 --- a/os/src/arch/loongarch/kernel/mod.rs +++ b/os/src/arch/loongarch/kernel/mod.rs @@ -21,13 +21,47 @@ pub mod cpu { /// 获取 CPU ID(别名) pub fn cpu_id() -> usize { - hart_id() + let cpu_ptr: usize; + unsafe { + core::arch::asm!( + "addi.d {0}, $tp, 0", + out(reg) cpu_ptr, + options(nostack, preserves_flags) + ); + } + if cpu_ptr == 0 { + return 0; + } + // Safety: tp 指向 Cpu 结构体,首字段为 cpu_id + unsafe { *(cpu_ptr as *const usize) } } /// 在切换到指定任务后执行的架构相关收尾工作。 /// - /// LoongArch 目前尚未实现 trap/上下文切换,因此此处为 no-op。 - pub fn on_task_switch(_trap_frame_ptr: usize, _cpu_ptr: usize) {} + /// LoongArch 使用 KScratch0 保存当前任务的 TrapFrame 指针, + /// 供 trap_entry 保存/恢复寄存器时使用。 + pub fn on_task_switch(trap_frame_ptr: usize, cpu_ptr: usize) { + if trap_frame_ptr == 0 { + return; + } + unsafe { + let tf = (trap_frame_ptr as *mut crate::arch::trap::TrapFrame) + .as_mut() + .expect("on_task_switch: null TrapFrame"); + tf.cpu_ptr = cpu_ptr; + core::arch::asm!( + "addi.d $tp, {0}, 0", + in(reg) cpu_ptr, + options(nostack, preserves_flags) + ); + // KScratch0 作为 trap_entry 的 TrapFrame 指针。 + core::arch::asm!( + "csrwr {0}, 0x30", + in(reg) trap_frame_ptr, + options(nostack, preserves_flags) + ); + } + } } pub use context::TaskContext; diff --git a/os/src/arch/loongarch/kernel/task.rs b/os/src/arch/loongarch/kernel/task.rs index 20d47579..e0e2909f 100644 --- a/os/src/arch/loongarch/kernel/task.rs +++ b/os/src/arch/loongarch/kernel/task.rs @@ -4,7 +4,15 @@ use alloc::vec::Vec; use core::{mem::size_of, ptr}; use super::context::TaskContext; -use crate::{arch::constant::STACK_ALIGN_MASK, mm::frame_allocator::FrameTracker}; +use crate::{ + arch::{constant::STACK_ALIGN_MASK, mm::paddr_to_vaddr}, + config::PAGE_SIZE, + mm::{ + address::{UsizeConvert, Vaddr}, + frame_allocator::FrameTracker, + memory_space::MemorySpace, + }, +}; /// 初始化内核任务上下文 pub fn init_kernel_task_context(context: &mut TaskContext, entry: usize, kstack: usize) { @@ -25,6 +33,7 @@ pub fn init_fork_context( /// 为新任务设置用户栈布局,包含命令行参数和环境变量 /// 返回新的栈指针位置,以及 argc, argv, envp 的地址 pub fn setup_stack_layout( + space: &MemorySpace, sp: usize, argv: &[&str], envp: &[&str], @@ -33,18 +42,36 @@ pub fn setup_stack_layout( phent: usize, at_base: usize, at_entry: usize, -) -> (usize, usize, usize, usize) { - let mut sp = sp; +) -> (usize, usize, usize, usize, usize) { + // Reserve one page at the top of the user stack for TLS/TCB, and set $tp to + // a stable address inside that page. This is required by many Linux-ABI user + // programs on LoongArch which rely on $tp for TLS. + // TLS lives in the top stack page: [tls_base, tls_base + PAGE_SIZE). + let tls_page_size = PAGE_SIZE; + let tls_base = (sp - 1) & !(tls_page_size - 1); + // Place tp near the top of that page, 16-byte aligned, and within the mapping. + let tls_tp = (sp & !0xf).wrapping_sub(0x10); + + // Ensure the TLS page is mapped (it should be within the mapped user stack range), + // and initialize a minimal self-pointer at tp for libc expectations. + write_user_usize(space, tls_tp, tls_tp); + + // Start placing argv/envp/auxv below the TLS page. + let mut sp = tls_base; + crate::pr_debug!( + "[setup_stack_layout] sp_top=0x{:x}, phdr=0x{:x}, entry=0x{:x}", + sp, + phdr_addr, + at_entry + ); let mut arg_ptrs: Vec = Vec::with_capacity(argv.len()); let mut env_ptrs: Vec = Vec::with_capacity(envp.len()); for &env in envp.iter().rev() { let bytes = env.as_bytes(); sp -= bytes.len() + 1; // 预留 NUL - unsafe { - ptr::copy_nonoverlapping(bytes.as_ptr(), sp as *mut u8, bytes.len()); - (sp as *mut u8).add(bytes.len()).write(0); // NUL 终止符 - } + write_user_bytes(&space, sp, bytes); + write_user_bytes(&space, sp + bytes.len(), &[0]); // NUL 终止符 env_ptrs.push(sp); // 存储字符串的地址 } @@ -52,10 +79,8 @@ pub fn setup_stack_layout( for &arg in argv.iter().rev() { let bytes = arg.as_bytes(); sp -= bytes.len() + 1; // 预留 NUL - unsafe { - ptr::copy_nonoverlapping(bytes.as_ptr(), sp as *mut u8, bytes.len()); - (sp as *mut u8).add(bytes.len()).write(0); // NUL 终止符 - } + write_user_bytes(&space, sp, bytes); + write_user_bytes(&space, sp + bytes.len(), &[0]); // NUL 终止符 arg_ptrs.push(sp); // 存储字符串的地址 } @@ -70,14 +95,14 @@ pub fn setup_stack_layout( 0x67, ]; let random_ptr = sp - 16; - unsafe { ptr::copy_nonoverlapping(random_bytes.as_ptr(), random_ptr as *mut u8, 16) }; + write_user_bytes(&space, random_ptr, &random_bytes); sp = random_ptr; // platform string let platform = "loongarch64\0"; let platform_len = platform.len(); sp -= platform_len; - unsafe { ptr::copy_nonoverlapping(platform.as_ptr(), sp as *mut u8, platform_len) }; + write_user_bytes(&space, sp, platform.as_bytes()); let platform_ptr = sp; // 16 字节对齐(auxv 要求) @@ -130,34 +155,67 @@ pub fn setup_stack_layout( for (type_, val) in auxv.iter().rev() { sp -= size_of::(); - unsafe { ptr::write(sp as *mut usize, *val) }; + write_user_usize(&space, sp, *val); sp -= size_of::(); - unsafe { ptr::write(sp as *mut usize, *type_) }; + write_user_usize(&space, sp, *type_); } // envp NULL sp -= size_of::(); - unsafe { ptr::write(sp as *mut usize, 0) }; + write_user_usize(&space, sp, 0); for &p in env_ptrs.iter() { sp -= size_of::(); - unsafe { ptr::write(sp as *mut usize, p) }; + write_user_usize(&space, sp, p); } let envp_vec_ptr = sp; // argv NULL sp -= size_of::(); - unsafe { ptr::write(sp as *mut usize, 0) }; + write_user_usize(&space, sp, 0); for &p in arg_ptrs.iter() { sp -= size_of::(); - unsafe { ptr::write(sp as *mut usize, p) }; + write_user_usize(&space, sp, p); } let argv_vec_ptr = sp; let argc = argv.len(); sp -= size_of::(); - unsafe { ptr::write(sp as *mut usize, argc) }; + write_user_usize(&space, sp, argc); - (sp, argc, argv_vec_ptr, envp_vec_ptr) + crate::pr_debug!( + "[setup_stack_layout] sp_final=0x{:x}, argc={}, argv=0x{:x}, envp=0x{:x}", + sp, + argc, + argv_vec_ptr, + envp_vec_ptr + ); + (sp, argc, argv_vec_ptr, envp_vec_ptr, tls_tp) +} + +fn write_user_usize(space: &MemorySpace, dst: usize, val: usize) { + let bytes = val.to_ne_bytes(); + write_user_bytes(space, dst, &bytes); +} + +fn write_user_bytes(space: &MemorySpace, dst: usize, data: &[u8]) { + let mut offset = 0usize; + while offset < data.len() { + let vaddr = ::from_usize(dst + offset); + let paddr = space + .translate(vaddr) + .expect("write_user_bytes: translate failed"); + let page_off = (dst + offset) & (PAGE_SIZE - 1); + let chunk = core::cmp::min(PAGE_SIZE - page_off, data.len() - offset); + unsafe { + let dst_va = paddr_to_vaddr(paddr.as_usize()); + let dst_ptr = dst_va as *mut u8; + let src_ptr = data.as_ptr().add(offset); + for i in 0..chunk { + ptr::write(dst_ptr.add(i), ptr::read(src_ptr.add(i))); + } + } + offset += chunk; + } } diff --git a/os/src/arch/loongarch/lib/mem.rs b/os/src/arch/loongarch/lib/mem.rs new file mode 100644 index 00000000..32f815d5 --- /dev/null +++ b/os/src/arch/loongarch/lib/mem.rs @@ -0,0 +1,40 @@ +//! LoongArch64 memory helpers. +//! +//! Provide simple byte-wise implementations to avoid unsupported instructions +//! in QEMU/LoongArch for compiler_builtins memcpy/memmove/memset. + +use core::ptr; + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn memcpy(dst: *mut u8, src: *const u8, n: usize) -> *mut u8 { + for i in 0..n { + ptr::write(dst.add(i), ptr::read(src.add(i))); + } + dst +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn memmove(dst: *mut u8, src: *const u8, n: usize) -> *mut u8 { + if dst as usize == src as usize || n == 0 { + return dst; + } + if (dst as usize) < (src as usize) || (dst as usize) >= (src as usize + n) { + for i in 0..n { + ptr::write(dst.add(i), ptr::read(src.add(i))); + } + } else { + for i in (0..n).rev() { + ptr::write(dst.add(i), ptr::read(src.add(i))); + } + } + dst +} + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn memset(dst: *mut u8, c: i32, n: usize) -> *mut u8 { + let val = c as u8; + for i in 0..n { + ptr::write(dst.add(i), val); + } + dst +} diff --git a/os/src/arch/loongarch/lib/mod.rs b/os/src/arch/loongarch/lib/mod.rs index 43f73f6f..e529af64 100644 --- a/os/src/arch/loongarch/lib/mod.rs +++ b/os/src/arch/loongarch/lib/mod.rs @@ -1,4 +1,5 @@ //! LoongArch64 库模块 pub mod console; +pub mod mem; pub mod sbi; diff --git a/os/src/arch/loongarch/mm/mod.rs b/os/src/arch/loongarch/mm/mod.rs index 0a17b2e5..682ca417 100644 --- a/os/src/arch/loongarch/mm/mod.rs +++ b/os/src/arch/loongarch/mm/mod.rs @@ -1,12 +1,11 @@ //! LoongArch64 内存管理模块 //! //! 本模块提供了针对 **LoongArch64 架构** 的内存管理实现, -//! 使用 **4 级页表** 进行虚拟地址到物理地址的转换。 +//! 使用 **3 级页表** 进行虚拟地址到物理地址的转换。 //! //! # 页表结构 //! -//! LoongArch64 支持 48 位虚拟地址空间,使用 4 级页表: -//! - **Level 3 (PGD)**: 页全局目录,索引 VA[47:39] +//! LoongArch64 支持 39 位虚拟地址空间,使用 3 级页表: //! - **Level 2 (PUD)**: 页上级目录,索引 VA[38:30] //! - **Level 1 (PMD)**: 页中级目录,索引 VA[29:21] //! - **Level 0 (PT)**: 页表,索引 VA[20:12] diff --git a/os/src/arch/loongarch/mm/page_table.rs b/os/src/arch/loongarch/mm/page_table.rs index 0dc78e6d..f2e8006f 100644 --- a/os/src/arch/loongarch/mm/page_table.rs +++ b/os/src/arch/loongarch/mm/page_table.rs @@ -1,11 +1,10 @@ //! LoongArch64 页表管理 //! -//! 实现 4 级页表结构,使用 `loongArch64` crate 进行 CSR 操作。 +//! 实现 3 级页表结构,使用 `loongArch64` crate 进行 CSR 操作。 //! //! # 页表结构 //! -//! LoongArch64 使用 4 级页表(48 位虚拟地址): -//! - Level 3 (Dir4/PGD): 虚拟地址 bits [47:39],9 位索引 +//! LoongArch64 使用 3 级页表(39 位虚拟地址): //! - Level 2 (Dir3/PUD): 虚拟地址 bits [38:30],9 位索引 //! - Level 1 (Dir2/PMD): 虚拟地址 bits [29:21],9 位索引 //! - Level 0 (Dir1/PT): 虚拟地址 bits [20:12],9 位索引 @@ -33,7 +32,7 @@ pub struct PageTableInner { } impl PageTableInnerTrait for PageTableInner { - /// LoongArch64 使用 4 级页表 + /// LoongArch64 使用 4 级页表(匹配 48 位虚拟地址) const LEVELS: usize = 4; /// 48 位虚拟地址 const MAX_VA_BITS: usize = 48; @@ -80,6 +79,33 @@ impl PageTableInnerTrait for PageTableInner { fn activate(ppn: Ppn) { let pgd_paddr = ppn.start_addr().as_usize(); unsafe { + // 设置 STLBPS (CSR 0x1E) - STLB 页大小为 4KB (PS=12) + core::arch::asm!( + "csrwr {0}, 0x1E", + in(reg) 12, + options(nostack, preserves_flags) + ); + // 配置 PWCL (CSR 0x1C) - 4级页表: pte@12, dir1@21, dir2@30 + let pwcl = 12 | (9 << 5) | (21 << 10) | (9 << 15) | (30 << 20) | (9 << 25); + core::arch::asm!( + "csrwr {0}, 0x1C", + in(reg) pwcl, + options(nostack, preserves_flags) + ); + // 配置 PWCH (CSR 0x1D) - dir3@39 + let pwch = 39 | (9 << 6); + core::arch::asm!( + "csrwr {0}, 0x1D", + in(reg) pwch, + options(nostack, preserves_flags) + ); + // 设置 ASID (CSR 0x18) + let asid = ppn.as_usize() & 0x3ff; + core::arch::asm!( + "csrwr {0}, 0x18", + in(reg) asid, + options(nostack, preserves_flags) + ); // 设置 PGDL (CSR 0x19) - 低半地址空间页全局目录基址 core::arch::asm!( "csrwr {0}, 0x19", @@ -92,6 +118,25 @@ impl PageTableInnerTrait for PageTableInner { in(reg) pgd_paddr, options(nostack, preserves_flags) ); + // 启用分页并关闭直接地址翻译 + let mut crmd: usize; + core::arch::asm!( + "csrrd {0}, 0x0", + out(reg) crmd, + options(nostack, preserves_flags) + ); + crmd |= crate::arch::constant::CSR_CRMD_PG; + crmd &= !crate::arch::constant::CSR_CRMD_DA; + // 软件 TLB refill 时必须将 DATF/DATM 设置为 CC + crmd &= !(crate::arch::constant::CSR_CRMD_DATF_MASK + | crate::arch::constant::CSR_CRMD_DATM_MASK); + crmd |= crate::arch::constant::CSR_CRMD_DAT_CC << 5; + crmd |= crate::arch::constant::CSR_CRMD_DAT_CC << 7; + core::arch::asm!( + "csrwr {0}, 0x0", + in(reg) crmd, + options(nostack, preserves_flags) + ); // 刷新 TLB Self::tlb_flush_all(); } @@ -170,7 +215,7 @@ impl PageTableInnerTrait for PageTableInner { let idx = Self::vpn_index(vpn_value, current_level); let pte = Self::read_pte(ppn, idx); - if !pte.is_valid() { + if pte.is_empty() { return None; } @@ -239,8 +284,8 @@ impl PageTableInnerTrait for PageTableInner { Self::tlb_flush(vpn); return Ok(()); } else { - // 中间级别 - if !pte.is_valid() { + // 中间级别:检查目录项是否为空 + if pte.is_empty() { // 分配新的页表 let new_frame = alloc_frame().ok_or(PagingError::FrameAllocFailed)?; let new_ppn = new_frame.ppn(); @@ -274,7 +319,7 @@ impl PageTableInnerTrait for PageTableInner { let idx = Self::vpn_index(vpn_value, level); let pte = Self::read_pte(current_ppn, idx); - if !pte.is_valid() { + if pte.is_empty() { return Err(PagingError::NotMapped); } @@ -312,7 +357,7 @@ impl PageTableInnerTrait for PageTableInner { let idx = Self::vpn_index(vpn_value, level); let mut pte = Self::read_pte(current_ppn, idx); - if !pte.is_valid() { + if pte.is_empty() { return Err(PagingError::NotMapped); } @@ -338,7 +383,7 @@ impl PageTableInnerTrait for PageTableInner { let idx = Self::vpn_index(vpn_value, level); let pte = Self::read_pte(ppn, idx); - if !pte.is_valid() { + if pte.is_empty() { return Err(PagingError::NotMapped); } diff --git a/os/src/arch/loongarch/mm/page_table_entry.rs b/os/src/arch/loongarch/mm/page_table_entry.rs index d2088df7..db498463 100644 --- a/os/src/arch/loongarch/mm/page_table_entry.rs +++ b/os/src/arch/loongarch/mm/page_table_entry.rs @@ -6,12 +6,16 @@ //! //! | 位 | 字段 | 说明 | //! |----|------|------| -//! | 0 | V | Valid - 有效位 | -//! | 1 | D | Dirty - 脏位(同时控制写权限) | +//! | 0 | V | Valid/Accessed - 有效/访问位 | +//! | 1 | D | Dirty - 脏位 | //! | 3:2 | PLV | Privilege Level (0=内核, 3=用户) | //! | 5:4 | MAT | Memory Access Type | //! | 6 | G | Global - 全局位 | -//! | 11:7 | 保留 | 必须为 0 | +//! | 7 | P | Present - 软件 present 位 | +//! | 8 | W | Write - 软件写权限位 | +//! | 9 | M | Modified - 软件 modified 位 | +//! | 10 | PROTNONE | 软件 PROT_NONE 位 | +//! | 11 | SPECIAL | 软件 special 位 | //! | 47:12 | PPN | 物理页号 (PALEN-1:12) | //! | 60:48 | 保留 | 必须为 0 | //! | 61 | NR | Non-Readable (0=可读,1=不可读) | @@ -29,11 +33,10 @@ bitflags::bitflags! { /// 注意:LoongArch 使用 NR/NX 表示不可读/不可执行(反逻辑) #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct LAPTEFlags: u64 { - /// 有效位 (bit 0) + /// 有效/访问位 (bit 0) const VALID = 1 << 0; - /// 脏位 (bit 1) - 同时控制写权限 - /// D=1 表示页面可写且已被修改 + /// 脏位 (bit 1) const DIRTY = 1 << 1; /// 特权级位 0 (bit 2) @@ -61,7 +64,20 @@ bitflags::bitflags! { /// 全局位 (bit 6) const GLOBAL = 1 << 6; - // bits 7-11 保留,必须为 0 + /// 软件 present 位 (bit 7) + const PRESENT = 1 << 7; + + /// 软件写权限位 (bit 8) + const WRITE = 1 << 8; + + /// 软件 modified 位 (bit 9) + const MODIFIED = 1 << 9; + + /// 软件 PROT_NONE 位 (bit 10) + const PROTNONE = 1 << 10; + + /// 软件 special 位 (bit 11) + const SPECIAL = 1 << 11; /// 不可读位 (bit 61) - 0=可读,1=不可读 /// 仅 LA64 支持 @@ -128,8 +144,9 @@ impl UniversalConvertableFlag for LAPTEFlags { let mut result = LAPTEFlags::empty(); if flag.contains(UniversalPTEFlag::VALID) { - // 有效页面启用一致性缓存 - result |= LAPTEFlags::VALID | LAPTEFlags::MAT_CC; + // 标记软件 present,并启用一致性缓存。 + // 这里同时设置 VALID 位(不做 accessed/dirty 跟踪)。 + result |= LAPTEFlags::PRESENT | LAPTEFlags::VALID | LAPTEFlags::MAT_CC; } // READABLE: 不设置 NR 位(默认 NR=0 表示可读) @@ -139,8 +156,9 @@ impl UniversalConvertableFlag for LAPTEFlags { } if flag.contains(UniversalPTEFlag::WRITEABLE) { - // D 位同时表示可写权限 - result |= LAPTEFlags::DIRTY; + // LoongArch Linux 软件约定:WRITE 控制写权限,DIRTY 用于脏页标记。 + // 为简化实现,这里对可写页同时置位 WRITE + DIRTY。 + result |= LAPTEFlags::WRITE | LAPTEFlags::DIRTY; } // EXECUTABLE: 不设置 NX 位(默认 NX=0 表示可执行) @@ -177,7 +195,7 @@ impl UniversalConvertableFlag for LAPTEFlags { fn to_universal(&self) -> UniversalPTEFlag { let mut result = UniversalPTEFlag::empty(); - if self.contains(LAPTEFlags::VALID) { + if self.contains(LAPTEFlags::PRESENT) { result |= UniversalPTEFlag::VALID; } @@ -186,10 +204,11 @@ impl UniversalConvertableFlag for LAPTEFlags { result |= UniversalPTEFlag::READABLE; } - // D 位表示可写(同时也是脏位) - // 为支持脏页跟踪,同时设置 WRITEABLE 和 DIRTY + if self.contains(LAPTEFlags::WRITE) { + result |= UniversalPTEFlag::WRITEABLE; + } if self.contains(LAPTEFlags::DIRTY) { - result |= UniversalPTEFlag::WRITEABLE | UniversalPTEFlag::DIRTY; + result |= UniversalPTEFlag::DIRTY; } // NX=0 表示可执行 @@ -216,8 +235,8 @@ const LA64_PTE_PPN_OFFSET: u32 = 12; /// PPN 掩码 (bits 12-47,支持 48 位物理地址) const LA64_PTE_PPN_MASK: u64 = 0x0000_FFFF_FFFF_F000; -/// 标志位掩码 (bits 0-6 + 61-63) -const LA64_PTE_FLAG_MASK_LOW: u64 = 0x7F; // bits 0-6 +/// 标志位掩码 (bits 0-11 + 61-63) +const LA64_PTE_FLAG_MASK_LOW: u64 = 0x0FFF; // bits 0-11 const LA64_PTE_FLAG_MASK_HIGH: u64 = 0xE000_0000_0000_0000; // bits 61-63 /// LoongArch 页表项 @@ -249,16 +268,16 @@ impl PageTableEntryTrait for PageTableEntry { /// 创建表节点(指向下一级页表) /// - /// 表节点只需设置 VALID 位,不设置 NR/NX(保持可访问) + /// LoongArch 目录项不设置 V 位,只存储物理地址。 + /// LDDIR 指令会直接使用目录项中的地址作为下一级页表基址。 fn new_table(ppn: Ppn) -> Self { let ppn_bits: u64 = ppn.as_usize() as u64; - // 表节点:VALID + MAT_CC,不设置权限位 - let flags = LAPTEFlags::VALID | LAPTEFlags::MAT_CC; - PageTableEntry((ppn_bits << LA64_PTE_PPN_OFFSET) | flags.bits()) + // 目录项只存储物理地址,不设置任何标志位 + PageTableEntry(ppn_bits << LA64_PTE_PPN_OFFSET) } fn is_valid(&self) -> bool { - (self.0 & LAPTEFlags::VALID.bits()) != 0 + (self.0 & LAPTEFlags::PRESENT.bits()) != 0 } /// 检查是否为巨页(Huge Page) diff --git a/os/src/arch/loongarch/syscall/mod.rs b/os/src/arch/loongarch/syscall/mod.rs index e23811a1..1b0e93ff 100644 --- a/os/src/arch/loongarch/syscall/mod.rs +++ b/os/src/arch/loongarch/syscall/mod.rs @@ -4,10 +4,14 @@ mod syscall_number; pub use syscall_number::*; +use core::sync::atomic::{AtomicUsize, Ordering}; + use crate::arch::trap::TrapFrame; use crate::kernel::syscall::*; use crate::uapi::errno::ENOSYS; +static UNKNOWN_SYSCALL_LOG_BUDGET: AtomicUsize = AtomicUsize::new(16); + /// 分发系统调用 pub fn dispatch_syscall(frame: &mut TrapFrame) { let syscall_id = frame.syscall_id(); @@ -178,10 +182,21 @@ pub fn dispatch_syscall(frame: &mut TrapFrame) { // 随机数与内存文件 SYS_GETRANDOM => sys_getrandom(frame), + // 扩展文件元数据 + SYS_STATX => sys_statx(frame), + // 获取网络接口地址列表 (非标准系统调用) SYS_GETIFADDRS => sys_getifaddrs(frame), _ => { + let log_now = UNKNOWN_SYSCALL_LOG_BUDGET + .fetch_update(Ordering::Relaxed, Ordering::Relaxed, |n| n.checked_sub(1)) + .is_ok(); + if log_now { + crate::pr_warn!("[syscall] unknown syscall id={}", syscall_id); + } else { + crate::pr_debug!("[syscall] unknown syscall id={}", syscall_id); + } frame.set_syscall_ret((-ENOSYS) as usize); } } diff --git a/os/src/arch/loongarch/syscall/syscall_number.rs b/os/src/arch/loongarch/syscall/syscall_number.rs index 194f3405..25e21040 100644 --- a/os/src/arch/loongarch/syscall/syscall_number.rs +++ b/os/src/arch/loongarch/syscall/syscall_number.rs @@ -261,5 +261,8 @@ pub const SYS_RENAMEAT2: usize = 276; /// 随机数与内存文件 pub const SYS_GETRANDOM: usize = 278; +/// 扩展文件元数据 (Extended File Attributes) +pub const SYS_STATX: usize = 291; + /// 获取网络接口地址列表 (非标准系统调用) pub const SYS_GETIFADDRS: usize = 1000; diff --git a/os/src/arch/loongarch/trap/mod.rs b/os/src/arch/loongarch/trap/mod.rs index 8dbecf5a..69723448 100644 --- a/os/src/arch/loongarch/trap/mod.rs +++ b/os/src/arch/loongarch/trap/mod.rs @@ -48,9 +48,10 @@ pub fn kernel_sigreturn_trampoline_bytes() -> &'static [u8] { unsafe { core::slice::from_raw_parts(start as *const u8, len) } } -/// 设置 TrapFrame 中与当前 CPU 相关的字段(占位符)。 -/// -/// LoongArch 端 TrapFrame 当前不携带类似 RISC-V 的 `cpu_ptr` 字段; -/// 为了让通用任务初始化/迁移逻辑保持无条件编译,这里提供 no-op 接口。 +/// 设置 TrapFrame 中与当前 CPU 相关的字段。 #[inline] -pub unsafe fn set_trap_frame_cpu_ptr(_trap_frame_ptr: *mut TrapFrame, _cpu_ptr: usize) {} +pub unsafe fn set_trap_frame_cpu_ptr(trap_frame_ptr: *mut TrapFrame, cpu_ptr: usize) { + if let Some(tf) = trap_frame_ptr.as_mut() { + tf.cpu_ptr = cpu_ptr; + } +} diff --git a/os/src/arch/loongarch/trap/trap_entry.S b/os/src/arch/loongarch/trap/trap_entry.S index c9a9d951..93736e2d 100644 --- a/os/src/arch/loongarch/trap/trap_entry.S +++ b/os/src/arch/loongarch/trap/trap_entry.S @@ -1,24 +1,26 @@ # LoongArch64 trap entry and context restore .text .globl trap_entry +.globl tlb_refill_entry .globl boot_trap_entry .globl __restore .globl trap_handler trap_entry: boot_trap_entry: - # 保留原始 t2,使用 KScratch1 作为临时保存区 - csrwr $t2, 0x49 # KScratch1 <- 原始 t2 + # 保留原始寄存器,避免覆盖 KScratch0(其长期保存 TrapFrame 指针) + csrwr $a0, 0x31 # KScratch1 <- 原始 a0 + csrwr $t1, 0x32 # KScratch2 <- 原始 t1 - # 读取 KScratch0 中的 TrapFrame 指针,顺便将原始 a0 写回 KScratch0 - csrrd $t1, 0x48 # t1 <- tf_ptr (保存于 KScratch0) - csrwr $a0, 0x48 # KScratch0 <- 原始 a0 + # 读取 KScratch0 中的 TrapFrame 指针 + csrrd $t1, 0x30 # t1 <- tf_ptr (保存于 KScratch0) move $a0, $t1 # a0 <- tf_ptr # 保存通用寄存器到 TrapFrame.regs[0..31] st.d $r0, $a0, 0 # r0 (zero) st.d $ra, $a0, 8 # r1 st.d $tp, $a0, 16 # r2 + ld.d $tp, $a0, 296 # tp <- cpu_ptr (kernel per-CPU 指针) st.d $sp, $a0, 24 # r3 st.d $a1, $a0, 40 # r5 st.d $a2, $a0, 48 # r6 @@ -28,9 +30,10 @@ boot_trap_entry: st.d $a6, $a0, 80 # r10 st.d $a7, $a0, 88 # r11 st.d $t0, $a0, 96 # r12 - st.d $t1, $a0, 104 # r13 - csrrd $t2, 0x49 # 取回原始 t2 - st.d $t2, $a0, 112 # r14 + # r13/t1 has been clobbered to hold tf_ptr; restore original t1 from KScratch2. + csrrd $t1, 0x32 + st.d $t1, $a0, 104 # r13 (t1) + st.d $t2, $a0, 112 # r14 (t2) st.d $t3, $a0, 120 # r15 st.d $t4, $a0, 128 # r16 st.d $t5, $a0, 136 # r17 @@ -38,21 +41,20 @@ boot_trap_entry: st.d $t7, $a0, 152 # r19 st.d $t8, $a0, 160 # r20 st.d $r21, $a0, 168 # r21 - st.d $fp, $a0, 176 # r22 / s0 - st.d $s1, $a0, 184 # r23 / s1 - st.d $s2, $a0, 192 # r24 / s2 - st.d $s3, $a0, 200 # r25 / s3 - st.d $s4, $a0, 208 # r26 / s4 - st.d $s5, $a0, 216 # r27 / s5 - st.d $s6, $a0, 224 # r28 / s6 - st.d $s7, $a0, 232 # r29 / s7 - st.d $s8, $a0, 240 # r30 / s8 - st.d $r31, $a0, 248 # r31 + st.d $fp, $a0, 176 # r22 / fp + st.d $s0, $a0, 184 # r23 / s0 + st.d $s1, $a0, 192 # r24 / s1 + st.d $s2, $a0, 200 # r25 / s2 + st.d $s3, $a0, 208 # r26 / s3 + st.d $s4, $a0, 216 # r27 / s4 + st.d $s5, $a0, 224 # r28 / s5 + st.d $s6, $a0, 232 # r29 / s6 + st.d $s7, $a0, 240 # r30 / s7 + st.d $s8, $a0, 248 # r31 / s8 - # 保存原始 a0(现存于 KScratch0 中) - csrrd $t1, 0x48 # t1 <- old a0 - st.d $t1, $a0, 32 # r4 - csrwr $a0, 0x48 # 恢复 KScratch0 为 TrapFrame 指针 + # 保存原始 a0(保存在 KScratch1 中) + csrrd $t1, 0x31 # t1 <- old a0 + st.d $t1, $a0, 32 # r4 (a0) # 保存异常相关 CSR csrrd $t1, 0x6 # ERA @@ -77,7 +79,7 @@ boot_trap_entry: __restore: # 使用 r21 作为基址寄存器,避免提前被覆盖 move $r21, $a0 # r21 <- TrapFrame 指针 - csrwr $r21, 0x48 # 更新 KScratch0,供下一次陷阱使用 + csrwr $r21, 0x30 # 更新 KScratch0,供下一次陷阱使用 # 恢复 CSR ld.d $t0, $r21, 256 # ERA @@ -108,18 +110,34 @@ __restore: ld.d $t7, $r21, 152 ld.d $t8, $r21, 160 ld.d $fp, $r21, 176 - ld.d $s1, $r21, 184 - ld.d $s2, $r21, 192 - ld.d $s3, $r21, 200 - ld.d $s4, $r21, 208 - ld.d $s5, $r21, 216 - ld.d $s6, $r21, 224 - ld.d $s7, $r21, 232 - ld.d $s8, $r21, 240 - ld.d $r31, $r21, 248 + ld.d $s0, $r21, 184 + ld.d $s1, $r21, 192 + ld.d $s2, $r21, 200 + ld.d $s3, $r21, 208 + ld.d $s4, $r21, 216 + ld.d $s5, $r21, 224 + ld.d $s6, $r21, 232 + ld.d $s7, $r21, 240 + ld.d $s8, $r21, 248 # 先恢复 a0(返回值),再恢复 r21 本身 ld.d $a0, $r21, 32 ld.d $r21, $r21, 168 # 结束陷阱,返回异常前上下文 - ertn \ No newline at end of file + ertn + +# TLB refill entry (hardware-assisted walk with LDDIR/LDPTE). +# Use CSR.TLBRSAVE (0x8b) to preserve $t0 only, and avoid clobbering KSAVE/KSCRATCH +# CSRs that trap_entry relies on. + .align 12 + tlb_refill_entry: + csrwr $t0, 0x8b # TLBRSAVE <- t0 + csrrd $t0, 0x1b # CSR.PGD (auto-selects PGDL/PGDH) + lddir $t0, $t0, 3 + lddir $t0, $t0, 2 + lddir $t0, $t0, 1 + ldpte $t0, 0 + ldpte $t0, 1 + tlbfill + csrrd $t0, 0x8b # restore t0 + ertn diff --git a/os/src/arch/loongarch/trap/trap_frame.rs b/os/src/arch/loongarch/trap/trap_frame.rs index 60b7d537..18231c9b 100644 --- a/os/src/arch/loongarch/trap/trap_frame.rs +++ b/os/src/arch/loongarch/trap/trap_frame.rs @@ -1,5 +1,6 @@ //! LoongArch64 陷阱帧定义 +use crate::arch::constant::{CSR_CRMD_PLV_MASK, PRMD_PIE, PRMD_PPLV_MASK, PRMD_PPLV_USER}; use crate::uapi::signal::MContextT; /// 陷阱帧结构 @@ -19,6 +20,8 @@ pub struct TrapFrame { pub prmd: usize, /// 内核栈指针 pub kernel_sp: usize, + /// 当前 CPU 结构体指针(供 trap_entry 设置 tp) + pub cpu_ptr: usize, } impl TrapFrame { @@ -31,6 +34,7 @@ impl TrapFrame { crmd: 0, prmd: 0, kernel_sp: 0, + cpu_ptr: 0, } } @@ -137,15 +141,32 @@ impl TrapFrame { argc: usize, argv: usize, envp: usize, + tls_tp: usize, ) { *self = Self::zero_init(); self.era = entry; + self.regs[2] = tls_tp; // tp (thread pointer / TLS) self.regs[3] = user_sp; // sp self.regs[4] = argc; // a0 self.regs[5] = argv; // a1 self.regs[6] = envp; // a2 self.kernel_sp = kernel_sp; - // TODO: 设置 PRMD 为用户态 + // 设置返回用户态的 PRMD 和 CRMD + self.prmd = (PRMD_PPLV_USER & PRMD_PPLV_MASK) | PRMD_PIE; + // CRMD: 清除 PLV 和 DA,设置 PG(映射模式) + use crate::arch::constant::{CSR_CRMD_DA, CSR_CRMD_PG}; + self.crmd = (read_crmd() & !CSR_CRMD_PLV_MASK & !CSR_CRMD_DA) | CSR_CRMD_PG; + crate::pr_debug!( + "[exec_trap_frame] era={:#x}, sp={:#x}, tp={:#x}, prmd={:#x}, crmd={:#x}, a0={:#x}, a1={:#x}, a2={:#x}", + self.era, + self.regs[3], + self.regs[2], + self.prmd, + self.crmd, + self.regs[4], + self.regs[5], + self.regs[6], + ); } /// 设置克隆线程的 TrapFrame @@ -201,6 +222,19 @@ impl TrapFrame { } } +#[inline(always)] +fn read_crmd() -> usize { + let value: usize; + unsafe { + core::arch::asm!( + "csrrd {value}, 0x0", + value = out(reg) value, + options(nostack, preserves_flags) + ); + } + value +} + impl Default for TrapFrame { fn default() -> Self { Self::empty() diff --git a/os/src/arch/loongarch/trap/trap_handler.rs b/os/src/arch/loongarch/trap/trap_handler.rs index 8f8417df..b98d3e26 100644 --- a/os/src/arch/loongarch/trap/trap_handler.rs +++ b/os/src/arch/loongarch/trap/trap_handler.rs @@ -1,8 +1,10 @@ //! LoongArch64 陷阱处理实现(与 RISC-V 路径一致的接口)。 -use core::sync::atomic::Ordering; +use core::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; -use crate::arch::constant::{CSR_BADI, CSR_BADV, CSR_CRMD_PLV_MASK, CSR_EENTRY, CSR_ESTAT_IS_MASK}; +use crate::arch::constant::{ + CSR_BADI, CSR_BADV, CSR_CRMD_PLV_MASK, CSR_EENTRY, CSR_ESTAT_IS_MASK, CSR_TLBRENT, +}; use crate::arch::syscall::dispatch_syscall; use crate::arch::timer::{ TIMER_TICKS, ack_timer_interrupt, clock_freq, get_time, set_next_trigger, @@ -18,12 +20,17 @@ use super::TrapFrame; #[unsafe(no_mangle)] pub static mut BOOT_TRAP_FRAME: TrapFrame = TrapFrame::empty(); +static FIRST_TRAP_LOGGED: AtomicBool = AtomicBool::new(false); +static FIRST_USER_TIMER_LOGGED: AtomicBool = AtomicBool::new(false); +static USER_SYSCALL_LOG_BUDGET: AtomicUsize = AtomicUsize::new(16); + const ECODE_SYSCALL: usize = 0xb; // LoongArch syscall 异常码 const TIMER_INT_BIT: usize = 1 << 11; // ESTAT.IS 中的本地定时器位 unsafe extern "C" { unsafe fn __restore(tf: &TrapFrame); unsafe fn trap_entry(); + unsafe fn tlb_refill_entry(); } /// 汇编入口调用的陷阱处理函数。 @@ -33,6 +40,30 @@ pub extern "C" fn trap_handler(trap_frame: &mut TrapFrame) { let estat = trap_frame.estat; let era = trap_frame.era; + if !FIRST_TRAP_LOGGED.swap(true, Ordering::Relaxed) { + let badv: usize; + let badi: usize; + let pgdl: usize; + let pgdh: usize; + unsafe { + core::arch::asm!("csrrd {0}, {csr}", out(reg) badv, csr = const CSR_BADV, options(nostack, preserves_flags)); + core::arch::asm!("csrrd {0}, {csr}", out(reg) badi, csr = const CSR_BADI, options(nostack, preserves_flags)); + core::arch::asm!("csrrd {0}, 0x19", out(reg) pgdl, options(nostack, preserves_flags)); + core::arch::asm!("csrrd {0}, 0x1a", out(reg) pgdh, options(nostack, preserves_flags)); + } + crate::pr_debug!( + "[trap_handler] first trap: estat={:#x}, era={:#x}, prmd={:#x}, crmd={:#x}, badv={:#x}, badi={:#x}, pgdl={:#x}, pgdh={:#x}", + estat, + era, + prmd, + trap_frame.crmd, + badv, + badi, + pgdl, + pgdh + ); + } + if (prmd & CSR_CRMD_PLV_MASK) != 0 { user_trap(estat, era, trap_frame); } else { @@ -41,8 +72,12 @@ pub extern "C" fn trap_handler(trap_frame: &mut TrapFrame) { check_signal(); - // Safety: __restore 会恢复全部寄存器并执行 ertn - unsafe { restore(trap_frame) }; + // 恢复“当前任务”的陷阱帧;若没有当前任务,回退到入口参数。 + let tf_ptr = crate::kernel::try_current_task() + .map(|t| t.lock().trap_frame_ptr.load(Ordering::SeqCst) as usize) + .unwrap_or(trap_frame as *mut _ as usize); + // Safety: 指针来源于当前任务保存的 trap_frame_ptr 或回退到入口参数。 + unsafe { restore(&*(tf_ptr as *const TrapFrame)) }; } /// 安装启动阶段的陷阱入口 @@ -62,9 +97,14 @@ fn install_trap_entry() { let sp: usize; core::arch::asm!("addi.d {0}, $sp, 0", out(reg) sp, options(nostack, preserves_flags)); BOOT_TRAP_FRAME.kernel_sp = sp; + BOOT_TRAP_FRAME.cpu_ptr = crate::kernel::current_cpu() as *const _ as usize; // KScratch0 <- TrapFrame 指针 - core::arch::asm!("csrwr {0}, 0x48", in(reg) (&raw mut BOOT_TRAP_FRAME as *mut TrapFrame as usize), options(nostack, preserves_flags)); + core::arch::asm!( + "csrwr {0}, 0x30", + in(reg) (&raw mut BOOT_TRAP_FRAME as *mut TrapFrame as usize), + options(nostack, preserves_flags) + ); // EENTRY <- trap_entry(注意 CSR 编号为 0xc) core::arch::asm!( "csrwr {val}, {csr}", @@ -72,11 +112,61 @@ fn install_trap_entry() { csr = const CSR_EENTRY, options(nostack, preserves_flags) ); + // TLB refill 入口使用独立处理,进行软件页表遍历与 tlbfill + // TLBRENT 必须使用物理地址,因为 TLB refill 时 CPU 处于直接地址翻译模式 + let tlbr_entry_paddr = + unsafe { crate::arch::mm::vaddr_to_paddr(tlb_refill_entry as usize) } & !0xfff; + core::arch::asm!( + "csrwr {val}, {csr}", + val = in(reg) tlbr_entry_paddr, + csr = const CSR_TLBRENT, + options(nostack, preserves_flags) + ); + + // 设置 TLBIDX.PS = 12 (4KB 页) + // TLBIDX 的 PS 字段在 bits [29:24] + core::arch::asm!( + "csrrd $t0, 0x10", + "li.w $t1, 12", + "bstrins.d $t0, $t1, 29, 24", + "csrwr $t0, 0x10", + out("$t0") _, + out("$t1") _, + options(nostack) + ); + + // 设置 TLBREHI.PS = 12 (4KB 页) + // TLBREHI 的 PS 字段在 bits [5:0] + core::arch::asm!( + "csrrd $t0, 0x8e", + "li.w $t1, 12", + "bstrins.d $t0, $t1, 5, 0", + "csrwr $t0, 0x8e", + out("$t0") _, + out("$t1") _, + options(nostack) + ); + + let tlbrent: usize; + core::arch::asm!( + "csrrd {0}, {csr}", + out(reg) tlbrent, + csr = const CSR_TLBRENT, + options(nostack, preserves_flags) + ); + crate::pr_info!( + "[trap_init] tlbrent={:#x}, tlbr_paddr={:#x}", + tlbrent, + tlbr_entry_paddr + ); } } fn user_trap(estat: usize, era: usize, trap_frame: &mut TrapFrame) { if estat & CSR_ESTAT_IS_MASK != 0 { + if (estat & TIMER_INT_BIT) != 0 && !FIRST_USER_TIMER_LOGGED.swap(true, Ordering::Relaxed) { + crate::pr_debug!("[user_trap] first user timer interrupt, era={:#x}", era); + } handle_interrupt(estat); return; } @@ -84,6 +174,15 @@ fn user_trap(estat: usize, era: usize, trap_frame: &mut TrapFrame) { let ecode = (estat >> 16) & 0x3f; match ecode { ECODE_SYSCALL => { + let syscall_id = trap_frame.syscall_id(); + let log_now = USER_SYSCALL_LOG_BUDGET + .fetch_update(Ordering::Relaxed, Ordering::Relaxed, |n| n.checked_sub(1)) + .is_ok(); + if log_now { + crate::pr_info!("[user_trap] syscall id={}, era={:#x}", syscall_id, era); + } else { + crate::pr_debug!("[user_trap] syscall id={}, era={:#x}", syscall_id, era); + } trap_frame.era = era.wrapping_add(4); dispatch_syscall(trap_frame); } @@ -124,7 +223,6 @@ fn handle_interrupt(estat: usize) { set_next_trigger(); check_timer(); } - // 其他中断交给中断控制器驱动 } fn user_panic(estat: usize, era: usize, trap_frame: &TrapFrame) { diff --git a/os/src/arch/riscv/intr/mod.rs b/os/src/arch/riscv/intr/mod.rs index 7890744c..7854690f 100644 --- a/os/src/arch/riscv/intr/mod.rs +++ b/os/src/arch/riscv/intr/mod.rs @@ -10,7 +10,7 @@ pub use softirq::*; use crate::{ arch::{ - constant::{IRQ_MIN, SSTATUS_SIE}, + constant::{IRQ_MIN, SSTATUS_SIE, SUPERVISOR_EXTERNAL}, mm::paddr_to_vaddr, }, println, @@ -116,5 +116,7 @@ pub unsafe fn restore_interrupts(flags: usize) { /// 启用指定的中断号 pub fn enable_irq(irq: usize) { - // Handled in PLIC driver + if irq == SUPERVISOR_EXTERNAL { + unsafe { sie::set_sext() }; + } } diff --git a/os/src/arch/riscv/syscall/mod.rs b/os/src/arch/riscv/syscall/mod.rs index 898d9744..8f7e002f 100644 --- a/os/src/arch/riscv/syscall/mod.rs +++ b/os/src/arch/riscv/syscall/mod.rs @@ -174,6 +174,9 @@ pub fn dispatch_syscall(frame: &mut super::trap::TrapFrame) { // 随机数与内存文件 syscall_number::SYS_GETRANDOM => sys_getrandom(frame), + // 扩展文件元数据 + syscall_number::SYS_STATX => sys_statx(frame), + // 获取网络接口地址列表 (非标准系统调用) syscall_number::SYS_GETIFADDRS => sys_getifaddrs(frame), diff --git a/os/src/arch/riscv/syscall/syscall_number.rs b/os/src/arch/riscv/syscall/syscall_number.rs index 2304eb1d..7e3f07d9 100644 --- a/os/src/arch/riscv/syscall/syscall_number.rs +++ b/os/src/arch/riscv/syscall/syscall_number.rs @@ -372,6 +372,7 @@ pub const SYS_PWRITEV2: usize = 287; pub const SYS_PKEY_MPROTECT: usize = 288; pub const SYS_PKEY_ALLOC: usize = 289; pub const SYS_PKEY_FREE: usize = 290; +pub const SYS_STATX: usize = 291; /// RISC-V 架构特定系统调用 pub const SYS_SYSRISCV: usize = SYS_ARCH_SPECIFIC_SYSCALL; // 244 diff --git a/os/src/arch/riscv/trap/trap_handler.rs b/os/src/arch/riscv/trap/trap_handler.rs index 6074e1c0..40f01006 100644 --- a/os/src/arch/riscv/trap/trap_handler.rs +++ b/os/src/arch/riscv/trap/trap_handler.rs @@ -10,9 +10,11 @@ use riscv::register::scause::{self, Trap}; use riscv::register::sstatus::SPP; use riscv::register::{sepc, sscratch, sstatus, stval}; +use crate::arch::constant::SUPERVISOR_EXTERNAL; use crate::arch::syscall::dispatch_syscall; use crate::arch::timer::{TIMER_TICKS, clock_freq, get_time}; use crate::arch::trap::restore; +use crate::device::IRQ_MANAGER; use crate::kernel::{TIMER, TIMER_QUEUE, schedule, send_signal_process, wake_up_with_block}; /// 陷阱处理程序 @@ -90,6 +92,10 @@ pub fn user_trap( schedule(); } } + Trap::Interrupt(9) => { + // 外部中断(设备) + check_device(); + } _ => { // 立即读取相关寄存器的当前值 let stval_val = stval::read(); @@ -286,6 +292,10 @@ pub fn kernel_trap(scause: scause::Scause, sepc_old: usize, sstatus_old: sstatus schedule(); } } + Trap::Interrupt(9) => { + // 外部中断(设备) + check_device(); + } // 中断处理时发生异常一般是致命的 Trap::Exception(e) => { // 立即读取 sscratch 和 stval 寄存器的当前值 @@ -346,5 +356,9 @@ pub fn check_timer() { } #[allow(dead_code)] -/// TODO: 处理设备中断 -pub fn check_device() {} +/// 处理设备中断 +pub fn check_device() { + IRQ_MANAGER + .read() + .try_handle_interrupt(Some(SUPERVISOR_EXTERNAL)); +} diff --git a/os/src/fs/ext4/mod.rs b/os/src/fs/ext4/mod.rs index b1fa997e..e7a5650c 100644 --- a/os/src/fs/ext4/mod.rs +++ b/os/src/fs/ext4/mod.rs @@ -64,6 +64,7 @@ use crate::pr_info; use crate::sync::Mutex; use crate::vfs::{FileSystem, FsError, Inode, StatFs}; use alloc::sync::Arc; +use ext4_rs::BlockDevice; /// Ext4 文件系统 pub struct Ext4FileSystem { @@ -113,6 +114,11 @@ impl Ext4FileSystem { // 创建适配器 let adapter = Arc::new(BlockDeviceAdapter::new(device.clone(), block_size)); + // 预检 superblock,避免 ext4_rs 在坏镜像/错误读取时 panic + if let Err(e) = validate_superblock(&adapter) { + return Err(e); + } + // 使用 ext4_rs 打开文件系统 // 注意:ext4_rs::Ext4::open 直接返回 Ext4,不返回 Result pr_info!("[Ext4] Calling ext4_rs::Ext4::open..."); @@ -138,6 +144,35 @@ impl Ext4FileSystem { } } +fn validate_superblock(adapter: &BlockDeviceAdapter) -> Result<(), FsError> { + const SUPERBLOCK_OFFSET: usize = 1024; + const MAGIC_OFFSET: usize = 0x38; + const BLOCKS_PER_GROUP_OFFSET: usize = 0x20; + const EXT4_MAGIC: u16 = 0xEF53; + + let buf = adapter.read_offset(SUPERBLOCK_OFFSET); + if buf.len() < MAGIC_OFFSET + 2 { + crate::pr_err!("[Ext4] Superblock read too small: {}", buf.len()); + return Err(FsError::IoError); + } + let magic = u16::from_le_bytes([buf[MAGIC_OFFSET], buf[MAGIC_OFFSET + 1]]); + if magic != EXT4_MAGIC { + crate::pr_err!("[Ext4] Invalid ext4 magic: {:#x}", magic); + return Err(FsError::InvalidArgument); + } + let blocks_per_group = u32::from_le_bytes([ + buf[BLOCKS_PER_GROUP_OFFSET], + buf[BLOCKS_PER_GROUP_OFFSET + 1], + buf[BLOCKS_PER_GROUP_OFFSET + 2], + buf[BLOCKS_PER_GROUP_OFFSET + 3], + ]); + if blocks_per_group == 0 { + crate::pr_err!("[Ext4] Invalid superblock: blocks_per_group=0"); + return Err(FsError::InvalidArgument); + } + Ok(()) +} + impl FileSystem for Ext4FileSystem { fn fs_type(&self) -> &'static str { "ext4" diff --git a/os/src/kernel/syscall/fs.rs b/os/src/kernel/syscall/fs.rs index bec1ba93..82de8705 100644 --- a/os/src/kernel/syscall/fs.rs +++ b/os/src/kernel/syscall/fs.rs @@ -20,7 +20,7 @@ use crate::{ }, vfs::{ DENTRY_CACHE, Dentry, FileMode, FsError, InodeType, OpenFlags, RegFile, SeekWhence, Stat, - split_path, vfs_lookup, + Statx, split_path, vfs_lookup, }, }; @@ -718,6 +718,75 @@ pub fn newfstatat(dirfd: i32, pathname: *const c_char, statbuf: *mut Stat, flags 0 } +pub fn statx( + dirfd: i32, + pathname: *const c_char, + flags: u32, + _mask: u32, + statxbuf: *mut Statx, +) -> isize { + if statxbuf.is_null() { + return -(EINVAL as isize); + } + + // 解析路径 + let _guard = SumGuard::new(); + let path_str = match get_path_safe(pathname) { + Ok(s) => s.to_string(), + Err(_) => { + return -(EINVAL as isize); + } + }; + + let at_flags = AtFlags::from_bits_truncate(flags); + + // 处理 AT_EMPTY_PATH 标志:pathname 为空时,对 dirfd 指向的文件执行 statx + if path_str.is_empty() && at_flags.contains(AtFlags::EMPTY_PATH) { + if dirfd == AT_FDCWD { + return -(EINVAL as isize); + } + + let task = current_task(); + let file = match task.lock().fd_table.get(dirfd as usize) { + Ok(f) => f, + Err(e) => return e.to_errno(), + }; + let metadata = match file.metadata() { + Ok(m) => m, + Err(e) => return e.to_errno(), + }; + + let stx = crate::vfs::Statx::from_metadata(&metadata); + let _guard = SumGuard::new(); + unsafe { + core::ptr::write(statxbuf, stx); + } + return 0; + } + + // 查找文件 + let follow_symlink = !at_flags.contains(AtFlags::SYMLINK_NOFOLLOW); + let dentry = match resolve_at_path_with_flags(dirfd, &path_str, follow_symlink) { + Ok(d) => d, + Err(e) => return e.to_errno(), + }; + + let metadata = match dentry.inode.metadata() { + Ok(m) => m, + Err(e) => return e.to_errno(), + }; + + let stx = crate::vfs::Statx::from_metadata(&metadata); + + // 写回用户空间 + let _guard = SumGuard::new(); + unsafe { + core::ptr::write(statxbuf, stx); + } + + 0 +} + pub fn utimensat(dirfd: i32, pathname: *const c_char, times: *const TimeSpec, flags: u32) -> isize { // 解析路径 let _guard = SumGuard::new(); @@ -1177,34 +1246,68 @@ pub fn mount( String::new() }; - crate::pr_info!( + crate::pr_debug!( "[SYSCALL] mount: source='{}', target='{}', type='{}'", source_str, target_str, fstype_str ); + fn ensure_dir_exists(path: &str) -> Result<(), FsError> { + use crate::vfs::{FileMode, split_path, vfs_lookup}; + + match vfs_lookup(path) { + Ok(dentry) => { + let meta = dentry.inode.metadata()?; + if meta.inode_type != InodeType::Directory { + return Err(FsError::NotDirectory); + } + Ok(()) + } + Err(FsError::NotFound) => { + let (parent_path, name) = split_path(path)?; + let parent = vfs_lookup(&parent_path)?; + let dir_mode = FileMode::S_IFDIR | FileMode::from_bits_truncate(0o755); + parent.inode.mkdir(&name, dir_mode)?; + Ok(()) + } + Err(e) => Err(e), + } + } + // 特殊挂载点处理 match target_str.as_str() { "/proc" => { + if let Err(e) = ensure_dir_exists("/proc") { + return e.to_errno(); + } return match init_procfs() { Ok(_) => 0, Err(e) => e.to_errno(), }; } "/sys" => { + if let Err(e) = ensure_dir_exists("/sys") { + return e.to_errno(); + } return match init_sysfs() { Ok(_) => 0, Err(e) => e.to_errno(), }; } "/tmp" => { + if let Err(e) = ensure_dir_exists("/tmp") { + return e.to_errno(); + } return match mount_tmpfs("/tmp", 0) { Ok(_) => 0, Err(e) => e.to_errno(), }; } "/dev" => { + if let Err(e) = ensure_dir_exists("/dev") { + return e.to_errno(); + } // 先挂载 tmpfs 到 /dev if let Err(e) = mount_tmpfs("/dev", 0) { return e.to_errno(); @@ -1301,14 +1404,14 @@ pub fn umount2(target: *const c_char, _flags: i32) -> isize { } }; - crate::pr_info!("[SYSCALL] umount2: unmounting '{}'", target_str); + crate::pr_debug!("[SYSCALL] umount2: unmounting '{}'", target_str); // 卸载文件系统 // 注意:MOUNT_TABLE.umount() 会自动调用 fs.sync() match MOUNT_TABLE.umount(&target_str) { Ok(()) => { - crate::pr_info!("[SYSCALL] umount2: successfully unmounted '{}'", target_str); + crate::pr_debug!("[SYSCALL] umount2: successfully unmounted '{}'", target_str); 0 } Err(e) => { diff --git a/os/src/kernel/syscall/mod.rs b/os/src/kernel/syscall/mod.rs index 9180dfca..9e8b8ddc 100644 --- a/os/src/kernel/syscall/mod.rs +++ b/os/src/kernel/syscall/mod.rs @@ -31,7 +31,7 @@ use crate::{ types::{SigSetT, SizeT, StackT}, uts_namespace::UtsNamespace, }, - vfs::Stat, + vfs::{Stat, Statx}, }; use cred::*; use fcntl::*; @@ -113,6 +113,7 @@ impl_syscall!( newfstatat, (i32, *const c_char, *mut Stat, u32) ); +impl_syscall!(sys_statx, statx, (i32, *const c_char, u32, u32, *mut Statx)); impl_syscall!(sys_fstat, fstat, (usize, *mut Stat)); impl_syscall!(sys_sync, sync, ()); impl_syscall!(sys_fsync, fsync, (usize)); diff --git a/os/src/kernel/syscall/task.rs b/os/src/kernel/syscall/task.rs index 21193349..c5d22bca 100644 --- a/os/src/kernel/syscall/task.rs +++ b/os/src/kernel/syscall/task.rs @@ -285,8 +285,16 @@ pub fn clone( unsafe { (*tf).set_clone_trap_frame(&*ptf, child_task.kstack_base, stack as usize); if requested_flags.contains(CloneFlags::SETTLS) { - // RISC-V userspace uses tp register as thread pointer (TLS base) - (*tf).x4_tp = tls as usize; + #[cfg(target_arch = "riscv64")] + { + // RISC-V userspace uses tp register as thread pointer (TLS base) + (*tf).x4_tp = tls as usize; + } + #[cfg(target_arch = "loongarch64")] + { + // LoongArch userspace uses r2 (tp) register as thread pointer (TLS base) + (*tf).regs[2] = tls as usize; + } } } if requested_flags.contains(CloneFlags::CHILD_SETTID) { diff --git a/os/src/kernel/task/exec_loader.rs b/os/src/kernel/task/exec_loader.rs index f6e2a040..a25a33d4 100644 --- a/os/src/kernel/task/exec_loader.rs +++ b/os/src/kernel/task/exec_loader.rs @@ -35,6 +35,7 @@ const ELFDATA2LSB: u8 = 1; const ET_DYN: u16 = 3; const EM_RISCV: u16 = 243; +const EM_LOONGARCH: u16 = 258; const PT_LOAD: u32 = 1; const PT_DYNAMIC: u32 = 2; @@ -56,6 +57,10 @@ const DT_SYMENT: i64 = 11; const R_RISCV_64: u32 = 2; const R_RISCV_RELATIVE: u32 = 3; +// loongarch64 relocations +const R_LARCH_64: u32 = 2; +const R_LARCH_RELATIVE: u32 = 3; + #[derive(Clone, Copy, Debug)] struct ElfHdr { e_type: u16, @@ -118,9 +123,14 @@ fn parse_elf_header(inode: &dyn Inode) -> Result { let e_phentsize = le_u16(&hdr[54..56]); let e_phnum = le_u16(&hdr[56..58]); + #[cfg(target_arch = "riscv64")] if e_machine != EM_RISCV { return Err(ExecImageError::InvalidElf); } + #[cfg(target_arch = "loongarch64")] + if e_machine != EM_LOONGARCH { + return Err(ExecImageError::InvalidElf); + } if e_phentsize as usize != 56 { return Err(ExecImageError::InvalidElf); } @@ -407,6 +417,7 @@ fn apply_static_pie_relocs( let r_sym = (r_info >> 32) as usize; let target_va = load_bias + r_offset; + #[cfg(target_arch = "riscv64")] let value = match r_type { R_RISCV_RELATIVE => (load_bias as isize + r_addend) as usize, R_RISCV_64 => { @@ -422,6 +433,22 @@ fn apply_static_pie_relocs( } _ => return Err(ExecImageError::InvalidElf), }; + #[cfg(target_arch = "loongarch64")] + let value = match r_type { + R_LARCH_RELATIVE => (load_bias as isize + r_addend) as usize, + R_LARCH_64 => { + if dt_symtab == 0 { + return Err(ExecImageError::InvalidElf); + } + let sym_addr = load_bias + dt_symtab + r_sym * dt_syment; + let st_value = space + .read_u64_at(sym_addr + 8) + .map_err(ExecImageError::Paging)? as usize; + let s = load_bias + st_value; + (s as isize + r_addend) as usize + } + _ => return Err(ExecImageError::InvalidElf), + }; space .write_usize_at(target_va, value) diff --git a/os/src/kernel/task/ktask.rs b/os/src/kernel/task/ktask.rs index 304c78ae..4d166feb 100644 --- a/os/src/kernel/task/ktask.rs +++ b/os/src/kernel/task/ktask.rs @@ -177,6 +177,7 @@ pub fn kernel_execve(path: &str, argv: &[&str], envp: &[&str]) -> ! { let space = Arc::new(SpinLock::new(prepared.space)); // 换掉当前任务的地址空间,e.g. 切换 satp { + // 先切换到新地址空间,再写入用户栈布局 let _guard = crate::sync::PreemptGuard::new(); current_cpu().switch_space(space.clone()); } @@ -207,9 +208,183 @@ pub fn kernel_execve(path: &str, argv: &[&str], envp: &[&str]) -> ! { prepared.at_entry, ); } + // 地址空间已在 execve 之前切换 crate::pr_info!("[kernel_execve] Switching to user mode"); let tfp = task.lock().trap_frame_ptr.load(Ordering::SeqCst); + #[cfg(target_arch = "loongarch64")] + { + if tfp.is_null() { + crate::pr_err!("[kernel_execve] trap_frame_ptr is null"); + panic!("kernel_execve: null trap_frame_ptr"); + } + crate::pr_debug!("[kernel_execve] trap_frame_ptr={:#x}", tfp as usize); + } + #[cfg(target_arch = "loongarch64")] + unsafe { + crate::pr_debug!( + "[kernel_execve] trapframe: era={:#x}, sp={:#x}, prmd={:#x}, crmd={:#x}, a0={:#x}, a1={:#x}, a2={:#x}", + (*tfp).get_sepc(), + (*tfp).get_sp(), + (*tfp).prmd, + (*tfp).crmd, + (*tfp).get_a0(), + (*tfp).regs[5], + (*tfp).regs[6], + ); + } + #[cfg(target_arch = "loongarch64")] + { + use crate::mm::address::PageNum; + use crate::mm::address::{UsizeConvert, Vaddr}; + let tlbrent: usize; + let crmd: usize; + let pgdl: usize; + let pgdh: usize; + let ecfg: usize; + let ks0: usize; + let asid: usize; + let tlbrehi: usize; + let tlbrelo0: usize; + let tlbrelo1: usize; + unsafe { + core::arch::asm!( + "csrrd {0}, 0x88", + out(reg) tlbrent, + options(nostack, preserves_flags) + ); + core::arch::asm!( + "csrrd {0}, 0x0", + out(reg) crmd, + options(nostack, preserves_flags) + ); + core::arch::asm!( + "csrrd {0}, 0x19", + out(reg) pgdl, + options(nostack, preserves_flags) + ); + core::arch::asm!( + "csrrd {0}, 0x1a", + out(reg) pgdh, + options(nostack, preserves_flags) + ); + core::arch::asm!( + "csrrd {0}, 0x4", + out(reg) ecfg, + options(nostack, preserves_flags) + ); + core::arch::asm!( + "csrrd {0}, 0x30", + out(reg) ks0, + options(nostack, preserves_flags) + ); + core::arch::asm!( + "csrrd {0}, 0x18", + out(reg) asid, + options(nostack, preserves_flags) + ); + core::arch::asm!( + "csrrd {0}, 0x8e", + out(reg) tlbrehi, + options(nostack, preserves_flags) + ); + core::arch::asm!( + "csrrd {0}, 0x8c", + out(reg) tlbrelo0, + options(nostack, preserves_flags) + ); + core::arch::asm!( + "csrrd {0}, 0x8d", + out(reg) tlbrelo1, + options(nostack, preserves_flags) + ); + } + let space = crate::kernel::current_memory_space(); + let space = space.lock(); + let root_ppn = space.root_ppn(); + let root_paddr = root_ppn.start_addr().as_usize(); + let entry_va = ::from_usize(prepared.initial_pc); + let sp_va = ::from_usize(prepared.user_sp_high); + unsafe extern "C" { + fn tlb_refill_entry(); + } + let tlbr_entry_vaddr = tlb_refill_entry as usize; + let tlbr_entry_paddr = + unsafe { crate::arch::mm::vaddr_to_paddr(tlbr_entry_vaddr) } & !0xfff; + let tlbr_entry_dm_vaddr = crate::arch::mm::paddr_to_vaddr(tlbr_entry_paddr); + crate::pr_debug!( + "[kernel_execve] va translate: entry={:?}, sp={:?}", + space.translate(entry_va), + space.translate(sp_va) + ); + // 检查页表项内容 + use crate::mm::address::Vpn; + use crate::mm::page_table::PageTableInner; + let entry_vpn = Vpn::from_addr_floor(entry_va); + if let Ok((ppn, _, flags)) = space.page_table().walk(entry_vpn) { + crate::pr_debug!( + "[kernel_execve] entry PTE: vpn={:#x}, ppn={:#x}, flags={:?}", + entry_vpn.0, + ppn.0, + flags + ); + } else { + crate::pr_err!("[kernel_execve] entry page not mapped!"); + } + crate::pr_debug!( + "[kernel_execve] root_ppn={:#x}, root_paddr={:#x}", + root_ppn.0, + root_paddr + ); + crate::pr_debug!( + "[kernel_execve] tlbrent={:#x}, crmd={:#x}, pgdl={:#x}, pgdh={:#x}, ecfg={:#x}, ks0={:#x}", + tlbrent, + crmd, + pgdl, + pgdh, + ecfg, + ks0 + ); + crate::pr_debug!( + "[kernel_execve] asid={:#x} (full_csr={:#x}), tlbrehi={:#x}, tlbrelo0={:#x}, tlbrelo1={:#x}", + asid & 0x3ff, + asid, + tlbrehi, + tlbrelo0, + tlbrelo1 + ); + crate::pr_debug!( + "[kernel_execve] tlb_refill_entry: vaddr={:#x}, paddr={:#x}, dm_vaddr={:#x}", + tlbr_entry_vaddr, + tlbr_entry_paddr, + tlbr_entry_dm_vaddr + ); + // TLB refill 运行在直接地址翻译模式,无法安全访问全局变量做统计 + } + #[cfg(target_arch = "loongarch64")] + unsafe { + // Ensure KScratch0 points to the current task's trap frame before returning to user mode. + core::arch::asm!( + "csrwr {0}, 0x30", + in(reg) tfp as usize, + options(nostack, preserves_flags) + ); + // Reset TLB refill debug counter (CSR.TLBRSAVE) so we can observe the first refill after + // entering user mode. + core::arch::asm!("csrwr $zero, 0x8b", options(nostack, preserves_flags)); + } + #[cfg(target_arch = "riscv64")] + unsafe { + crate::pr_info!( + "[kernel_execve] trapframe: sepc={:#x}, sp={:#x}, sstatus={:#x}, a0={:#x}, a1={:#x}, a2={:#x}", + (*tfp).sepc, + (*tfp).x2_sp, + (*tfp).sstatus, + (*tfp).x10_a0, + (*tfp).x11_a1, + (*tfp).x12_a2, + ); + } // SAFETY: tfp 指向的内存已经被分配且由当前任务拥有 // 直接按 trapframe 状态恢复并 sret 到用户态 unsafe { diff --git a/os/src/kernel/task/task_struct.rs b/os/src/kernel/task/task_struct.rs index 105fb7d2..265fec88 100644 --- a/os/src/kernel/task/task_struct.rs +++ b/os/src/kernel/task/task_struct.rs @@ -292,6 +292,18 @@ impl Task { // 也就是说,new_memory_space 已经被激活(切换 satp) // 否则必须实现类似 copy_to_user 的函数来完成拷贝,不然会引发页错误 // 3. 设置用户栈布局,包含命令行参数和环境变量 + #[cfg(target_arch = "loongarch64")] + let (new_sp, argc, argv_vec_ptr, envp_vec_ptr, tls_tp) = { + let space = self + .memory_space + .as_ref() + .expect("execve: memory_space not set") + .lock(); + setup_stack_layout( + &space, sp_high, argv, envp, phdr_addr, phnum, phent, at_base, at_entry, + ) + }; + #[cfg(target_arch = "riscv64")] let (new_sp, argc, argv_vec_ptr, envp_vec_ptr) = setup_stack_layout( sp_high, argv, envp, phdr_addr, phnum, phent, at_base, at_entry, ); @@ -301,6 +313,17 @@ impl Task { unsafe { // 清零整个 TrapFrame,避免旧值泄漏到用户态 core::ptr::write_bytes(tf_ptr, 0, 1); + #[cfg(target_arch = "loongarch64")] + (*tf_ptr).set_exec_trap_frame( + initial_pc, + new_sp, + self.kstack_base, + argc, + argv_vec_ptr, + envp_vec_ptr, + tls_tp, + ); + #[cfg(target_arch = "riscv64")] (*tf_ptr).set_exec_trap_frame( initial_pc, new_sp, diff --git a/os/src/mm/memory_space/memory_space.rs b/os/src/mm/memory_space/memory_space.rs index fa4335b2..b091fe1f 100644 --- a/os/src/mm/memory_space/memory_space.rs +++ b/os/src/mm/memory_space/memory_space.rs @@ -593,9 +593,26 @@ impl MemorySpace { let elf = ElfFile::new(elf_data).map_err(|_| PagingError::InvalidAddress)?; // 检查架构 - if elf.header.pt2.machine().as_machine() != xmas_elf::header::Machine::RISC_V { + let machine = elf.header.pt2.machine().as_machine(); + #[cfg(target_arch = "riscv64")] + if machine != xmas_elf::header::Machine::RISC_V { + crate::pr_err!( + "[from_elf] machine mismatch: expected RISC-V, got {:?}", + machine + ); return Err(PagingError::InvalidAddress); } + #[cfg(target_arch = "loongarch64")] + { + const EM_LOONGARCH: u16 = 258; + if machine != xmas_elf::header::Machine::Other(EM_LOONGARCH) { + crate::pr_err!( + "[from_elf] machine mismatch: expected LoongArch (EM=258), got {:?}", + machine + ); + return Err(PagingError::InvalidAddress); + } + } // 对 ET_DYN (PIE/static-pie) 采用固定 load bias,避免把可执行映射放到 VA=0。 // 这也便于按 ELF relocation 语义处理 R_RISCV_RELATIVE。 @@ -647,6 +664,12 @@ impl MemorySpace { // 检查段是否与栈/陷阱区域重叠 if start_va >= USER_STACK_TOP - USER_STACK_SIZE { + crate::pr_err!( + "[from_elf] segment overlaps stack: start=0x{:x}, end=0x{:x}, stack_bottom=0x{:x}", + start_va, + end_va, + USER_STACK_TOP - USER_STACK_SIZE + ); return Err(PagingError::InvalidAddress); } @@ -689,14 +712,23 @@ impl MemorySpace { }; // 插入区域(将在内部检查重叠) - space.insert_framed_area_with_offset( + if let Err(err) = space.insert_framed_area_with_offset( vpn_range, area_type, flags, data, start_va % PAGE_SIZE, // bias 是页对齐的,因此等价于 p_vaddr % PAGE_SIZE None, // 非文件映射 - )?; + ) { + crate::pr_err!( + "[from_elf] map segment failed: start=0x{:x}, end=0x{:x}, flags={:?}, err={:?}", + start_va, + end_va, + flags, + err + ); + return Err(err); + } } // 1.5 对静态 PIE/PIE 应用最小化重定位:R_RISCV_RELATIVE diff --git a/os/src/uapi/fs.rs b/os/src/uapi/fs.rs index dd21593c..01ba7b33 100644 --- a/os/src/uapi/fs.rs +++ b/os/src/uapi/fs.rs @@ -353,6 +353,104 @@ pub struct Stat { pub __unused: [i32; 2], } +/// Linux statx timestamp (与 Linux UAPI struct statx_timestamp 对齐) +/// +/// 参考:include/uapi/linux/stat.h +#[repr(C)] +#[derive(Debug, Clone, Copy)] +pub struct StatxTimestamp { + pub tv_sec: i64, + pub tv_nsec: u32, + pub __reserved: i32, +} + +impl StatxTimestamp { + pub const fn zeroed() -> Self { + Self { + tv_sec: 0, + tv_nsec: 0, + __reserved: 0, + } + } +} + +/// Linux statx 结构 (与 Linux UAPI struct statx 对齐) +/// +/// 参考:include/uapi/linux/stat.h +#[repr(C)] +#[derive(Debug, Clone, Copy)] +pub struct Statx { + pub stx_mask: u32, + pub stx_blksize: u32, + pub stx_attributes: u64, + pub stx_nlink: u32, + pub stx_uid: u32, + pub stx_gid: u32, + pub stx_mode: u16, + pub __spare0: [u16; 1], + pub stx_ino: u64, + pub stx_size: u64, + pub stx_blocks: u64, + pub stx_attributes_mask: u64, + pub stx_atime: StatxTimestamp, + pub stx_btime: StatxTimestamp, + pub stx_ctime: StatxTimestamp, + pub stx_mtime: StatxTimestamp, + pub stx_rdev_major: u32, + pub stx_rdev_minor: u32, + pub stx_dev_major: u32, + pub stx_dev_minor: u32, + pub stx_mnt_id: u64, + pub stx_dio_mem_align: u32, + pub stx_dio_offset_align: u32, + pub __spare3: [u64; 12], +} + +impl Statx { + pub const fn zeroed() -> Self { + Self { + stx_mask: 0, + stx_blksize: 0, + stx_attributes: 0, + stx_nlink: 0, + stx_uid: 0, + stx_gid: 0, + stx_mode: 0, + __spare0: [0; 1], + stx_ino: 0, + stx_size: 0, + stx_blocks: 0, + stx_attributes_mask: 0, + stx_atime: StatxTimestamp::zeroed(), + stx_btime: StatxTimestamp::zeroed(), + stx_ctime: StatxTimestamp::zeroed(), + stx_mtime: StatxTimestamp::zeroed(), + stx_rdev_major: 0, + stx_rdev_minor: 0, + stx_dev_major: 0, + stx_dev_minor: 0, + stx_mnt_id: 0, + stx_dio_mem_align: 0, + stx_dio_offset_align: 0, + __spare3: [0; 12], + } + } +} + +// statx mask bits (参考 include/uapi/linux/stat.h) +pub const STATX_TYPE: u32 = 0x0000_0001; +pub const STATX_MODE: u32 = 0x0000_0002; +pub const STATX_NLINK: u32 = 0x0000_0004; +pub const STATX_UID: u32 = 0x0000_0008; +pub const STATX_GID: u32 = 0x0000_0010; +pub const STATX_ATIME: u32 = 0x0000_0020; +pub const STATX_MTIME: u32 = 0x0000_0040; +pub const STATX_CTIME: u32 = 0x0000_0080; +pub const STATX_INO: u32 = 0x0000_0100; +pub const STATX_SIZE: u32 = 0x0000_0200; +pub const STATX_BLOCKS: u32 = 0x0000_0400; +pub const STATX_BASIC_STATS: u32 = 0x0000_07ff; + /// Linux dirent64 结构 /// /// 用于getdents64系统调用 diff --git a/os/src/vfs/adapter.rs b/os/src/vfs/adapter.rs index 5f313b65..98319bfe 100644 --- a/os/src/vfs/adapter.rs +++ b/os/src/vfs/adapter.rs @@ -3,7 +3,7 @@ //! 用于处理数据结构之间的转换 use super::{InodeMetadata, InodeType}; -use crate::uapi::fs::{LinuxDirent64, Stat}; +use crate::uapi::fs::{LinuxDirent64, STATX_BASIC_STATS, Stat, Statx, StatxTimestamp}; /// Stat 结构适配方法 impl Stat { @@ -33,6 +33,45 @@ impl Stat { } } +/// Statx 结构适配方法 +impl Statx { + /// 从 InodeMetadata 创建 Statx 结构 + pub fn from_metadata(meta: &InodeMetadata) -> Self { + let ts = |t: crate::uapi::time::TimeSpec| StatxTimestamp { + tv_sec: t.tv_sec as i64, + tv_nsec: t.tv_nsec as u32, + __reserved: 0, + }; + + Self { + stx_mask: STATX_BASIC_STATS, + stx_blksize: 512, + stx_attributes: 0, + stx_nlink: meta.nlinks as u32, + stx_uid: meta.uid, + stx_gid: meta.gid, + stx_mode: meta.mode.bits() as u16, + __spare0: [0; 1], + stx_ino: meta.inode_no as u64, + stx_size: meta.size as u64, + stx_blocks: meta.blocks as u64, + stx_attributes_mask: 0, + stx_atime: ts(meta.atime), + stx_btime: StatxTimestamp::zeroed(), + stx_ctime: ts(meta.ctime), + stx_mtime: ts(meta.mtime), + stx_rdev_major: 0, + stx_rdev_minor: 0, + stx_dev_major: 0, + stx_dev_minor: 0, + stx_mnt_id: 0, + stx_dio_mem_align: 0, + stx_dio_offset_align: 0, + __spare3: [0; 12], + } + } +} + /// 将InodeType转换为d_type值 pub fn inode_type_to_d_type(t: InodeType) -> u8 { match t { diff --git a/os/src/vfs/mod.rs b/os/src/vfs/mod.rs index 1efdef44..83ce2a9a 100644 --- a/os/src/vfs/mod.rs +++ b/os/src/vfs/mod.rs @@ -181,7 +181,7 @@ pub use path::{ // Re-export UAPI types used by VFS pub use crate::uapi::fcntl::{FdFlags, OpenFlags, SeekWhence}; -pub use crate::uapi::fs::{LinuxDirent64, Stat}; +pub use crate::uapi::fs::{LinuxDirent64, Stat, Statx}; pub use crate::uapi::time::TimeSpec; use alloc::{vec, vec::Vec};