summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--kernel/fs/fs.c45
-rw-r--r--kernel/include/comus/memory.h6
-rw-r--r--kernel/include/comus/procs.h4
-rw-r--r--kernel/include/comus/syscalls.h37
-rw-r--r--kernel/mboot/module.c2
-rw-r--r--kernel/memory/memory.c7
-rw-r--r--kernel/procs.c31
-rw-r--r--kernel/user.c11
8 files changed, 98 insertions, 45 deletions
diff --git a/kernel/fs/fs.c b/kernel/fs/fs.c
index 4b6bc5d..ed2d2ea 100644
--- a/kernel/fs/fs.c
+++ b/kernel/fs/fs.c
@@ -18,7 +18,7 @@ void fs_init(void)
void *rd = mboot_get_initrd(&rd_len);
if (rd != NULL) {
assert(idx < N_DISKS, "Too many disks, limit is: %d\n", N_DISKS);
- fs_disks[idx] = (struct disk) {
+ fs_disks[idx] = (struct disk){
.present = 1,
.id = idx,
.type = DISK_TYPE_RAMDISK,
@@ -32,7 +32,7 @@ void fs_init(void)
struct ide_devicelist ide_list = ide_devices_enumerate();
for (size_t i = 0; i < ide_list.num_devices; i++) {
assert(idx < N_DISKS, "Too many disks, limit is: %d\n", N_DISKS);
- fs_disks[idx] = (struct disk) {
+ fs_disks[idx] = (struct disk){
.present = 1,
.id = idx,
.type = DISK_TYPE_ATA,
@@ -92,7 +92,8 @@ int fs_find_file_rel(struct file *rel, char *rel_path, struct file *res)
panic("fs_find_file_rel NOT YET IMPLEMENTED");
}
-static int disk_read_rd(struct disk *disk, size_t offset, size_t len, uint8_t *buffer)
+static int disk_read_rd(struct disk *disk, size_t offset, size_t len,
+ uint8_t *buffer)
{
if (offset + len >= disk->rd.len) {
WARN("attempted to read past length of ramdisk");
@@ -103,7 +104,8 @@ static int disk_read_rd(struct disk *disk, size_t offset, size_t len, uint8_t *b
return 0;
}
-static int disk_read_ata(struct disk *disk, size_t offset, size_t len, uint8_t *buffer)
+static int disk_read_ata(struct disk *disk, size_t offset, size_t len,
+ uint8_t *buffer)
{
static size_t atabuf_len = 0;
static uint16_t *atabuf = NULL;
@@ -112,14 +114,15 @@ static int disk_read_ata(struct disk *disk, size_t offset, size_t len, uint8_t *
uint32_t err = offset % ATA_SECT_SIZE;
int ret = 0;
- if (atabuf == NULL || atabuf_len < numsects*ATA_SECT_SIZE) {
- if ((atabuf = krealloc(atabuf, numsects*ATA_SECT_SIZE)) == NULL)
+ if (atabuf == NULL || atabuf_len < numsects * ATA_SECT_SIZE) {
+ if ((atabuf = krealloc(atabuf, numsects * ATA_SECT_SIZE)) == NULL)
return 1;
- atabuf_len = numsects*ATA_SECT_SIZE;
+ atabuf_len = numsects * ATA_SECT_SIZE;
}
// read sectors
- if ((ret = ide_device_read_sectors(disk->ide, numsects, offset / ATA_SECT_SIZE, atabuf)))
+ if ((ret = ide_device_read_sectors(disk->ide, numsects,
+ offset / ATA_SECT_SIZE, atabuf)))
return 1;
// copy over to buffer
@@ -128,12 +131,11 @@ static int disk_read_ata(struct disk *disk, size_t offset, size_t len, uint8_t *
return ret;
}
-
int disk_read(struct disk *disk, size_t offset, size_t len, uint8_t *buffer)
{
int ret = 0;
- switch(disk->type) {
+ switch (disk->type) {
case DISK_TYPE_RAMDISK:
ret = disk_read_rd(disk, offset, len, buffer);
break;
@@ -141,14 +143,16 @@ int disk_read(struct disk *disk, size_t offset, size_t len, uint8_t *buffer)
ret = disk_read_ata(disk, offset, len, buffer);
break;
default:
- ERROR("attempted to read from disk with invalid type: %d\n", disk->type);
+ ERROR("attempted to read from disk with invalid type: %d\n",
+ disk->type);
ret = 1;
}
return ret;
}
-static int disk_write_rd(struct disk *disk, size_t offset, size_t len, uint8_t *buffer)
+static int disk_write_rd(struct disk *disk, size_t offset, size_t len,
+ uint8_t *buffer)
{
if (offset + len >= disk->rd.len) {
WARN("attempted to write past length of ramdisk");
@@ -159,7 +163,8 @@ static int disk_write_rd(struct disk *disk, size_t offset, size_t len, uint8_t *
return 0;
}
-static int disk_write_ata(struct disk *disk, size_t offset, size_t len, uint8_t *buffer)
+static int disk_write_ata(struct disk *disk, size_t offset, size_t len,
+ uint8_t *buffer)
{
static size_t atabuf_len = 0;
static uint16_t *atabuf = NULL;
@@ -168,21 +173,23 @@ static int disk_write_ata(struct disk *disk, size_t offset, size_t len, uint8_t
uint32_t err = offset % ATA_SECT_SIZE;
int ret = 0;
- if (atabuf == NULL || atabuf_len < numsects*ATA_SECT_SIZE) {
- if ((atabuf = krealloc(atabuf, numsects*ATA_SECT_SIZE)) == NULL)
+ if (atabuf == NULL || atabuf_len < numsects * ATA_SECT_SIZE) {
+ if ((atabuf = krealloc(atabuf, numsects * ATA_SECT_SIZE)) == NULL)
return 1;
- atabuf_len = numsects*ATA_SECT_SIZE;
+ atabuf_len = numsects * ATA_SECT_SIZE;
}
// read sectors what will be overwritten
- if ((ret = ide_device_read_sectors(disk->ide, numsects, offset / ATA_SECT_SIZE, atabuf)))
+ if ((ret = ide_device_read_sectors(disk->ide, numsects,
+ offset / ATA_SECT_SIZE, atabuf)))
return 1;
// copy custom data over
memcpy(atabuf + err, buffer, len);
// write back sectors
- if ((ret = ide_device_write_sectors(disk->ide, numsects, offset / ATA_SECT_SIZE, atabuf)))
+ if ((ret = ide_device_write_sectors(disk->ide, numsects,
+ offset / ATA_SECT_SIZE, atabuf)))
return 1;
return ret;
@@ -192,7 +199,7 @@ int disk_write(struct disk *disk, size_t offset, size_t len, uint8_t *buffer)
{
int ret = 0;
- switch(disk->type) {
+ switch (disk->type) {
case DISK_TYPE_RAMDISK:
ret = disk_write_rd(disk, offset, len, buffer);
break;
diff --git a/kernel/include/comus/memory.h b/kernel/include/comus/memory.h
index 3b57324..d91c9bb 100644
--- a/kernel/include/comus/memory.h
+++ b/kernel/include/comus/memory.h
@@ -97,11 +97,11 @@ mem_ctx_t mem_ctx_clone(mem_ctx_t ctx, bool cow);
void mem_ctx_free(mem_ctx_t ctx);
/**
- * Free a memory context
+ * Switch into a different memory context
*
- * @param ctx - pointer to the memory context
+ * @param ctx - the memory context
*/
-void free_mem_ctx(mem_ctx_t ctx);
+void mem_ctx_switch(mem_ctx_t ctx);
/**
* Allocates at least len bytes of memory starting at
diff --git a/kernel/include/comus/procs.h b/kernel/include/comus/procs.h
index fe8cbee..2c40f5a 100644
--- a/kernel/include/comus/procs.h
+++ b/kernel/include/comus/procs.h
@@ -237,7 +237,7 @@ struct pcb *pcb_queue_peek(const pcb_queue_t queue);
* @param pcb[out] Pointer to where the PCB pointer will be saved
* @return status of the removal request
*/
-int pcb_queue_remove(pcb_queue_t queue, struct pcb **pcb);
+int pcb_queue_pop(pcb_queue_t queue, struct pcb **pcb);
/**
* Remove the specified PCB from the indicated queue.
@@ -246,7 +246,7 @@ int pcb_queue_remove(pcb_queue_t queue, struct pcb **pcb);
* @param pcb[in] Pointer to the PCB to be removed
* @return status of the removal request
*/
-int pcb_queue_remove_this(pcb_queue_t queue, struct pcb *pcb);
+int pcb_queue_remove(pcb_queue_t queue, struct pcb *pcb);
/**
* Schedule the supplied process
diff --git a/kernel/include/comus/syscalls.h b/kernel/include/comus/syscalls.h
new file mode 100644
index 0000000..3dc128d
--- /dev/null
+++ b/kernel/include/comus/syscalls.h
@@ -0,0 +1,37 @@
+/**
+ * @file syscalls.h
+ *
+ * @author Freya Murphy <freya@freyacat.org>
+ * @author cisi 452
+ *
+ * System call declarations
+ */
+
+#ifndef SYSCALLS_H_
+#define SYSCALLS_H_
+
+#define SYS_exit 0
+#define SYS_waitpid 1
+#define SYS_fork 2
+#define SYS_exec 3
+#define SYS_open 4
+#define SYS_close 5
+#define SYS_read 6
+#define SYS_write 7
+#define SYS_getpid 8
+#define SYS_getppid 9
+#define SYS_gettime 10
+#define SYS_getprio 11
+#define SYS_setprio 12
+#define SYS_kill 13
+#define SYS_sleep 14
+#define SYS_brk 15
+#define SYS_sbrk 16
+
+// UPDATE THIS DEFINITION IF MORE SYSCALLS ARE ADDED!
+#define N_SYSCALLS 13
+
+// interrupt vector entry for system calls
+#define VEC_SYSCALL 0x80
+
+#endif /* syscalls.h */
diff --git a/kernel/mboot/module.c b/kernel/mboot/module.c
index 7a64f2e..79d092e 100644
--- a/kernel/mboot/module.c
+++ b/kernel/mboot/module.c
@@ -20,5 +20,5 @@ void *mboot_get_initrd(size_t *len)
struct multiboot_tag_module *mod = (struct multiboot_tag_module *)tag;
*len = mod->mod_end - mod->mod_start;
- return (void*) (uintptr_t) mod->mod_start;
+ return (void *)(uintptr_t)mod->mod_start;
}
diff --git a/kernel/memory/memory.c b/kernel/memory/memory.c
index de94fe3..1d10414 100644
--- a/kernel/memory/memory.c
+++ b/kernel/memory/memory.c
@@ -10,7 +10,7 @@
#include "physalloc.h"
mem_ctx_t kernel_mem_ctx;
-struct mem_ctx_s _kernel_mem_ctx;
+static struct mem_ctx_s _kernel_mem_ctx;
extern volatile char kernel_pml4[];
extern struct virt_ctx kernel_virt_ctx;
@@ -64,6 +64,11 @@ void mem_ctx_free(mem_ctx_t ctx)
panic("not yet implemented");
}
+void mem_ctx_switch(mem_ctx_t ctx)
+{
+ __asm__ volatile("mov %0, %%cr3" ::"r"(ctx->pml4) : "memory");
+}
+
void memory_init(void)
{
struct memory_map mmap;
diff --git a/kernel/procs.c b/kernel/procs.c
index a8352b0..f97d358 100644
--- a/kernel/procs.c
+++ b/kernel/procs.c
@@ -174,7 +174,7 @@ int pcb_alloc(struct pcb **pcb)
// remove the first PCB from the free list
struct pcb *tmp;
- if (pcb_queue_remove(pcb_freelist, &tmp) != SUCCESS)
+ if (pcb_queue_pop(pcb_freelist, &tmp) != SUCCESS)
return E_NO_PCBS;
*pcb = tmp;
@@ -261,10 +261,10 @@ void pcb_zombify(register struct pcb *victim)
if (zchild != NULL && init_pcb->state == PROC_STATE_WAITING) {
// dequeue the zombie
- assert(pcb_queue_remove_this(zombie, zchild) == SUCCESS,
+ assert(pcb_queue_remove(zombie, zchild) == SUCCESS,
"pcb_zombify: cannot remove zombie process from queue");
- assert(pcb_queue_remove_this(waiting, init_pcb) == SUCCESS,
+ assert(pcb_queue_remove(waiting, init_pcb) == SUCCESS,
"pcb_zombify: cannot remove waiting process from queue");
// intrinsic return value is the PID
@@ -436,12 +436,6 @@ bool pcb_queue_empty(pcb_queue_t queue)
return PCB_QUEUE_EMPTY(queue);
}
-/**
- * Return the count of elements in the specified queue.
- *
- * @param[in] queue The queue to check
- * @return the count (0 if the queue is empty)
- */
size_t pcb_queue_length(const pcb_queue_t queue)
{
// sanity check
@@ -526,11 +520,11 @@ int pcb_queue_insert(pcb_queue_t queue, struct pcb *pcb)
return SUCCESS;
}
-int pcb_queue_remove(pcb_queue_t queue, struct pcb **pcb)
+int pcb_queue_pop(pcb_queue_t queue, struct pcb **pcb)
{
//sanity checks
- assert(queue != NULL, "pcb_queue_remove: queue is null");
- assert(pcb != NULL, "pcb_queue_remove: pcb is null");
+ assert(queue != NULL, "pcb_queue_pop: queue is null");
+ assert(pcb != NULL, "pcb_queue_pop: pcb is null");
// can't get anything if there's nothing to get!
if (PCB_QUEUE_EMPTY(queue)) {
@@ -556,11 +550,11 @@ int pcb_queue_remove(pcb_queue_t queue, struct pcb **pcb)
return SUCCESS;
}
-int pcb_queue_remove_this(pcb_queue_t queue, struct pcb *pcb)
+int pcb_queue_remove(pcb_queue_t queue, struct pcb *pcb)
{
//sanity checks
- assert(queue != NULL, "pcb_queue_remove_this: queue is null");
- assert(pcb != NULL, "pcb_queue_remove_this: pcb is null");
+ assert(queue != NULL, "pcb_queue_remove: queue is null");
+ assert(pcb != NULL, "pcb_queue_remove: pcb is null");
// can't get anything if there's nothing to get!
if (PCB_QUEUE_EMPTY(queue)) {
@@ -587,8 +581,7 @@ int pcb_queue_remove_this(pcb_queue_t queue, struct pcb *pcb)
if (curr == NULL) {
// case 1
- assert(prev != NULL,
- "pcb_queue_remove_this: prev element in queue is null");
+ assert(prev != NULL, "pcb_queue_remove: prev element in queue is null");
// case 4
return E_NOT_FOUND;
}
@@ -621,7 +614,7 @@ int pcb_queue_remove_this(pcb_queue_t queue, struct pcb *pcb)
assert((queue->head == NULL && queue->tail == NULL) ||
(queue->head != NULL && queue->tail != NULL),
- "pcb_queue_remove_this: queue consistancy problem");
+ "pcb_queue_remove: queue consistancy problem");
return SUCCESS;
}
@@ -663,7 +656,7 @@ void dispatch(void)
assert(current == NULL, "dispatch: current process is not null");
// grab whoever is at the head of the queue
- int status = pcb_queue_remove(ready, &current);
+ int status = pcb_queue_pop(ready, &current);
if (status != SUCCESS) {
panic("dispatch queue remove failed, code %d", status);
}
diff --git a/kernel/user.c b/kernel/user.c
new file mode 100644
index 0000000..0a237e9
--- /dev/null
+++ b/kernel/user.c
@@ -0,0 +1,11 @@
+#include <comus/procs.h>
+#include <comus/memory.h>
+
+void user_cleanup(struct pcb *pcb)
+{
+ if (pcb == NULL)
+ return;
+
+ mem_ctx_free(pcb->memctx);
+ pcb->memctx = NULL;
+}