Make HW trap reflection more arch-independent
[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 #define HW_TRAP_DIV_ZERO                0
15 #define HW_TRAP_GP_FAULT                13
16 #define HW_TRAP_PAGE_FAULT              14
17
18 static bool has_refl_fault(struct user_context *ctx)
19 {
20         switch (ctx->type) {
21         case ROS_HW_CTX:
22                 return ctx->tf.hw_tf.tf_padding3 == ROS_ARCH_REFL_ID;
23         case ROS_SW_CTX:
24                 return FALSE;
25         case ROS_VM_CTX:
26                 return ctx->tf.vm_tf.tf_flags & VMCTX_FL_HAS_FAULT ? TRUE : FALSE;
27         }
28 }
29
30 static void clear_refl_fault(struct user_context *ctx)
31 {
32         switch (ctx->type) {
33         case ROS_HW_CTX:
34                 ctx->tf.hw_tf.tf_padding3 = 0;
35                 break;
36         case ROS_SW_CTX:
37                 /* Should never attempt this on an SW ctx */
38                 assert(0);
39                 break;
40         case ROS_VM_CTX:
41                 ctx->tf.vm_tf.tf_flags &= ~VMCTX_FL_HAS_FAULT;
42                 break;
43         }
44 }
45
46 static unsigned int __arch_refl_get_nr(struct user_context *ctx)
47 {
48         return ctx->tf.hw_tf.tf_trapno;
49 }
50
51 static unsigned int __arch_refl_get_err(struct user_context *ctx)
52 {
53         return ctx->tf.hw_tf.tf_err;
54 }
55
56 static unsigned long __arch_refl_get_aux(struct user_context *ctx)
57 {
58         return ((unsigned long)ctx->tf.hw_tf.tf_padding5 << 32) |
59                ctx->tf.hw_tf.tf_padding4;
60 }
61
62 __END_DECLS