Add flags that VMs need. But many other things do as well.
[akaros.git] / kern / arch / x86 / trap32.h
index 0d87fd9..e56ed11 100644 (file)
 #error "Do not include arch/trap32.h directly."
 #endif
 
+/* For kernel contexts, when we save/restore/move them around. */
+struct kernel_ctx {
+       struct hw_trapframe             hw_tf;
+};
+
 static inline bool in_kernel(struct hw_trapframe *hw_tf)
 {
        return (hw_tf->tf_cs & ~3) == GD_KT;
@@ -22,6 +27,7 @@ static inline bool in_kernel(struct hw_trapframe *hw_tf)
 static inline void save_kernel_ctx(struct kernel_ctx *ctx)
 {
        /* Save the regs and the future esp. */
+       /* Careful when updating; %0, %1, and %2 are not listed as clobbers */
        asm volatile("movl %%esp,(%0);       " /* save esp in it's slot*/
                     "pushl %%eax;           " /* temp save eax */
                     "leal 1f,%%eax;         " /* get future eip */
@@ -58,6 +64,13 @@ static inline void x86_fake_rdtscp(struct hw_trapframe *hw_tf)
        hw_tf->tf_regs.reg_ecx = core_id();
 }
 
+static inline void x86_sysenter_init(uintptr_t stacktop)
+{
+       write_msr(MSR_IA32_SYSENTER_CS, GD_KT);
+       write_msr(MSR_IA32_SYSENTER_ESP, stacktop);
+       write_msr(MSR_IA32_SYSENTER_EIP, (uintptr_t) &sysenter_handler);
+}
+
 static inline void x86_set_sysenter_stacktop(uintptr_t stacktop)
 {
        write_msr(MSR_IA32_SYSENTER_ESP, stacktop);
@@ -73,6 +86,16 @@ static inline long x86_get_sysenter_arg1(struct hw_trapframe *hw_tf)
        return hw_tf->tf_regs.reg_esi;
 }
 
+static inline long x86_get_systrap_arg0(struct hw_trapframe *hw_tf)
+{
+       return hw_tf->tf_regs.reg_eax;
+}
+
+static inline long x86_get_systrap_arg1(struct hw_trapframe *hw_tf)
+{
+       return hw_tf->tf_regs.reg_edx;
+}
+
 static inline uintptr_t x86_get_stacktop_tss(struct taskstate *tss)
 {
        return tss->ts_esp0;
@@ -84,4 +107,14 @@ static inline void x86_set_stacktop_tss(struct taskstate *tss, uintptr_t top)
        tss->ts_ss0 = GD_KD;
 }
 
+static inline uintptr_t x86_get_hwtf_pc(struct hw_trapframe *hw_tf)
+{
+       return hw_tf->tf_eip;
+}
+
+static inline uintptr_t x86_get_hwtf_fp(struct hw_trapframe *hw_tf)
+{
+       return hw_tf->tf_regs.reg_ebp;
+}
+
 #endif /* ROS_KERN_ARCH_TRAP32_H */