Move trap reflection bits into their own header
[akaros.git] / user / parlib / include / x86 / trap.h
1 /* Copyright (c) 2016 Google Inc.
2  * Barret Rhoden <brho@cs.berkeley.edu>
3  * See LICENSE for details.
4  *
5  * Arch-specific defines for traps, vmexits, and similar things */
6
7 #pragma once
8
9 #include <parlib/common.h>
10 #include <ros/trapframe.h>
11
12 __BEGIN_DECLS
13
14 static bool has_refl_fault(struct user_context *ctx)
15 {
16         switch (ctx->type) {
17         case ROS_HW_CTX:
18                 return ctx->tf.hw_tf.tf_padding3 == ROS_ARCH_REFL_ID;
19         case ROS_SW_CTX:
20                 return FALSE;
21         case ROS_VM_CTX:
22                 return ctx->tf.vm_tf.tf_flags & VMCTX_FL_HAS_FAULT ? TRUE : FALSE;
23         }
24 }
25
26 static void clear_refl_fault(struct user_context *ctx)
27 {
28         switch (ctx->type) {
29         case ROS_HW_CTX:
30                 ctx->tf.hw_tf.tf_padding3 = 0;
31                 break;
32         case ROS_SW_CTX:
33                 /* Should never attempt this on an SW ctx */
34                 assert(0);
35                 break;
36         case ROS_VM_CTX:
37                 ctx->tf.vm_tf.tf_flags &= ~VMCTX_FL_HAS_FAULT;
38                 break;
39         }
40 }
41
42 static unsigned int __arch_refl_get_nr(struct user_context *ctx)
43 {
44         return ctx->tf.hw_tf.tf_trapno;
45 }
46
47 static unsigned int __arch_refl_get_err(struct user_context *ctx)
48 {
49         return ctx->tf.hw_tf.tf_err;
50 }
51
52 static unsigned long __arch_refl_get_aux(struct user_context *ctx)
53 {
54         return ((unsigned long)ctx->tf.hw_tf.tf_padding5 << 32) |
55                ctx->tf.hw_tf.tf_padding4;
56 }
57
58 __END_DECLS