diff --git a/drivers/io/io_memmap.c b/drivers/io/io_memmap.c index ff4efa8..fe39652 100644 --- a/drivers/io/io_memmap.c +++ b/drivers/io/io_memmap.c @@ -45,6 +45,7 @@ int in_use; uintptr_t base; size_t file_pos; + size_t size; } file_state_t; static file_state_t current_file = {0}; @@ -61,6 +62,7 @@ io_entity_t *entity); static int memmap_block_seek(io_entity_t *entity, int mode, ssize_t offset); +static int memmap_block_len(io_entity_t *entity, size_t *length); static int memmap_block_read(io_entity_t *entity, uintptr_t buffer, size_t length, size_t *length_read); static int memmap_block_write(io_entity_t *entity, const uintptr_t buffer, @@ -78,7 +80,7 @@ .type = device_type_memmap, .open = memmap_block_open, .seek = memmap_block_seek, - .size = NULL, + .size = memmap_block_len, .read = memmap_block_read, .write = memmap_block_write, .close = memmap_block_close, @@ -135,6 +137,7 @@ current_file.base = block_spec->offset; /* File cursor offset for seek and incremental reads etc. */ current_file.file_pos = 0; + current_file.size = block_spec->length; entity->info = (uintptr_t)¤t_file; result = 0; } else { @@ -163,6 +166,18 @@ } +/* Return the size of a file on the memmap device */ +static int memmap_block_len(io_entity_t *entity, size_t *length) +{ + assert(entity != NULL); + assert(length != NULL); + + *length = ((file_state_t *)entity->info)->size; + + return 0; +} + + /* Read data from a file on the memmap device */ static int memmap_block_read(io_entity_t *entity, uintptr_t buffer, size_t length, size_t *length_read)