Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
/*
 * 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);
	}
}
Exemplo n.º 3
0
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);
}