razzle/arch/i386/scheduler.c

67 lines
1.8 KiB
C
Raw Normal View History

2024-10-03 07:55:54 +00:00
#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;
}