diff options
-rw-r--r-- | kernel/fs/fs.c | 45 | ||||
-rw-r--r-- | kernel/include/comus/memory.h | 6 | ||||
-rw-r--r-- | kernel/include/comus/procs.h | 4 | ||||
-rw-r--r-- | kernel/include/comus/syscalls.h | 37 | ||||
-rw-r--r-- | kernel/mboot/module.c | 2 | ||||
-rw-r--r-- | kernel/memory/memory.c | 7 | ||||
-rw-r--r-- | kernel/procs.c | 31 | ||||
-rw-r--r-- | kernel/user.c | 11 |
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, ¤t); + int status = pcb_queue_pop(ready, ¤t); 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; +} |