Skip to content

Commit 0ac9fd2

Browse files
committed
Fixed the GPF when switching processes
1 parent 4a98ecd commit 0ac9fd2

File tree

11 files changed

+82
-46
lines changed

11 files changed

+82
-46
lines changed

include/kernel/heap.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ extern "C" {
77

88
#include <types.h>
99

10-
#define HEAP_SIZE 16
10+
#define HEAP_SIZE 256
1111
#define HEAP_FREE 0
1212
#define HEAP_USED 1
1313
#define HEAP_MAGIC 0x534f6d00
@@ -27,7 +27,7 @@ typedef struct heap_node_t {
2727
struct heap_node_t* next; // 8 bytes
2828
struct heap_node_t* prev; // 8 bytes
2929
uint8_t data[];
30-
} /*__attribute__((packed))*/ heap_node_t;
30+
} heap_node_t;
3131

3232
typedef struct heap_node_t* heap_node_p;
3333

include/kernel/proc.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,6 @@ typedef struct proc_info_t {
7777
proc_info_p* children;
7878
uint32_t children_count;
7979
uint32_t pid;
80-
char name[32];
8180
uintptr_t brk;
8281
uintptr_t heap;
8382
uintptr_t* stack;
@@ -87,6 +86,7 @@ typedef struct proc_info_t {
8786
void(*entrypoint)(void*);
8887
void* arguments;
8988
proc_info_p next;
89+
char name[32];
9090
} proc_info_t;
9191

9292
typedef proc_info_t* proc_info_p;
@@ -95,7 +95,7 @@ extern proc_info_p procs[PROC_MAX];
9595
extern proc_info_p current;
9696

9797
void init_scheduler();
98-
void proc_create(proc_info_p proc, void (*entrypoint)(void *), void* arg);
98+
void proc_create(proc_info_p proc, const char* name, void (*entrypoint)(void *), void* arg);
9999
void proc_execute(proc_info_p proc);
100100

101101
#ifdef __cplusplus

include/kernel/thread.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ extern "C" {
66
#endif
77

88
typedef struct kthread_t {
9-
9+
char* name;
1010
} kthread_t;
1111

1212
// typedef void *(*entrypoint)(void *) kthread_handler_t;

obj/acpica/.gitkeep

Whitespace-only changes.

src/kernel/main.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,14 @@ void _start() {
8686

8787
init_scheduler();
8888

89-
// kthread_t* thread;
90-
// kthread_create(thread, thread_code, NULL);
91-
9289
sti();
9390

91+
kthread_t thread = {
92+
.name = "thread0\0",
93+
};
94+
kthread_create(&thread, thread_code, NULL);
95+
printf("- Created thread\n");
96+
9497
while(true) {
9598

9699
}

src/kernel/mem/kmalloc.c

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include <types.h>
22
#include <kernel/heap.h>
3+
#include <kernel/kernel.h>
34
#include <kernel/serial.h>
45
#include <stdio.h>
56
#include <string.h>
@@ -49,8 +50,6 @@ void init_heap(void* addr, size_t size) {
4950
heap->prev = NULL;
5051
heap->next = NULL;
5152
heap->status = HEAP_FREE;
52-
memset(heap->data, 0xee, heap->size);
53-
5453
free_mem = heap->size;
5554

5655
serial_printf("Heap initialized at %p with size %d\n", addr, size);
@@ -79,59 +78,75 @@ HEAP_INSPECT_RESULT inspect_heap(uint32_t node_index, heap_node_p* node) {
7978
}
8079

8180
int find_first_free_node(size_t size, heap_node_p* node) {
81+
serial_line("");
8282
*node = (heap_node_p)heap;
83+
serial_line("");
8384

84-
// serial_printf("find_first_free_node: node @ %p\n", *node);
85+
serial_printf("find_first_free_node: node @ %p\n", *node);
8586

8687
while(*node) {
88+
// serial_line("");
8789
// serial_printf("find_first_free_node: node->magic: %lx - node->status = %s(%d) - node->size: %d - requested: %d, required: %d\n", (*node)->magic, (*node)->status == HEAP_FREE ? "FREE" : "USED", (*node)->status, (*node)->size, size, (size + HEAP_HEADER_SIZE));
8890
if((*node)->status == HEAP_FREE && ((*node)->size == size || (*node)->size >= size + HEAP_HEADER_SIZE)) {
8991
return 0;
9092
}
93+
// serial_line("");
9194
*node = (*node)->next;
9295
}
9396

97+
serial_line("");
98+
if(!*node) {
99+
serial_line("");
100+
serial_printf("find_first_free_node: no free node found\n");
101+
}
102+
103+
serial_line("");
94104
return -1;
95105
}
96106

97107
void* kmalloc(size_t size) {
108+
serial_printf("kmalloc: size: %d, free_mem: %d\n", size, free_mem);
98109
if(size == 0) {
99110
serial_printf("kmalloc: size is 0\n");
100111
return NULL;
101112
}
102113

103114
heap_node_p node = NULL;
104115
heap_node_p next = NULL;
105-
116+
serial_line("");
106117
if(find_first_free_node(size, &node) != 0) {
107-
serial_printf("kmalloc: no free node found\n");
118+
serial_line("");
119+
serial_printf("kmalloc: no free node found. free: %d - needed: %d\n", free_mem, size);
120+
serial_line("");
121+
debug_heap(heap);
122+
hcf();
108123
return NULL;
109124
}
110-
125+
serial_line("");
111126
if(node->size == size) {
112127
node->status = HEAP_USED;
113128
free_mem -= node->size;
114129

115-
// serial_printf("kmalloc: node @ %p, free_mem: %d\n", node, free_mem);
130+
serial_printf("kmalloc: node @ %p, free_mem: %d\n", node, free_mem);
116131

117132
return (void*)node->data;
118133
}
119-
134+
serial_line("");
120135
next = (heap_node_p)(((uintptr_t)node) + HEAP_HEADER_SIZE + size);
121136
// serial_printf("kmalloc: this @ %p, next @ %p, diff: %d, size: %d, header: %d\n", node, next, (uintptr_t)next - (uintptr_t)node, size, HEAP_HEADER_SIZE);
122-
137+
serial_line("");
123138
next->magic = HEAP_MAGIC;
124139
next->size = node->size - (size + HEAP_HEADER_SIZE);
125140
next->prev = node;
126141
next->next = node->next;
127142
next->status = HEAP_FREE;
128-
143+
serial_line("");
129144
free_mem -= (size + HEAP_HEADER_SIZE);
130-
145+
serial_line("");
131146
node->status = HEAP_USED;
132147
node->size = size;
133148
node->next = next;
134-
149+
serial_line("");
135150
// debug_heap(heap);
136151
// serial_printf("kmalloc: node @ %p, free_mem: %d\n", node, free_mem);
137152

src/kernel/proc/kthread.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,20 @@
22
#include <kernel/heap.h>
33
#include <kernel/proc.h>
44
#include <kernel/thread.h>
5+
#include <kernel/serial.h>
56

67
#include <string.h>
78

89
int kthread_create(kthread_t* thread, void (*entrypoint)(void *), void* arg) {
910
proc_info_p proc = kmalloc(sizeof(proc_info_p));
10-
11-
strncpy(proc->name, "kthread\0", 8);
12-
proc_create(proc, entrypoint, arg);
11+
serial_line("");
12+
proc_create(proc, thread->name, entrypoint, arg);
13+
serial_line("");
1314
proc->cpu_state->cs = KERNEL_CODE_SEGMENT;
1415
proc->cpu_state->ss = KERNEL_DATA_SEGMENT;
16+
serial_line("");
1517
proc_execute(proc);
18+
serial_line("");
1619

1720
return 0;
1821
}

src/kernel/proc/proc.c

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ proc_info_p procs[PROC_MAX] = {
2727
proc_info_p current = &kernel_process_info;
2828

2929
void proc_switch(void* arg) {
30-
cpu_state_p state = (cpu_state_p)arg;
30+
// cpu_state_p state = (cpu_state_p)arg;
3131
// serial_printf("states: rax: %lx - rbx: %lx - rcx: %lx - rdx: %lx - rsi: %lx\n", state->rax, state->rbx, state->rcx, state->rdx, state->rsi);
3232
// serial_printf("states: rdi: %lx - rsp: %lx - r8: %lx - r9: %lx - r10: %lx\n", state->rdi, state->rsp, state->r8, state->r9, state->r10);
3333
// serial_printf("states: r11: %lx\n", state->r11);
@@ -38,15 +38,12 @@ void proc_switch(void* arg) {
3838
// serial_printf("states: cr3: %lx\n", state->cr3);
3939
// serial_printf("states: rbp: %lx\n", state->rbp);
4040
// serial_printf("states: ss: %lx\n", state->ss);
41-
serial_line("");
42-
43-
// serial_printf("proc_switch: Current process %s\n", current->name);
41+
serial_printf("proc_switch: Current process %s\n", current->name);
4442
// memcpy(current->cpu_state, state, sizeof(cpu_state_t));
45-
/*
43+
4644
current->state = PROC_STATE_READY;
47-
serial_line("");
4845
current = current->next;
49-
serial_line("");
46+
/*
5047
if(current->state == PROC_STATE_NEW) {
5148
serial_line("");
5249
current->state = PROC_STATE_READY;
@@ -70,26 +67,42 @@ void proc_switch(void* arg) {
7067
// (current->entrypoint)(current->arguments);
7168
// serial_line("");
7269
}
73-
serial_line("");
74-
serial_printf("proc_switch: Switching to process %s\n", current->name);
7570
*/
71+
serial_printf("proc_switch: Switching to process %s\n", current->name);
7672
}
7773

78-
void proc_create(proc_info_p proc, void (*entrypoint)(void *), void* arg) {
79-
proc->children = NULL;
74+
void proc_create(proc_info_p proc, const char* name, void (*entrypoint)(void *), void* arg) {
75+
serial_line("");
76+
memcpy(proc->name, name, 32);
77+
serial_line("");
78+
*proc->children = NULL;
79+
serial_line("");
8080
proc->children_count = 0;
81-
proc->cpu_state = (cpu_state_t*)kmalloc(sizeof(cpu_state_t));
81+
serial_line("");
82+
void* foo = kmalloc(sizeof(cpu_state_t));
83+
serial_printf("foo: %p\n", foo);
84+
proc->cpu_state = (cpu_state_p)foo;
85+
serial_line("");
8286
proc->parent = current;
87+
serial_line("");
8388
proc->pid = last_pid++;
89+
serial_line("");
8490
proc->priority = PROC_PRIO_NORMAL;
91+
serial_line("");
8592
proc->stack = kmalloc(PROC_STACK_SIZE);
93+
serial_line("");
8694
proc->state = PROC_STATE_NEW;
95+
serial_line("");
8796
proc->entrypoint = entrypoint;
97+
serial_line("");
8898
proc->arguments = arg;
99+
serial_line("");
89100
}
90101

91102
void proc_execute(proc_info_p proc) {
103+
serial_line("");
92104
proc->next = current->next;
105+
serial_line("");
93106
current->next = proc;
94107

95108
serial_printf("proc_execute: Executing process %s\n", proc->name);

src/kernel/timer/timer.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ void timer_handler(void* state) {
3737
callback[i](state);
3838
}
3939
}
40-
4140
timer_eoi();
4241
}
4342

src/kernel/timer/tsc.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,12 @@ void init_tsc() {
4848
}
4949
puts(".");
5050

51-
serial_printf("init_tsc: starttime %d\n", start_time);
52-
serial_printf("init_tsc: starttsc %d\n", start_tsc);
51+
serial_printf("init_tsc: starttime %ld\n", start_time);
52+
serial_printf("init_tsc: starttsc %ld\n", start_tsc);
5353

5454
start_time = unix_time();
5555

56-
serial_printf("init_tsc: starttime %d\n", start_time);
56+
serial_printf("init_tsc: starttime %ld\n", start_time);
5757

5858
uint64_t last_sec = start_time;
5959

@@ -67,12 +67,12 @@ void init_tsc() {
6767

6868
uint64_t frequency = (end_tsc - start_tsc) / 5;
6969

70-
serial_printf("init_tsc: endtime %d\n", end_time);
71-
serial_printf("init_tsc: endtsc %d\n", end_tsc);
72-
serial_printf("init_tsc: tscdiff %d\n", end_tsc - start_tsc);
73-
serial_printf("init_tsc: timediff %d\n", end_time - start_time);
74-
serial_printf("init_tsc: per sec %d\n", frequency);
75-
printf(".OK\n Frequency: %dfs\n", frequency);
70+
serial_printf("init_tsc: endtime %ld\n", end_time);
71+
serial_printf("init_tsc: endtsc %ld\n", end_tsc);
72+
serial_printf("init_tsc: tscdiff %ld\n", end_tsc - start_tsc);
73+
serial_printf("init_tsc: timediff %ld\n", end_time - start_time);
74+
serial_printf("init_tsc: per sec %ld\n", frequency);
75+
printf(".OK\n Frequency: %ldfs\n", frequency);
7676

7777
}
7878

0 commit comments

Comments
 (0)