diff options
author | Anton Kling <anton@kling.gg> | 2024-10-14 21:43:20 +0200 |
---|---|---|
committer | Anton Kling <anton@kling.gg> | 2024-10-14 21:43:20 +0200 |
commit | 8913568be10385abdba07285162506a36827e16e (patch) | |
tree | 50ab2114680baf0395d6682e72a595c6d9aa9587 | |
parent | 87af93c7521be331a5794c6a53f31d13b3a24baa (diff) |
kernel: small bug fixes
-rw-r--r-- | kernel/cpu/isr.s | 2 | ||||
-rw-r--r-- | kernel/kmalloc.c | 3 | ||||
-rw-r--r-- | kernel/random.c | 9 | ||||
-rw-r--r-- | kernel/sched/scheduler.c | 7 | ||||
-rw-r--r-- | kernel/sched/scheduler.h | 1 | ||||
-rw-r--r-- | kernel/socket.c | 1 |
6 files changed, 14 insertions, 9 deletions
diff --git a/kernel/cpu/isr.s b/kernel/cpu/isr.s index 9fca13c..09fcc24 100644 --- a/kernel/cpu/isr.s +++ b/kernel/cpu/isr.s @@ -2,7 +2,7 @@ .section .text # Due to x86 not giving the interrupt number these isr stubs are # created. This is to allow a general isr stub for all interrupts. This -# stub will act as a # multiplexer to the correct interrupt. +# stub will act as a multiplexer to the correct interrupt. .macro ISR_NOERRCODE num .global isr\num isr\num: diff --git a/kernel/kmalloc.c b/kernel/kmalloc.c index f5188cc..19ed252 100644 --- a/kernel/kmalloc.c +++ b/kernel/kmalloc.c @@ -242,8 +242,7 @@ void kfree(void *p) { if (!p) { return; } - // FIXME: This assumes that p is at the start of a allocated area. - // Could this be avoided in a simple way? + MallocHeader *h = (MallocHeader *)((uintptr_t)p - sizeof(MallocHeader)); assert(h->magic == 0xdde51ab9410268b1); assert(!(h->flags & IS_FREE)); diff --git a/kernel/random.c b/kernel/random.c index 4389ee0..d54c5a0 100644 --- a/kernel/random.c +++ b/kernel/random.c @@ -161,6 +161,10 @@ int random_read(BYTEPTR buffer, u64 offset, u64 len, vfs_fd_t *fd) { } void add_random_devices(void) { + devfs_add_file("/random", random_read, random_write, NULL, always_has_data, + always_can_write, FS_TYPE_CHAR_DEVICE); + devfs_add_file("/urandom", random_read, random_write, NULL, always_has_data, + always_can_write, FS_TYPE_CHAR_DEVICE); BYTE seed[1024]; int rand_fd = vfs_open("/etc/seed", O_RDWR, 0); if (0 > rand_fd) { @@ -184,9 +188,4 @@ void add_random_devices(void) { get_random(seed, 1024); vfs_pwrite(rand_fd, seed, 1024, 0); vfs_close(rand_fd); - - devfs_add_file("/random", random_read, random_write, NULL, always_has_data, - always_can_write, FS_TYPE_CHAR_DEVICE); - devfs_add_file("/urandom", random_read, random_write, NULL, always_has_data, - always_can_write, FS_TYPE_CHAR_DEVICE); } diff --git a/kernel/sched/scheduler.c b/kernel/sched/scheduler.c index 9fec2b7..98df414 100644 --- a/kernel/sched/scheduler.c +++ b/kernel/sched/scheduler.c @@ -193,7 +193,7 @@ void free_process(process_t *p) { continue; } MemoryMap *m = p->maps[i]; - mmu_remove_virtual_physical_address_mapping(m->u_address, m->length); + munmap(m->u_address, m->length); } list_free(&p->read_list); @@ -660,6 +660,9 @@ int munmap(void *addr, size_t length) { continue; } if (addr == m->u_address) { + assert(m->underlying_object->num_of_references > 0); + m->underlying_object->num_of_references--; + mmu_remove_virtual_physical_address_mapping(m->u_address, m->length); current_task->maps[i] = NULL; return 0; } @@ -722,5 +725,7 @@ void *mmap(void *addr, size_t length, int prot, int flags, int fd, free_map->k_address = NULL; free_map->length = length; free_map->fd = fd; + free_map->underlying_object = vmobject; + vmobject->num_of_references++; return rc; } diff --git a/kernel/sched/scheduler.h b/kernel/sched/scheduler.h index 85c2a4c..9d548a3 100644 --- a/kernel/sched/scheduler.h +++ b/kernel/sched/scheduler.h @@ -37,6 +37,7 @@ typedef struct { void *k_address; u32 length; int fd; + struct vfs_vm_object *underlying_object; } MemoryMap; typedef struct { diff --git a/kernel/socket.c b/kernel/socket.c index cc5a645..ad24134 100644 --- a/kernel/socket.c +++ b/kernel/socket.c @@ -15,6 +15,7 @@ #include <socket.h> #include <stdatomic.h> #include <sys/socket.h> +#include <timer.h> #define OBJECT_UNIX 0 #define OBJECT_TCP 1 |