diff options
author | Clyne Sullivan <tullivan99@gmail.com> | 2018-11-20 10:43:33 -0500 |
---|---|---|
committer | Clyne Sullivan <tullivan99@gmail.com> | 2018-11-20 10:43:33 -0500 |
commit | 22615096dee294f63c6940c17f2a448da51d9197 (patch) | |
tree | cf38db8d010344e445210c35348ec457f33b7a7e /src/kernel | |
parent | e88b4f9040b63d70563bee8553596f3c317022a5 (diff) |
fs work, initrd/stdio
Diffstat (limited to 'src/kernel')
-rw-r--r-- | src/kernel/gpio.c | 2 | ||||
-rw-r--r-- | src/kernel/startup_stm32l476xx.s | 2 | ||||
-rw-r--r-- | src/kernel/task.c | 2 | ||||
-rw-r--r-- | src/kernel/vfs.c | 23 | ||||
-rw-r--r-- | src/kernel/vfs.h | 4 |
5 files changed, 20 insertions, 13 deletions
diff --git a/src/kernel/gpio.c b/src/kernel/gpio.c index 1c81d11..0932e51 100644 --- a/src/kernel/gpio.c +++ b/src/kernel/gpio.c @@ -20,7 +20,7 @@ #include "gpio.h" -static const GPIO_TypeDef *gpio_ports[8] = { +static GPIO_TypeDef *gpio_ports[8] = { GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH }; diff --git a/src/kernel/startup_stm32l476xx.s b/src/kernel/startup_stm32l476xx.s index b26ced5..d60fa49 100644 --- a/src/kernel/startup_stm32l476xx.s +++ b/src/kernel/startup_stm32l476xx.s @@ -105,7 +105,7 @@ LoopFillZerobss: bcc FillZerobss
/* Call static constructors */
- bl __libc_init_array
+ //bl __libc_init_array
/* Call the application's entry point.*/
bl main
diff --git a/src/kernel/task.c b/src/kernel/task.c index dfe50a7..c5e5e96 100644 --- a/src/kernel/task.c +++ b/src/kernel/task.c @@ -87,7 +87,7 @@ void task_sleep(uint32_t ms) pid_t task_getpid(void) { - return task_current->pid; + return task_current != 0 ? task_current->pid : 0; } pid_t task_waitpid(pid_t pid, int *wstatus, int options) diff --git a/src/kernel/vfs.c b/src/kernel/vfs.c index da1d641..6236691 100644 --- a/src/kernel/vfs.c +++ b/src/kernel/vfs.c @@ -43,12 +43,12 @@ void vfs_init(void) vfs_mount(&stdio_funcs, 0); // order is crucial - vfs_open("in", VFS_FILE_READ); - vfs_open("out", VFS_FILE_WRITE); - vfs_open("err", VFS_FILE_WRITE); + vfs_open(" in", VFS_FILE_READ); + vfs_open(" out", VFS_FILE_WRITE); + vfs_open(" err", VFS_FILE_WRITE); } -int vfs_mount(vfs_volume_funcs *funcs, uint32_t flags) +int vfs_mount(const vfs_volume_funcs *funcs, uint32_t flags) { for (int i = 0; i < VFS_MAX_VOLS; i++) { if (!(vfs_volumes[i].flags && VFS_MOUNTED)) { @@ -64,10 +64,14 @@ int vfs_mount(vfs_volume_funcs *funcs, uint32_t flags) int vfs_get_drive(const char *path) { // Validate parameters - if (path[0] == '\0' || path[1] == '\0' || path[1] != ':' || - path[2] == '\0' || path[2] != '/') + if (path[0] == '\0') return -1; + // Default to 'A' if no drive specified (A gives stdio) + if (path[1] == '\0' || path[1] != ':' || + path[2] == '\0' || path[2] != '/') + return 0; + // Find chosen drive int drive = -1; for (int i = 0; i < VFS_MAX_VOLS; i++) { @@ -103,11 +107,14 @@ int vfs_open(const char *path, uint32_t flags) if (file == -1) return -1; + void *fsinfo = vfs_volumes[drive].funcs->open(path + 3); + if (fsinfo == 0) + return -1; + vfs_files[file].flags = VFS_FILE_OPEN | flags; vfs_files[file].vol = drive; vfs_files[file].pid = task_getpid(); - vfs_files[file].fsinfo = - vfs_volumes[drive].funcs->open(path + 3); + vfs_files[file].fsinfo = fsinfo; return file; } diff --git a/src/kernel/vfs.h b/src/kernel/vfs.h index 29763a5..89213f9 100644 --- a/src/kernel/vfs.h +++ b/src/kernel/vfs.h @@ -22,7 +22,7 @@ typedef struct vfs_volume_funcs_t { typedef struct { uint32_t flags; - vfs_volume_funcs *funcs; + const vfs_volume_funcs *funcs; } vfs_volume; // Indicates an opened file @@ -43,7 +43,7 @@ typedef struct { void vfs_init(void); -int vfs_mount(vfs_volume_funcs *funcs, uint32_t flags); +int vfs_mount(const 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); |