Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 11 additions & 6 deletions include/vmem/vmem_file.h
Original file line number Diff line number Diff line change
Expand Up @@ -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] = {}; \
Expand All @@ -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, \
Expand Down
40 changes: 39 additions & 1 deletion src/vmem/vmem_file.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down