initial razzle
This commit is contained in:
commit
cd3d8871df
29 changed files with 1986 additions and 0 deletions
66
arch/i386/scheduler.c
Normal file
66
arch/i386/scheduler.c
Normal file
|
@ -0,0 +1,66 @@
|
|||
#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;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue