#include <sys/types.h>
#include <sys/promif.h>
#include <sys/bootconf.h>
#include <sys/salib.h>
#include <sys/boot.h>
#include "boot_plat.h"
char *v2path, *kernname, *systype;
char *my_own_name = "boot";
char v2args_buf[V2ARGS_BUF_SZ];
char *v2args = v2args_buf;
extern char *mfg_name;
char *impl_arch_name;
char *bootp_response;
char *module_path;
extern int cache_state;
uint64_t memlistextent;
struct memlist *pfreelistp,
*vfreelistp,
*pinstalledp;
char *boot_message;
char *netdev_path;
caddr_t start_addr, end_addr;
#define BOOT_BADPROP -1
#define BOOT_SUCCESS 0
#define BOOT_FAILURE -1
#define NIL 0
#define strequal(p, q) (strcmp((p), (q)) == 0)
void
set_default_filename(char *filename)
{
kernname = filename;
}
static const struct bplist {
char *name;
void *val;
uint_t size;
} bprop_tab[] = {
"boot-args", &v2args, 0,
"boot-path", &v2path, 0,
"fstype", &systype, 0,
"whoami", &my_own_name, 0,
"mfg-name", &mfg_name, 0,
"impl-arch-name", &impl_arch_name, 0,
"module-path", &module_path, 0,
"virt-avail", &vfreelistp, 0,
"phys-avail", &pfreelistp, 0,
"phys-installed", &pinstalledp, 0,
"default-name", &kernname, 0,
"extent", &memlistextent, sizeof (memlistextent),
"vac", &vac, sizeof (vac),
"cache-on?", &cache_state, sizeof (int),
"memory-update", 0, 0,
"boot-start", &start_addr, sizeof (start_addr),
"boot-end", &scratchmemp, sizeof (scratchmemp),
"boot-message", &boot_message, 0,
"bootp-response", &bootp_response, 0,
"netdev-path", &netdev_path, 0,
0, 0, 0
};
int
bgetproplen(struct bootops *bop, char *name)
{
int size = 0;
struct bplist *p;
struct memlist *ml;
if (strequal(name, "memory-update"))
return (BOOT_SUCCESS);
for (p = (struct bplist *)bprop_tab; p->name != (char *)0; p++) {
if ((strequal(name, "virt-avail") && strequal(name, p->name)) ||
(strequal(name, "phys-avail") && strequal(name, p->name)) ||
(strequal(name, "phys-installed") &&
strequal(name, p->name))) {
for (ml = *((struct memlist **)p->val);
ml != NIL;
ml = ml->ml_next)
size += (int)(sizeof (struct memlist) -
2*sizeof (struct memlist *));
return (size);
} else if (strequal(name, p->name)) {
if (p->size != 0)
return (p->size);
else {
if (*((char **)p->val) == NIL)
return (0);
return (strlen(*((char **)p->val)) + 1);
}
}
}
return (BOOT_BADPROP);
}
int
bgetprop(struct bootops *bop, char *name, void *buf)
{
struct bplist *p;
struct memlist *ml;
if (strequal(name, "memory-update")) {
update_memlist("virtual-memory", "available", &vfreelistp);
update_memlist("memory", "available", &pfreelistp);
return (BOOT_SUCCESS);
}
if (strequal(name, "boot-start")) {
start_addr = (caddr_t)_start;
bcopy((char *)(&start_addr), buf, sizeof (start_addr));
return (BOOT_SUCCESS);
}
if (strequal(name, "boot-end")) {
end_addr = scratchmemp;
bcopy((char *)(&end_addr), buf, sizeof (scratchmemp));
return (BOOT_SUCCESS);
}
for (p = (struct bplist *)bprop_tab; p->name != (char *)0; p++) {
if ((strequal(name, "virt-avail") && strequal(name, p->name)) ||
(strequal(name, "phys-avail") && strequal(name, p->name)) ||
(strequal(name, "phys-installed") &&
strequal(name, p->name))) {
u_longlong_t *t = buf;
for (ml = *((struct memlist **)p->val);
ml != NIL;
ml = ml->ml_next) {
*t++ = ml->ml_address;
*t++ = ml->ml_size;
}
return (BOOT_SUCCESS);
} else if (strequal(name, p->name)) {
if (p->size != 0) {
bcopy(p->val, buf, p->size);
} else {
(void) strcpy((char *)buf, *((char **)p->val));
}
return (BOOT_SUCCESS);
}
}
return (BOOT_FAILURE);
}
char *
bnextprop(struct bootops *bop, char *prev)
{
struct bplist *p;
if (*prev == 0)
return (bprop_tab->name);
for (p = (struct bplist *)bprop_tab; p->name != (char *)0; p++) {
if (strequal(prev, p->name))
return ((++p)->name);
}
return ((char *)0);
}