A Total Overhaul on the Lunaix's Virtual Memory Model (#26)
[lunaix-os.git] / lunaix-os / arch / i386 / includes / sys / abi.h
index f610b93465b80a0131cbadc032570c846e9a53b6..05c28975c8cac2725fa03f874287d5a780dc6c7d 100644 (file)
@@ -6,14 +6,15 @@
 #define stack_alignment 0xfffffff0
 
 #ifndef __ASM__
 #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"                                             \
 
 #define j_usr(sp, pc)                                                          \
     asm volatile("movw %0, %%ax\n"                                             \
                  "r"(pc)                                                       \
                  : "eax", "memory");
 
                  "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)                                       \
     {                                                                          \
 #define push_arg1(stack_ptr, arg) *((typeof((arg))*)(stack_ptr)--) = arg
 #define push_arg2(stack_ptr, arg1, arg2)                                       \
     {                                                                          \
         *((typeof((arg3))*)(stack_ptr)--) = arg3;                              \
         *((typeof((arg4))*)(stack_ptr)--) = arg4;                              \
     }
         *((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 */
 #endif
 #endif /* __LUNAIX_ABI_H */