1/*
2 * Copyright (C) 1996-2005 Paul Mackerras.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version
7 * 2 of the License, or (at your option) any later version.
8 */
9
10#include "of1275.h"
11#include <stdarg.h>
12
13int call_prom(const char *service, int nargs, int nret, ...)
14{
15	int i;
16	struct prom_args {
17		const char *service;
18		int nargs;
19		int nret;
20		unsigned int args[12];
21	} args;
22	va_list list;
23
24	args.service = service;
25	args.nargs = nargs;
26	args.nret = nret;
27
28	va_start(list, nret);
29	for (i = 0; i < nargs; i++)
30		args.args[i] = va_arg(list, unsigned int);
31	va_end(list);
32
33	for (i = 0; i < nret; i++)
34		args.args[nargs+i] = 0;
35
36	if (of_prom_entry(&args) < 0)
37		return -1;
38
39	return (nret > 0)? args.args[nargs]: 0;
40}
41
42int call_prom_ret(const char *service, int nargs, int nret,
43		  unsigned int *rets, ...)
44{
45	int i;
46	struct prom_args {
47		const char *service;
48		int nargs;
49		int nret;
50		unsigned int args[12];
51	} args;
52	va_list list;
53
54	args.service = service;
55	args.nargs = nargs;
56	args.nret = nret;
57
58	va_start(list, rets);
59	for (i = 0; i < nargs; i++)
60		args.args[i] = va_arg(list, unsigned int);
61	va_end(list);
62
63	for (i = 0; i < nret; i++)
64		args.args[nargs+i] = 0;
65
66	if (of_prom_entry(&args) < 0)
67		return -1;
68
69	if (rets != (void *) 0)
70		for (i = 1; i < nret; ++i)
71			rets[i-1] = args.args[nargs+i];
72
73	return (nret > 0)? args.args[nargs]: 0;
74}
75