X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/1fe5f5eb5378a47bf0f3451762743c162e40faad..d1b1c8d9119229dbeed06cd252917e54a1cb77f6:/lunaix-os/arch/i386/includes/sys/abi.h diff --git a/lunaix-os/arch/i386/includes/sys/abi.h b/lunaix-os/arch/i386/includes/sys/abi.h index 482d6f1..d847251 100644 --- a/lunaix-os/arch/i386/includes/sys/abi.h +++ b/lunaix-os/arch/i386/includes/sys/abi.h @@ -1,37 +1,41 @@ #ifndef __LUNAIX_I386ABI_H #define __LUNAIX_I386ABI_H -#include +#include "sys/x86_isa.h" #define stack_alignment 0xfffffff0 #ifndef __ASM__ -#define store_retval(retval) __current->intr_ctx->registers.eax = (retval) - -#define store_retval_to(proc, retval) (proc)->intr_ctx->registers.eax = (retval) - -#define eret_target(proc) (proc)->intr_ctx->execp->eip -#define eret_stack(proc) (proc)->intr_ctx->execp->esp -#define intr_ivec(proc) (proc)->intr_ctx->execp->vector -#define intr_ierr(proc) (proc)->intr_ctx->execp->err_code - -#define j_usr(sp, pc) \ - asm volatile("movw %0, %%ax\n" \ - "movw %%ax, %%es\n" \ - "movw %%ax, %%ds\n" \ - "movw %%ax, %%fs\n" \ - "movw %%ax, %%gs\n" \ - "pushl %0\n" \ - "pushl %1\n" \ - "pushl %2\n" \ - "pushl %3\n" \ - "retf" ::"i"(UDATA_SEG), \ - "r"(sp), \ - "i"(UCODE_SEG), \ - "r"(pc) \ +#define align_stack(ptr) ((ptr) & stack_alignment) +#define store_retval(retval) current_thread->hstate->registers.eax = (retval) + +#define store_retval_to(th, retval) (th)->hstate->registers.eax = (retval) + +static inline void must_inline +j_usr(ptr_t sp, ptr_t pc) +{ + asm volatile("movw %0, %%ax\n" + "movw %%ax, %%es\n" + "movw %%ax, %%ds\n" + "movw %%ax, %%fs\n" + "movw %%ax, %%gs\n" + "pushl %0\n" + "pushl %1\n" + "pushl %2\n" + "pushl %3\n" + "retf" ::"i"(UDATA_SEG), + "r"(sp), + "i"(UCODE_SEG), + "r"(pc) : "eax", "memory"); +} -#define switch_context(process) asm volatile("jmp switch_to\n" ::"a"(process)); + +static inline void must_inline noret +switch_context() { + asm volatile("jmp do_switch\n"); + unreachable; +} #define push_arg1(stack_ptr, arg) *((typeof((arg))*)(stack_ptr)--) = arg #define push_arg2(stack_ptr, arg1, arg2) \ @@ -52,5 +56,26 @@ *((typeof((arg3))*)(stack_ptr)--) = arg3; \ *((typeof((arg4))*)(stack_ptr)--) = arg4; \ } + + +static inline ptr_t must_inline +abi_get_callframe() +{ + ptr_t val; + asm("movl %%ebp, %0" : "=r"(val)::); + return val; +} + +static inline ptr_t +abi_get_retaddr() +{ + return *((ptr_t*)abi_get_callframe() + 1); +} + +static inline ptr_t +abi_get_retaddrat(ptr_t fp) +{ + return *((ptr_t*)fp + 1); +} #endif #endif /* __LUNAIX_ABI_H */