1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#pragma ident "%Z%%M% %I% %E% SMI"
#include <sys/types.h>
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/bootconf.h>
#include <sys/kobj_impl.h>
#include <sys/cmn_err.h>
/*
* Standalone utility functions for use within krtld.
* Many platforms implement optimized platmod versions of
* utilities such as bcopy and any such are not yet available
* until the kernel is more completely stitched together.
* These standalones are referenced through vectors
* kobj_bzero, etc. Throughout krtld, the usual utility
* is redefined to reference through the corresponding
* vector so that krtld may simply refer to bzero etc.
* as usual. See kobj_impl.h.
*/
/*ARGSUSED*/
static void
kprintf(void *op, const char *fmt, ...)
{
va_list adx;
va_start(adx, fmt);
vprintf(fmt, adx);
va_end(adx);
}
static void
stand_bzero(void *p_arg, size_t count)
{
char zero = 0;
caddr_t p = p_arg;
while (count != 0)
*p++ = zero, count--;
}
static void
stand_bcopy(const void *src_arg, void *dest_arg, size_t count)
{
caddr_t src = (caddr_t)src_arg;
caddr_t dest = dest_arg;
if (src < dest && (src + count) > dest) {
/* overlap copy */
while (--count != -1)
*(dest + count) = *(src + count);
} else {
while (--count != -1)
*dest++ = *src++;
}
}
static size_t
stand_strlcat(char *dst, const char *src, size_t dstsize)
{
char *df = dst;
size_t left = dstsize;
size_t l1;
size_t l2 = strlen(src);
size_t copied;
while (left-- != 0 && *df != '\0')
df++;
l1 = df - dst;
if (dstsize == l1)
return (l1 + l2);
copied = l1 + l2 >= dstsize ? dstsize - l1 - 1 : l2;
bcopy(src, dst + l1, copied);
dst[l1+copied] = '\0';
return (l1 + l2);
}
/*
* Set up the krtld standalone utilty vectors
*/
void
kobj_setup_standalone_vectors()
{
_kobj_printf = (void (*)(void *, const char *, ...))bop_printf;
kobj_bcopy = stand_bcopy;
kobj_bzero = stand_bzero;
kobj_strlcat = stand_strlcat;
}
/*
* Restore the kprintf/bcopy/bzero kobj vectors.
* We need to undefine the override macros to
* accomplish this.
*
* Do NOT add new code after the point or at least
* certainly not code using bcopy or bzero which would
* need to be vectored to the krtld equivalents.
*/
#undef bcopy
#undef bzero
#undef strlcat
void
kobj_restore_vectors()
{
_kobj_printf = kprintf;
kobj_bcopy = bcopy;
kobj_bzero = bzero;
kobj_strlcat = strlcat;
}
|