2024-07-11 08:56:52 +02:00
|
|
|
#include <kernel/tty.h>
|
2024-07-16 22:51:41 +02:00
|
|
|
#include <stddef.h>
|
2024-08-05 00:59:07 +02:00
|
|
|
#include <debugging.h>
|
2024-07-11 08:56:52 +02:00
|
|
|
|
2024-08-05 00:59:07 +02:00
|
|
|
struct interrupt_frame {
|
|
|
|
uint32_t eflags;
|
|
|
|
uint32_t cs;
|
|
|
|
uint32_t eip;
|
2024-07-16 22:51:41 +02:00
|
|
|
};
|
|
|
|
|
2024-08-05 00:59:07 +02:00
|
|
|
uint8_t test = 'a';
|
2024-07-16 22:51:41 +02:00
|
|
|
|
2024-08-05 00:59:07 +02:00
|
|
|
static void stack_trace()
|
2024-07-16 22:51:41 +02:00
|
|
|
{
|
2024-08-05 00:59:07 +02:00
|
|
|
uint32_t* stack = 0;
|
|
|
|
asm("mov %%esp, %0" : "=r" (stack));
|
|
|
|
for (int i = 0; i < 25; i++) {
|
|
|
|
uint32_t* current_address = stack + (i * 4);
|
|
|
|
print_hex_bytes(¤t_address, 4);
|
|
|
|
terminal_writestring(": ");
|
|
|
|
print_hex_bytes(current_address, 4);
|
|
|
|
terminal_putchar('\n');
|
2024-07-16 22:51:41 +02:00
|
|
|
}
|
2024-08-05 00:59:07 +02:00
|
|
|
}
|
2024-07-16 22:51:41 +02:00
|
|
|
|
2024-08-05 00:59:07 +02:00
|
|
|
__attribute__((interrupt)) void divide_by_zero(struct interrupt_frame* frame)
|
|
|
|
{
|
|
|
|
terminal_initialize();
|
|
|
|
stack_trace();
|
|
|
|
terminal_writestring("Yo dude u cant divide by zero yao\n");
|
|
|
|
while (1) { }
|
2024-07-16 22:51:41 +02:00
|
|
|
}
|
|
|
|
|
2024-08-05 00:59:07 +02:00
|
|
|
__attribute__((interrupt)) void general_protection_fault(struct interrupt_frame* frame)
|
2024-07-16 22:51:41 +02:00
|
|
|
{
|
2024-08-05 00:59:07 +02:00
|
|
|
/* terminal_initialize();
|
|
|
|
stack_trace();
|
|
|
|
terminal_writestring("General protection fault\n");
|
|
|
|
terminal_writestring("Error code:\n");
|
|
|
|
print_hex_bytes(frame, sizeof(frame));
|
|
|
|
terminal_putchar('\n'); */
|
|
|
|
while (1) { }
|
|
|
|
}
|
2024-07-16 22:51:41 +02:00
|
|
|
|
2024-08-05 00:59:07 +02:00
|
|
|
__attribute__((interrupt)) void double_fault(struct interrupt_frame* frame)
|
|
|
|
{
|
|
|
|
// terminal_writestring("2 Errors in a row, u better behave naughty naughty\n");
|
|
|
|
// while (1) { }
|
|
|
|
}
|
2024-07-16 22:51:41 +02:00
|
|
|
|
2024-08-05 00:59:07 +02:00
|
|
|
__attribute__((interrupt)) void exception(struct interrupt_frame* frame)
|
|
|
|
{
|
|
|
|
/* terminal_initialize();
|
|
|
|
stack_trace();
|
|
|
|
terminal_writestring("Some weird error code stuff\n");
|
|
|
|
terminal_writestring("Error code:\n");
|
|
|
|
print_hex_bytes(frame, sizeof(frame));
|
|
|
|
terminal_putchar('\n'); */
|
|
|
|
while (1) { }
|
|
|
|
}
|
2024-07-16 22:51:41 +02:00
|
|
|
|
2024-08-05 00:59:07 +02:00
|
|
|
__attribute__((interrupt)) void print(struct interrupt_frame* frame)
|
|
|
|
{
|
|
|
|
/* terminal_initialize();
|
|
|
|
terminal_putchar(test);
|
|
|
|
test++; */
|
|
|
|
|
|
|
|
char* start;
|
|
|
|
asm("mov %%edx, %0" : "=r" (start));
|
|
|
|
terminal_writestring(start);
|
|
|
|
|
|
|
|
/* uint8_t* stack;
|
|
|
|
asm("mov %%esp, %0" : "=r" (stack));
|
|
|
|
|
|
|
|
terminal_writestring("\nSTACK:\n");
|
|
|
|
print_hex_bytes(stack - 24, 4);
|
|
|
|
terminal_putchar('\n');
|
|
|
|
print_hex_bytes(stack - 20, 4);
|
|
|
|
terminal_putchar('\n');
|
|
|
|
print_hex_bytes(stack - 16, 4);
|
|
|
|
terminal_putchar('\n');
|
|
|
|
print_hex_bytes(stack - 12, 4);
|
|
|
|
terminal_putchar('\n');
|
|
|
|
print_hex_bytes(stack - 8, 4);
|
|
|
|
terminal_putchar('\n');
|
|
|
|
print_hex_bytes(stack - 4, 4);
|
|
|
|
terminal_putchar('\n'); */
|
2024-07-16 22:51:41 +02:00
|
|
|
}
|
|
|
|
|
2024-08-05 00:59:07 +02:00
|
|
|
__attribute__((interrupt)) void input(struct interrupt_frame* frame)
|
2024-07-11 08:56:52 +02:00
|
|
|
{
|
2024-08-05 00:59:07 +02:00
|
|
|
char* buffer;
|
|
|
|
asm("mov %%edx, %0" : "=r" (buffer));
|
2024-07-16 22:51:41 +02:00
|
|
|
|
2024-08-05 00:59:07 +02:00
|
|
|
size_t index = 0;
|
2024-07-16 22:51:41 +02:00
|
|
|
|
2024-08-05 00:59:07 +02:00
|
|
|
char current_character = get_last_key_pressed();
|
|
|
|
while (current_character != '\n') {
|
|
|
|
char tmp = get_last_key_pressed();
|
|
|
|
if (current_character != -1 && tmp != current_character) {
|
|
|
|
buffer[index] = current_character;
|
|
|
|
terminal_putchar(current_character);
|
|
|
|
index++;
|
|
|
|
}
|
|
|
|
current_character = tmp;
|
|
|
|
}
|
|
|
|
buffer[index] = '\0';
|
2024-07-11 08:56:52 +02:00
|
|
|
}
|
|
|
|
|
2024-08-05 00:59:07 +02:00
|
|
|
__attribute__((interrupt)) void irq(struct interrupt_frame* frame)
|
2024-07-11 08:56:52 +02:00
|
|
|
{
|
2024-07-16 22:51:41 +02:00
|
|
|
|
2024-07-11 08:56:52 +02:00
|
|
|
}
|
2024-08-05 00:59:07 +02:00
|
|
|
|