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#pragma ident	"%Z%%M%	%I%	%E% SMI"
27
28/*
29 * Stubs for basic system services otherwise unavailable to the debugger.
30 */
31
32#include <stdlib.h>
33#include <unistd.h>
34#include <libproc.h>
35#include <sys/time.h>
36#include <sys/utsname.h>
37
38#include <kmdb/kmdb_dpi.h>
39#include <kmdb/kmdb_promif.h>
40#include <kmdb/kmdb_io.h>
41#include <mdb/mdb_debug.h>
42#include <mdb/mdb_signal.h>
43#include <mdb/mdb_io_impl.h>
44#include <mdb/mdb.h>
45
46/*ARGSUSED*/
47char *
48getenv(const char *name)
49{
50	/* There aren't any environment variables here */
51	return (NULL);
52}
53
54char *
55strerror(int errnum)
56{
57	static char errnostr[16];
58
59	(void) mdb_snprintf(errnostr, sizeof (errnostr), "Error %d", errnum);
60
61	return (errnostr);
62}
63
64pid_t
65getpid(void)
66{
67	return (1);
68}
69
70/*
71 * We're trying to isolate ourselves from the rest of the world as much as
72 * possible, so we can't rely on the time in the kernel proper.  For now, we
73 * just bump a counter whenever time is requested, thus guaranteeing that
74 * things with timestamps can be compared according to order of occurrance.
75 */
76hrtime_t
77gethrtime(void)
78{
79	static hrtime_t kmdb_timestamp;
80
81	return (++kmdb_timestamp);
82}
83
84/*
85 * Signal handling
86 */
87
88/*ARGSUSED*/
89int
90sigemptyset(sigset_t *set)
91{
92	return (0);
93}
94
95/*ARGSUSED*/
96int
97sigaddset(sigset_t *set, int signo)
98{
99	return (0);
100}
101
102/*ARGSUSED*/
103int
104sigfillset(sigset_t *set)
105{
106	return (0);
107}
108
109/*ARGSUSED*/
110int
111sigprocmask(int how, const sigset_t *set, sigset_t *oset)
112{
113	return (0);
114}
115
116/*ARGSUSED*/
117int
118sigaction(int sig, const struct sigaction *act, struct sigaction *oact)
119{
120	return (0);
121}
122
123/*ARGSUSED*/
124int
125kill(pid_t pid, int sig)
126{
127	if (sig == SIGABRT) {
128		mdb_printf("Debugger aborted\n");
129		exit(1);
130	}
131
132	return (0);
133}
134
135/*ARGSUSED*/
136int
137proc_str2flt(const char *buf, int *ptr)
138{
139	return (-1);
140}
141
142/*ARGSUSED*/
143int
144proc_str2sig(const char *buf, int *ptr)
145{
146	return (-1);
147}
148
149/*ARGSUSED*/
150int
151proc_str2sys(const char *buf, int *ptr)
152{
153	return (-1);
154}
155
156/*ARGSUSED*/
157void
158exit(int status)
159{
160#ifdef __sparc
161	extern void kmdb_prom_exit_to_mon(void) __NORETURN;
162
163	kmdb_prom_exit_to_mon();
164#else
165	extern void kmdb_dpi_reboot(void) __NORETURN;
166	static int recurse = 0;
167
168	if (!recurse) {
169
170		recurse = 1;
171
172		mdb_iob_printf(mdb.m_out, "Press any key to reboot\n");
173		mdb_iob_flush(mdb.m_out);
174		mdb_iob_clearlines(mdb.m_out);
175
176		(void) kmdb_getchar();
177	}
178
179	kmdb_dpi_reboot();
180#endif
181}
182
183#if defined(__i386) && !defined(__amd64)
184/*ARGSUSED*/
185int
186_nuname(struct utsname *buf)
187{
188	return (-1);
189}
190#endif
191