char * prom_bootpath(void) { static char bootpath[OBP_MAXPATHLEN]; int length; pnode_t node; static char *name = "bootpath"; if (bootpath[0] != (char)0) return (bootpath); node = prom_chosennode(); if ((node == OBP_NONODE) || (node == OBP_BADNODE)) node = prom_rootnode(); length = prom_getproplen(node, name); if ((length == -1) || (length == 0)) return (NULL); if (length > OBP_MAXPATHLEN) length = OBP_MAXPATHLEN - 1; /* Null terminator */ (void) prom_bounded_getprop(node, name, bootpath, length); return (bootpath); }
/*ARGSUSED*/ char * kmdb_prom_get_ddi_prop(kmdb_auxv_t *kav, char *propname) { pnode_t node; ssize_t len; char *val; if ((node = prom_finddevice("/options")) == NULL) return (NULL); if ((len = prom_getproplen(node, propname)) < 0) return (NULL); val = mdb_alloc(len + 1, UM_SLEEP); if (prom_bounded_getprop(node, propname, val, len) != len) { mdb_free(val, len); return (NULL); } val[len] = '\0'; return (val); }
/* * Platform specific lgroup initialization */ void plat_lgrp_init(void) { pnode_t curnode; char tmp_name[sizeof (OBP_CPU) + 1]; /* extra padding */ int portid; int cpucnt = 0; int max_portid = -1; extern uint32_t lgrp_expand_proc_thresh; extern uint32_t lgrp_expand_proc_diff; extern pgcnt_t lgrp_mem_free_thresh; extern uint32_t lgrp_loadavg_tolerance; extern uint32_t lgrp_loadavg_max_effect; extern uint32_t lgrp_load_thresh; extern lgrp_mem_policy_t lgrp_mem_policy_root; /* * Count the number of CPUs installed to determine if * NUMA optimization should be enabled or not. * * All CPU nodes reside in the root node and have a * device type "cpu". */ curnode = prom_rootnode(); for (curnode = prom_childnode(curnode); curnode; curnode = prom_nextnode(curnode)) { bzero(tmp_name, sizeof (tmp_name)); if (prom_bounded_getprop(curnode, OBP_DEVICETYPE, tmp_name, sizeof (OBP_CPU)) == -1 || strcmp(tmp_name, OBP_CPU) != 0) continue; cpucnt++; if (prom_getprop(curnode, "portid", (caddr_t)&portid) != -1 && portid > max_portid) max_portid = portid; } if (cpucnt <= 1) max_mem_nodes = 1; else if (max_portid >= 0 && max_portid < MAX_MEM_NODES) max_mem_nodes = max_portid + 1; /* * Set tuneables for fiesta architecture * * lgrp_expand_proc_thresh is the minimum load on the lgroups * this process is currently running on before considering * expanding threads to another lgroup. * * lgrp_expand_proc_diff determines how much less the remote lgroup * must be loaded before expanding to it. * * Optimize for memory bandwidth by spreading multi-threaded * program to different lgroups. */ lgrp_expand_proc_thresh = lgrp_loadavg_max_effect - 1; lgrp_expand_proc_diff = lgrp_loadavg_max_effect / 2; lgrp_loadavg_tolerance = lgrp_loadavg_max_effect / 2; lgrp_mem_free_thresh = 1; /* home lgrp must have some memory */ lgrp_expand_proc_thresh = lgrp_loadavg_max_effect - 1; lgrp_mem_policy_root = LGRP_MEM_POLICY_NEXT; lgrp_load_thresh = 0; mem_node_pfn_shift = PLATFORM_MC_SHIFT - MMU_PAGESHIFT; }