X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/b26d3165c52589d1f8de37bf0df27ad96f460f47..69777bdcab284335651a8002e2896f3862fa423d:/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 f610b93..05c2897 100644 --- a/lunaix-os/arch/i386/includes/sys/abi.h +++ b/lunaix-os/arch/i386/includes/sys/abi.h @@ -6,14 +6,15 @@ #define stack_alignment 0xfffffff0 #ifndef __ASM__ -#define store_retval(retval) __current->intr_ctx->registers.eax = (retval) +#define align_stack(ptr) ((ptr) & stack_alignment) +#define store_retval(retval) current_thread->intr_ctx->registers.eax = (retval) -#define store_retval_to(proc, retval) (proc)->intr_ctx->registers.eax = (retval) +#define store_retval_to(th, retval) (th)->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 eret_target(th) (th)->intr_ctx->execp->eip +#define eret_stack(th) (th)->intr_ctx->execp->esp +#define intr_ivec(th) (th)->intr_ctx->execp->vector +#define intr_ierr(th) (th)->intr_ctx->execp->err_code #define j_usr(sp, pc) \ asm volatile("movw %0, %%ax\n" \ @@ -31,6 +32,13 @@ "r"(pc) \ : "eax", "memory"); + +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) \ { \ @@ -50,5 +58,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 */