diff --git a/include/vmem/vmem_file.h b/include/vmem/vmem_file.h index d15f95e8b..f3bfb7cfb 100644 --- a/include/vmem/vmem_file.h +++ b/include/vmem/vmem_file.h @@ -32,9 +32,16 @@ typedef struct { FILE * stream; } vmem_file_driver_t; +typedef struct { + const char * filename; + FILE * stream; +} vmem_file_vaddr_driver_t; + void vmem_file_init(const vmem_t * vmem); void vmem_file_read(const vmem_t * vmem, uint64_t addr, void * dataout, uint32_t len); void vmem_file_write(const vmem_t * vmem, uint64_t addr, const void * datain, uint32_t len); +void vmem_file_vaddr_read(const vmem_t * vmem, uint64_t addr, void * dataout, uint32_t len); +void vmem_file_vaddr_write(const vmem_t * vmem, uint64_t addr, const void * datain, uint32_t len); #define VMEM_DEFINE_FILE(name_in, strname, filename_in, size_in) \ uint8_t vmem_##name_in##_buf[size_in] = {}; \ @@ -57,20 +64,18 @@ void vmem_file_write(const vmem_t * vmem, uint64_t addr, const void * datain, ui }; #define VMEM_DEFINE_FILE_VADDR(name_in, strname, filename_in, size_in, fixed_vaddr) \ - uint8_t vmem_##name_in##_buf[size_in] = {}; \ - static vmem_file_driver_t vmem_##name_in##_driver = { \ - .physaddr = vmem_##name_in##_buf, \ + static vmem_file_vaddr_driver_t vmem_##name_in##_driver = { \ .filename = filename_in, \ }; \ __attribute__((section("vmem"))) \ - __attribute__((aligned(8))) \ + __attribute__((aligned(__alignof__(vmem_t)))) \ __attribute__((used)) \ const vmem_t vmem_##name_in = { \ .type = VMEM_TYPE_FILE, \ .name = strname, \ .size = size_in, \ - .read = vmem_file_read, \ - .write = vmem_file_write, \ + .read = vmem_file_vaddr_read, \ + .write = vmem_file_vaddr_write, \ .driver = &vmem_##name_in##_driver, \ .vaddr = (uint64_t)fixed_vaddr, \ .ack_with_pull = 1, \ diff --git a/src/vmem/vmem_file.c b/src/vmem/vmem_file.c index 88821470c..58c7acee8 100644 --- a/src/vmem/vmem_file.c +++ b/src/vmem/vmem_file.c @@ -44,7 +44,45 @@ void vmem_file_write(const vmem_t * vmem, uint64_t addr, const void * datain, ui /* Flush back to file */ int res = fseek(driver->stream, addr, SEEK_SET); (void)res; - int written = fwrite((char *) driver->physaddr + addr, len, 1, driver->stream); + int written = fwrite((void*)((intptr_t)driver->physaddr + addr), len, 1, driver->stream); + fflush(driver->stream); + (void) written; + } +} + +static void vmem_file_vaddr_init(const vmem_t * vmem) { + vmem_file_driver_t *driver = (vmem_file_driver_t *) vmem->driver; + if(driver->stream == NULL) { + /* Open file for reading/writing, creating it if it doesn't exist */ + int fd = open(driver->filename, O_RDWR|O_CREAT, S_IRUSR|S_IWUSR); + if (fd != -1) { + driver->stream = fdopen(fd, "r+"); + } + if(!driver->stream) { + printf("\nWARNING: vmem[%s]: permission/path issues for associated filename: \"%s\"\n", vmem->name, driver->filename); + } + } +} + +void vmem_file_vaddr_read(const vmem_t * vmem, uint64_t addr, void * dataout, uint32_t len) { + vmem_file_driver_t *driver = (vmem_file_driver_t *) vmem->driver; + vmem_file_vaddr_init(vmem); + if(driver->stream ) { + int res = fseek(driver->stream, addr, SEEK_SET); + (void)res; + res = fread(dataout, len, 1, driver->stream); + (void)res; + } +} + +void vmem_file_vaddr_write(const vmem_t * vmem, uint64_t addr, const void * datain, uint32_t len) { + vmem_file_driver_t *driver = (vmem_file_driver_t *) vmem->driver; + vmem_file_vaddr_init(vmem); + if(driver->stream ) { + /* Flush back to file */ + int res = fseek(driver->stream, addr, SEEK_SET); + (void)res; + int written = fwrite(datain, len, 1, driver->stream); fflush(driver->stream); (void) written; }