kid_t safe_kstat_write(kstat_ctl_t *kc, kstat_t *ksp, void *data) { kid_t kstat_chain_id = 0; if (ksp->ks_data != NULL) { kstat_chain_id = kstat_write(kc, ksp, data); if (kstat_chain_id == -1) fail(1, "kstat_write(%x, '%s') failed", kc, ksp->ks_name); } return (kstat_chain_id); }
/* * Set the appropiate events. Only called for event nodes * that are marked EVT_WRITE. */ void set_evt(dev_node_t *dev_node) { kstat_named_t *cnt_data; kstat_named_t *pic_data; kstat_t *cnt_ksp; kstat_t *pic_ksp; evt_node_t *evt_node; uint64_t clear_pcr_mask; uint64_t pcr; int pic_num; cnt_ksp = dev_node->cnt_ksp; pic_ksp = dev_node->pic_ksp; pic_num = dev_node->pic_num; evt_node = dev_node->evt_node; /* Read the "counters" kstat */ if (kstat_read(kc, cnt_ksp, NULL) == FAIL) { (void) fprintf(stderr, gettext("%s: could " "not set event's.\n"), pgmname); exit(1); } cnt_data = (kstat_named_t *)cnt_ksp->ks_data; if (kstat_read(kc, pic_ksp, NULL) == FAIL) { (void) fprintf(stderr, gettext("%s: could " "not set event's.\n"), pgmname); exit(1); } pic_data = (kstat_named_t *)pic_ksp->ks_data; clear_pcr_mask = pic_data[pic_ksp->ks_ndata-1].value.ui64; if ((pic_num < 0) || (pic_num > cnt_ksp->ks_ndata-1)) { (void) fprintf(stderr, gettext("%s: invalid pic #%d.\n"), pgmname, pic_num); exit(1); } /* * Store the previous value that is on the pic * so that we can calculate the delta value * later. */ evt_node->prev_count = cnt_data[pic_num+1].value.ui64; /* * Read the current pcr value from device. */ pcr = cnt_data[0].value.ui64; /* * Clear the section of the pcr which corresponds to the * pic we are setting events on. Also clear the pcr value * which is stored in the instance node. * */ pcr = pcr & clear_pcr_mask; /* * Set the event. */ pcr = pcr | evt_node->evt_pcr_mask; cnt_data[0].value.ui64 = pcr; /* * Write the value back to the kstat, to make it * visible to the underlying driver. */ if (kstat_write(kc, cnt_ksp, NULL) == FAIL) { (void) fprintf(stderr, gettext("%s: could not set events " "(setting events requires root " "permission).\n"), pgmname); exit(1); } }
int main(int argc, char *argv[]) #endif { DYNMEM_KNP_DEFN *p_dynmem_knp; kstat_ctl_t *kctl; KSTAT_INFO_DEF info_ksp; int val; char **pargs, **cur_pargs; /* * grab and parse argument list */ p_dynmem_knp = dynmem_knp; pargs = argv; while (*pargs) { (void) printf("pargs=%x - %s\n", (uint_t)pargs, *pargs); cur_pargs = pargs; pargs++; if (strcmp(*cur_pargs, "h") == 0) { print_usage(); return (0); } if (strcmp(*cur_pargs, "wake") == 0) { if ((p_dynmem_knp+DIRECTIVE)->newval == NO_VALUE) (p_dynmem_knp+DIRECTIVE)->newval = 0; (p_dynmem_knp+DIRECTIVE)->newval |= 0x01; continue; } if (strcmp(*cur_pargs, "hys") == 0) { if ((p_dynmem_knp+DIRECTIVE)->newval == NO_VALUE) (p_dynmem_knp+DIRECTIVE)->newval = 0; (p_dynmem_knp+DIRECTIVE)->newval |= 0x02; continue; } if (strcmp (*cur_pargs, "mon") == 0) { val = atoi(*pargs); (void) printf("errno=%x, %s=%x\n", errno, *cur_pargs, val); pargs++; (p_dynmem_knp+MONITOR)->newval = val; } if (strcmp (*cur_pargs, "age1") == 0) { val = atoi(*pargs); (void) printf("errno=%x, %s=%x\n", errno, *cur_pargs, val); pargs++; (p_dynmem_knp+AGECT1)->newval = val; } if (strcmp(*cur_pargs, "age2") == 0) { val = atoi(*pargs); (void) printf("errno=%x, %s=%x\n", errno, *cur_pargs, val); pargs++; (p_dynmem_knp+AGECT2)->newval = val; } if (strcmp(*cur_pargs, "age3") == 0) { val = atoi(*pargs); (void) printf("errno=%x, %s=%x\n", errno, *cur_pargs, val); pargs++; (p_dynmem_knp+AGECT3)->newval = val; } if (strcmp (*cur_pargs, "sec1") == 0) { val = atoi(*pargs); (void) printf("errno=%x, %s=%x\n", errno, *cur_pargs, val); pargs++; if (val == 0) break; else { (p_dynmem_knp+SEC1)->newval = val; continue; } } if (strcmp(*cur_pargs, "sec2") == 0) { val = atoi(*pargs); pargs++; (void) printf("errno=%x, %s=%x\n", errno, *cur_pargs, val); if (val == 0) break; else { (p_dynmem_knp+SEC2)->newval = val; continue; } } if (strcmp(*cur_pargs, "sec3") == 0) { val = atoi(*pargs); pargs++; (void) printf("errno=%x, %s=%x\n", errno, *cur_pargs, val); if (val == 0) break; else { (p_dynmem_knp+SEC3)->newval = val; continue; } } if (strcmp(*cur_pargs, "pcnt1") == 0) { val = atoi(*pargs); pargs++; (void) printf("errno=%x, %s=%x\n", errno, *cur_pargs, val); if (val == 0) break; else { (p_dynmem_knp+PCNT1)->newval = val; continue; } } if (strcmp(*cur_pargs, "pcnt2") == 0) { val = atoi(*pargs); pargs++; (void) printf("errno=%x, %s=%x\n", errno, *cur_pargs, val); if (val == 0) break; else { (p_dynmem_knp+PCNT2)->newval = val; continue; } } if (strcmp(*cur_pargs, "hdpcnt") == 0) { val = atoi(*pargs); pargs++; (void) printf("errno=%x, %s=%x\n", errno, *cur_pargs, val); if (val < 0) break; else { (p_dynmem_knp+HDPCNT)->newval = val; continue; } } if (strcmp(*cur_pargs, "list") == 0) { val = atoi(*pargs); pargs++; (void) printf("errno=%x, %s=%x\n", errno, *cur_pargs, val); if (val == 0) break; else { (p_dynmem_knp+MAXLIST)->newval = val; continue; } } } /* while(*pargs && cl) */ /* * open the kstat library */ kctl = kstat_open(); if (kctl == NULL) { (void) printf("kstat_open() failed\n"); return (1); } /* * is the name module about */ info_ksp.instance = 0; info_ksp.ksp = kstat_lookup(kctl, SDBC_KSTAT_MODULE, 0, SDBC_KSTAT_DYNMEM); if (info_ksp.ksp == NULL) { (void) printf("No module to report\n"); return (1); } /* * using the info get a copy of the data */ if (kstat_read(kctl, info_ksp.ksp, NULL) == -1) { (void) printf("Can't read kstat\n"); return (1); } /* * print the current data */ p_dynmem_knp = dynmem_knp; while (p_dynmem_knp->named) { p_dynmem_knp->knp = kstat_data_lookup(info_ksp.ksp, p_dynmem_knp->named); if (p_dynmem_knp->knp == NULL) { (void) printf("kstat_data_lookup(%s) failed\n", p_dynmem_knp->named); return (1); } else { (void) printf("%s: %x\n", p_dynmem_knp->named, (uint_t)p_dynmem_knp->knp->value.ul); p_dynmem_knp++; } } /* * modify the data and write it back */ p_dynmem_knp = dynmem_knp; while (p_dynmem_knp->named) { if (p_dynmem_knp->newval != NO_VALUE) p_dynmem_knp->knp->value.ul = p_dynmem_knp->newval; p_dynmem_knp++; } if (kstat_write(kctl, info_ksp.ksp, NULL) == -1) { (void) printf("kstat_write() failed\n"); return (1); } (void) printf("Finished (h for help)\n"); return (0); }