67 lines
1.8 KiB
C
67 lines
1.8 KiB
C
|
#pragma once
|
||
|
|
||
|
#include "asm.c"
|
||
|
|
||
|
enum eflags_t {
|
||
|
EFLAG_CARRY = 0x0001,
|
||
|
EFLAG_RES = 0x0002,
|
||
|
EFLAG_PARITY = 0x0004,
|
||
|
EFLAG_INTERRUPT = 0x0200
|
||
|
};
|
||
|
|
||
|
void initialize_registers(struct regs *new_regs, char *entrypoint,
|
||
|
uint32_t address_base, uint32_t address_space_size) {
|
||
|
new_regs->eip = (unsigned int)entrypoint;
|
||
|
|
||
|
new_regs->edi = 0;
|
||
|
new_regs->esi = 0;
|
||
|
new_regs->ebx = 0;
|
||
|
new_regs->edx = 0;
|
||
|
new_regs->ecx = 0;
|
||
|
new_regs->eax = 0;
|
||
|
|
||
|
new_regs->eflags = EFLAG_INTERRUPT;
|
||
|
new_regs->useresp = (unsigned int)address_base + address_space_size - 1;
|
||
|
new_regs->ebp = new_regs->useresp;
|
||
|
|
||
|
new_regs->ds = 35;
|
||
|
new_regs->es = 35;
|
||
|
new_regs->fs = 35;
|
||
|
new_regs->gs = 35;
|
||
|
new_regs->ss = 27;
|
||
|
}
|
||
|
|
||
|
void store_registers(struct regs *machine_regs, struct regs *current_regs) {
|
||
|
current_regs->edi = machine_regs->edi;
|
||
|
current_regs->esi = machine_regs->esi;
|
||
|
current_regs->ebx = machine_regs->ebx;
|
||
|
current_regs->edx = machine_regs->edx;
|
||
|
current_regs->ecx = machine_regs->ecx;
|
||
|
current_regs->eax = machine_regs->eax;
|
||
|
current_regs->eip = machine_regs->eip;
|
||
|
current_regs->eflags = machine_regs->eflags;
|
||
|
current_regs->useresp = machine_regs->useresp;
|
||
|
current_regs->ebp = machine_regs->ebp;
|
||
|
}
|
||
|
|
||
|
void switch_context(struct regs *machine_regs, struct regs *new_regs) {
|
||
|
machine_regs->edi = new_regs->edi;
|
||
|
machine_regs->esi = new_regs->esi;
|
||
|
machine_regs->ebx = new_regs->ebx;
|
||
|
machine_regs->edx = new_regs->edx;
|
||
|
machine_regs->ecx = new_regs->ecx;
|
||
|
machine_regs->eax = new_regs->eax;
|
||
|
machine_regs->eip = new_regs->eip;
|
||
|
machine_regs->eflags = new_regs->eflags;
|
||
|
machine_regs->esp = machine_regs->esp;
|
||
|
machine_regs->useresp = new_regs->useresp;
|
||
|
machine_regs->ebp = new_regs->ebp;
|
||
|
|
||
|
machine_regs->ds = 35;
|
||
|
machine_regs->es = 35;
|
||
|
machine_regs->fs = 35;
|
||
|
machine_regs->gs = 35;
|
||
|
machine_regs->ss = 35;
|
||
|
machine_regs->cs = 27;
|
||
|
}
|