diff --git a/kernel/storedev/storedev.c b/kernel/storedev/storedev.c index 2f2ddf6..cd2073b 100644 --- a/kernel/storedev/storedev.c +++ b/kernel/storedev/storedev.c @@ -12,6 +12,7 @@ #include "hshtb.h" #include "hal/hal.h" #include "randcrypto/uniqid.h" +#include "sysdefs/dev.h" StoreDevList STOREDEV_LIST; @@ -24,6 +25,50 @@ void storedev_init(void) { ata_probe(); } +int32_t storedev_dev_read(Dev *dev, uint8_t *buffer, size_t len, uint64_t pid) { + (void)pid; + + StoreDev *sd = (StoreDev *)dev->extra; + + if (len != sizeof(StoreDevRead)) { + return E_INVALIDARGUMENT; + } + + StoreDevRead *cfg = (StoreDevRead *)buffer; + + return sd->read(sd, cfg->buffer, cfg->sector, cfg->off, cfg->size); +} + +int32_t storedev_dev_write(Dev *dev, uint8_t *buffer, size_t len, uint64_t pid) { + (void)pid; + + StoreDev *sd = (StoreDev *)dev->extra; + + if (len != sizeof(StoreDevRead)) { + return E_INVALIDARGUMENT; + } + + StoreDevWrite *cfg = (StoreDevWrite *)buffer; + + return sd->write(sd, cfg->buffer, cfg->sector, cfg->off, cfg->size); +} + +int32_t storedev_dev_seccount(Dev *dev, uint8_t *buffer, size_t len, uint64_t pid) { + (void)pid; + + StoreDev *sd = (StoreDev *)dev->extra; + + return (int32_t)(sd->capacity(sd) / sd->sectorsize); +} + +int32_t storedev_dev_sectsize(Dev *dev, uint8_t *buffer, size_t len, uint64_t pid) { + (void)pid; + + StoreDev *sd = (StoreDev *)dev->extra; + + return (int32_t)sd->sectorsize; +} + void storedev_register_dev_entry(StoreDev *sd, char *name, int32_t sdtype) { spinlock_acquire(&DEVTABLE.spinlock); Dev *dev = NULL; @@ -37,6 +82,11 @@ void storedev_register_dev_entry(StoreDev *sd, char *name, int32_t sdtype) { spinlock_init(&dev->spinlock); dev->extra = (void *)sd; + + dev->fns[DEV_STOREDEV_READ] = &storedev_dev_read; + dev->fns[DEV_STOREDEV_WRITE] = &storedev_dev_write; + dev->fns[DEV_STOREDEV_SECCOUNT] = &storedev_dev_seccount; + dev->fns[DEV_STOREDEV_SECTSIZE] = &storedev_dev_sectsize; } void storedev_unregister_dev_entry(Dev *dev) { diff --git a/share/sysdefs/dev.h b/share/sysdefs/dev.h index 7351098..06d895c 100644 --- a/share/sysdefs/dev.h +++ b/share/sysdefs/dev.h @@ -1,6 +1,9 @@ #ifndef SHARE_SYSDEFS_DEV_H_ #define SHARE_SYSDEFS_DEV_H_ +#include +#include + #define DEV_TERMDEV_PUTCH 0 #define DEV_PS2KBDEV_READCH 0 @@ -13,6 +16,25 @@ #define DEV_FBDEV_GETINFO 0 +#define DEV_STOREDEV_READ 0 +#define DEV_STOREDEV_WRITE 1 +#define DEV_STOREDEV_SECCOUNT 2 +#define DEV_STOREDEV_SECTSIZE 3 + +typedef struct { + uint8_t *const buffer; + ptrdiff_t sector; + ptrdiff_t off; + size_t size; +} StoreDevRead; + +typedef struct { + const uint8_t *const buffer; + ptrdiff_t sector; + ptrdiff_t off; + size_t size; +} StoreDevWrite; + typedef uint64_t Dev_t; typedef struct {