forked from Bananymous/banan-os
Doing a yield no longer raises a software interrupt. Instead it just saves all the callee saved registers, ip, sp and return value. Because yield is only called in the kernel, it can just restore registers and jump to the target address. There is never a need to use iret :)
75 lines
1.0 KiB
C++
75 lines
1.0 KiB
C++
#pragma once
|
|
|
|
#include <kernel/Arch.h>
|
|
|
|
#include <stdint.h>
|
|
|
|
namespace Kernel
|
|
{
|
|
|
|
struct InterruptStack
|
|
{
|
|
uintptr_t ip;
|
|
uintptr_t cs;
|
|
uintptr_t flags;
|
|
uintptr_t sp;
|
|
uintptr_t ss;
|
|
};
|
|
|
|
#if ARCH(x86_64)
|
|
struct InterruptRegisters
|
|
{
|
|
uintptr_t r15;
|
|
uintptr_t r14;
|
|
uintptr_t r13;
|
|
uintptr_t r12;
|
|
uintptr_t r11;
|
|
uintptr_t r10;
|
|
uintptr_t r9;
|
|
uintptr_t r8;
|
|
uintptr_t rdi;
|
|
uintptr_t rsi;
|
|
uintptr_t rbp;
|
|
uintptr_t rbx;
|
|
uintptr_t rdx;
|
|
uintptr_t rcx;
|
|
uintptr_t rax;
|
|
};
|
|
struct YieldRegisters
|
|
{
|
|
uintptr_t r15;
|
|
uintptr_t r14;
|
|
uintptr_t r13;
|
|
uintptr_t r12;
|
|
uintptr_t rbp;
|
|
uintptr_t rbx;
|
|
uintptr_t ret;
|
|
uintptr_t sp;
|
|
uintptr_t ip;
|
|
};
|
|
#elif ARCH(i686)
|
|
struct InterruptRegisters
|
|
{
|
|
uintptr_t edi;
|
|
uintptr_t esi;
|
|
uintptr_t ebp;
|
|
uintptr_t unused;
|
|
uintptr_t ebx;
|
|
uintptr_t edx;
|
|
uintptr_t ecx;
|
|
uintptr_t eax;
|
|
};
|
|
struct YieldRegisters
|
|
{
|
|
uintptr_t ebp;
|
|
uintptr_t edi;
|
|
uintptr_t esi;
|
|
uintptr_t ebx;
|
|
uintptr_t ret;
|
|
uintptr_t sp;
|
|
uintptr_t ip;
|
|
};
|
|
#endif
|
|
|
|
}
|