summaryrefslogtreecommitdiff
path: root/lang/mono/files/patch-mono_mini_exceptions-amd64.c
blob: 3e7142defcb7fe3493ee5aa85e490f8cfab8e32a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
--- mono/mini/exceptions-amd64.c.orig	Tue Aug  2 17:53:06 2005
+++ mono/mini/exceptions-amd64.c	Tue Aug  2 17:53:20 2005
@@ -573,11 +573,27 @@
  * @obj: the exception object
  */
 gboolean
-mono_arch_handle_exception (void *sigctx, gpointer obj, gboolean test_only)
+mono_arch_handle_exception (void *sigctx, gpointer obj,	gboolean test_only)
 {
-	ucontext_t *ctx = (ucontext_t*)sigctx;
-	MonoContext mctx;
+	ucontext_t *ctx	= (ucontext_t*)sigctx;
+	MonoContext	mctx;
 
+#if	defined(__FreeBSD__)
+    guint64 *gregs = (guint64 *) &ctx->uc_mcontext;
+	mctx.rax = gregs [REG_RAX];
+	mctx.rbx = gregs [REG_RBX];
+	mctx.rcx = gregs [REG_RCX];
+	mctx.rdx = gregs [REG_RDX];
+	mctx.rbp = gregs [REG_RBP];
+	mctx.rsp = gregs [REG_RSP];
+	mctx.rsi = gregs [REG_RSI];
+	mctx.rdi = gregs [REG_RDI];
+	mctx.rip = gregs [REG_RIP];
+	mctx.r12 = gregs [REG_R12];
+	mctx.r13 = gregs [REG_R13];
+	mctx.r14 = gregs [REG_R14];
+	mctx.r15 = gregs [REG_R15];
+#else
 	mctx.rax = ctx->uc_mcontext.gregs [REG_RAX];
 	mctx.rbx = ctx->uc_mcontext.gregs [REG_RBX];
 	mctx.rcx = ctx->uc_mcontext.gregs [REG_RCX];
@@ -591,9 +607,25 @@
 	mctx.r13 = ctx->uc_mcontext.gregs [REG_R13];
 	mctx.r14 = ctx->uc_mcontext.gregs [REG_R14];
 	mctx.r15 = ctx->uc_mcontext.gregs [REG_R15];
+#endif
 
 	mono_handle_exception (&mctx, obj, (gpointer)mctx.rip, test_only);
 
+#if	defined(__FreeBSD__)
+	gregs [REG_RAX] = mctx.rax;
+	gregs [REG_RBX] = mctx.rbx;
+	gregs [REG_RCX] = mctx.rcx;
+	gregs [REG_RDX] = mctx.rdx;
+	gregs [REG_RBP] = mctx.rbp;
+	gregs [REG_RSP] = mctx.rsp;
+	gregs [REG_RSI] = mctx.rsi;
+	gregs [REG_RDI] = mctx.rdi;
+	gregs [REG_RIP] = mctx.rip;
+	gregs [REG_R12] = mctx.r12;
+	gregs [REG_R13] = mctx.r13;
+	gregs [REG_R14] = mctx.r14;
+	gregs [REG_R15] = mctx.r15;
+#else
 	ctx->uc_mcontext.gregs [REG_RAX] = mctx.rax;
 	ctx->uc_mcontext.gregs [REG_RBX] = mctx.rbx;
 	ctx->uc_mcontext.gregs [REG_RCX] = mctx.rcx;
@@ -607,14 +639,20 @@
 	ctx->uc_mcontext.gregs [REG_R13] = mctx.r13;
 	ctx->uc_mcontext.gregs [REG_R14] = mctx.r14;
 	ctx->uc_mcontext.gregs [REG_R15] = mctx.r15;
+#endif
 
 	return TRUE;
 }
 
 gpointer
-mono_arch_ip_from_context (void *sigctx)
+mono_arch_ip_from_context (void	*sigctx)
 {
-	ucontext_t *ctx = (ucontext_t*)sigctx;
-	return (gpointer)ctx->uc_mcontext.gregs [REG_RIP];
+	ucontext_t *ctx	= (ucontext_t*)sigctx;
+#if	defined(__FreeBSD__)
+    __register_t *gregs = (__register_t *) &ctx->uc_mcontext;
+	return (gpointer)gregs[REG_RIP];
+#else
+	return (gpointer)ctx->uc_mcontext.gregs	[REG_RIP];
+#endif
 }