46 lines
869 B
C
46 lines
869 B
C
|
#include <stdint.h>
|
||
|
#include <stddef.h>
|
||
|
#include <debugging.h>
|
||
|
#include <kernel/tty.h>
|
||
|
#include <kernel/gdt.h>
|
||
|
|
||
|
void run_program(uint8_t* program, size_t length)
|
||
|
{
|
||
|
uint8_t* userland_code = (uint8_t*) 0x00800004;
|
||
|
|
||
|
for (size_t i = 0; i < length; i++) {
|
||
|
userland_code[i] = program[i];
|
||
|
}
|
||
|
|
||
|
tss.ss0 = 0x10;
|
||
|
|
||
|
asm("sti");
|
||
|
asm("int 0x80");
|
||
|
|
||
|
asm("mov %0, esp" : "=r" (tss.esp0));
|
||
|
|
||
|
// Generates segfault
|
||
|
// asm("mov esp, %0" : "=r" (tss.esp0));
|
||
|
|
||
|
asm("mov ax, 0x23 # Load registers with the correct GDT segments values");
|
||
|
asm("mov ds, ax");
|
||
|
asm("mov es, ax");
|
||
|
asm("mov fs, ax");
|
||
|
asm("mov gs, ax");
|
||
|
|
||
|
asm("push 0x23");
|
||
|
asm("push 0x00c00100");
|
||
|
|
||
|
asm("pushfd");
|
||
|
asm("pop eax");
|
||
|
asm("or eax, 0x200");
|
||
|
asm("push eax");
|
||
|
|
||
|
asm("push 0x1b");
|
||
|
asm("push 0x00800000");
|
||
|
|
||
|
asm("iret");
|
||
|
|
||
|
asm("int 0x21");
|
||
|
}
|