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*/
44char *
45getenv(const char *name)
46{
47	/* There aren't any environment variables here */
48	return (NULL);
49}
50
51char *
52strerror(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
61pid_t
62getpid(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 */
73hrtime_t
74gethrtime(void)
75{
76	static hrtime_t kmdb_timestamp;
77
78	return (++kmdb_timestamp);
79}
80
81/*
82 * Signal handling
83 */
84
85/*ARGSUSED*/
86int
87sigemptyset(sigset_t *set)
88{
89	return (0);
90}
91
92/*ARGSUSED*/
93int
94sigaddset(sigset_t *set, int signo)
95{
96	return (0);
97}
98
99/*ARGSUSED*/
100int
101sigfillset(sigset_t *set)
102{
103	return (0);
104}
105
106/*ARGSUSED*/
107int
108sigprocmask(int how, const sigset_t *set, sigset_t *oset)
109{
110	return (0);
111}
112
113/*ARGSUSED*/
114int
115sigaction(int sig, const struct sigaction *act, struct sigaction *oact)
116{
117	return (0);
118}
119
120/*ARGSUSED*/
121int
122kill(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*/
133int
134proc_str2flt(const char *buf, int *ptr)
135{
136	return (-1);
137}
138
139/*ARGSUSED*/
140int
141proc_str2sig(const char *buf, int *ptr)
142{
143	return (-1);
144}
145
146/*ARGSUSED*/
147int
148proc_str2sys(const char *buf, int *ptr)
149{
150	return (-1);
151}
152
153/*ARGSUSED*/
154void
155exit(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