/* * Copyright (C) 1996-2005 Paul Mackerras. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. */ #include "of1275.h" #include int call_prom(const char *service, int nargs, int nret, ...) { int i; struct prom_args { const char *service; int nargs; int nret; unsigned int args[12]; } args; va_list list; args.service = service; args.nargs = nargs; args.nret = nret; va_start(list, nret); for (i = 0; i < nargs; i++) args.args[i] = va_arg(list, unsigned int); va_end(list); for (i = 0; i < nret; i++) args.args[nargs+i] = 0; if (of_prom_entry(&args) < 0) return -1; return (nret > 0)? args.args[nargs]: 0; } int call_prom_ret(const char *service, int nargs, int nret, unsigned int *rets, ...) { int i; struct prom_args { const char *service; int nargs; int nret; unsigned int args[12]; } args; va_list list; args.service = service; args.nargs = nargs; args.nret = nret; va_start(list, rets); for (i = 0; i < nargs; i++) args.args[i] = va_arg(list, unsigned int); va_end(list); for (i = 0; i < nret; i++) args.args[nargs+i] = 0; if (of_prom_entry(&args) < 0) return -1; if (rets != (void *) 0) for (i = 1; i < nret; ++i) rets[i-1] = args.args[nargs+i]; return (nret > 0)? args.args[nargs]: 0; }