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 2014 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/cyclic.h> 23 24 #include <sys/poll.h> 25 26 #include <time.h> 27 #include <stdlib.h> 28 #include <unistd.h> 29 #include <errno.h> 30 31 #include <fakekernel.h> 32 33 pri_t minclsyspri = 60; 34 35 /* Some kernel code takes the address of this. */ 36 proc_t p0; 37 38 proc_t * 39 _curproc(void) 40 { 41 return (&p0); 42 } 43 44 zone_t zone0 = { 45 .zone_name = "global", 46 .zone_zsched = &p0, 0 47 }; 48 49 zone_t * 50 _curzone(void) 51 { 52 return (&zone0); 53 } 54 55 pid_t 56 ddi_get_pid(void) 57 { 58 return ((pid_t)getpid()); 59 } 60 61 /* 62 * Find highest one bit set. 63 * Returns bit number + 1 of highest bit that is set, otherwise returns 0. 64 */ 65 int 66 highbit64(uint64_t i) 67 { 68 int h = 1; 69 70 if (i == 0) 71 return (0); 72 if (i & 0xffffffff00000000ULL) { 73 h += 32; i >>= 32; 74 } 75 if (i & 0xffff0000) { 76 h += 16; i >>= 16; 77 } 78 if (i & 0xff00) { 79 h += 8; i >>= 8; 80 } 81 if (i & 0xf0) { 82 h += 4; i >>= 4; 83 } 84 if (i & 0xc) { 85 h += 2; i >>= 2; 86 } 87 if (i & 0x2) { 88 h += 1; 89 } 90 return (h); 91 } 92 93 int 94 ddi_strtoul(const char *str, char **endp, int base, unsigned long *res) 95 { 96 *res = strtoul(str, endp, base); 97 if (*res == 0) 98 return (errno); 99 return (0); 100 } 101 102 int 103 ddi_strtoull(const char *str, char **nptr, int base, u_longlong_t *res) 104 { 105 char *end; 106 107 *res = strtoull(str, &end, base); 108 if (*res == 0) 109 return (errno); 110 return (0); 111 } 112 113 void 114 delay(clock_t ticks) 115 { 116 int msec = ticks; /* NB: hz==1000 */ 117 (void) poll(0, 0, msec); 118 } 119 120 int 121 issig(int why) 122 { 123 return (0); 124 } 125 126 /* ARGSUSED */ 127 cyclic_id_t 128 cyclic_add(cyc_handler_t *hdlr, cyc_time_t *when) 129 { 130 return (1); 131 } 132 133 /* ARGSUSED */ 134 void 135 cyclic_remove(cyclic_id_t id) 136 { 137 } 138 139 /* ARGSUSED */ 140 int 141 cyclic_reprogram(cyclic_id_t id, hrtime_t expiration) 142 { 143 return (1); 144 } 145 146 /* 147 * This library does not really need an "init" function, but 148 * providing one the main program can call is an easy way to 149 * make sure this library is loaded into the debugger, and 150 * gives us a way to avoid elfcheck complaints in the build. 151 */ 152 void 153 fakekernel_init(void) 154 { 155 }