aboutsummaryrefslogtreecommitdiffstats
path: root/src/kernel
diff options
context:
space:
mode:
authorClyne Sullivan <tullivan99@gmail.com>2018-11-20 10:43:33 -0500
committerClyne Sullivan <tullivan99@gmail.com>2018-11-20 10:43:33 -0500
commit22615096dee294f63c6940c17f2a448da51d9197 (patch)
treecf38db8d010344e445210c35348ec457f33b7a7e /src/kernel
parente88b4f9040b63d70563bee8553596f3c317022a5 (diff)
fs work, initrd/stdio
Diffstat (limited to 'src/kernel')
-rw-r--r--src/kernel/gpio.c2
-rw-r--r--src/kernel/startup_stm32l476xx.s2
-rw-r--r--src/kernel/task.c2
-rw-r--r--src/kernel/vfs.c23
-rw-r--r--src/kernel/vfs.h4
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);