Пример #1
0
int store_addressrange(sstr * str, struct in_addr *addr, struct in_addr *msk)
{
	sstr *tok;
	int sep, i;
	tok = sstr_init(0);

	sep = sstr_token(str, tok, " /->\r\n", 0);
	if(name2addr(tok, addr)==-1) return(-1);

	if (sep == '/') {
		sep = sstr_token(str, tok, " /->\r\n", 0);
		if (sstr_chr(tok, '.')==-1) {	/* x.x.x.x/yy */
			i = sstr_atoi(tok);
			msk->s_addr = htonl(0xFFFFFFFF << (32 - i));
		} else
			if(name2addr(tok, msk)==-1) return(-1);
	} else {		/*No mask given */
		if (addr->s_addr == INADDR_ANY)
			msk->s_addr = INADDR_ANY;
		else
			msk->s_addr = INADDR_BROADCAST;
	}
	sstr_free(tok);
	return (0);
}
Пример #2
0
/* ------------------------------------------------------------------------*//**
 * @FUNCTION		core44xx_name2addr
 * @BRIEF		retrieve physical address of a register, given its name.
 * @RETURNS		0 in case of success
 *			OMAPCONF_ERR_CPU
 *			OMAPCONF_ERR_REG_ACCESS
 * @param[in]		name: register name
 * @param[in,out]	addr: register address
 * @DESCRIPTION		retrieve physical address of a register, given its name.
 *//*------------------------------------------------------------------------ */
int core44xx_name2addr(char *name, unsigned int *addr)
{
	CHECK_CPU(44xx, OMAPCONF_ERR_CPU);

	if (!init_done)
		core44xx_regtable_init();

	return name2addr(name, addr, prcm_core_reg_table);
}
Пример #3
0
int u_comparehost(u_buf_t *ubufp, char *hostn, u_port_t port) {
   in_addr_t addr;
   struct sockaddr_in *remotep;

   remotep = (struct sockaddr_in *)ubufp;
   if ((port != ntohs(remotep->sin_port)) ||
       (name2addr(hostn, &addr) == -1) ||
       (memcmp(&(remotep->sin_addr.s_addr), &addr, sizeof(in_addr_t)) != 0))
      return 0;
   return 1;
}
Пример #4
0
ssize_t u_sendtohost(int fd, void *buf, size_t nbytes, char *hostn,
                     u_port_t port) {
   struct sockaddr_in remote;

   if (name2addr(hostn, &(remote.sin_addr.s_addr)) == -1) {
      errno = EINVAL;
      return -1;
   }
   remote.sin_port = htons((short)port);
   remote.sin_family = AF_INET;
   return u_sendto(fd, buf, nbytes, &remote);
}
Пример #5
0
/* ------------------------------------------------------------------------*//**
 * @FUNCTION		sr44xx_name2addr
 * @BRIEF		retrieve physical address of a register, given its name.
 * @RETURNS		0 in case of success
 *			OMAPCONF_ERR_CPU
 *			OMAPCONF_ERR_NOT_AVAILABLE
 * @param[in]		name: register name
 * @param[in,out]	addr: register address
 * @DESCRIPTION		retrieve physical address of a register, given its name.
 *//*------------------------------------------------------------------------ */
int sr44xx_name2addr(char *name, unsigned int *addr)
{
	int ret;

	if (!cpu_is_omap44xx())
		return OMAPCONF_ERR_CPU;

	if (!init_done)
		sr44xx_regtable_init();

	ret = name2addr(name, addr, prcm_sr_vc_reg_table);
	if (ret == 0)
		return ret;
	ret = name2addr(name, addr, prcm_sr_vp_mpu_reg_table);
	if (ret == 0)
		return ret;
	ret = name2addr(name, addr, prcm_sr_vp_iva_reg_table);
	if (ret == 0)
		return ret;
	ret = name2addr(name, addr, prcm_sr_vp_core_reg_table);
	if (ret == 0)
		return ret;

	/*
	 * This function is called on a "omapconf read 'by name'"
	 * If name is found, then read access will be done.
	 * In the case of SR, module may be disabled so access will fail.
	 * Return OMAPCONF_ERR_REG_ACCESS if register not available.
	 */
	ret = name2addr(name, addr, prcm_sr_mpu_reg_table);
	if (ret == 0) {
		if (mod44xx_is_accessible(OMAP4_SMARTREFLEX_MPU) == 1)
			return 0;
		else
			return OMAPCONF_ERR_NOT_AVAILABLE;
	}

	ret = name2addr(name, addr, prcm_sr_iva_reg_table);
	if (ret == 0) {
		if (mod44xx_is_accessible(OMAP4_SMARTREFLEX_IVA) == 1)
			return 0;
		else
			return OMAPCONF_ERR_NOT_AVAILABLE;
	}

	ret = name2addr(name, addr, prcm_sr_core_reg_table);
	if (ret == 0) {
		if (mod44xx_is_accessible(OMAP4_SMARTREFLEX_CORE) == 1)
			return 0;
		else
			return OMAPCONF_ERR_NOT_AVAILABLE;
	}

	return OMAPCONF_ERR_NOT_AVAILABLE;
}
Пример #6
0
/*
 *                           u_connect
 * Initiate communication with a remote server.
 *
 * parameters:
 *     port  = well-known port on remote server
 *     hostn = character string giving the Internet name of remote host
 * returns:  a communication file descriptor if successful
 *           -1 on error with errno set
 */
int u_connect(u_port_t port, char *hostn) {
   int error;
   int retval;
   struct sockaddr_in server;
   int sock;
   fd_set sockset;

   if (name2addr(hostn,&(server.sin_addr.s_addr)) == -1) {
      errno = EINVAL;
      return -1;
   }
   server.sin_port = htons((short)port);
   server.sin_family = AF_INET;

   if ((u_ignore_sigpipe() == -1) ||
        ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1))
      return -1;

   if (((retval =
       connect(sock, (struct sockaddr *)&server, sizeof(server))) == -1) &&
       ((errno == EINTR) || (errno == EALREADY))) {
       FD_ZERO(&sockset);
       FD_SET(sock, &sockset);
       while ( ((retval = select(sock+1, NULL, &sockset, NULL, NULL)) == -1) &&
               (errno == EINTR) ) {
          FD_ZERO(&sockset);
          FD_SET(sock, &sockset);
       }
   }
   if (retval == -1) {
        error = errno;
        while ((close(sock) == -1) && (errno == EINTR));
        errno = error;
        return -1;
   }
   return sock;
}
Пример #7
0
/**
 * Function: counters44xx_perf
 * Role: trace OMAP performance (CPU Load, OPP & memory bandwidth usage).
 * Parameters:
 *	capture_time: capture (trace) duration
 * Return:
 *	0 in case of success
 *	OMAPCONF_ERR_ARG
 *	OMAPCONF_ERR_NOT_AVAILABLE
 *	OMAPCONF_ERR_UNEXPECTED
 */
int counters44xx_count(unsigned int capture_time)
{

	unsigned int i;
	unsigned int sample_cnt;
	int ret;
	unsigned int addr, data, l2_disabled_prior = 0;
	unsigned int *trace_buf[TRACE_CFG_ENABLED_OPTIONS_MAX];
	unsigned short emif;
	unsigned int sample;
	FILE *fp = NULL;
	char s[16];
	char table[TABLE_MAX_ROW][TABLE_MAX_COL][TABLE_MAX_ELT_LEN];
	unsigned int row = 0;
	char name[64];
	char tmp_name[64];
	char option[64];
	unsigned int temp, avg, min, max;


	/* Configure EMIF counters */
	ret = 0;
	if (trace_state[TRACE_CFG_EMIF0_CNT0_FILTER] >= 0)
		ret = emif44xx_perf_cnt_configure(EMIF44XX_0, 0,
			trace_state[TRACE_CFG_EMIF0_CNT0_FILTER],
			trace_state[TRACE_CFG_EMIF0_CNT0_ID],
			trace_state[TRACE_CFG_EMIF0_CNT0_ADDRSPACE]);
	if (trace_state[TRACE_CFG_EMIF1_CNT0_FILTER] >= 0)
		ret |= emif44xx_perf_cnt_configure(EMIF44XX_1, 0,
			trace_state[TRACE_CFG_EMIF1_CNT0_FILTER],
			trace_state[TRACE_CFG_EMIF1_CNT0_ID],
			trace_state[TRACE_CFG_EMIF1_CNT0_ADDRSPACE]);
	if (trace_state[TRACE_CFG_EMIF0_CNT1_FILTER] >= 0)
		ret |= emif44xx_perf_cnt_configure(EMIF44XX_0, 1,
			trace_state[TRACE_CFG_EMIF0_CNT1_FILTER],
			trace_state[TRACE_CFG_EMIF0_CNT1_ID],
			trace_state[TRACE_CFG_EMIF0_CNT1_ADDRSPACE]);
	if (trace_state[TRACE_CFG_EMIF1_CNT1_FILTER] >= 0)
		ret |= emif44xx_perf_cnt_configure(EMIF44XX_1, 1,
			trace_state[TRACE_CFG_EMIF1_CNT1_FILTER],
			trace_state[TRACE_CFG_EMIF1_CNT1_ID],
			trace_state[TRACE_CFG_EMIF1_CNT1_ADDRSPACE]);

	if (ret != 0) {
		fprintf(stderr, "%s(): error while configuring EMIF perf. "
			"counters!\n", __func__);
		ret = OMAPCONF_ERR_NOT_AVAILABLE;
		goto counters44xx_count_err;
	}

	/* Configure L2CC counters */
	/* Do this regardless whether enabled or disabled (at this point.) */
	if (trace_state[TRACE_CFG_L2CC_CNT0_FILTER] >= 0)
		ret = l2cc44xx_perf_cnt_configure(0, trace_state[TRACE_CFG_L2CC_CNT0_FILTER], 1); /* for last entry, should use boolean 'true' */
	if (trace_state[TRACE_CFG_L2CC_CNT1_FILTER] >= 0)
		ret = l2cc44xx_perf_cnt_configure(1, trace_state[TRACE_CFG_L2CC_CNT1_FILTER], 1); /* for last entry, should use boolean 'true' */

/*
//	if (ret != 0) {
//		fprintf(stderr, "%s(): error while configuring L2CC perf. "
//			"counters!\n", __func__);
//		ret = OMAPCONF_ERR_NOT_AVAILABLE;
//		goto counters44xx_count_err;
//		}
*/

	/* Allocate buffer to store sampled data, unless continuous capture is enabled */
	if (capture_time > 0) {
		if (sampling_rate > 0) {
			sample_cnt = 1 + ((capture_time * 1000) / sampling_rate);
		} else {
	/* If smaple rate of 0, trace as fast as possible for the capture time. */
			sample_cnt = 1 + ((capture_time * 1000));
		}
	} else {
		/* Hack. If capture_time == 0, capture continuous. Need room for at least 2 samples. */
		sample_cnt = 2;

		if (trace_state[TRACE_CFG_LONG_HEADER] == 1) {
			printf("#\n");
			printf("# ----------------- OMAP4430 Performance Trace+ ----------"
				"--------------------------------------------------------------"
				"-----\n");
			printf("#\n");
		/*	printf("# NB:\n"); */
			printf("#   * This is an intrusive trace (counters polling).\n");
			printf("#     Idle C-States usage was altered.\n");
			printf("#     Limted additional CPU & EMIFs loads generated.\n");
			printf("#\n");
		/*	printf("#   * If CPU1 Load = -5.0, it means CPU1 is OFFLINE.\n"); */
		/*	printf("#\n"); */
		/*	printf("#   * CPU LOADS CANNOT be directly converted to Mhz.\n"); */
		/*	printf("#     OPP may have changed during the audit.\n"); */
		/*	printf("#\n"); */
			printf("# ----------------------- Trace FORMAT -------------------"
				"--------------------------------------------------------------"
				"-----\n");
			printf("#\n");
			printf("# Trace Length: %us\n", capture_time);
			printf("#\n");
			printf("# Trace Sampling Rate: %ums\n",
				sampling_rate);
			printf("#\n");

			printf("# Number of samples: %u\n", sample_cnt - 1);
			printf("#\n");
			printf("# %10.10s ", "Timestamp(s)");
		};
		for (i = 0; i < TRACE_CFG_ENABLED_OPTIONS_MAX; i++) {
			if (trace_state[i] >= 0) {/* Traces state is enabled if non-zero state value. */
				ret = value2name(i, name, trace_config_options_table);
				printf("\t%10.10s", name);
				switch (i) {
				case TRACE_CFG_EMIF0_CNT0_FILTER:
				case TRACE_CFG_EMIF1_CNT0_FILTER:
				case TRACE_CFG_EMIF0_CNT1_FILTER:
				case TRACE_CFG_EMIF1_CNT1_FILTER:
					ret = value2name(trace_state[i], name, emif_event_counters);
					ret = snprintf(tmp_name, 64, "%s%s", ".", name);
					ret = snprintf(name, 64, "%s", tmp_name);
					break;
				case TRACE_CFG_L2CC_CNT0_FILTER:
				case TRACE_CFG_L2CC_CNT1_FILTER:
					ret = value2name(trace_state[i], name, l2cc_event_counters_table);
					ret = snprintf(tmp_name, 64, "%s%s", ".", name);
					ret = snprintf(name, 64, "%s", tmp_name);
					break;
				default:
					strcpy(name, " ");
					break;
				} /* end switch */
				printf("%s ", name);
			}
		}
		printf("\n");

		if (trace_state[TRACE_CFG_LONG_HEADER] == 1) {
			printf("#\n");
			printf("# ----------------------- Trace START --------------------"
				"--------------------------------------------------------------"
				"-----\n");
		}
	}

	dprintf("%s(): capture_time=%us, sample_cnt=%u\n", __func__,
		capture_time, sample_cnt);


	for (i = 0; i < TRACE_CFG_ENABLED_OPTIONS_MAX; i++) {
		if (trace_state[i] >= 0) {/* Traces state is enabled if non-zero state value. */
			/* Add three sample entries to hold min, avg, max */
			trace_buf[i] = malloc((sample_cnt+3) * sizeof(unsigned int));
			if (trace_buf[i] == NULL) {
				ret = value2name(i, name, trace_config_options_table);
				fprintf(stderr, "%s(): could not allocate %s!\n",
					__func__, name);
				ret = OMAPCONF_ERR_NOT_AVAILABLE;
				goto counters44xx_count_err;
			}
		}
	} /* end for i < TRACE_CFG_ENABLED_OPTIONS_MAX */

	/* Enable L2CC counters */
	ret = l2cc44xx_perf_cnt_enable();


	/* Sample performance indicators periodically */
	printf("\n");

	printf("Sampling OMAP Counters for %us, please wait...\n",
		capture_time);


	for (sample = 0; sample < sample_cnt; sample++) {

/*
		// This could be a big for loop and 'switch' statemenet...
		// Get CPU runtime execution stats
		// Get EMIF cnt0, cnt1 & total mclk cycle counts as enabled
		// skorson
		// Being lazy and doing these two one after the other. I suppose code could be written
		// to convert a for 0 to 1 loop but with only two, this is OK.
*/


		emif = 0;
		if (trace_state[TRACE_CFG_EMIF0_CNT0_FILTER] >= 0) {
			trace_buf[TRACE_CFG_EMIF0_CNT0_FILTER][sample] = emif44xx_perf_cnt_get_count(
				emif, EMIF44XX_PERF_CNT_0);
			dprintf("%s(): EMIF0 counter 0 value=%u\n", __func__,
				trace_buf[TRACE_CFG_EMIF0_CNT0_FILTER][sample]);
		}
		if (trace_state[TRACE_CFG_EMIF0_CNT1_FILTER] >= 0) {
			trace_buf[TRACE_CFG_EMIF0_CNT1_FILTER][sample] = emif44xx_perf_cnt_get_count(
				emif, EMIF44XX_PERF_CNT_1);
			dprintf("%s(): EMIF0 counter 1 value=%u\n", __func__,
				trace_buf[TRACE_CFG_EMIF0_CNT1_FILTER][sample]);
		}

		if (trace_state[TRACE_CFG_EMIF0_MCLK_CYCLES] >= 0) {
			trace_buf[TRACE_CFG_EMIF0_MCLK_CYCLES][sample] = emif44xx_perf_cnt_get_time(emif);
		}

		emif = 1;
		if (trace_state[TRACE_CFG_EMIF1_CNT0_FILTER] >= 0) {
			trace_buf[TRACE_CFG_EMIF1_CNT0_FILTER][sample] = emif44xx_perf_cnt_get_count(
				emif, EMIF44XX_PERF_CNT_0);
			dprintf("%s(): EMIF1 counter 0 value=%u\n", __func__,
				trace_buf[TRACE_CFG_EMIF1_CNT0_FILTER][sample]);
		}
		if (trace_state[TRACE_CFG_EMIF1_CNT1_FILTER] >= 0) {
			trace_buf[TRACE_CFG_EMIF1_CNT1_FILTER][sample] = emif44xx_perf_cnt_get_count(
				emif, EMIF44XX_PERF_CNT_1);
			dprintf("%s(): EMIF1 counter 1 value=%u\n", __func__,
				trace_buf[TRACE_CFG_EMIF1_CNT1_FILTER][sample]);
		}

		if (trace_state[TRACE_CFG_EMIF1_MCLK_CYCLES] >= 0) {
			trace_buf[TRACE_CFG_EMIF1_MCLK_CYCLES][sample] = emif44xx_perf_cnt_get_time(emif);
			dprintf("%s(): EMIF1 MCLK cycles=%u\n", __func__,
				trace_buf[TRACE_CFG_EMIF1_MCLK_CYCLES][sample]);
		}


/*
// FIXME: There is a bug where the L2 Counters are being disabled. Until this is known, enable the following
// block to determine if the counter has been disabled during a run. Print appropriate ERROR to screen...
*/
		if ((trace_state[TRACE_CFG_L2CC_CNT0_FILTER] >= 0) || (trace_state[TRACE_CFG_L2CC_CNT1_FILTER] >= 0))  {


			/* check if counter is still enabled.... */
			ret = name2addr("EVENT_COUNTER_CONTROL", &addr,
				(reg_table *) omap4_mpuss_pl310_reg_table);
			ret = mem_read(addr, &data);
			dprintf("EVENT COUNTER VALUE: 0x%x 0x%x\n", addr, data);
			if (ret != 0) {
				fprintf(stderr, "%s(): error reading L2CC (PL310) EVENT_COUNTER_CONTROL reg!\n",
				__func__);
				return OMAPCONF_ERR_REG_ACCESS;
			}
			if (data == 0  && l2_disabled_prior == 0) {
				l2_disabled_prior = 1;
				fprintf(stderr, "%s(): WARNING:L2CC (PL310) EVENT_COUNTER_CONTROL was DISABLED during a run!!!\n",
				__func__);
				fprintf(stderr, "%s(): WARNING:  Counter values will be invalid (zero) after this point.\n",
				__func__);
			}
		}

/* END FIXME */



		if (trace_state[TRACE_CFG_L2CC_CNT0_FILTER] >= 0) {
			trace_buf[TRACE_CFG_L2CC_CNT0_FILTER][sample] =
				(unsigned int) l2cc44xx_get_perf_cnt(0);
			dprintf("%s(): l2_event_cnt[0] sample %d = 0x%x %d\n", __func__, sample,
				trace_buf[TRACE_CFG_L2CC_CNT0_FILTER][sample], trace_buf[TRACE_CFG_L2CC_CNT0_FILTER][sample]);
		}
		if (trace_state[TRACE_CFG_L2CC_CNT1_FILTER] >= 0) {
			trace_buf[TRACE_CFG_L2CC_CNT1_FILTER][sample] =
				(unsigned int) l2cc44xx_get_perf_cnt(1);
			dprintf("%s(): l2_event_cnt[1] sample %d = 0x%x %d\n", __func__, sample,
				trace_buf[TRACE_CFG_L2CC_CNT1_FILTER][sample], trace_buf[TRACE_CFG_L2CC_CNT1_FILTER][sample]);
		}

		if (trace_state[TRACE_CFG_TIMER_32K_SYNC] >= 0) {
			addr = T32KSYNCNT_CR;
			ret = mem_read(addr, &data);
			trace_buf[TRACE_CFG_TIMER_32K_SYNC][sample] = data;
			dprintf("%s(): 32K CLK cycles=%u\n", __func__,
				trace_buf[TRACE_CFG_TIMER_32K_SYNC][sample]);
		}
		dprintf("\n");
		/* Sleep for some [minimum] time before sampling again */



		if ((capture_time == 0) && (sample > 0)) {
			/* Save timestamp */
			printf("[unix time stamp here]");
			for (i = 0; i < TRACE_CFG_ENABLED_OPTIONS_MAX; i++) {
				if (trace_state[i] >= 0) {
					sprintf(s, "%u", count32_delta(trace_buf[i][0],
					trace_buf[i][1]));
					printf("\t%10.10s", s);
				} /* if state >= 0 */
			} /* for i to TRACE_CFG_ENABLED_OPTIONS_MAX */
			printf("\n");

			/* Now move sample[1] to sample[0] */
			for (i = 0; i < TRACE_CFG_ENABLED_OPTIONS_MAX; i++) {
				if (trace_state[i] >= 0) {
					trace_buf[i][0] = trace_buf[i][1];
				} /* if state >= 0 */
			} /* for i to TRACE_CFG_ENABLED_OPTIONS_MAX */
			sample = 0;
		}

		/* SLeep onyl if a sampling rate is set. */
		/* Sampling rate of 0 is as fast as possible... */
		if (sampling_rate > 0)
			usleep(sampling_rate * 1000);
	}

	/* Disable L2CC counters */
	/* Do regardless of whether enabled for tracing or not. */
	ret = l2cc44xx_perf_cnt_disable();

	printf("Sampling done, processing and saving data...\n");

	/* Open trace output file */
	fp = workdir_fopen(trace_perf_file, "w");
	if (fp == NULL) {
		fprintf(stderr, "%s(): could not create %s!\n",
			__func__, trace_perf_file);
		ret = OMAPCONF_ERR_NOT_AVAILABLE;
		goto counters44xx_count_err;
	}

	dprintf("INFO: TRACE_CFG_LONG_HEADER %d\n", trace_state[TRACE_CFG_LONG_HEADER]);

	if (trace_state[TRACE_CFG_LONG_HEADER] == 1) {
		fprintf(fp, "#\n");
		fprintf(fp, "# ----------------- OMAP4430 Performance Trace+ ----------"
			"--------------------------------------------------------------"
			"-----\n");
		fprintf(fp, "#\n");
	/*	fprintf(fp, "# NB:\n"); */
		fprintf(fp, "#   * This is an intrusive trace (counters polling).\n");
		fprintf(fp, "#     Idle C-States usage was altered.\n");
		fprintf(fp, "#     Limted additional CPU & EMIFs loads generated.\n");
		fprintf(fp, "#\n");
	/*	fprintf(fp, "#   * If CPU1 Load = -5.0, it means CPU1 is OFFLINE.\n"); */
	/*	fprintf(fp, "#\n"); */
	/*	fprintf(fp, "#   * CPU LOADS CANNOT be directly converted to Mhz.\n"); */
	/*	fprintf(fp, "#     OPP may have changed during the audit.\n"); */
	/*	fprintf(fp, "#\n"); */
		fprintf(fp, "# ----------------------- Trace FORMAT -------------------"
			"--------------------------------------------------------------"
			"-----\n");
		fprintf(fp, "#\n");
		fprintf(fp, "# Trace Length: %us\n", capture_time);
		fprintf(fp, "#\n");
		fprintf(fp, "# Trace Sampling Rate: %ums\n",
			sampling_rate);
		fprintf(fp, "#\n");

		fprintf(fp, "# Number of samples: %u\n", sample_cnt - 1);
		fprintf(fp, "#\n");
		fprintf(fp, "# %10.10s ", "Timestamp(s)");
	};

	for (i = 0; i < TRACE_CFG_ENABLED_OPTIONS_MAX; i++) {
		if (trace_state[i] >= 0) {/* Traces state is enabled if non-zero state value. */
			ret = value2name(i, name, trace_config_options_table);
			fprintf(fp, "\t%10.10s", name);
			switch (i) {
			case TRACE_CFG_EMIF0_CNT0_FILTER:
			case TRACE_CFG_EMIF1_CNT0_FILTER:
			case TRACE_CFG_EMIF0_CNT1_FILTER:
			case TRACE_CFG_EMIF1_CNT1_FILTER:
				ret = value2name(trace_state[i], name, emif_event_counters);
				ret = snprintf(tmp_name, 64, "%s%s", ".", name);
				ret = snprintf(name, 64, "%s", tmp_name);
				break;
			case TRACE_CFG_L2CC_CNT0_FILTER:
			case TRACE_CFG_L2CC_CNT1_FILTER:
				ret = value2name(trace_state[i], name, l2cc_event_counters_table);
				ret = snprintf(tmp_name, 64, "%s%s", ".", name);
				ret = snprintf(name, 64, "%s", tmp_name);
				break;
			default:
				strcpy(name, " ");
				break;
			} /* end switch */
			fprintf(fp, "%s ", name);
		}
	}
	fprintf(fp, "\n");
	if (trace_state[TRACE_CFG_LONG_HEADER] == 1) {
		fprintf(fp, "#\n");
		fprintf(fp, "# ----------------------- Trace START --------------------"
			"--------------------------------------------------------------"
			"-----\n");
	}
	dprintf ("I'm here 0\n");

	/* Note: dropping first sample (or using it to normalize data to 0) */
	for (sample = 1; sample < sample_cnt; sample++) {
		if (sampling_rate > 0) {
		/* Save timestamp */
		sprintf(s, "%.3lf", (double)
			(sample * sampling_rate) / 1000.0);
		fprintf(fp, "%10.10s", s);
		} else {
		  sprintf(s, "%.3lf", (double)
			(sample));
		fprintf(fp, "%10.10s", s);
		}

		dprintf ("I'm here 1.%d\n", sample);

		for (i = 0; i < TRACE_CFG_ENABLED_OPTIONS_MAX; i++) {
			if (trace_state[i] >= 0) {

/*
// For now, treating this timer as a counter - its easier to perform calculations
// (std. dev, mean, error etc.)
//				if (	i == TRACE_CFG_TIMER_32K_SYNC ) {
//					// These don't need offset adjusted like counters
//					sprintf(s, "%u", count32_delta(trace_buf[i][0],
//						trace_buf[i][sample]) );
//					fprintf(fp, "\t%10.10s", s);
//					continue;
//				}
*/

				dprintf("INFO: Current Sample %d Value %d Previous %d\n",
					sample, trace_buf[i][sample], trace_buf[i][sample - 1]);

				sprintf(s, "%u",
					count32_delta(trace_buf[i][sample - 1],
					trace_buf[i][sample]));
				fprintf(fp, "\t%10.10s", s);
			} /* if state >= 0 */
		} /* for i to TRACE_CFG_ENABLED_OPTIONS_MAX */

		dprintf ("I'm here 2\n");
		fprintf(fp, "\n");
	} /* for sample < sample_cnt */

	if (trace_state[TRACE_CFG_LONG_HEADER]) {
		fprintf(fp, "# ------------------------ Trace END ---------------------"
			"--------------------------------------------------------------"
			"-----\n");
	};
	fclose(fp);
	printf("Performance trace saved into \"%s\" file.\n",
		trace_perf_file);



	/* Calculate Averages/Statistics*/
	fp = workdir_fopen(trace_perf_stats_file, "w");
	if (fp == NULL) {
		fprintf(stderr, "%s(): could not create %s!\n",
			__func__, trace_perf_stats_file);
		ret = OMAPCONF_ERR_NOT_AVAILABLE;
		goto counters44xx_count_err;
	}
	dprintf ("I'm here 2\n");
	autoadjust_table_init(table);
	row = 0;
	strncpy(table[row][0], "Performance Statistics", TABLE_MAX_ELT_LEN);
	strncpy(table[row][1], "Option", TABLE_MAX_ELT_LEN);
	strncpy(table[row][2], "Min", TABLE_MAX_ELT_LEN);
	strncpy(table[row][3], "Max", TABLE_MAX_ELT_LEN);
	strncpy(table[row][4], "Average", TABLE_MAX_ELT_LEN);
	row++;

	/* Note: sample_cnt+0 = min, +1=avg, +2 = max */
	min = sample_cnt;
	avg = sample_cnt+1;
	max = sample_cnt+2;


	dprintf ("I'm here 3\n");
	for (i = 0; i < TRACE_CFG_ENABLED_OPTIONS_MAX; i++) {
		/* Whats the 'if' below for? Will always be true... */
		if (trace_state[i] >= 0) {
			trace_buf[i][min] = ~0;
			trace_buf[i][max] =  0;
			trace_buf[i][avg] =  0;
			dprintf ("I'm here 3.%d\n", i);
			ret = value2name(i, name, trace_config_options_table);
			dprintf ("Name: %s MIN: %d MAX: %d AVG: %d\n", name, trace_buf[i][min], trace_buf[i][max], trace_buf[i][avg]);
			for (sample = 1; sample < sample_cnt; sample++) {
	dprintf ("I'm here 3.%d.%d\n", i, sample);
				temp = count32_delta(trace_buf[i][sample - 1],
					trace_buf[i][sample]);
	dprintf ("I'm here 3.%d.%d !FREQ %d\n", i, sample, temp);
				if (temp > trace_buf[i][max])
					trace_buf[i][max] = temp;
				if (temp < trace_buf[i][min])
					trace_buf[i][min] = temp;
				trace_buf[i][avg] = (unsigned int) avg_recalc((double) trace_buf[i][avg],
					(double) temp, sample - 1);
				ret = value2name(i, name, trace_config_options_table);
				dprintf ("Name: %s MIN: %d MAX: %d AVG: %d\n", name, trace_buf[i][min], trace_buf[i][max], trace_buf[i][avg]);
			} /* for sample < sample_cnt */
			dprintf ("I'm here 4.%d\n", i);
			/* Save statistics */
			ret = value2name(i, name, trace_config_options_table);
			dprintf ("Name: %s MIN: %d MAX: %d AVG: %d\n", name, trace_buf[i][min], trace_buf[i][max], trace_buf[i][avg]);
			strncpy(table[row][0], name, TABLE_MAX_ELT_LEN);


			strcpy (option, "");
			switch (i) {
			case TRACE_CFG_EMIF0_CNT0_FILTER:
			case TRACE_CFG_EMIF1_CNT0_FILTER:
			case TRACE_CFG_EMIF0_CNT1_FILTER:
			case TRACE_CFG_EMIF1_CNT1_FILTER:
				ret = value2name(trace_state[i], option, emif_event_counters);
				break;
			case TRACE_CFG_L2CC_CNT0_FILTER:
			case TRACE_CFG_L2CC_CNT1_FILTER:
				ret = value2name(trace_state[i], option, l2cc_event_counters_table);
				break;
			default:
				break;
			} /* end switch */
			strncpy(table[row][1], option, TABLE_MAX_ELT_LEN);
			snprintf(table[row][2], TABLE_MAX_ELT_LEN, "%.2d", trace_buf[i][min]);
			snprintf(table[row][3], TABLE_MAX_ELT_LEN, "%.2d", trace_buf[i][max]);
			snprintf(table[row][4], TABLE_MAX_ELT_LEN, "%.2d", trace_buf[i][avg]);
			row++;
		} /* if (trace_state[i] >= 0 */

	} /* for i to TRACE_CFG_ENABLED_OPTIONS_MAX */
	dprintf ("I'm here 5\n");


	autoadjust_table_fprint(fp, table, row, 4);
	fclose(fp);
	printf("Performance statistics saved into \"%s\" file.\n\n",
		trace_perf_stats_file);
	dprintf ("I'm here 6\n");
	autoadjust_table_print(table, row, 4);
	dprintf ("I'm here 7\n");
	return ret;

counters44xx_count_err:
	/* Free allocated buffers */
	for (i = 0; i < TRACE_CFG_ENABLED_OPTIONS_MAX; i++) {
		if (trace_state[i] >= 0) {/* Traces state is enabled if non-neg state value. */
			if (trace_buf[i] != NULL) {
				free(trace_buf[i]);
			}
		}
	} /* end for i < TRACE_CFG_ENABLED_OPTIONS_MAX */

	return ret;
}
Пример #8
0
int set_opt(struct option_array *opt, sstr * str)
{
	sstr *tok;
	int sep;

	if (rereading && !opt->reloadable)
		return (0);

	tok = sstr_init(0);

	sstr_ncat2(str, "\n", 1);	/*For sstr_token */
	opt->essential = FALSE;

	switch (opt->type) {
	case BOOL:
		sstr_token(str, tok, " \t\r\n", 0);
		if (!sstr_casecmp2(tok, "yes"))
			*(int *) opt->var = TRUE;
		else if (!sstr_casecmp2(tok, "no"))
			*(int *) opt->var = FALSE;
		else
			return (-1);
		break;
	case FILENAME:
	case STRING:
		sstr_token(str, tok, " \t\r\n", SSTR_QTOK);
		*(char **) opt->var = strdup(sstr_buf(tok));
		break;
	case DIRECTRY:
		sstr_token(str, tok, " \t\r\n", SSTR_QTOK);
		if (sstr_getchar(tok, sstr_len(tok) - 1) != '/')
			sstr_ncat2(tok, "/", 1);
		*(char **) opt->var = strdup(sstr_buf(tok));
		break;
	case ADDRESS:
		sstr_token(str, tok, " \t\r\n", 0);
		return name2addr(tok, (struct in_addr *) opt->var);
		break;
	case ADDRPRT:
		sep = sstr_token(str, tok, " :\t\r\n", 0);
		if( name2addr(tok, &((struct sockaddr_in *) opt->var)->sin_addr)==-1)
			return(-1);
		if (sep == ':')
			((struct sockaddr_in *) opt->var)->sin_port
			    = ntohs(sstr_atoi(str));
		((struct sockaddr_in *) opt->var)->sin_family = AF_INET;
		break;
	case INT:
		sstr_token(str, tok, " \t\r\n", 0);
		*(int *) opt->var = sstr_atoi(tok);
		break;
	case PRTRNGE:
		sstr_token(str, tok, " \t-,\r\n", 0);
		((int *) opt->var)[0] = sstr_atoi(tok);
		((int *) opt->var)[1] = sstr_atoi(str);
		if(!valid_uint16(((int *) opt->var)[0]) ||
		   !valid_uint16(((int *) opt->var)[1])) {
			fprintf(stderr, "Port out of range\n");
			return -1;
		}
		if(((int *) opt->var)[0] >= ((int *) opt->var)[1]) {
			fprintf(stderr, "Port range is inverted\n");
			return -1;
		}
		break;
	case ACL:
		return store_acl(str, (struct acl_list *) opt->var);
		break;
	case SUBSECT:
		return store_subsect(str, (struct subsect_list *) opt->var);
	}
	sstr_free(tok);
	return (0);
}