diff --git a/base/scripts/mount.tb b/base/scripts/mount.tb index 4a95daf..e079ce8 100644 --- a/base/scripts/mount.tb +++ b/base/scripts/mount.tb @@ -1 +1,2 @@ print 'Mounting filesystems...\n' +$fs mount -mp system -fs LittleFS -dev atasd-mst -fmt no diff --git a/scripts/mkbaseimg.sh b/scripts/mkbaseimg.sh index 08ec5d1..f4c270c 100755 --- a/scripts/mkbaseimg.sh +++ b/scripts/mkbaseimg.sh @@ -2,4 +2,4 @@ rm -f base.img cat user/FILES.txt | while read line; do cp -v $line base/bin; done -mklittlefs -c base -b 4096 -s $((1<<20)) base.img +mklittlefs -c base -b 512 -s $((1<<20)) base.img diff --git a/ulib/system/system.c b/ulib/system/system.c index b954d67..afbcae3 100644 --- a/ulib/system/system.c +++ b/ulib/system/system.c @@ -43,3 +43,11 @@ int32_t devctl(Dev_t *devh, uint64_t cmd, uint8_t *buffer, size_t len, uint64_t int32_t rand(void) { return syscall(SYS_RAND, 0, 0, 0, 0, 0, 0); } + +int32_t vfsmount(char *mountpoint, char *fstype, Dev_t *dev, bool format) { + return syscall(SYS_VFSMOUNT, (uint64_t)mountpoint, (uint64_t)fstype, (uint64_t)dev, (uint64_t)format, 0, 0); +} + +int32_t vfsunmount(char *mountpoint) { + return syscall(SYS_VFSUNMOUNT, (uint64_t)mountpoint, 0, 0, 0, 0, 0); +} diff --git a/ulib/system/system.h b/ulib/system/system.h index 1d7a611..7be2d3f 100644 --- a/ulib/system/system.h +++ b/ulib/system/system.h @@ -3,6 +3,7 @@ #include #include +#include #include void debugprint(const char *string); @@ -14,5 +15,7 @@ int32_t mman_unmap(uint8_t *addr); int32_t schedrelease(void); int32_t devctl(Dev_t *devh, uint64_t cmd, uint8_t *buffer, size_t len, uint64_t extra); int32_t rand(void); +int32_t vfsmount(char *mountpoint, char *fstype, Dev_t *dev, bool format); +int32_t vfsunmount(char *mountpoint); #endif // ULIB_SYSTEM_SYSTEM_H_ diff --git a/user/fs/main.c b/user/fs/main.c index 07f3539..c3183ae 100644 --- a/user/fs/main.c +++ b/user/fs/main.c @@ -2,9 +2,9 @@ #include #include -#define CMDS(X) \ - X(fetch) X(mkf) X(mkd) \ - X(tree) +#define CMDS(X) \ + X(fetch) X(mkf) X(mkd) \ + X(tree) X(mount) void main(void) { if (argslen() == 0) { diff --git a/user/fs/mkf.c b/user/fs/mkf.c index 28780ce..15d33cc 100644 --- a/user/fs/mkf.c +++ b/user/fs/mkf.c @@ -27,6 +27,10 @@ void fs_mkf(void) { } IOH ioh = ioctl(IOCTL_NOHANDLE, IOCTL_OPENF, (uint64_t)path, IOCTL_F_MAKE | IOCTL_F_WRITE, 0); + if (ioh < 0) { + uprintf("fs mkf: could not create %s\n", path); + return; + } if (FS_MKF_CONFIG.write != NULL) { if (ioctl(ioh, IOCTL_WRITE, (uint64_t)FS_MKF_CONFIG.write, string_len(FS_MKF_CONFIG.write), 0) < 0) { uprintf("fs mkf: could not write to %s\n", path); diff --git a/user/fs/mount.c b/user/fs/mount.c new file mode 100644 index 0000000..778b5b6 --- /dev/null +++ b/user/fs/mount.c @@ -0,0 +1,56 @@ +#include +#include +#include + +struct { + char *mountpoint; + char *fstype; + char *devname; + bool format; +} FS_MOUNT_CONFIG = {0}; + +static Arg ARGS[] = { + ARG("-mp", ARG_STRING, &FS_MOUNT_CONFIG.mountpoint), + ARG("-fs", ARG_STRING, &FS_MOUNT_CONFIG.fstype), + ARG("-dev", ARG_STRING, &FS_MOUNT_CONFIG.devname), + ARG("-fmt", ARG_BOOL, &FS_MOUNT_CONFIG.format), + ARG_END(), +}; + +void fs_mount(void) { + int32_t ret; + if ((ret = parse_args(args()+1, argslen()-1, ARGS)) < 0) { + uprintf("fs: could not parse args: %d\n", ret); + return; + } + + if (FS_MOUNT_CONFIG.mountpoint == NULL) { + uprintf("fs: mountpoint missing\n"); + return; + } + + if (FS_MOUNT_CONFIG.fstype == NULL) { + uprintf("fs: filesystem type missing\n"); + return; + } + + if (FS_MOUNT_CONFIG.devname == NULL) { + uprintf("fs: device name missing\n"); + return; + } + + Dev_t dev; + ret = devctl(&dev, DEVCTL_GET_HANDLE, (uint8_t *)FS_MOUNT_CONFIG.devname, 0, 0); + if (ret != E_OK) { + uprintf("fs: device %s not found\n", FS_MOUNT_CONFIG.devname); + return; + } + + ret = vfsmount(FS_MOUNT_CONFIG.mountpoint, FS_MOUNT_CONFIG.fstype, &dev, FS_MOUNT_CONFIG.format); + if (ret != E_OK) { + uprintf("fs: mount error %s\n", ERRSTRING(ret)); + return; + } else { + uprintf("OK %s\n", FS_MOUNT_CONFIG.mountpoint); + } +}