int cmd_vfs_exec(struct vmm_chardev *cdev, int argc, char **argv) { u32 off, len; physical_addr_t pa; if (argc < 2) { cmd_vfs_usage(cdev); return VMM_EFAIL; } if (strcmp(argv[1], "help") == 0) { cmd_vfs_usage(cdev); return VMM_OK; } else if ((strcmp(argv[1], "fslist") == 0) && (argc == 2)) { return cmd_vfs_fslist(cdev); } else if ((strcmp(argv[1], "mplist") == 0) && (argc == 2)) { return cmd_vfs_mplist(cdev); } else if ((strcmp(argv[1], "mount") == 0) && (argc == 4)) { return cmd_vfs_mount(cdev, argv[2], argv[3]); } else if ((strcmp(argv[1], "umount") == 0) && (argc == 3)) { return cmd_vfs_umount(cdev, argv[2]); } else if ((strcmp(argv[1], "ls") == 0) && (argc == 3)) { return cmd_vfs_ls(cdev, argv[2]); } else if ((strcmp(argv[1], "cat") == 0) && (argc == 3)) { return cmd_vfs_cat(cdev, argv[2]); } else if ((strcmp(argv[1], "mv") == 0) && (argc == 4)) { return cmd_vfs_mv(cdev, argv[2], argv[3]); } else if ((strcmp(argv[1], "rm") == 0) && (argc == 3)) { return cmd_vfs_rm(cdev, argv[2]); } else if ((strcmp(argv[1], "mkdir") == 0) && (argc == 3)) { return cmd_vfs_mkdir(cdev, argv[2]); } else if ((strcmp(argv[1], "rmdir") == 0) && (argc == 3)) { return cmd_vfs_rmdir(cdev, argv[2]); } else if ((strcmp(argv[1], "load") == 0) && (argc > 3)) { pa = (physical_addr_t)strtoull(argv[2], NULL, 0); off = (argc > 4) ? strtoul(argv[4], NULL, 0) : 0; len = (argc > 5) ? strtoul(argv[5], NULL, 0) : 0xFFFFFFFF; return cmd_vfs_load(cdev, pa, argv[3], off, len); } cmd_vfs_usage(cdev); return VMM_EFAIL; }
static int cmd_vfs_exec(struct vmm_chardev *cdev, int argc, char **argv) { u32 off, len; physical_addr_t pa; struct vmm_guest *guest; if (argc < 2) { cmd_vfs_usage(cdev); return VMM_EFAIL; } if (strcmp(argv[1], "help") == 0) { cmd_vfs_usage(cdev); return VMM_OK; } else if ((strcmp(argv[1], "fslist") == 0) && (argc == 2)) { return cmd_vfs_fslist(cdev); } else if ((strcmp(argv[1], "mplist") == 0) && (argc == 2)) { return cmd_vfs_mplist(cdev); } else if ((strcmp(argv[1], "mount") == 0) && (argc == 4)) { return cmd_vfs_mount(cdev, argv[2], argv[3]); } else if ((strcmp(argv[1], "umount") == 0) && (argc == 3)) { return cmd_vfs_umount(cdev, argv[2]); } else if ((strcmp(argv[1], "ls") == 0) && (argc == 3)) { return cmd_vfs_ls(cdev, argv[2]); } else if ((strcmp(argv[1], "run") == 0) && (argc == 3)) { return cmd_vfs_run(cdev, argv[2]); #if CONFIG_CRYPTO_HASH_MD5 } else if ((strcmp(argv[1], "md5") == 0) && (argc == 3)) { return cmd_vfs_md5(cdev, argv[2]); #endif #if CONFIG_CRYPTO_HASH_SHA256 } else if ((strcmp(argv[1], "sha256") == 0) && (argc == 3)) { return cmd_vfs_sha256(cdev, argv[2]); #endif } else if ((strcmp(argv[1], "cat") == 0) && (argc == 3)) { return cmd_vfs_cat(cdev, argv[2]); } else if ((strcmp(argv[1], "mv") == 0) && (argc == 4)) { return cmd_vfs_mv(cdev, argv[2], argv[3]); } else if ((strcmp(argv[1], "rm") == 0) && (argc == 3)) { return cmd_vfs_rm(cdev, argv[2]); } else if ((strcmp(argv[1], "mkdir") == 0) && (argc == 3)) { return cmd_vfs_mkdir(cdev, argv[2]); } else if ((strcmp(argv[1], "rmdir") == 0) && (argc == 3)) { return cmd_vfs_rmdir(cdev, argv[2]); } else if ((strcmp(argv[1], "fdt_load") == 0) && (argc >= 5)) { return cmd_vfs_fdt_load(cdev, argv[2], argv[3], argv[4], argc-5, (argc-5) ? &argv[5] : NULL); } else if ((strcmp(argv[1], "host_load") == 0) && (argc > 3)) { pa = (physical_addr_t)strtoull(argv[2], NULL, 0); off = (argc > 4) ? strtoul(argv[4], NULL, 0) : 0; len = (argc > 5) ? strtoul(argv[5], NULL, 0) : 0xFFFFFFFF; return cmd_vfs_load(cdev, NULL, pa, argv[3], off, len); } else if ((strcmp(argv[1], "host_load_list") == 0) && (argc == 3)) { return cmd_vfs_load_list(cdev, NULL, argv[2]); } else if ((strcmp(argv[1], "guest_load") == 0) && (argc > 4)) { guest = vmm_manager_guest_find(argv[2]); if (!guest) { vmm_cprintf(cdev, "Failed to find guest %s\n", argv[2]); return VMM_ENOTAVAIL; } pa = (physical_addr_t)strtoull(argv[3], NULL, 0); off = (argc > 5) ? strtoul(argv[5], NULL, 0) : 0; len = (argc > 6) ? strtoul(argv[6], NULL, 0) : 0xFFFFFFFF; return cmd_vfs_load(cdev, guest, pa, argv[4], off, len); } else if ((strcmp(argv[1], "guest_load_list") == 0) && (argc == 4)) { guest = vmm_manager_guest_find(argv[2]); if (!guest) { vmm_cprintf(cdev, "Failed to find guest %s\n", argv[2]); return VMM_ENOTAVAIL; } return cmd_vfs_load_list(cdev, guest, argv[3]); } cmd_vfs_usage(cdev); return VMM_EFAIL; }
static int cmd_vfs_load_list(struct vmm_chardev *cdev, struct vmm_guest *guest, const char *path) { loff_t rd_off; struct stat st; int fd, rc, pos; physical_addr_t pa; char c, *addr, *file, buf[VFS_LOAD_BUF_SZ+1]; fd = vfs_open(path, O_RDONLY, 0); if (fd < 0) { vmm_cprintf(cdev, "Failed to open %s\n", path); return fd; } rc = vfs_fstat(fd, &st); if (rc) { vfs_close(fd); vmm_cprintf(cdev, "Failed to stat %s\n", path); return rc; } if (!(st.st_mode & S_IFREG)) { vfs_close(fd); vmm_cprintf(cdev, "Cannot read %s\n", path); return VMM_EINVALID; } rd_off = 0; pos = 0; while (vfs_read(fd, &c, 1) == 1) { if (pos == VFS_LOAD_BUF_SZ) { vmm_cprintf(cdev, "Line exceeds limit of " "%d chars at offset 0x%llx\n", VFS_LOAD_BUF_SZ, (u64)rd_off); break; } if (c == '\n' || c == '\r') { buf[pos] = '\0'; while ((pos > 0) && ((buf[pos - 1] == ' ') || (buf[pos - 1] == '\t'))) { pos--; buf[pos] = '\0'; } addr = &buf[0]; while ((*addr == ' ') || (*addr == '\t')) { addr++; } if (*addr == '\0') { goto skip_line; } file = addr; while ((*file != ' ') && (*file != '\t') && (*file != '\0')) { file++; } if (*file == '\0') { goto skip_line; } while ((*file == ' ') || (*file == '\t')) { *file = '\0'; file++; } if (*file == '\0') { goto skip_line; } pa = (physical_addr_t)strtoull(addr, NULL, 0); vmm_cprintf(cdev, "%s: Loading 0x%llx with file %s\n", (guest) ? (guest->name) : "host", (u64)pa, file); rc = cmd_vfs_load(cdev, guest, pa, file, 0, 0xFFFFFFFF); if (rc) { vmm_cprintf(cdev, "error %d\n", rc); break; } skip_line: pos = 0; } else if (vmm_isprintable(c)) { buf[pos] = c; pos++; } else { vmm_cprintf(cdev, "Non-printable char at " "offset 0x%llx\n", (u64)rd_off); break; } rd_off++; } rc = vfs_close(fd); if (rc) { vmm_cprintf(cdev, "Failed to close %s\n", path); return rc; } return VMM_OK; }