diff options
Diffstat (limited to 'src/kernel')
-rw-r--r-- | src/kernel/clock.c | 2 | ||||
-rw-r--r-- | src/kernel/svc.c | 2 | ||||
-rw-r--r-- | src/kernel/vfs.c | 29 | ||||
-rw-r--r-- | src/kernel/vfs.h | 1 |
4 files changed, 32 insertions, 2 deletions
diff --git a/src/kernel/clock.c b/src/kernel/clock.c index 5b80203..950f4ca 100644 --- a/src/kernel/clock.c +++ b/src/kernel/clock.c @@ -35,6 +35,8 @@ void clock_svc(uint32_t *args) task_sleep(args[1]); else if (args[0] == 1) udelay(args[1]); + else if (args[0] == 2) + *((unsigned int *)args[1]) = ticks; } void clock_init(void) diff --git a/src/kernel/svc.c b/src/kernel/svc.c index 7d171c3..cf1fbe2 100644 --- a/src/kernel/svc.c +++ b/src/kernel/svc.c @@ -65,6 +65,7 @@ void SVC_Handler(void) { case 2: /* Clock-related calls * 0 - delay * 1 - udelay + * 2 - ticks */ clock_svc(args); break; @@ -74,6 +75,7 @@ void SVC_Handler(void) { * 1 - open * 2 - close * 3 - read + * 4 - write */ vfs_svc(args); break; diff --git a/src/kernel/vfs.c b/src/kernel/vfs.c index d6f9e14..da1d641 100644 --- a/src/kernel/vfs.c +++ b/src/kernel/vfs.c @@ -26,6 +26,9 @@ void vfs_svc(uint32_t *args) case 3: *((int *)args[4]) = vfs_read(args[1], args[2], (uint8_t *)args[3]); break; + case 4: + *((int *)args[4]) = vfs_write(args[1], args[2], (const uint8_t *)args[3]); + break; default: break; } @@ -141,8 +144,30 @@ uint32_t vfs_read(int fd, uint32_t count, uint8_t *buffer) VFS_EOF)) return 0; - uint32_t ret = vfs_volumes[vfs_files[fd].vol].funcs->read(vfs_files[fd].fsinfo, - count, buffer); + uint32_t ret = vfs_volumes[vfs_files[fd].vol].funcs->read( + vfs_files[fd].fsinfo, count, buffer); + + if (ret < count) + vfs_files[fd].flags |= VFS_EOF; + + return ret; +} + +uint32_t vfs_write(int fd, uint32_t count, const uint8_t *buffer) +{ + if (fd < 0 || fd > VFS_MAX_FILES || count == 0 || buffer == 0) + return 0; + if (vfs_volumes[vfs_files[fd].vol].funcs->write == 0) + return -1; + if (vfs_files[fd].pid != task_getpid()) + return 0; + // TODO append? + if ((!(vfs_files[fd].flags & VFS_FILE_WRITE)) || (vfs_files[fd].flags & + VFS_EOF)) + return 0; + + uint32_t ret = vfs_volumes[vfs_files[fd].vol].funcs->write( + vfs_files[fd].fsinfo, count, buffer); if (ret < count) vfs_files[fd].flags |= VFS_EOF; diff --git a/src/kernel/vfs.h b/src/kernel/vfs.h index c9c9179..29763a5 100644 --- a/src/kernel/vfs.h +++ b/src/kernel/vfs.h @@ -47,5 +47,6 @@ int vfs_mount(vfs_volume_funcs *funcs, uint32_t flags); int vfs_open(const char *path, uint32_t flags); int vfs_close(int fd); uint32_t vfs_read(int fd, uint32_t count, uint8_t *buffer); +uint32_t vfs_write(int fd, uint32_t count, const uint8_t *buffer); #endif // VFS_H_ |