Deleted Added
full compact
loader.c (65617) loader.c (65677)
1/*-
2 * Copyright (c) 2000 Daniel Capo Sobral
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
1/*-
2 * Copyright (c) 2000 Daniel Capo Sobral
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 * $FreeBSD: head/sys/boot/ficl/loader.c 65617 2000-09-08 17:03:53Z dcs $
26 * $FreeBSD: head/sys/boot/ficl/loader.c 65677 2000-09-10 12:15:30Z dfr $
27 */
28
29/*******************************************************************
30** l o a d e r . c
31** Additional FICL words designed for FreeBSD's loader
32**
33*******************************************************************/
34
35#include <stand.h>
36#include "bootstrap.h"
37#include <string.h>
38#include "ficl.h"
39
40/* FreeBSD's loader interaction words
41 *
42 * setenv ( value n name n' -- )
43 * setenv? ( value n name n' flag -- )
44 * getenv ( addr n -- addr' n' | -1 )
45 * unsetenv ( addr n -- )
46 * copyin ( addr addr' len -- )
47 * copyout ( addr addr' len -- )
48 * findfile ( name len type len' -- addr )
49 * pnpdevices ( -- addr )
50 * pnphandlers ( -- addr )
51 * ccall ( [[...[p10] p9] ... p1] n addr -- result )
52 */
53
54void
55ficlSetenv(FICL_VM *pVM)
56{
57 char *namep, *valuep, *name, *value;
58 int names, values;
59
60#if FICL_ROBUST > 1
61 vmCheckStack(pVM, 4, 0);
62#endif
63 names = stackPopINT(pVM->pStack);
64 namep = (char*) stackPopPtr(pVM->pStack);
65 values = stackPopINT(pVM->pStack);
66 valuep = (char*) stackPopPtr(pVM->pStack);
67
68 name = (char*) ficlMalloc(names+1);
69 if (!name)
70 vmThrowErr(pVM, "Error: out of memory");
71 strncpy(name, namep, names);
72 name[names] = '\0';
73 value = (char*) ficlMalloc(values+1);
74 if (!value)
75 vmThrowErr(pVM, "Error: out of memory");
76 strncpy(value, valuep, values);
77 value[values] = '\0';
78
79 setenv(name, value, 1);
80 ficlFree(name);
81 ficlFree(value);
82
83 return;
84}
85
86void
87ficlSetenvq(FICL_VM *pVM)
88{
89 char *namep, *valuep, *name, *value;
90 int names, values, overwrite;
91
92#if FICL_ROBUST > 1
93 vmCheckStack(pVM, 5, 0);
94#endif
95 overwrite = stackPopINT(pVM->pStack);
96 names = stackPopINT(pVM->pStack);
97 namep = (char*) stackPopPtr(pVM->pStack);
98 values = stackPopINT(pVM->pStack);
99 valuep = (char*) stackPopPtr(pVM->pStack);
100
101 name = (char*) ficlMalloc(names+1);
102 if (!name)
103 vmThrowErr(pVM, "Error: out of memory");
104 strncpy(name, namep, names);
105 name[names] = '\0';
106 value = (char*) ficlMalloc(values+1);
107 if (!value)
108 vmThrowErr(pVM, "Error: out of memory");
109 strncpy(value, valuep, values);
110 value[values] = '\0';
111
112 setenv(name, value, overwrite);
113 ficlFree(name);
114 ficlFree(value);
115
116 return;
117}
118
119void
120ficlGetenv(FICL_VM *pVM)
121{
122 char *namep, *name, *value;
123 int names;
124
125#if FICL_ROBUST > 1
126 vmCheckStack(pVM, 2, 2);
127#endif
128 names = stackPopINT(pVM->pStack);
129 namep = (char*) stackPopPtr(pVM->pStack);
130
131 name = (char*) ficlMalloc(names+1);
132 if (!name)
133 vmThrowErr(pVM, "Error: out of memory");
134 strncpy(name, namep, names);
135 name[names] = '\0';
136
137 value = getenv(name);
138 ficlFree(name);
139
140 if(value != NULL) {
141 stackPushPtr(pVM->pStack, value);
142 stackPushINT(pVM->pStack, strlen(value));
143 } else
144 stackPushINT(pVM->pStack, -1);
145
146 return;
147}
148
149void
150ficlUnsetenv(FICL_VM *pVM)
151{
152 char *namep, *name;
153 int names;
154
155#if FICL_ROBUST > 1
156 vmCheckStack(pVM, 2, 0);
157#endif
158 names = stackPopINT(pVM->pStack);
159 namep = (char*) stackPopPtr(pVM->pStack);
160
161 name = (char*) ficlMalloc(names+1);
162 if (!name)
163 vmThrowErr(pVM, "Error: out of memory");
164 strncpy(name, namep, names);
165 name[names] = '\0';
166
167 unsetenv(name);
168 ficlFree(name);
169
170 return;
171}
172
173void
174ficlCopyin(FICL_VM *pVM)
175{
176 void* src;
177 vm_offset_t dest;
178 size_t len;
179
180#if FICL_ROBUST > 1
181 vmCheckStack(pVM, 3, 0);
182#endif
183
184 len = stackPopINT(pVM->pStack);
185 dest = stackPopINT(pVM->pStack);
186 src = stackPopPtr(pVM->pStack);
187
188 archsw.arch_copyin(src, dest, len);
189
190 return;
191}
192
193void
194ficlCopyout(FICL_VM *pVM)
195{
196 void* dest;
197 vm_offset_t src;
198 size_t len;
199
200#if FICL_ROBUST > 1
201 vmCheckStack(pVM, 3, 0);
202#endif
203
204 len = stackPopINT(pVM->pStack);
205 dest = stackPopPtr(pVM->pStack);
206 src = stackPopINT(pVM->pStack);
207
208 archsw.arch_copyout(src, dest, len);
209
210 return;
211}
212
213void
214ficlFindfile(FICL_VM *pVM)
215{
216 char *name, *type, *namep, *typep;
217 struct preloaded_file* fp;
218 int names, types;
219
220#if FICL_ROBUST > 1
221 vmCheckStack(pVM, 4, 1);
222#endif
223
224 types = stackPopINT(pVM->pStack);
225 typep = (char*) stackPopPtr(pVM->pStack);
226 names = stackPopINT(pVM->pStack);
227 namep = (char*) stackPopPtr(pVM->pStack);
228 name = (char*) ficlMalloc(names+1);
229 if (!name)
230 vmThrowErr(pVM, "Error: out of memory");
231 strncpy(name, namep, names);
232 name[names] = '\0';
233 type = (char*) ficlMalloc(types+1);
234 if (!type)
235 vmThrowErr(pVM, "Error: out of memory");
236 strncpy(type, typep, types);
237 type[types] = '\0';
238
239 fp = file_findfile(name, type);
240 stackPushPtr(pVM->pStack, fp);
241
242 return;
243}
244
27 */
28
29/*******************************************************************
30** l o a d e r . c
31** Additional FICL words designed for FreeBSD's loader
32**
33*******************************************************************/
34
35#include <stand.h>
36#include "bootstrap.h"
37#include <string.h>
38#include "ficl.h"
39
40/* FreeBSD's loader interaction words
41 *
42 * setenv ( value n name n' -- )
43 * setenv? ( value n name n' flag -- )
44 * getenv ( addr n -- addr' n' | -1 )
45 * unsetenv ( addr n -- )
46 * copyin ( addr addr' len -- )
47 * copyout ( addr addr' len -- )
48 * findfile ( name len type len' -- addr )
49 * pnpdevices ( -- addr )
50 * pnphandlers ( -- addr )
51 * ccall ( [[...[p10] p9] ... p1] n addr -- result )
52 */
53
54void
55ficlSetenv(FICL_VM *pVM)
56{
57 char *namep, *valuep, *name, *value;
58 int names, values;
59
60#if FICL_ROBUST > 1
61 vmCheckStack(pVM, 4, 0);
62#endif
63 names = stackPopINT(pVM->pStack);
64 namep = (char*) stackPopPtr(pVM->pStack);
65 values = stackPopINT(pVM->pStack);
66 valuep = (char*) stackPopPtr(pVM->pStack);
67
68 name = (char*) ficlMalloc(names+1);
69 if (!name)
70 vmThrowErr(pVM, "Error: out of memory");
71 strncpy(name, namep, names);
72 name[names] = '\0';
73 value = (char*) ficlMalloc(values+1);
74 if (!value)
75 vmThrowErr(pVM, "Error: out of memory");
76 strncpy(value, valuep, values);
77 value[values] = '\0';
78
79 setenv(name, value, 1);
80 ficlFree(name);
81 ficlFree(value);
82
83 return;
84}
85
86void
87ficlSetenvq(FICL_VM *pVM)
88{
89 char *namep, *valuep, *name, *value;
90 int names, values, overwrite;
91
92#if FICL_ROBUST > 1
93 vmCheckStack(pVM, 5, 0);
94#endif
95 overwrite = stackPopINT(pVM->pStack);
96 names = stackPopINT(pVM->pStack);
97 namep = (char*) stackPopPtr(pVM->pStack);
98 values = stackPopINT(pVM->pStack);
99 valuep = (char*) stackPopPtr(pVM->pStack);
100
101 name = (char*) ficlMalloc(names+1);
102 if (!name)
103 vmThrowErr(pVM, "Error: out of memory");
104 strncpy(name, namep, names);
105 name[names] = '\0';
106 value = (char*) ficlMalloc(values+1);
107 if (!value)
108 vmThrowErr(pVM, "Error: out of memory");
109 strncpy(value, valuep, values);
110 value[values] = '\0';
111
112 setenv(name, value, overwrite);
113 ficlFree(name);
114 ficlFree(value);
115
116 return;
117}
118
119void
120ficlGetenv(FICL_VM *pVM)
121{
122 char *namep, *name, *value;
123 int names;
124
125#if FICL_ROBUST > 1
126 vmCheckStack(pVM, 2, 2);
127#endif
128 names = stackPopINT(pVM->pStack);
129 namep = (char*) stackPopPtr(pVM->pStack);
130
131 name = (char*) ficlMalloc(names+1);
132 if (!name)
133 vmThrowErr(pVM, "Error: out of memory");
134 strncpy(name, namep, names);
135 name[names] = '\0';
136
137 value = getenv(name);
138 ficlFree(name);
139
140 if(value != NULL) {
141 stackPushPtr(pVM->pStack, value);
142 stackPushINT(pVM->pStack, strlen(value));
143 } else
144 stackPushINT(pVM->pStack, -1);
145
146 return;
147}
148
149void
150ficlUnsetenv(FICL_VM *pVM)
151{
152 char *namep, *name;
153 int names;
154
155#if FICL_ROBUST > 1
156 vmCheckStack(pVM, 2, 0);
157#endif
158 names = stackPopINT(pVM->pStack);
159 namep = (char*) stackPopPtr(pVM->pStack);
160
161 name = (char*) ficlMalloc(names+1);
162 if (!name)
163 vmThrowErr(pVM, "Error: out of memory");
164 strncpy(name, namep, names);
165 name[names] = '\0';
166
167 unsetenv(name);
168 ficlFree(name);
169
170 return;
171}
172
173void
174ficlCopyin(FICL_VM *pVM)
175{
176 void* src;
177 vm_offset_t dest;
178 size_t len;
179
180#if FICL_ROBUST > 1
181 vmCheckStack(pVM, 3, 0);
182#endif
183
184 len = stackPopINT(pVM->pStack);
185 dest = stackPopINT(pVM->pStack);
186 src = stackPopPtr(pVM->pStack);
187
188 archsw.arch_copyin(src, dest, len);
189
190 return;
191}
192
193void
194ficlCopyout(FICL_VM *pVM)
195{
196 void* dest;
197 vm_offset_t src;
198 size_t len;
199
200#if FICL_ROBUST > 1
201 vmCheckStack(pVM, 3, 0);
202#endif
203
204 len = stackPopINT(pVM->pStack);
205 dest = stackPopPtr(pVM->pStack);
206 src = stackPopINT(pVM->pStack);
207
208 archsw.arch_copyout(src, dest, len);
209
210 return;
211}
212
213void
214ficlFindfile(FICL_VM *pVM)
215{
216 char *name, *type, *namep, *typep;
217 struct preloaded_file* fp;
218 int names, types;
219
220#if FICL_ROBUST > 1
221 vmCheckStack(pVM, 4, 1);
222#endif
223
224 types = stackPopINT(pVM->pStack);
225 typep = (char*) stackPopPtr(pVM->pStack);
226 names = stackPopINT(pVM->pStack);
227 namep = (char*) stackPopPtr(pVM->pStack);
228 name = (char*) ficlMalloc(names+1);
229 if (!name)
230 vmThrowErr(pVM, "Error: out of memory");
231 strncpy(name, namep, names);
232 name[names] = '\0';
233 type = (char*) ficlMalloc(types+1);
234 if (!type)
235 vmThrowErr(pVM, "Error: out of memory");
236 strncpy(type, typep, types);
237 type[types] = '\0';
238
239 fp = file_findfile(name, type);
240 stackPushPtr(pVM->pStack, fp);
241
242 return;
243}
244
245#ifdef HAVE_PNP
246
245void
246ficlPnpdevices(FICL_VM *pVM)
247{
248 static int pnp_devices_initted = 0;
249#if FICL_ROBUST > 1
250 vmCheckStack(pVM, 0, 1);
251#endif
252
253 if(!pnp_devices_initted) {
254 STAILQ_INIT(&pnp_devices);
255 pnp_devices_initted = 1;
256 }
257
258 stackPushPtr(pVM->pStack, &pnp_devices);
259
260 return;
261}
262
263void
264ficlPnphandlers(FICL_VM *pVM)
265{
266#if FICL_ROBUST > 1
267 vmCheckStack(pVM, 0, 1);
268#endif
269
270 stackPushPtr(pVM->pStack, pnphandlers);
271
272 return;
273}
274
247void
248ficlPnpdevices(FICL_VM *pVM)
249{
250 static int pnp_devices_initted = 0;
251#if FICL_ROBUST > 1
252 vmCheckStack(pVM, 0, 1);
253#endif
254
255 if(!pnp_devices_initted) {
256 STAILQ_INIT(&pnp_devices);
257 pnp_devices_initted = 1;
258 }
259
260 stackPushPtr(pVM->pStack, &pnp_devices);
261
262 return;
263}
264
265void
266ficlPnphandlers(FICL_VM *pVM)
267{
268#if FICL_ROBUST > 1
269 vmCheckStack(pVM, 0, 1);
270#endif
271
272 stackPushPtr(pVM->pStack, pnphandlers);
273
274 return;
275}
276
277#endif
278
275void
276ficlCcall(FICL_VM *pVM)
277{
278 int (*func)(int, ...);
279 int result, p[10];
280 int nparam, i;
281
282#if FICL_ROBUST > 1
283 vmCheckStack(pVM, 2, 0);
284#endif
285
286 func = stackPopPtr(pVM->pStack);
287 nparam = stackPopINT(pVM->pStack);
288
289#if FICL_ROBUST > 1
290 vmCheckStack(pVM, nparam, 1);
291#endif
292
293 for (i = 0; i < nparam; i++)
294 p[i] = stackPopINT(pVM->pStack);
295
296 result = func(p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8],
297 p[9]);
298
299 stackPushINT(pVM->pStack, result);
300
301 return;
302}
303
279void
280ficlCcall(FICL_VM *pVM)
281{
282 int (*func)(int, ...);
283 int result, p[10];
284 int nparam, i;
285
286#if FICL_ROBUST > 1
287 vmCheckStack(pVM, 2, 0);
288#endif
289
290 func = stackPopPtr(pVM->pStack);
291 nparam = stackPopINT(pVM->pStack);
292
293#if FICL_ROBUST > 1
294 vmCheckStack(pVM, nparam, 1);
295#endif
296
297 for (i = 0; i < nparam; i++)
298 p[i] = stackPopINT(pVM->pStack);
299
300 result = func(p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8],
301 p[9]);
302
303 stackPushINT(pVM->pStack, result);
304
305 return;
306}
307