summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2024-10-14 21:43:20 +0200
committerAnton Kling <anton@kling.gg>2024-10-14 21:43:20 +0200
commit8913568be10385abdba07285162506a36827e16e (patch)
tree50ab2114680baf0395d6682e72a595c6d9aa9587
parent87af93c7521be331a5794c6a53f31d13b3a24baa (diff)
kernel: small bug fixes
-rw-r--r--kernel/cpu/isr.s2
-rw-r--r--kernel/kmalloc.c3
-rw-r--r--kernel/random.c9
-rw-r--r--kernel/sched/scheduler.c7
-rw-r--r--kernel/sched/scheduler.h1
-rw-r--r--kernel/socket.c1
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