diff options
Diffstat (limited to 'src/kernel/arch/amd64/driver/fsroot.c')
-rw-r--r-- | src/kernel/arch/amd64/driver/fsroot.c | 89 |
1 files changed, 15 insertions, 74 deletions
diff --git a/src/kernel/arch/amd64/driver/fsroot.c b/src/kernel/arch/amd64/driver/fsroot.c index 882fe91..7856fba 100644 --- a/src/kernel/arch/amd64/driver/fsroot.c +++ b/src/kernel/arch/amd64/driver/fsroot.c @@ -1,95 +1,36 @@ #include <camellia/errno.h> #include <camellia/fsutil.h> -#include <kernel/arch/amd64/ata.h> #include <kernel/arch/amd64/driver/fsroot.h> #include <kernel/arch/amd64/driver/util.h> -#include <kernel/mem/virt.h> #include <kernel/panic.h> -#include <kernel/proc.h> #include <kernel/util.h> +#include <kernel/vfs/request.h> #include <shared/mem.h> -#include <stdbool.h> - -enum { - HANDLE_ROOT, - HANDLE_ATA_ROOT, - HANDLE_ATA, - _SKIP = HANDLE_ATA + 4, -}; - -static bool exacteq(struct vfs_request *req, const char *str) { - size_t len = strlen(str); - assert(req->input.kern); - return req->input.len == len && !memcmp(req->input.buf_kern, str, len); -} static int handle(struct vfs_request *req) { - assert(req->caller); - int id = (int)(long __force)req->id; + // TODO document directory read format + // TODO don't hardcode + const char dir[] = + "com1\0" + "ps2/\0" + "ata/\0" + "video/"; + if (!req->caller) return -1; switch (req->type) { case VFSOP_OPEN: - if (exacteq(req, "/")) return HANDLE_ROOT; - if (exacteq(req, "/ata/")) return HANDLE_ATA_ROOT; - if (exacteq(req, "/ata/0")) - return ata_available(0) ? HANDLE_ATA+0 : -1; - if (exacteq(req, "/ata/1")) - return ata_available(1) ? HANDLE_ATA+1 : -1; - if (exacteq(req, "/ata/2")) - return ata_available(2) ? HANDLE_ATA+2 : -1; - if (exacteq(req, "/ata/3")) - return ata_available(3) ? HANDLE_ATA+3 : -1; - - return -1; + return req->input.len == 1 ? 0 : -1; case VFSOP_READ: - switch (id) { - case HANDLE_ROOT: { - // TODO document directory read format - // TODO don't hardcode - const char src[] = - "com1\0" - "ps2/\0" - "ata/\0" - "video/"; - return req_readcopy(req, src, sizeof src); - } - case HANDLE_ATA_ROOT: { - char list[8] = {}; - size_t len = 0; - for (int i = 0; i < 4; i++) { - if (ata_available(i)) { - list[len] = '0' + i; - len += 2; - } - } - return req_readcopy(req, list, len); - } - case HANDLE_ATA: case HANDLE_ATA+1: - case HANDLE_ATA+2: case HANDLE_ATA+3: - if (req->offset < 0) return -1; - char buf[512]; - uint32_t sector = req->offset / 512; - size_t len = min(req->output.len, 512 - ((size_t)req->offset & 511)); - ata_read(id - HANDLE_ATA, sector, buf); - virt_cpy_to(req->caller->pages, req->output.buf, buf, len); - return len; - default: panic_invalid_state(); - } - - case VFSOP_CLOSE: return 0; - // TODO getsize for kernel provided directories - case VFSOP_GETSIZE: return -ENOSYS; + return req_readcopy(req, dir, sizeof dir); - default: panic_invalid_state(); + // TODO getsize for the other kernel provided directories + case VFSOP_GETSIZE: return sizeof dir; + default: return 0; } } static void accept(struct vfs_request *req) { - if (req->caller) { - vfsreq_finish_short(req, handle(req)); - } else { - vfsreq_finish_short(req, -1); - } + vfsreq_finish_short(req, handle(req)); } static struct vfs_backend backend = BACKEND_KERN(accept); |