I want to convert a replay log to something that looks more structured, and
easier to parse through mentally. I've tried to use coccinelle, but I came
across a couple of problems. First, the file is over 13000 (thirteen thousand)
lines long, and coccinelle crashes with a "stack overflow" error even on the
simplest patterns. Second, I couldn't figure out how to use coccinelle to
extract the bits I want from those 32-bit constants.
This is an example pattern. I've described the relevant information I want to
extract in '//' style comments:
read(0x6530); /* 0f410000 */
write(0x6530, 0x0f410000);
read(0x6530); /* 0f410000 */
write(0x6530, 0x0f410000);
read(0x6200); /* 21000101 */
write(0x6200, 0x21000101); // <- [30:28] hpd_id (2)
read(0x6200); /* 21000101 */
write(0x6200, 0x21000101);
read(0x9fffbe00); /* 50400050 */
read(0x6204); /* 00030000 */
write(0x6204, 0x00050000); // <- [20:16] tx_bytes (5)
read(0x6204); /* 00050000 */
write(0x6204, 0x00050000);
read(0x9fffbe00); /* 50400050 */
write(0x6218, 0x80004000); // <- [15:8] cmd_byte
read(0x9fffbe00); /* 50400050 */
write(0x6218, 0x00000000); // <- [15:8] address[15:8]
read(0x9fffbe00); /* 50400050 */
write(0x6218, 0x00005000); // <- [15:8] address[7:0] (0x50)
read(0x9fffbe00); /* 50400050 */
write(0x6218, 0x00000000); // <- [15:8] expected_rx_bytes - 1
read(0x9fffbe04); /* 00000050 */
write(0x6218, 0x00003000); // <- [15:8] i2c_reg (0x30)
read(0x9fffbe04); /* 00000050 */
write(0x6218, 0x00000000);
read(0x9fffbe04); /* 00000050 */
write(0x6218, 0x00000000);
read(0x9fffbe04); /* 00000050 */
write(0x6218, 0x00000000);
read(0x620c); /* 00000000 */
write(0x620c, 0x00000002);
read(0x6204); /* 00050000 */
write(0x6204, 0x00050001);
read(0x6210); /* c1000000 */
delay(0x0088c9bd - 0x0088c79b);
read(0x6210); /* c1000000 */
delay(0x0088f0b7 - 0x0088ee9b);
read(0x6210); /* 01000001 */
read(0x6210); /* 01000001 */
write(0x6218, 0x80000001);
read(0x6218); /* 00000001 */ // <- [15:8] reply (0)
read(0x6210); /* 01000001 */ // <- [28:24] actual_rx_bytes (1)
read(0x9fffa414); /* 22232121 */
read(0x9fffa418); /* 00000000 */
read(0x9fffa52c); /* 80010000 */
read(0x9fffa530); /* 00000108 */
write(0x9fffbe04, 0x08800100);
write(0x9fffbe00, 0x4f500050);
Now assuming I have a struct called jelly_donut instantiated as 'donut', I'd
like the output to look like:
donut->hpd_id = 2;
donut->tx_bytes = 5;
donut->cmd_byte = 0x40;
donut->address = 0x0050;
donut->i2c_reg = 0x30;
process_food(donut);
/* .reply = 0; actual_rx_bytes = 1 */
or, I'll even settle for something like:
regurgitate(2, 5, 0x40, 0x0050, 0x30); /* .reply = 0; actual_rx_bytes = 1 */
Any ideas how I'd get this done?
Alex