#ifndef __LUNAIX_I386ABI_H #define __LUNAIX_I386ABI_H #include #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) \ : "eax", "memory"); #define switch_context(process) asm volatile("jmp switch_to\n" ::"a"(process)); #define push_arg1(stack_ptr, arg) *((typeof((arg))*)(stack_ptr)--) = arg #define push_arg2(stack_ptr, arg1, arg2) \ { \ *((typeof((arg1))*)(stack_ptr)--) = arg1; \ *((typeof((arg2))*)(stack_ptr)--) = arg2; \ } #define push_arg3(stack_ptr, arg1, arg2, arg3) \ { \ *((typeof((arg1))*)(stack_ptr)--) = arg1; \ *((typeof((arg2))*)(stack_ptr)--) = arg2; \ *((typeof((arg3))*)(stack_ptr)--) = arg3; \ } #define push_arg4(stack_ptr, arg1, arg2, arg3, arg4) \ { \ *((typeof((arg1))*)(stack_ptr)--) = arg1; \ *((typeof((arg2))*)(stack_ptr)--) = arg2; \ *((typeof((arg3))*)(stack_ptr)--) = arg3; \ *((typeof((arg4))*)(stack_ptr)--) = arg4; \ } #endif #endif /* __LUNAIX_ABI_H */