#include #include #include #include #include #include #include bool ramdrv_init (struct device* device, void* arg) { struct ramdrv_init* init = arg; struct ramdrv* ramdrv = malloc (sizeof (*ramdrv)); if (ramdrv == NULL) return false; ramdrv->total_size = init->total_size; ramdrv->sector_size = init->sector_size; if (init->buffer == NULL) { ramdrv->buffer = malloc (init->total_size); if (ramdrv->buffer == NULL) { free (ramdrv); return false; } ramdrv->managed = false; } else { ramdrv->buffer = init->buffer; ramdrv->managed = true; } device->udata = ramdrv; return true; } void ramdrv_fini (struct device* device) { struct ramdrv* ramdrv = device->udata; if (!ramdrv->managed) free (ramdrv); } int ramdrv_get_device_type (struct device* device, struct proc* proc, struct reschedule_ctx* rctx, void* a1, void* a2, void* a3, void* a4) { (void)device, (void)a2, (void)a3, (void)a4; if (a1 == NULL) return -ST_BAD_ADDRESS_SPACE; int* device_type = (int*)a1; *device_type = XDRV_TYPE_RAMDRV; return ST_OK; } int ramdrv_get_size (struct device* device, struct proc* proc, struct reschedule_ctx* rctx, void* a1, void* a2, void* a3, void* a4) { (void)a2, (void)a3, (void)a4; if (a1 == NULL) return -ST_BAD_ADDRESS_SPACE; size_t* size = (size_t*)a1; struct ramdrv* ramdrv = device->udata; *size = ramdrv->total_size; return ST_OK; } int ramdrv_get_sector_size (struct device* device, struct proc* proc, struct reschedule_ctx* rctx, void* a1, void* a2, void* a3, void* a4) { (void)a2, (void)a3, (void)a4; if (a1 == NULL) return -ST_BAD_ADDRESS_SPACE; size_t* secsize = (size_t*)a1; struct ramdrv* ramdrv = device->udata; *secsize = ramdrv->sector_size; return ST_OK; } 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) return -ST_BAD_ADDRESS_SPACE; size_t pos = *(size_t*)a1; size_t size = *(size_t*)a2; uint8_t* buffer = a3; struct ramdrv* ramdrv = device->udata; if (pos + size > ramdrv->total_size) return -ST_OOB_ERROR; memcpy (buffer, (void*)(((uintptr_t)ramdrv->buffer) + pos), size); return ST_OK; }