void arch_ptAnalyze(honggfuzz_t * hfuzz, fuzzer_t * fuzzer) { struct perf_event_mmap_page *pem = (struct perf_event_mmap_page *)fuzzer->linux.perfMmapBuf; struct pt_config ptc; pt_config_init(&ptc); ptc.begin = &fuzzer->linux.perfMmapAux[pem->aux_tail]; ptc.end = &fuzzer->linux.perfMmapAux[pem->aux_head - 1]; int errcode = pt_cpu_errata(&ptc.errata, &ptc.cpu); if (errcode < 0) { LOG_F("pt_errata() failed: %s", pt_errstr(errcode)); } struct pt_packet_decoder *ptd = pt_pkt_alloc_decoder(&ptc); if (ptd == NULL) { LOG_F("pt_pkt_alloc_decoder() failed"); } defer { pt_pkt_free_decoder(ptd); }; errcode = pt_pkt_sync_forward(ptd); if (errcode < 0) { LOG_W("pt_pkt_sync_forward() failed: %s", pt_errstr(errcode)); return; } struct pt_last_ip last_ip; pt_last_ip_init(&last_ip); for (;;) { struct pt_packet packet; errcode = pt_pkt_next(ptd, &packet, sizeof(packet)); if (errcode == -pte_eos) { break; } if (errcode < 0) { LOG_W("pt_pkt_next() failed: %s", pt_errstr(errcode)); break; } perf_ptAnalyzePkt(hfuzz, fuzzer, &packet, &ptc, &last_ip); } }
static struct ptunit_result free_decoder_null(void) { pt_pkt_free_decoder(NULL); return ptu_passed(); }