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