Fixed syscalls

This commit is contained in:
vanten-s 2024-08-10 01:14:29 +02:00
parent ddb45b819b
commit 645626551b
Signed by: vanten-s
GPG key ID: DE3060396884D3F2
10 changed files with 91 additions and 87 deletions

View file

@ -22,6 +22,7 @@ KERNEL_OBJS=\
kernel/kernel.o \ kernel/kernel.o \
kernel/debugging.o \ kernel/debugging.o \
kernel/elf.o \ kernel/elf.o \
kernel/syscall.o \
kernel/keyboard.o \ kernel/keyboard.o \
LIB_OBJS=\ LIB_OBJS=\
@ -30,6 +31,7 @@ $(ARCHDIR)/tty.o \
$(ARCHDIR)/strlib.o \ $(ARCHDIR)/strlib.o \
$(ARCHDIR)/interrupts/idt.o \ $(ARCHDIR)/interrupts/idt.o \
$(ARCHDIR)/interrupts/interrupt.o \ $(ARCHDIR)/interrupts/interrupt.o \
$(ARCHDIR)/interrupts/syscall.o \
$(ARCHDIR)/gdt.o \ $(ARCHDIR)/gdt.o \
$(ARCHDIR)/userland.o \ $(ARCHDIR)/userland.o \
$(ARCHDIR)/interrupts/pic.o \ $(ARCHDIR)/interrupts/pic.o \

View file

@ -139,23 +139,14 @@ void idt_init()
entry = generate_entry(true, keyboard_interrupt, 0xE, 0, 0x8); entry = generate_entry(true, keyboard_interrupt, 0xE, 0, 0x8);
add_entry(entry, IRQ1); add_entry(entry, IRQ1);
struct InterruptDescriptor print_entry; struct InterruptDescriptor syscall_entry;
print_entry.present = true; syscall_entry.present = true;
print_entry.offset = (uint32_t)print; syscall_entry.offset = (uint32_t)syscall;
print_entry.gate_type = 0xE; syscall_entry.gate_type = 0xE;
print_entry.ring = 3; syscall_entry.ring = 3;
print_entry.selector = 0x8; syscall_entry.selector = 0x8;
add_entry(print_entry, 0x80); add_entry(syscall_entry, 0x80);
struct InterruptDescriptor input_entry;
input_entry.present = true;
input_entry.offset = (uint32_t)input;
input_entry.gate_type = 0xE;
input_entry.ring = 3;
input_entry.selector = 0x8;
add_entry(input_entry, 0x81);
load_idt(); load_idt();
} }

View file

@ -25,65 +25,39 @@ static void stack_trace()
} }
} }
__attribute__((interrupt)) void divide_by_zero(struct interrupt_frame* frame) __attribute__((interrupt)) void divide_by_zero(void*)
{ {
terminal_writestring("Yo dude u cant divide by zero yao\n"); terminal_writestring("Yo dude u cant divide by zero yao\n");
while (1) { } while (1) { }
} }
__attribute__((interrupt)) void general_protection_fault(struct interrupt_frame* frame) __attribute__((interrupt)) void general_protection_fault(void*)
{ {
terminal_writestring("GPF handler called\n"); terminal_writestring("GPF handler called\n");
while (1) { } while (1) { }
} }
__attribute__((interrupt)) void double_fault(struct interrupt_frame* frame) __attribute__((interrupt)) void double_fault(void*)
{ {
stack_trace();
terminal_writestring("2 Errors in a row, u better behave naughty naughty\n"); terminal_writestring("2 Errors in a row, u better behave naughty naughty\n");
while (1) { } while (1) { }
} }
__attribute__((interrupt)) void exception(struct interrupt_frame* frame) __attribute__((interrupt)) void exception(void*)
{ {
terminal_writestring("Some weird error code stuff\n"); terminal_writestring("Some weird error code stuff\n");
while (1) { } while (1) { }
} }
__attribute__((interrupt)) void print(struct interrupt_frame* frame) __attribute__((interrupt)) void keyboard_interrupt(void*)
{
char* start;
asm("mov %%edx, %0" : "=r" (start));
terminal_writestring(start);
}
__attribute__((interrupt)) void input(struct interrupt_frame* frame)
{
char* buffer;
asm("mov %%edx, %0" : "=r" (buffer));
/* size_t index = 0;
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'; */
}
__attribute__((interrupt)) void keyboard_interrupt(struct interrupt_frame* frame)
{ {
uint8_t scancode = inb(0x60); uint8_t scancode = inb(0x60);
handle_keyboard(scancode); handle_keyboard(scancode);
outb(0x20, 0x20); outb(0x20, 0x20);
} }
__attribute__((interrupt)) void irq(struct interrupt_frame* frame) __attribute__((interrupt)) void irq(void*)
{ {
outb(0x20, 0x20); outb(0x20, 0x20);
} }

View file

@ -6,8 +6,7 @@ __attribute__((interrupt)) void double_fault(struct interrupt_frame* frame);
__attribute__((interrupt)) void exception(struct interrupt_frame* frame); __attribute__((interrupt)) void exception(struct interrupt_frame* frame);
__attribute__((interrupt)) void print(struct interrupt_frame* frame); __attribute__((interrupt)) void syscall(void*);
__attribute__((interrupt)) void input(struct interrupt_frame* frame);
__attribute__((interrupt)) void keyboard_interrupt(struct interrupt_frame* frame); __attribute__((interrupt)) void keyboard_interrupt(struct interrupt_frame* frame);
__attribute__((interrupt)) void irq(struct interrupt_frame* frame); __attribute__((interrupt)) void irq(struct interrupt_frame* frame);

View file

@ -20,10 +20,10 @@
#define ICW4_SFNM 0x10 /* Special fully nested (not) */ #define ICW4_SFNM 0x10 /* Special fully nested (not) */
void init_pic() { void init_pic() {
uint8_t a1, a2; uint8_t a1;
a1 = inb(PIC1_DATA); // save masks a1 = inb(PIC1_DATA); // save masks
a2 = inb(PIC2_DATA); inb(PIC2_DATA);
outb(PIC1_COMMAND, ICW1_INIT | ICW1_ICW4); // starts the initialization sequence (in cascade mode) outb(PIC1_COMMAND, ICW1_INIT | ICW1_ICW4); // starts the initialization sequence (in cascade mode)
io_wait(); io_wait();

View file

@ -0,0 +1,18 @@
.extern _syscall
.global syscall
syscall:
sti
push %edx
push %ecx
push %ebx
push %eax
call _syscall
pop %eax
pop %ebx
pop %ecx
pop %edx
iret

View file

@ -1,3 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <stddef.h>
extern char keyboard_buffer[100];
extern size_t keyboard_buffer_top;
void handle_keyboard(uint8_t scancode); void handle_keyboard(uint8_t scancode);

View file

@ -10,34 +10,12 @@
#endif #endif
uint8_t program[] = { uint8_t program[] = {
0xba, 0x09, 0x00, 0x80, 0x00, // mov $string, %edx 0xba, 0x01, 0x00, 0x00, 0x00, // mov 1, %edx
0xb8, 0xff, 0x00, 0x80, 0x00, // mov $buffer, %eax
0xcd, 0x80, // int 0x80
0xba, 0x00, 0x00, 0x00, 0x00, // mov 0, %edx
0xcd, 0x80, // int 0x80 0xcd, 0x80, // int 0x80
0xeb, 0xfe, // jmp . 0xeb, 0xfe, // jmp .
'H',
'e',
'l',
'l',
'o',
' ',
'W',
'o',
'r',
'l',
'd',
' ',
'f',
'r',
'o',
'm',
' ',
'r',
'i',
'n',
'g',
' ',
'3',
'!',
0x00,
}; };
void kernel_main(void) void kernel_main(void)
@ -47,8 +25,5 @@ void kernel_main(void)
init_pic(); init_pic();
idt_init(); idt_init();
// run_program(program, sizeof(program)); run_program(program, sizeof(program));
while (true) {
}
} }

View file

@ -5,8 +5,8 @@
static bool is_in_shift; static bool is_in_shift;
char buffer[100]; char keyboard_buffer[100];
static size_t i; size_t keyboard_buffer_top;
static unsigned char keyboard_char(unsigned char scancode) static unsigned char keyboard_char(unsigned char scancode)
{ {
@ -125,8 +125,8 @@ void handle_keyboard(uint8_t scancode) {
return; return;
} }
buffer[i] = character; keyboard_buffer[keyboard_buffer_top] = character;
i++; keyboard_buffer_top++;
terminal_putchar(character); terminal_putchar(character);
} }

42
kernel/syscall.c Normal file
View file

@ -0,0 +1,42 @@
#include <kernel/tty.h>
#include <kernel/keyboard.h>
#include <debugging.h>
static void print(char* buffer)
{
terminal_writestring(buffer);
}
static void* memcpy(void* restrict dstptr, const void* restrict srcptr, size_t size) {
unsigned char* dst = (unsigned char*) dstptr;
const unsigned char* src = (const unsigned char*) srcptr;
for (size_t i = 0; i < size; i++)
dst[i] = src[i];
return dstptr;
}
static void input(char* buffer)
{
while (true) {
for (int i = 0; i < keyboard_buffer_top; i++) {
buffer[i] = keyboard_buffer[i];
if (keyboard_buffer[i] == '\n') {
buffer[keyboard_buffer_top] = 0;
keyboard_buffer_top = 0;
return;
}
}
}
}
void _syscall(uint32_t a, uint32_t b, uint32_t c, uint32_t d)
{
switch (d) {
case 0x00:
print((char*) a);
break;
case 0x01:
input((char*) a);
break;
}
}