diff options
author | Anton Kling <anton@kling.gg> | 2024-02-14 17:40:06 +0100 |
---|---|---|
committer | Anton Kling <anton@kling.gg> | 2024-02-14 17:40:06 +0100 |
commit | 3922adcdec5bd003b4106ffce79c28553bc40c15 (patch) | |
tree | f1af360cd7ad75d4b5f19bf066bf7e29ce8e3e53 /kernel/cpu | |
parent | a8ffc46136eb16adc87fb520c724467d1295a854 (diff) |
Kernel: Update signal handling and IPC
Diffstat (limited to 'kernel/cpu')
-rw-r--r-- | kernel/cpu/idt.c | 39 | ||||
-rw-r--r-- | kernel/cpu/isr.s | 297 |
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 |