1 /*
2 * This file and its contents are supplied under the terms of the
3 * Common Development and Distribution License ("CDDL"), version 1.0.
4 * You may only use this file in accordance with the terms of version
5 * 1.0 of the CDDL.
6 *
7 * A full copy of the text of the CDDL should have accompanied this
8 * source. A copy of the CDDL is also available via the Internet at
9 * http://www.illumos.org/license/CDDL.
10 */
11
12 /*
13 * Copyright 2017 Nexenta Systems, Inc. All rights reserved.
14 * Copyright 2017 RackTop Systems.
15 */
16
17 #include <sys/types.h>
18 #include <sys/time.h>
19 #include <sys/thread.h>
20 #include <sys/proc.h>
21 #include <sys/zone.h>
22 #include <sys/poll.h>
23
24 #include <time.h>
25 #include <stdlib.h>
26 #include <unistd.h>
27 #include <errno.h>
28 #include <string.h>
29
30 #include <fakekernel.h>
31
32 pri_t minclsyspri = 60;
33 extern zone_t zone0;
34
35 /* Some kernel code takes the address of this. */
36 proc_t p0 = {
37 .p_zone = &zone0, 0
38 };
39
40 proc_t *
_curproc(void)41 _curproc(void)
42 {
43 return (&p0);
44 }
45
46 zone_t zone0 = {
47 .zone_name = "global",
48 .zone_zsched = &p0, 0
49 };
50
51 zone_t *
_curzone(void)52 _curzone(void)
53 {
54 return (&zone0);
55 }
56
57 pid_t
ddi_get_pid(void)58 ddi_get_pid(void)
59 {
60 return ((pid_t)getpid());
61 }
62
63 /*
64 * Find highest one bit set.
65 * Returns bit number + 1 of highest bit that is set, otherwise returns 0.
66 */
67 int
highbit64(uint64_t i)68 highbit64(uint64_t i)
69 {
70 int h = 1;
71
72 if (i == 0)
73 return (0);
74 if (i & 0xffffffff00000000ULL) {
75 h += 32; i >>= 32;
76 }
77 if (i & 0xffff0000) {
78 h += 16; i >>= 16;
79 }
80 if (i & 0xff00) {
81 h += 8; i >>= 8;
82 }
83 if (i & 0xf0) {
84 h += 4; i >>= 4;
85 }
86 if (i & 0xc) {
87 h += 2; i >>= 2;
88 }
89 if (i & 0x2) {
90 h += 1;
91 }
92 return (h);
93 }
94
95 int
ddi_strtoul(const char * str,char ** endp,int base,unsigned long * res)96 ddi_strtoul(const char *str, char **endp, int base, unsigned long *res)
97 {
98 errno = 0;
99 *res = strtoul(str, endp, base);
100 if (*res == 0)
101 return (errno);
102 return (0);
103 }
104
105 int
ddi_strtoull(const char * str,char ** endp,int base,u_longlong_t * res)106 ddi_strtoull(const char *str, char **endp, int base, u_longlong_t *res)
107 {
108 errno = 0;
109 *res = strtoull(str, endp, base);
110 if (*res == 0)
111 return (errno);
112 return (0);
113 }
114
115 void
delay(clock_t ticks)116 delay(clock_t ticks)
117 {
118 int msec = ticks; /* NB: hz==1000 */
119 (void) poll(0, 0, msec);
120 }
121
122 int
highbit(ulong_t i)123 highbit(ulong_t i)
124 {
125 return (fls(i));
126 }
127
128 /* ARGSUSED */
129 int
issig(int why)130 issig(int why)
131 {
132 return (0);
133 }
134
135 /*
136 * This library does not really need an "init" function, but
137 * providing one the main program can call is an easy way to
138 * make sure this library is loaded into the debugger, and
139 * gives us a way to avoid elfcheck complaints in the build.
140 */
141 void
fakekernel_init(void)142 fakekernel_init(void)
143 {
144 }
145