summaryrefslogtreecommitdiff
path: root/kernel/cpu
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2024-02-14 17:40:06 +0100
committerAnton Kling <anton@kling.gg>2024-02-14 17:40:06 +0100
commit3922adcdec5bd003b4106ffce79c28553bc40c15 (patch)
treef1af360cd7ad75d4b5f19bf066bf7e29ce8e3e53 /kernel/cpu
parenta8ffc46136eb16adc87fb520c724467d1295a854 (diff)
Kernel: Update signal handling and IPC
Diffstat (limited to 'kernel/cpu')
-rw-r--r--kernel/cpu/idt.c39
-rw-r--r--kernel/cpu/isr.s297
2 files changed, 329 insertions, 7 deletions
diff --git a/kernel/cpu/idt.c b/kernel/cpu/idt.c
index 823cc2a..30b6253 100644
--- a/kernel/cpu/idt.c
+++ b/kernel/cpu/idt.c
@@ -76,10 +76,9 @@ void page_fault(reg_t *regs) {
volatile uint32_t cr2;
asm volatile("mov %%cr2, %0" : "=r"(cr2));
kprintf("CR2: %x\n", cr2);
- if (0xFFFFDEAD == cr2) {
- for (;;) {
- switch_task(0);
- }
+ if (0xDEADC0DE == cr2) {
+ EOI(0xB);
+ process_pop_restore_context(NULL, regs);
return;
}
klog("Page Fault", LOG_ERROR);
@@ -219,16 +218,42 @@ void *isr_list[] = {
isr252, isr253, isr254, isr255,
};
-void (*list_of_handlers[256])(reg_t *);
+typedef int (*interrupt_handler)(reg_t *);
+
+interrupt_handler list_of_handlers[256];
void int_handler(reg_t *r) {
- list_of_handlers[r->int_no](r);
+ interrupt_handler handler = list_of_handlers[r->int_no];
+ if (NULL == handler) {
+ kprintf("[NOTE] Interrupt(0x%x) called but has no interrupt handler",
+ r->int_no);
+ return;
+ }
+
+ handler(r);
+
+ int is_kernel = (r->cs == 0x08);
+ if (!is_kernel) {
+ const signal_t *sig = process_pop_signal(NULL);
+ if (sig) {
+ process_push_restore_context(NULL, *r);
+ r->eip = sig->handler_ip;
+ kprintf("jumping to: %x\n", r->eip);
+ // kprintf("esp: %x\n", r->esp);
+ // kprintf("ebp: %x\n", r->ebp);
+
+ // Add magic value to the stack such that the signal handler
+ // returns to 0xDEADC0DE
+ r->useresp -= 4;
+ *(u32 *)r->useresp = 0xDEADC0DE;
+ }
+ }
}
void install_handler(void (*handler_function)(), u16 type_attribute, u8 entry) {
format_descriptor((u32)isr_list[entry], KERNEL_CODE_SEGMENT_OFFSET,
type_attribute, &IDT_Entry[entry]);
- list_of_handlers[entry] = handler_function;
+ list_of_handlers[entry] = (interrupt_handler)handler_function;
}
void idt_init(void) {
diff --git a/kernel/cpu/isr.s b/kernel/cpu/isr.s
new file mode 100644
index 0000000..1bb2fff
--- /dev/null
+++ b/kernel/cpu/isr.s
@@ -0,0 +1,297 @@
+.intel_syntax noprefix
+.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.
+.macro ISR_NOERRCODE num
+ .global isr\num
+ isr\num:
+ cli
+ push 0
+ push \num
+ jmp isr_common_stub
+.endm
+
+ISR_NOERRCODE 0
+ISR_NOERRCODE 1
+ISR_NOERRCODE 2
+ISR_NOERRCODE 3
+ISR_NOERRCODE 4
+ISR_NOERRCODE 5
+ISR_NOERRCODE 6
+ISR_NOERRCODE 7
+ISR_NOERRCODE 8
+ISR_NOERRCODE 9
+ISR_NOERRCODE 10
+ISR_NOERRCODE 11
+ISR_NOERRCODE 12
+ISR_NOERRCODE 13
+ISR_NOERRCODE 14
+ISR_NOERRCODE 15
+ISR_NOERRCODE 16
+ISR_NOERRCODE 17
+ISR_NOERRCODE 18
+ISR_NOERRCODE 19
+ISR_NOERRCODE 20
+ISR_NOERRCODE 21
+ISR_NOERRCODE 22
+ISR_NOERRCODE 23
+ISR_NOERRCODE 24
+ISR_NOERRCODE 25
+ISR_NOERRCODE 26
+ISR_NOERRCODE 27
+ISR_NOERRCODE 28
+ISR_NOERRCODE 29
+ISR_NOERRCODE 30
+ISR_NOERRCODE 31
+ISR_NOERRCODE 32
+ISR_NOERRCODE 33
+ISR_NOERRCODE 34
+ISR_NOERRCODE 35
+ISR_NOERRCODE 36
+ISR_NOERRCODE 37
+ISR_NOERRCODE 38
+ISR_NOERRCODE 39
+ISR_NOERRCODE 40
+ISR_NOERRCODE 41
+ISR_NOERRCODE 42
+ISR_NOERRCODE 43
+ISR_NOERRCODE 44
+ISR_NOERRCODE 45
+ISR_NOERRCODE 46
+ISR_NOERRCODE 47
+ISR_NOERRCODE 48
+ISR_NOERRCODE 49
+ISR_NOERRCODE 50
+ISR_NOERRCODE 51
+ISR_NOERRCODE 52
+ISR_NOERRCODE 53
+ISR_NOERRCODE 54
+ISR_NOERRCODE 55
+ISR_NOERRCODE 56
+ISR_NOERRCODE 57
+ISR_NOERRCODE 58
+ISR_NOERRCODE 59
+ISR_NOERRCODE 60
+ISR_NOERRCODE 61
+ISR_NOERRCODE 62
+ISR_NOERRCODE 63
+ISR_NOERRCODE 64
+ISR_NOERRCODE 65
+ISR_NOERRCODE 66
+ISR_NOERRCODE 67
+ISR_NOERRCODE 68
+ISR_NOERRCODE 69
+ISR_NOERRCODE 70
+ISR_NOERRCODE 71
+ISR_NOERRCODE 72
+ISR_NOERRCODE 73
+ISR_NOERRCODE 74
+ISR_NOERRCODE 75
+ISR_NOERRCODE 76
+ISR_NOERRCODE 77
+ISR_NOERRCODE 78
+ISR_NOERRCODE 79
+ISR_NOERRCODE 80
+ISR_NOERRCODE 81
+ISR_NOERRCODE 82
+ISR_NOERRCODE 83
+ISR_NOERRCODE 84
+ISR_NOERRCODE 85
+ISR_NOERRCODE 86
+ISR_NOERRCODE 87
+ISR_NOERRCODE 88
+ISR_NOERRCODE 89
+ISR_NOERRCODE 90
+ISR_NOERRCODE 91
+ISR_NOERRCODE 92
+ISR_NOERRCODE 93
+ISR_NOERRCODE 94
+ISR_NOERRCODE 95
+ISR_NOERRCODE 96
+ISR_NOERRCODE 97
+ISR_NOERRCODE 98
+ISR_NOERRCODE 99
+ISR_NOERRCODE 100
+ISR_NOERRCODE 101
+ISR_NOERRCODE 102
+ISR_NOERRCODE 103
+ISR_NOERRCODE 104
+ISR_NOERRCODE 105
+ISR_NOERRCODE 106
+ISR_NOERRCODE 107
+ISR_NOERRCODE 108
+ISR_NOERRCODE 109
+ISR_NOERRCODE 110
+ISR_NOERRCODE 111
+ISR_NOERRCODE 112
+ISR_NOERRCODE 113
+ISR_NOERRCODE 114
+ISR_NOERRCODE 115
+ISR_NOERRCODE 116
+ISR_NOERRCODE 117
+ISR_NOERRCODE 118
+ISR_NOERRCODE 119
+ISR_NOERRCODE 120
+ISR_NOERRCODE 121
+ISR_NOERRCODE 122
+ISR_NOERRCODE 123
+ISR_NOERRCODE 124
+ISR_NOERRCODE 125
+ISR_NOERRCODE 126
+ISR_NOERRCODE 127
+ISR_NOERRCODE 128
+ISR_NOERRCODE 129
+ISR_NOERRCODE 130
+ISR_NOERRCODE 131
+ISR_NOERRCODE 132
+ISR_NOERRCODE 133
+ISR_NOERRCODE 134
+ISR_NOERRCODE 135
+ISR_NOERRCODE 136
+ISR_NOERRCODE 137
+ISR_NOERRCODE 138
+ISR_NOERRCODE 139
+ISR_NOERRCODE 140
+ISR_NOERRCODE 141
+ISR_NOERRCODE 142
+ISR_NOERRCODE 143
+ISR_NOERRCODE 144
+ISR_NOERRCODE 145
+ISR_NOERRCODE 146
+ISR_NOERRCODE 147
+ISR_NOERRCODE 148
+ISR_NOERRCODE 149
+ISR_NOERRCODE 150
+ISR_NOERRCODE 151
+ISR_NOERRCODE 152
+ISR_NOERRCODE 153
+ISR_NOERRCODE 154
+ISR_NOERRCODE 155
+ISR_NOERRCODE 156
+ISR_NOERRCODE 157
+ISR_NOERRCODE 158
+ISR_NOERRCODE 159
+ISR_NOERRCODE 160
+ISR_NOERRCODE 161
+ISR_NOERRCODE 162
+ISR_NOERRCODE 163
+ISR_NOERRCODE 164
+ISR_NOERRCODE 165
+ISR_NOERRCODE 166
+ISR_NOERRCODE 167
+ISR_NOERRCODE 168
+ISR_NOERRCODE 169
+ISR_NOERRCODE 170
+ISR_NOERRCODE 171
+ISR_NOERRCODE 172
+ISR_NOERRCODE 173
+ISR_NOERRCODE 174
+ISR_NOERRCODE 175
+ISR_NOERRCODE 176
+ISR_NOERRCODE 177
+ISR_NOERRCODE 178
+ISR_NOERRCODE 179
+ISR_NOERRCODE 180
+ISR_NOERRCODE 181
+ISR_NOERRCODE 182
+ISR_NOERRCODE 183
+ISR_NOERRCODE 184
+ISR_NOERRCODE 185
+ISR_NOERRCODE 186
+ISR_NOERRCODE 187
+ISR_NOERRCODE 188
+ISR_NOERRCODE 189
+ISR_NOERRCODE 190
+ISR_NOERRCODE 191
+ISR_NOERRCODE 192
+ISR_NOERRCODE 193
+ISR_NOERRCODE 194
+ISR_NOERRCODE 195
+ISR_NOERRCODE 196
+ISR_NOERRCODE 197
+ISR_NOERRCODE 198
+ISR_NOERRCODE 199
+ISR_NOERRCODE 200
+ISR_NOERRCODE 201
+ISR_NOERRCODE 202
+ISR_NOERRCODE 203
+ISR_NOERRCODE 204
+ISR_NOERRCODE 205
+ISR_NOERRCODE 206
+ISR_NOERRCODE 207
+ISR_NOERRCODE 208
+ISR_NOERRCODE 209
+ISR_NOERRCODE 210
+ISR_NOERRCODE 211
+ISR_NOERRCODE 212
+ISR_NOERRCODE 213
+ISR_NOERRCODE 214
+ISR_NOERRCODE 215
+ISR_NOERRCODE 216
+ISR_NOERRCODE 217
+ISR_NOERRCODE 218
+ISR_NOERRCODE 219
+ISR_NOERRCODE 220
+ISR_NOERRCODE 221
+ISR_NOERRCODE 222
+ISR_NOERRCODE 223
+ISR_NOERRCODE 224
+ISR_NOERRCODE 225
+ISR_NOERRCODE 226
+ISR_NOERRCODE 227
+ISR_NOERRCODE 228
+ISR_NOERRCODE 229
+ISR_NOERRCODE 230
+ISR_NOERRCODE 231
+ISR_NOERRCODE 232
+ISR_NOERRCODE 233
+ISR_NOERRCODE 234
+ISR_NOERRCODE 235
+ISR_NOERRCODE 236
+ISR_NOERRCODE 237
+ISR_NOERRCODE 238
+ISR_NOERRCODE 239
+ISR_NOERRCODE 240
+ISR_NOERRCODE 241
+ISR_NOERRCODE 242
+ISR_NOERRCODE 243
+ISR_NOERRCODE 244
+ISR_NOERRCODE 245
+ISR_NOERRCODE 246
+ISR_NOERRCODE 247
+ISR_NOERRCODE 248
+ISR_NOERRCODE 249
+ISR_NOERRCODE 250
+ISR_NOERRCODE 251
+ISR_NOERRCODE 252
+ISR_NOERRCODE 253
+ISR_NOERRCODE 254
+ISR_NOERRCODE 255
+
+isr_common_stub:
+ pusha # Pushes edi,esi,ebp,esp,ebx,edx,ecx,eax
+
+ mov ax, ds # Lower 16-bits of eax = ds.
+ push eax # save the data segment descriptor
+
+ mov ax, 0x10 # load the kernel data segment descriptor
+ mov ds, ax
+ mov es, ax
+ mov fs, ax
+ mov gs, ax
+
+ push esp
+ call int_handler
+ add esp, 4
+
+ pop ebx # reload the original data segment descriptor
+ mov ds, bx
+ mov es, bx
+ mov fs, bx
+ mov gs, bx
+
+ popa # Pops edi,esi,ebp...
+ add esp, 8 # Cleans up the pushed error code and pushed ISR number
+ sti
+ iret # pops 5 things at once: CS, EIP, EFLAGS, SS, and ESP