view pircharge/pktsort.c @ 260:863b483bf9e7

pirelli/fw-disasm: CI charging analyzed
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 26 Dec 2017 06:49:53 +0000
parents 84a4f6ef2d28
children
line wrap: on
line source

/*
 * Here we sort out incoming packets from the target relayed via rvinterf.
 */

#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <stdlib.h>
#include <rvinterf/pktmux.h>
#include <rvinterf/limits.h>
#include <rvinterf/localsock.h>
#include <rvinterf/localtypes.h>
#include <rvinterf/etm.h>
#include <rvinterf/exitcodes.h>

extern u_char rvi_msg[];
extern int rvi_msg_len;

void
print_rv_trace()
{
	char fmtbuf[MAX_PKT_FROM_TARGET*8];	/* size it generously */
	int i, c;
	char *dp;

	dp = fmtbuf;
	strcpy(dp, "RV ");
	dp += 3;
	/* the SWE static ID is sent MSB first */
	for (i = 1; i <= 4; i++) {
		sprintf(dp, "%02X", rvi_msg[i+1]);
		dp += 2;
	}
	/* severity level */
	sprintf(dp, " %d ", rvi_msg[6]);
	dp = index(dp, '\0');
	for (i = 7; i < rvi_msg_len; i++) {
		c = rvi_msg[i];
		if (c & 0x80) {
			*dp++ = 'M';
			*dp++ = '-';
			c &= 0x7F;
		}
		if (c < 0x20) {
			*dp++ = '^';
			*dp++ = c + '@';
		} else if (c == 0x7F) {
			*dp++ = '^';
			*dp++ = '?';
		} else
			*dp++ = c;
	}
	*dp = '\0';
	printf("%s\n", fmtbuf);
}

void
rvt_packet_rx()
{
	u32 useid;

	if (rvi_msg_len < 7) {
		fprintf(stderr, "Error: rvinterf sent us an invalid RVT msg\n");
		exit(ERROR_RVINTERF);
	}
	print_rv_trace();
	useid = rvi_msg[2] << 24 | rvi_msg[3] << 16 | rvi_msg[4] << 8
		| rvi_msg[5];
	if (useid != 0x000A0010)
		return;
	if (rvi_msg_len != 22)
		return;
	if (strncmp(rvi_msg + 7, "IQ EXT: ADC End", 15))
		return;
	adc_end_process();
}

void
process_pkt_from_target()
{
	switch (rvi_msg[1]) {
	case RVT_RV_HEADER:
		rvt_packet_rx();
		return;
	case RVT_TM_HEADER:
		etm_packet_rx();
		return;
	default:
		fprintf(stderr, "unexpected fwd of MUX %02X from rvinterf\n",
			rvi_msg[1]);
		exit(ERROR_RVINTERF);
	}
}