From 8fc5418915e2039ec5e76e97f7da23ce38c34416 Mon Sep 17 00:00:00 2001 From: kamkow1 Date: Sun, 22 Feb 2026 18:58:28 +0100 Subject: [PATCH] XDRV_READ reading in sectors --- kernel/device/device.c | 1 + kernel/device/ramdrv.c | 43 ++++++++++++++++++++---------------------- kernel/device/ramdrv.h | 1 - kernel/fs/tarfs.c | 17 ++++++++++++++--- 4 files changed, 35 insertions(+), 27 deletions(-) diff --git a/kernel/device/device.c b/kernel/device/device.c index 769271b..e4e1d05 100644 --- a/kernel/device/device.c +++ b/kernel/device/device.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include diff --git a/kernel/device/ramdrv.c b/kernel/device/ramdrv.c index 0ec03cb..61dc5e6 100644 --- a/kernel/device/ramdrv.c +++ b/kernel/device/ramdrv.c @@ -1,9 +1,11 @@ #include #include +#include #include #include #include #include +#include #include bool ramdrv_init (struct device* device, void* arg) { @@ -14,23 +16,21 @@ bool ramdrv_init (struct device* device, void* arg) { if (ramdrv == NULL) return false; - ramdrv->total_size = init->total_size; ramdrv->sector_size = init->sector_size; + ramdrv->total_size = align_up (init->total_size, ramdrv->sector_size); - if (init->buffer == NULL) { - ramdrv->buffer = malloc (init->total_size); + ramdrv->buffer = malloc (ramdrv->total_size); - if (ramdrv->buffer == NULL) { - free (ramdrv); - return false; - } - - ramdrv->managed = false; - } else { - ramdrv->buffer = init->buffer; - ramdrv->managed = true; + if (ramdrv->buffer == NULL) { + free (ramdrv); + return false; } + memset (ramdrv->buffer, 0, ramdrv->total_size); + + if (init->buffer != NULL) + memcpy (ramdrv->buffer, init->buffer, init->total_size); + device->udata = ramdrv; return true; @@ -39,8 +39,8 @@ bool ramdrv_init (struct device* device, void* arg) { void ramdrv_fini (struct device* device) { struct ramdrv* ramdrv = device->udata; - if (!ramdrv->managed) - free (ramdrv); + free (ramdrv->buffer); + free (ramdrv); } int ramdrv_get_device_type (struct device* device, struct proc* proc, struct reschedule_ctx* rctx, @@ -91,19 +91,16 @@ int ramdrv_get_sector_size (struct device* device, struct proc* proc, struct res int ramdrv_read (struct device* device, struct proc* proc, struct reschedule_ctx* rctx, void* a1, void* a2, void* a3, void* a4) { - (void)a4; - - if (a1 == NULL || a2 == NULL || a3 == NULL) + if (a1 == NULL || a2 == NULL || a3 == NULL || a4 == NULL) return -ST_BAD_ADDRESS_SPACE; - size_t pos = *(size_t*)a1; - size_t size = *(size_t*)a2; - uint8_t* buffer = a3; + size_t sector = *(size_t*)a1; + size_t off = *(size_t*)a2; + size_t size = *(size_t*)a3; + uint8_t* buffer = a4; struct ramdrv* ramdrv = device->udata; - - if (pos + size > ramdrv->total_size) - return -ST_OOB_ERROR; + size_t pos = sector * ramdrv->sector_size + off; memcpy (buffer, (void*)(((uintptr_t)ramdrv->buffer) + pos), size); diff --git a/kernel/device/ramdrv.h b/kernel/device/ramdrv.h index b2063ab..914dc12 100644 --- a/kernel/device/ramdrv.h +++ b/kernel/device/ramdrv.h @@ -19,7 +19,6 @@ struct ramdrv { size_t total_size; size_t sector_size; uint8_t* buffer; - bool managed; }; bool ramdrv_init (struct device* device, void* arg); diff --git a/kernel/fs/tarfs.c b/kernel/fs/tarfs.c index 78c8ac5..a149fa7 100644 --- a/kernel/fs/tarfs.c +++ b/kernel/fs/tarfs.c @@ -66,7 +66,7 @@ int tarfs_mount (struct vfs_mountpoint* mountpoint, struct proc* proc, mountpoint->udata = tarfs; struct device* back_device = mountpoint->back_device; - size_t total_size; + size_t total_size, sector_size; int ret; spin_lock (&back_device->lock); @@ -78,6 +78,14 @@ int tarfs_mount (struct vfs_mountpoint* mountpoint, struct proc* proc, return ret; } + ret = back_device->ops[XDRV_GET_SECTOR_SIZE](back_device, proc, rctx, §or_size, NULL, NULL, + NULL); + if (ret < 0) { + spin_unlock (&back_device->lock); + free (mountpoint->udata); + return ret; + } + uint8_t* buffer = malloc (total_size); if (buffer == NULL) { @@ -86,8 +94,11 @@ int tarfs_mount (struct vfs_mountpoint* mountpoint, struct proc* proc, return ret; } - size_t pos = 0; - ret = back_device->ops[XDRV_READ](back_device, proc, rctx, &pos, &total_size, buffer, NULL); + size_t off = 0; + for (size_t sector = 0; sector < total_size / sector_size; sector++) { + uint8_t* dest = (uint8_t*)((uintptr_t)buffer + (sector * sector_size)); + ret = back_device->ops[XDRV_READ](back_device, proc, rctx, §or, &off, §or_size, dest); + } spin_unlock (&back_device->lock);