#include #include #include #include #include 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"); }