1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 /*
27  * Stubs for basic system services otherwise unavailable to the debugger.
28  */
29 
30 #include <stdlib.h>
31 #include <unistd.h>
32 #include <libproc.h>
33 #include <sys/time.h>
34 
35 #include <kmdb/kmdb_dpi.h>
36 #include <kmdb/kmdb_promif.h>
37 #include <kmdb/kmdb_io.h>
38 #include <mdb/mdb_debug.h>
39 #include <mdb/mdb_signal.h>
40 #include <mdb/mdb_io_impl.h>
41 #include <mdb/mdb.h>
42 
43 /*ARGSUSED*/
44 char *
getenv(const char * name)45 getenv(const char *name)
46 {
47 	/* There aren't any environment variables here */
48 	return (NULL);
49 }
50 
51 char *
strerror(int errnum)52 strerror(int errnum)
53 {
54 	static char errnostr[16];
55 
56 	(void) mdb_snprintf(errnostr, sizeof (errnostr), "Error %d", errnum);
57 
58 	return (errnostr);
59 }
60 
61 pid_t
getpid(void)62 getpid(void)
63 {
64 	return (1);
65 }
66 
67 /*
68  * We're trying to isolate ourselves from the rest of the world as much as
69  * possible, so we can't rely on the time in the kernel proper.  For now, we
70  * just bump a counter whenever time is requested, thus guaranteeing that
71  * things with timestamps can be compared according to order of occurrance.
72  */
73 hrtime_t
gethrtime(void)74 gethrtime(void)
75 {
76 	static hrtime_t kmdb_timestamp;
77 
78 	return (++kmdb_timestamp);
79 }
80 
81 /*
82  * Signal handling
83  */
84 
85 /*ARGSUSED*/
86 int
sigemptyset(sigset_t * set)87 sigemptyset(sigset_t *set)
88 {
89 	return (0);
90 }
91 
92 /*ARGSUSED*/
93 int
sigaddset(sigset_t * set,int signo)94 sigaddset(sigset_t *set, int signo)
95 {
96 	return (0);
97 }
98 
99 /*ARGSUSED*/
100 int
sigfillset(sigset_t * set)101 sigfillset(sigset_t *set)
102 {
103 	return (0);
104 }
105 
106 /*ARGSUSED*/
107 int
sigprocmask(int how,const sigset_t * set,sigset_t * oset)108 sigprocmask(int how, const sigset_t *set, sigset_t *oset)
109 {
110 	return (0);
111 }
112 
113 /*ARGSUSED*/
114 int
sigaction(int sig,const struct sigaction * act,struct sigaction * oact)115 sigaction(int sig, const struct sigaction *act, struct sigaction *oact)
116 {
117 	return (0);
118 }
119 
120 /*ARGSUSED*/
121 int
kill(pid_t pid,int sig)122 kill(pid_t pid, int sig)
123 {
124 	if (sig == SIGABRT) {
125 		mdb_printf("Debugger aborted\n");
126 		exit(1);
127 	}
128 
129 	return (0);
130 }
131 
132 /*ARGSUSED*/
133 int
proc_str2flt(const char * buf,int * ptr)134 proc_str2flt(const char *buf, int *ptr)
135 {
136 	return (-1);
137 }
138 
139 /*ARGSUSED*/
140 int
proc_str2sig(const char * buf,int * ptr)141 proc_str2sig(const char *buf, int *ptr)
142 {
143 	return (-1);
144 }
145 
146 /*ARGSUSED*/
147 int
proc_str2sys(const char * buf,int * ptr)148 proc_str2sys(const char *buf, int *ptr)
149 {
150 	return (-1);
151 }
152 
153 /*ARGSUSED*/
154 void
exit(int status)155 exit(int status)
156 {
157 #ifdef __sparc
158 	extern void kmdb_prom_exit_to_mon(void) __NORETURN;
159 
160 	kmdb_prom_exit_to_mon();
161 #else
162 	extern void kmdb_dpi_reboot(void) __NORETURN;
163 	static int recurse = 0;
164 
165 	if (!recurse) {
166 
167 		recurse = 1;
168 
169 		mdb_iob_printf(mdb.m_out, "Press any key to reboot\n");
170 		mdb_iob_flush(mdb.m_out);
171 		mdb_iob_clearlines(mdb.m_out);
172 
173 		(void) kmdb_getchar();
174 	}
175 
176 	kmdb_dpi_reboot();
177 #endif
178 }
179