Mercurial > hg > truffle
comparison src/os/aix/vm/vmError_aix.cpp @ 14415:666e6ce3976c
8023038: PPC64 (part 15): Platform files for AIX/PPC64 support
Reviewed-by: kvn
author | simonis |
---|---|
date | Fri, 06 Sep 2013 20:16:09 +0200 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
14414:b83f7d608548 | 14415:666e6ce3976c |
---|---|
1 /* | |
2 * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. | |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
20 * or visit www.oracle.com if you need additional information or have any | |
21 * questions. | |
22 * | |
23 */ | |
24 | |
25 #include "precompiled.hpp" | |
26 #include "runtime/arguments.hpp" | |
27 #include "runtime/os.hpp" | |
28 #include "runtime/thread.hpp" | |
29 #include "utilities/vmError.hpp" | |
30 | |
31 #include <sys/types.h> | |
32 #include <sys/wait.h> | |
33 #include <unistd.h> | |
34 #include <signal.h> | |
35 | |
36 void VMError::show_message_box(char *buf, int buflen) { | |
37 bool yes; | |
38 do { | |
39 error_string(buf, buflen); | |
40 int len = (int)strlen(buf); | |
41 char *p = &buf[len]; | |
42 | |
43 jio_snprintf(p, buflen - len, | |
44 "\n\n" | |
45 "Do you want to debug the problem?\n\n" | |
46 "To debug, run 'dbx -a %d'; then switch to thread tid " INTX_FORMAT ", k-tid " INTX_FORMAT "\n" | |
47 "Enter 'yes' to launch dbx automatically (PATH must include dbx)\n" | |
48 "Otherwise, press RETURN to abort...", | |
49 os::current_process_id(), | |
50 os::current_thread_id(), thread_self()); | |
51 | |
52 yes = os::message_box("Unexpected Error", buf); | |
53 | |
54 if (yes) { | |
55 // yes, user asked VM to launch debugger | |
56 jio_snprintf(buf, buflen, "dbx -a %d", os::current_process_id()); | |
57 | |
58 os::fork_and_exec(buf); | |
59 yes = false; | |
60 } | |
61 } while (yes); | |
62 } | |
63 | |
64 // Handle all synchronous signals which may happen during signal handling, | |
65 // not just SIGSEGV and SIGBUS. | |
66 static const int SIGNALS[] = { SIGSEGV, SIGBUS, SIGILL, SIGFPE, SIGTRAP }; // add more if needed | |
67 static const int NUM_SIGNALS = sizeof(SIGNALS) / sizeof(int); | |
68 | |
69 // Space for our "saved" signal flags and handlers | |
70 static int resettedSigflags[NUM_SIGNALS]; | |
71 static address resettedSighandler[NUM_SIGNALS]; | |
72 | |
73 static void save_signal(int idx, int sig) { | |
74 struct sigaction sa; | |
75 sigaction(sig, NULL, &sa); | |
76 resettedSigflags[idx] = sa.sa_flags; | |
77 resettedSighandler[idx] = (sa.sa_flags & SA_SIGINFO) | |
78 ? CAST_FROM_FN_PTR(address, sa.sa_sigaction) | |
79 : CAST_FROM_FN_PTR(address, sa.sa_handler); | |
80 } | |
81 | |
82 int VMError::get_resetted_sigflags(int sig) { | |
83 // Handle all program errors. | |
84 for (int i = 0; i < NUM_SIGNALS; i++) { | |
85 if (SIGNALS[i] == sig) { | |
86 return resettedSigflags[i]; | |
87 } | |
88 } | |
89 return -1; | |
90 } | |
91 | |
92 address VMError::get_resetted_sighandler(int sig) { | |
93 // Handle all program errors. | |
94 for (int i = 0; i < NUM_SIGNALS; i++) { | |
95 if (SIGNALS[i] == sig) { | |
96 return resettedSighandler[i]; | |
97 } | |
98 } | |
99 return NULL; | |
100 } | |
101 | |
102 static void crash_handler(int sig, siginfo_t* info, void* ucVoid) { | |
103 // Unmask current signal. | |
104 sigset_t newset; | |
105 sigemptyset(&newset); | |
106 sigaddset(&newset, sig); | |
107 | |
108 Unimplemented(); | |
109 } | |
110 | |
111 void VMError::reset_signal_handlers() { | |
112 sigset_t newset; | |
113 sigemptyset(&newset); | |
114 | |
115 for (int i = 0; i < NUM_SIGNALS; i++) { | |
116 save_signal(i, SIGNALS[i]); | |
117 os::signal(SIGNALS[i], CAST_FROM_FN_PTR(void *, crash_handler)); | |
118 sigaddset(&newset, SIGNALS[i]); | |
119 } | |
120 | |
121 sigthreadmask(SIG_UNBLOCK, &newset, NULL); | |
122 } |