Deleted Added
full compact
openfirm.c (84617) openfirm.c (84972)
1/* $NetBSD: Locore.c,v 1.7 2000/08/20 07:04:59 tsubai Exp $ */
2
3/*
4 * Copyright (C) 1995, 1996 Wolfgang Solfrank.
5 * Copyright (C) 1995, 1996 TooLs GmbH.
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 40 unchanged lines hidden (view full) ---

49 * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
50 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
51 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
52 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
53 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
54 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
55 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
56 *
1/* $NetBSD: Locore.c,v 1.7 2000/08/20 07:04:59 tsubai Exp $ */
2
3/*
4 * Copyright (C) 1995, 1996 Wolfgang Solfrank.
5 * Copyright (C) 1995, 1996 TooLs GmbH.
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 40 unchanged lines hidden (view full) ---

49 * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
50 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
51 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
52 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
53 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
54 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
55 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
56 *
57 * $FreeBSD: head/sys/boot/ofw/libofw/openfirm.c 84617 2001-10-07 13:22:25Z benno $
57 * $FreeBSD: head/sys/boot/ofw/libofw/openfirm.c 84972 2001-10-15 09:51:09Z robert $
58 */
59
60#include <machine/stdarg.h>
61
62#include <stand.h>
63
64#include "openfirm.h"
65

--- 26 unchanged lines hidden (view full) ---

92 * Generic functions
93 */
94
95/* Test to see if a service exists. */
96int
97OF_test(char *name)
98{
99 static struct {
58 */
59
60#include <machine/stdarg.h>
61
62#include <stand.h>
63
64#include "openfirm.h"
65

--- 26 unchanged lines hidden (view full) ---

92 * Generic functions
93 */
94
95/* Test to see if a service exists. */
96int
97OF_test(char *name)
98{
99 static struct {
100 char *name;
101 int nargs;
102 int nreturns;
103 char *service;
104 int missing;
100 cell_t name;
101 cell_t nargs;
102 cell_t nreturns;
103 cell_t service;
104 cell_t missing;
105 } args = {
105 } args = {
106 "test",
106 (cell_t)"test",
107 1,
108 1,
107 1,
108 1,
109 0,
110 0
109 };
110
111 };
112
111 args.service = name;
113 args.service = (cell_t)name;
112 if (openfirmware(&args) == -1)
113 return -1;
114 if (openfirmware(&args) == -1)
115 return -1;
114 return args.missing;
116 return (int)args.missing;
115}
116
117/* Return firmware millisecond count. */
118int
119OF_milliseconds()
120{
121 static struct {
117}
118
119/* Return firmware millisecond count. */
120int
121OF_milliseconds()
122{
123 static struct {
122 char *name;
123 int nargs;
124 int nreturns;
125 int ms;
124 cell_t name;
125 cell_t nargs;
126 cell_t nreturns;
127 cell_t ms;
126 } args = {
128 } args = {
127 "milliseconds",
129 (cell_t)"milliseconds",
128 0,
129 1,
130 0,
131 1,
132 0
130 };
131
132 openfirmware(&args);
133 };
134
135 openfirmware(&args);
133 return args.ms;
136 return (int)args.ms;
134}
135
136/*
137 * Device tree functions
138 */
139
140/* Return the next sibling of this node or 0. */
141phandle_t
142OF_peer(phandle_t node)
143{
144 static struct {
137}
138
139/*
140 * Device tree functions
141 */
142
143/* Return the next sibling of this node or 0. */
144phandle_t
145OF_peer(phandle_t node)
146{
147 static struct {
145 char *name;
146 int nargs;
147 int nreturns;
148 phandle_t node;
149 phandle_t next;
148 cell_t name;
149 cell_t nargs;
150 cell_t nreturns;
151 cell_t node;
152 cell_t next;
150 } args = {
153 } args = {
151 "peer",
154 (cell_t)"peer",
152 1,
153 1,
155 1,
156 1,
157 0,
158 0
154 };
155
159 };
160
156 args.node = node;
161 args.node = (u_int)node;
157 if (openfirmware(&args) == -1)
158 return -1;
162 if (openfirmware(&args) == -1)
163 return -1;
159 return args.next;
164 return (phandle_t)args.next;
160}
161
162/* Return the first child of this node or 0. */
163phandle_t
164OF_child(phandle_t node)
165{
166 static struct {
165}
166
167/* Return the first child of this node or 0. */
168phandle_t
169OF_child(phandle_t node)
170{
171 static struct {
167 char *name;
168 int nargs;
169 int nreturns;
170 phandle_t node;
171 phandle_t child;
172 cell_t name;
173 cell_t nargs;
174 cell_t nreturns;
175 cell_t node;
176 cell_t child;
172 } args = {
177 } args = {
173 "child",
178 (cell_t)"child",
174 1,
175 1,
179 1,
180 1,
181 0,
182 0
176 };
177
183 };
184
178 args.node = node;
185 args.node = (u_int)node;
179 if (openfirmware(&args) == -1)
180 return -1;
186 if (openfirmware(&args) == -1)
187 return -1;
181 return args.child;
188 return (phandle_t)args.child;
182}
183
184/* Return the parent of this node or 0. */
185phandle_t
186OF_parent(phandle_t node)
187{
188 static struct {
189}
190
191/* Return the parent of this node or 0. */
192phandle_t
193OF_parent(phandle_t node)
194{
195 static struct {
189 char *name;
190 int nargs;
191 int nreturns;
192 phandle_t node;
193 phandle_t parent;
196 cell_t name;
197 cell_t nargs;
198 cell_t nreturns;
199 cell_t node;
200 cell_t parent;
194 } args = {
201 } args = {
195 "parent",
202 (cell_t)"parent",
196 1,
197 1,
203 1,
204 1,
205 0,
206 0
198 };
199
207 };
208
200 args.node = node;
209 args.node = (u_int)node;
201 if (openfirmware(&args) == -1)
202 return -1;
210 if (openfirmware(&args) == -1)
211 return -1;
203 return args.parent;
212 return (phandle_t)args.parent;
204}
205
206/* Return the package handle that corresponds to an instance handle. */
207phandle_t
208OF_instance_to_package(ihandle_t instance)
209{
210 static struct {
213}
214
215/* Return the package handle that corresponds to an instance handle. */
216phandle_t
217OF_instance_to_package(ihandle_t instance)
218{
219 static struct {
211 char *name;
212 int nargs;
213 int nreturns;
214 ihandle_t instance;
215 phandle_t package;
220 cell_t name;
221 cell_t nargs;
222 cell_t nreturns;
223 cell_t instance;
224 cell_t package;
216 } args = {
225 } args = {
217 "instance-to-package",
226 (cell_t)"instance-to-package",
218 1,
219 1,
227 1,
228 1,
229 0,
230 0
220 };
221
231 };
232
222 args.instance = instance;
233 args.instance = (u_int)instance;
223 if (openfirmware(&args) == -1)
224 return -1;
234 if (openfirmware(&args) == -1)
235 return -1;
225 return args.package;
236 return (phandle_t)args.package;
226}
227
228/* Get the length of a property of a package. */
229int
230OF_getproplen(phandle_t package, char *propname)
231{
232 static struct {
237}
238
239/* Get the length of a property of a package. */
240int
241OF_getproplen(phandle_t package, char *propname)
242{
243 static struct {
233 char *name;
234 int nargs;
235 int nreturns;
236 phandle_t package;
237 char *propname;
238 int proplen;
244 cell_t name;
245 cell_t nargs;
246 cell_t nreturns;
247 cell_t package;
248 cell_t propname;
249 cell_t proplen;
239 } args = {
250 } args = {
240 "getproplen",
251 (cell_t)"getproplen",
241 2,
242 1,
252 2,
253 1,
254 0,
255 0,
256 0
243 };
244
257 };
258
245 args.package = package;
246 args.propname = propname;
259 args.package = (u_int)package;
260 args.propname = (cell_t)propname;
247 if (openfirmware(&args) == -1)
248 return -1;
261 if (openfirmware(&args) == -1)
262 return -1;
249 return args.proplen;
263 return (int)args.proplen;
250}
251
252/* Get the value of a property of a package. */
253int
254OF_getprop(phandle_t package, char *propname, void *buf, int buflen)
255{
256 static struct {
264}
265
266/* Get the value of a property of a package. */
267int
268OF_getprop(phandle_t package, char *propname, void *buf, int buflen)
269{
270 static struct {
257 char *name;
258 int nargs;
259 int nreturns;
260 phandle_t package;
261 char *propname;
262 void *buf;
263 int buflen;
264 int size;
271 cell_t name;
272 cell_t nargs;
273 cell_t nreturns;
274 cell_t package;
275 cell_t propname;
276 cell_t buf;
277 cell_t buflen;
278 cell_t size;
265 } args = {
279 } args = {
266 "getprop",
280 (cell_t)"getprop",
267 4,
268 1,
281 4,
282 1,
283 0,
284 0,
285 0,
286 0,
287 0
269 };
270
288 };
289
271 args.package = package;
272 args.propname = propname;
273 args.buf = buf;
274 args.buflen = buflen;
290 args.package = (u_int)package;
291 args.propname = (cell_t)propname;
292 args.buf = (cell_t)buf;
293 args.buflen = (u_int)buflen;
275 if (openfirmware(&args) == -1)
276 return -1;
294 if (openfirmware(&args) == -1)
295 return -1;
277 return args.size;
296 return (int)args.size;
278}
279
280/* Get the next property of a package. */
281int
282OF_nextprop(phandle_t package, char *previous, char *buf)
283{
284 static struct {
297}
298
299/* Get the next property of a package. */
300int
301OF_nextprop(phandle_t package, char *previous, char *buf)
302{
303 static struct {
285 char *name;
286 int nargs;
287 int nreturns;
288 phandle_t package;
289 char *previous;
290 char *buf;
291 int flag;
304 cell_t name;
305 cell_t nargs;
306 cell_t nreturns;
307 cell_t package;
308 cell_t previous;
309 cell_t buf;
310 cell_t flag;
292 } args = {
311 } args = {
293 "nextprop",
312 (cell_t)"nextprop",
294 3,
295 1,
313 3,
314 1,
315 0,
316 0,
317 0,
318 0
296 };
297
319 };
320
298 args.package = package;
299 args.previous = previous;
300 args.buf = buf;
321 args.package = (u_int)package;
322 args.previous = (cell_t)previous;
323 args.buf = (cell_t)buf;
301 if (openfirmware(&args) == -1)
302 return -1;
324 if (openfirmware(&args) == -1)
325 return -1;
303 return args.flag;
326 return (int)args.flag;
304}
305
306/* Set the value of a property of a package. */
307/* XXX Has a bug on FirePower */
308int
309OF_setprop(phandle_t package, char *propname, void *buf, int len)
310{
311 static struct {
327}
328
329/* Set the value of a property of a package. */
330/* XXX Has a bug on FirePower */
331int
332OF_setprop(phandle_t package, char *propname, void *buf, int len)
333{
334 static struct {
312 char *name;
313 int nargs;
314 int nreturns;
315 phandle_t package;
316 char *propname;
317 void *buf;
318 int len;
319 int size;
335 cell_t name;
336 cell_t nargs;
337 cell_t nreturns;
338 cell_t package;
339 cell_t propname;
340 cell_t buf;
341 cell_t len;
342 cell_t size;
320 } args = {
343 } args = {
321 "setprop",
344 (cell_t)"setprop",
322 4,
323 1,
345 4,
346 1,
347 0,
348 0,
349 0,
350 0,
351 0
324 };
325
352 };
353
326 args.package = package;
327 args.propname = propname;
328 args.buf = buf;
329 args.len = len;
354 args.package = (u_int)package;
355 args.propname = (cell_t)propname;
356 args.buf = (cell_t)buf;
357 args.len = (u_int)len;
330 if (openfirmware(&args) == -1)
331 return -1;
358 if (openfirmware(&args) == -1)
359 return -1;
332 return args.size;
360 return (int)args.size;
333}
334
335/* Convert a device specifier to a fully qualified pathname. */
336int
337OF_canon(const char *device, char *buf, int len)
338{
339 static struct {
361}
362
363/* Convert a device specifier to a fully qualified pathname. */
364int
365OF_canon(const char *device, char *buf, int len)
366{
367 static struct {
340 char *name;
341 int nargs;
342 int nreturns;
343 char *device;
344 char *buf;
345 int len;
346 int size;
368 cell_t name;
369 cell_t nargs;
370 cell_t nreturns;
371 cell_t device;
372 cell_t buf;
373 cell_t len;
374 cell_t size;
347 } args = {
375 } args = {
348 "canon",
376 (cell_t)"canon",
349 3,
350 1,
377 3,
378 1,
379 0,
380 0,
381 0,
382 0
351 };
352
383 };
384
353 args.device = (char *)(uintptr_t *)device;
354 args.buf = buf;
355 args.len = len;
385 args.device = (cell_t)device;
386 args.buf = (cell_t)buf;
387 args.len = (cell_t)len;
356 if (openfirmware(&args) == -1)
357 return -1;
388 if (openfirmware(&args) == -1)
389 return -1;
358 return args.size;
390 return (int)args.size;
359}
360
361/* Return a package handle for the specified device. */
362phandle_t
363OF_finddevice(const char *device)
364{
391}
392
393/* Return a package handle for the specified device. */
394phandle_t
395OF_finddevice(const char *device)
396{
397 int i;
365 static struct {
398 static struct {
366 char *name;
367 int nargs;
368 int nreturns;
369 char *device;
370 phandle_t package;
399 cell_t name;
400 cell_t nargs;
401 cell_t nreturns;
402 cell_t device;
403 cell_t package;
371 } args = {
404 } args = {
372 "finddevice",
405 (cell_t)"finddevice",
373 1,
374 1,
406 1,
407 1,
408 0,
409 0
375 };
376
410 };
411
377 args.device = (char *)(uintptr_t *)device;
412 args.device = (cell_t)device;
378 if (openfirmware(&args) == -1)
379 return -1;
413 if (openfirmware(&args) == -1)
414 return -1;
380 return args.package;
415
416 return (phandle_t)args.package;
381}
382
383/* Return the fully qualified pathname corresponding to an instance. */
384int
385OF_instance_to_path(ihandle_t instance, char *buf, int len)
386{
387 static struct {
417}
418
419/* Return the fully qualified pathname corresponding to an instance. */
420int
421OF_instance_to_path(ihandle_t instance, char *buf, int len)
422{
423 static struct {
388 char *name;
389 int nargs;
390 int nreturns;
391 ihandle_t instance;
392 char *buf;
393 int len;
394 int size;
424 cell_t name;
425 cell_t nargs;
426 cell_t nreturns;
427 cell_t instance;
428 cell_t buf;
429 cell_t len;
430 cell_t size;
395 } args = {
431 } args = {
396 "instance-to-path",
432 (cell_t)"instance-to-path",
397 3,
398 1,
433 3,
434 1,
435 0,
436 0,
437 0,
438 0
399 };
400
439 };
440
401 args.instance = instance;
402 args.buf = buf;
403 args.len = len;
441 args.instance = (u_int)instance;
442 args.buf = (cell_t)buf;
443 args.len = (u_int)len;
404 if (openfirmware(&args) == -1)
405 return -1;
444 if (openfirmware(&args) == -1)
445 return -1;
406 return(args.size);
446 return (int)args.size;
407}
408
409/* Return the fully qualified pathname corresponding to a package. */
410int
411OF_package_to_path(phandle_t package, char *buf, int len)
412{
413 static struct {
447}
448
449/* Return the fully qualified pathname corresponding to a package. */
450int
451OF_package_to_path(phandle_t package, char *buf, int len)
452{
453 static struct {
414 char *name;
415 int nargs;
416 int nreturns;
417 phandle_t package;
418 char *buf;
419 int len;
420 int size;
454 cell_t name;
455 cell_t nargs;
456 cell_t nreturns;
457 cell_t package;
458 cell_t buf;
459 cell_t len;
460 cell_t size;
421 } args = {
461 } args = {
422 "package-to-path",
462 (cell_t)"package-to-path",
423 3,
424 1,
463 3,
464 1,
465 0,
466 0,
467 0,
468 0
425 };
426
469 };
470
427 args.package = package;
428 args.buf = buf;
429 args.len = len;
471 args.package = (u_int)package;
472 args.buf = (cell_t)buf;
473 args.len = (u_int)len;
430 if (openfirmware(&args) == -1)
431 return -1;
474 if (openfirmware(&args) == -1)
475 return -1;
432 return(args.size);
476 return (int)args.size;
433}
434
435/* Call the method in the scope of a given instance. */
436int
437OF_call_method(char *method, ihandle_t instance, int nargs, int nreturns, ...)
438{
439 va_list ap;
440 static struct {
477}
478
479/* Call the method in the scope of a given instance. */
480int
481OF_call_method(char *method, ihandle_t instance, int nargs, int nreturns, ...)
482{
483 va_list ap;
484 static struct {
441 char *name;
442 int nargs;
443 int nreturns;
444 char *method;
445 ihandle_t instance;
446 int args_n_results[12];
485 cell_t name;
486 cell_t nargs;
487 cell_t nreturns;
488 cell_t method;
489 cell_t instance;
490 cell_t args_n_results[12];
447 } args = {
491 } args = {
448 "call-method",
492 (cell_t)"call-method",
449 2,
450 1,
493 2,
494 1,
495 0,
496 0,
497 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
451 };
452 int *ip, n;
453
454 if (nargs > 6)
455 return -1;
456 args.nargs = nargs + 2;
457 args.nreturns = nreturns + 1;
498 };
499 int *ip, n;
500
501 if (nargs > 6)
502 return -1;
503 args.nargs = nargs + 2;
504 args.nreturns = nreturns + 1;
458 args.method = method;
459 args.instance = instance;
505 args.method = (cell_t)method;
506 args.instance = (u_int)instance;
460 va_start(ap, nreturns);
507 va_start(ap, nreturns);
461 for (ip = args.args_n_results + (n = nargs); --n >= 0;)
508 for (ip = (int *)(args.args_n_results + (n = nargs)); --n >= 0;)
462 *--ip = va_arg(ap, int);
463
464 if (openfirmware(&args) == -1)
465 return -1;
466 if (args.args_n_results[nargs])
509 *--ip = va_arg(ap, int);
510
511 if (openfirmware(&args) == -1)
512 return -1;
513 if (args.args_n_results[nargs])
467 return args.args_n_results[nargs];
468 for (ip = args.args_n_results + nargs + (n = args.nreturns); --n > 0;)
514 return (int)args.args_n_results[nargs];
515 for (ip = (int *)(args.args_n_results + nargs + (n = args.nreturns));
516 --n > 0;)
469 *va_arg(ap, int *) = *--ip;
470 va_end(ap);
471 return 0;
472}
473
474/*
475 * Device I/O functions.
476 */
477
478/* Open an instance for a device. */
479ihandle_t
480OF_open(char *device)
481{
482 static struct {
517 *va_arg(ap, int *) = *--ip;
518 va_end(ap);
519 return 0;
520}
521
522/*
523 * Device I/O functions.
524 */
525
526/* Open an instance for a device. */
527ihandle_t
528OF_open(char *device)
529{
530 static struct {
483 char *name;
484 int nargs;
485 int nreturns;
486 char *device;
487 ihandle_t instance;
531 cell_t name;
532 cell_t nargs;
533 cell_t nreturns;
534 cell_t device;
535 cell_t instance;
488 } args = {
536 } args = {
489 "open",
537 (cell_t)"open",
490 1,
491 1,
538 1,
539 1,
540 0,
541 0
492 };
493
542 };
543
494 args.device = device;
544 args.device = (cell_t)device;
495 if (openfirmware(&args) == -1 || args.instance == 0) {
496 return -1;
497 }
545 if (openfirmware(&args) == -1 || args.instance == 0) {
546 return -1;
547 }
498 return args.instance;
548 return (ihandle_t)args.instance;
499}
500
501/* Close an instance. */
502void
503OF_close(ihandle_t instance)
504{
505 static struct {
549}
550
551/* Close an instance. */
552void
553OF_close(ihandle_t instance)
554{
555 static struct {
506 char *name;
507 int nargs;
508 int nreturns;
509 ihandle_t instance;
556 cell_t name;
557 cell_t nargs;
558 cell_t nreturns;
559 cell_t instance;
510 } args = {
560 } args = {
511 "close",
561 (cell_t)"close",
512 1,
513 0,
562 1,
563 0,
564 0
514 };
515
565 };
566
516 args.instance = instance;
567 args.instance = (u_int)instance;
517 openfirmware(&args);
518}
519
520/* Read from an instance. */
521int
522OF_read(ihandle_t instance, void *addr, int len)
523{
524 static struct {
568 openfirmware(&args);
569}
570
571/* Read from an instance. */
572int
573OF_read(ihandle_t instance, void *addr, int len)
574{
575 static struct {
525 char *name;
526 int nargs;
527 int nreturns;
528 ihandle_t instance;
529 void *addr;
530 int len;
531 int actual;
576 cell_t name;
577 cell_t nargs;
578 cell_t nreturns;
579 cell_t instance;
580 cell_t addr;
581 cell_t len;
582 cell_t actual;
532 } args = {
583 } args = {
533 "read",
584 (cell_t)"read",
534 3,
535 1,
585 3,
586 1,
587 0,
588 0,
589 0,
590 0
536 };
537
591 };
592
538 args.instance = instance;
539 args.addr = addr;
540 args.len = len;
593 args.instance = (u_int)instance;
594 args.addr = (cell_t)addr;
595 args.len = (u_int)len;
541
542#if defined(OPENFIRM_DEBUG)
543 printf("OF_read: called with instance=%08x, addr=%p, len=%d\n",
544 args.instance, args.addr, args.len);
545#endif
546
547 if (openfirmware(&args) == -1)
548 return -1;
549
550#if defined(OPENFIRM_DEBUG)
551 printf("OF_read: returning instance=%d, addr=%p, len=%d, actual=%d\n",
552 args.instance, args.addr, args.len, args.actual);
553#endif
554
596
597#if defined(OPENFIRM_DEBUG)
598 printf("OF_read: called with instance=%08x, addr=%p, len=%d\n",
599 args.instance, args.addr, args.len);
600#endif
601
602 if (openfirmware(&args) == -1)
603 return -1;
604
605#if defined(OPENFIRM_DEBUG)
606 printf("OF_read: returning instance=%d, addr=%p, len=%d, actual=%d\n",
607 args.instance, args.addr, args.len, args.actual);
608#endif
609
555 return args.actual;
610 return (int)args.actual;
556}
557
558/* Write to an instance. */
559int
560OF_write(ihandle_t instance, void *addr, int len)
561{
562 static struct {
611}
612
613/* Write to an instance. */
614int
615OF_write(ihandle_t instance, void *addr, int len)
616{
617 static struct {
563 char *name;
564 int nargs;
565 int nreturns;
566 ihandle_t instance;
567 void *addr;
568 int len;
569 int actual;
618 cell_t name;
619 cell_t nargs;
620 cell_t nreturns;
621 cell_t instance;
622 cell_t addr;
623 cell_t len;
624 cell_t actual;
570 } args = {
625 } args = {
571 "write",
626 (cell_t)"write",
572 3,
573 1,
627 3,
628 1,
629 0,
630 0,
631 0,
632 0
574 };
575
633 };
634
576 args.instance = instance;
577 args.addr = addr;
578 args.len = len;
635 args.instance = (u_int)instance;
636 args.addr = (cell_t)addr;
637 args.len = (u_int)len;
579 if (openfirmware(&args) == -1)
580 return -1;
638 if (openfirmware(&args) == -1)
639 return -1;
581 return args.actual;
640 return (int)args.actual;
582}
583
584/* Seek to a position. */
585int
586OF_seek(ihandle_t instance, u_int64_t pos)
587{
588 static struct {
641}
642
643/* Seek to a position. */
644int
645OF_seek(ihandle_t instance, u_int64_t pos)
646{
647 static struct {
589 char *name;
590 int nargs;
591 int nreturns;
592 ihandle_t instance;
593 int poshi;
594 int poslo;
595 int status;
648 cell_t name;
649 cell_t nargs;
650 cell_t nreturns;
651 cell_t instance;
652 cell_t poshi;
653 cell_t poslo;
654 cell_t status;
596 } args = {
655 } args = {
597 "seek",
656 (cell_t)"seek",
598 3,
599 1,
657 3,
658 1,
659 0,
660 0,
661 0,
662 0
600 };
601
663 };
664
602 args.instance = instance;
603 args.poshi = (int)(pos >> 32);
604 args.poslo = (int)pos;
665 args.instance = (u_int)instance;
666 args.poshi = pos >> 32;
667 args.poslo = pos;
605 if (openfirmware(&args) == -1)
606 return -1;
668 if (openfirmware(&args) == -1)
669 return -1;
607 return args.status;
670 return (int)args.status;
608}
609
610/*
611 * Memory functions.
612 */
613
614/* Claim an area of memory. */
615void *
616OF_claim(void *virt, u_int size, u_int align)
617{
618 static struct {
671}
672
673/*
674 * Memory functions.
675 */
676
677/* Claim an area of memory. */
678void *
679OF_claim(void *virt, u_int size, u_int align)
680{
681 static struct {
619 char *name;
620 int nargs;
621 int nreturns;
622 void *virt;
623 u_int size;
624 u_int align;
625 void *baseaddr;
682 cell_t name;
683 cell_t nargs;
684 cell_t nreturns;
685 cell_t virt;
686 cell_t size;
687 cell_t align;
688 cell_t baseaddr;
626 } args = {
689 } args = {
627 "claim",
690 (cell_t)"claim",
628 3,
629 1,
691 3,
692 1,
693 0,
694 0,
695 0,
696 0
630 };
631
697 };
698
632 args.virt = virt;
699 args.virt = (cell_t)virt;
633 args.size = size;
634 args.align = align;
635 if (openfirmware(&args) == -1)
636 return (void *)-1;
700 args.size = size;
701 args.align = align;
702 if (openfirmware(&args) == -1)
703 return (void *)-1;
637 return args.baseaddr;
704 return (void *)args.baseaddr;
638}
639
705}
706
707/* Allocate an area of physical memory */
708void *
709OF_alloc_phys(size_t size, int align)
710{
711 static struct {
712 cell_t name;
713 cell_t nargs;
714 cell_t nret;
715 cell_t method;
716 cell_t ihandle;
717 cell_t align;
718 cell_t size;
719 cell_t status;
720 cell_t phys_hi;
721 cell_t phys_low;
722 } args = {
723 (cell_t)"call-method",
724 4,
725 3,
726 (cell_t)"claim",
727 0,
728 0,
729 0,
730 0, /* ret */
731 0,
732 0,
733 };
734
735 args.ihandle = memory;
736 args.size = size;
737 args.align = align;
738
739 if (openfirmware(&args) == -1)
740 return (void *)-1;
741
742 return (void *)(args.phys_hi << 32 | args.phys_low);
743}
744
640/* Release an area of memory. */
641void
642OF_release(void *virt, u_int size)
643{
644 static struct {
745/* Release an area of memory. */
746void
747OF_release(void *virt, u_int size)
748{
749 static struct {
645 char *name;
646 int nargs;
647 int nreturns;
648 void *virt;
649 u_int size;
750 cell_t name;
751 cell_t nargs;
752 cell_t nreturns;
753 cell_t virt;
754 cell_t size;
650 } args = {
755 } args = {
651 "release",
756 (cell_t)"release",
652 2,
653 0,
757 2,
758 0,
759 0,
760 0
654 };
655
761 };
762
656 args.virt = virt;
763 args.virt = (cell_t)virt;
657 args.size = size;
658 openfirmware(&args);
659}
660
661/*
662 * Control transfer functions.
663 */
664
665/* Reset the system and call "boot <bootspec>". */
666void
667OF_boot(char *bootspec)
668{
669 static struct {
764 args.size = size;
765 openfirmware(&args);
766}
767
768/*
769 * Control transfer functions.
770 */
771
772/* Reset the system and call "boot <bootspec>". */
773void
774OF_boot(char *bootspec)
775{
776 static struct {
670 char *name;
671 int nargs;
672 int nreturns;
673 char *bootspec;
777 cell_t name;
778 cell_t nargs;
779 cell_t nreturns;
780 cell_t bootspec;
674 } args = {
781 } args = {
675 "boot",
782 (cell_t)"boot",
676 1,
677 0,
783 1,
784 0,
785 0
678 };
679
786 };
787
680 args.bootspec = bootspec;
788 args.bootspec = (cell_t)bootspec;
681 openfirmware(&args);
682 for (;;); /* just in case */
683}
684
685/* Suspend and drop back to the OpenFirmware interface. */
686void
687OF_enter()
688{
689 static struct {
789 openfirmware(&args);
790 for (;;); /* just in case */
791}
792
793/* Suspend and drop back to the OpenFirmware interface. */
794void
795OF_enter()
796{
797 static struct {
690 char *name;
691 int nargs;
692 int nreturns;
798 cell_t name;
799 cell_t nargs;
800 cell_t nreturns;
693 } args = {
801 } args = {
694 "enter",
802 (cell_t)"enter",
695 0,
696 0
697 };
698
699 openfirmware(&args);
803 0,
804 0
805 };
806
807 openfirmware(&args);
700 return; /* We may come back. */
701}
702
703/* Shut down and drop back to the OpenFirmware interface. */
704void
705OF_exit()
706{
707 static struct {
808}
809
810/* Shut down and drop back to the OpenFirmware interface. */
811void
812OF_exit()
813{
814 static struct {
708 char *name;
709 int nargs;
710 int nreturns;
815 cell_t name;
816 cell_t nargs;
817 cell_t nreturns;
711 } args = {
818 } args = {
712 "exit",
819 (cell_t)"exit",
713 0,
714 0
715 };
716
717 openfirmware(&args);
718 for (;;); /* just in case */
719}
720
721/* Free <size> bytes starting at <virt>, then call <entry> with <arg>. */
820 0,
821 0
822 };
823
824 openfirmware(&args);
825 for (;;); /* just in case */
826}
827
828/* Free <size> bytes starting at <virt>, then call <entry> with <arg>. */
722#if 0
829#ifdef __notyet__
723void
724OF_chain(void *virt, u_int size, void (*entry)(), void *arg, u_int len)
725{
726 static struct {
830void
831OF_chain(void *virt, u_int size, void (*entry)(), void *arg, u_int len)
832{
833 static struct {
727 char *name;
728 int nargs;
729 int nreturns;
730 void *virt;
731 u_int size;
732 void (*entry)();
733 void *arg;
734 u_int len;
834 cell_t name;
835 cell_t nargs;
836 cell_t nreturns;
837 cell_t virt;
838 cell_t size;
839 cell_t entry;
840 cell_t arg;
841 cell_t len;
735 } args = {
842 } args = {
736 "chain",
843 (cell_t)"chain",
737 5,
738 0,
844 5,
845 0,
846 0,
847 0,
848 0,
849 0,
850 0
739 };
740
851 };
852
741 args.virt = virt;
853 args.virt = (cell_t)virt;
742 args.size = size;
854 args.size = size;
743 args.entry = entry;
744 args.arg = arg;
855 args.entry = (cell_t)entry;
856 args.arg = (cell_t)arg;
745 args.len = len;
746 openfirmware(&args);
747}
748#else
749void
750OF_chain(void *virt, u_int size, void (*entry)(), void *arg, u_int len)
751{
752 /*
753 * This is a REALLY dirty hack till the firmware gets this going
754 */
755 if (size > 0)
756 OF_release(virt, size);
757
758 entry(0, 0, openfirmware, arg, len);
759}
760#endif
857 args.len = len;
858 openfirmware(&args);
859}
860#else
861void
862OF_chain(void *virt, u_int size, void (*entry)(), void *arg, u_int len)
863{
864 /*
865 * This is a REALLY dirty hack till the firmware gets this going
866 */
867 if (size > 0)
868 OF_release(virt, size);
869
870 entry(0, 0, openfirmware, arg, len);
871}
872#endif