mirror of
https://github.com/VectorCamp/vectorscan.git
synced 2025-09-29 19:24:25 +03:00
remove start argument in literal matcher callbacks
This commit is contained in:
committed by
Matthew Barr
parent
482e1ef931
commit
ebb1b0006b
@@ -88,7 +88,7 @@ void confWithBit(const struct FDRConfirm *fdrc, const struct FDR_Runtime_Args *a
|
||||
}
|
||||
|
||||
*last_match = li->id;
|
||||
*control = a->cb(loc - buf, i, li->id, a->ctxt);
|
||||
*control = a->cb(i, li->id, a->ctxt);
|
||||
out:
|
||||
oldNext = li->next; // oldNext is either 0 or an 'adjust' value
|
||||
li++;
|
||||
|
@@ -56,7 +56,6 @@ struct FDRFlood {
|
||||
|
||||
u32 ids[FDR_FLOOD_MAX_IDS]; //!< the ids
|
||||
hwlm_group_t groups[FDR_FLOOD_MAX_IDS]; //!< group ids to go with string ids
|
||||
u32 len[FDR_FLOOD_MAX_IDS]; //!< lengths to go with the string ids
|
||||
};
|
||||
|
||||
/** \brief FDR structure.
|
||||
|
@@ -82,7 +82,6 @@ void addFlood(vector<FDRFlood> &tmpFlood, u8 c, const hwlmLiteral &lit,
|
||||
fl.ids[fl.idCount] = lit.id;
|
||||
fl.allGroups |= lit.groups;
|
||||
fl.groups[fl.idCount] = lit.groups;
|
||||
fl.len[fl.idCount] = suffix;
|
||||
// when idCount gets to max_ids this flood no longer happens
|
||||
// only incremented one more time to avoid arithmetic overflow
|
||||
DEBUG_PRINTF("Added Flood for char '%c' suffix=%u len[%hu]=%u\n",
|
||||
|
@@ -196,120 +196,110 @@ const u8 * floodDetect(const struct FDR * fdr,
|
||||
for (u32 t = 0; t < floodSize && (*control & fl->allGroups);
|
||||
t += 4) {
|
||||
DEBUG_PRINTF("aaa %u %llx\n", t, fl->groups[0]);
|
||||
u32 len0 = fl->len[0] - 1;
|
||||
if (*control & fl->groups[0]) {
|
||||
*control = cb(i + t + 0 - len0, i + t + 0, fl->ids[0], ctxt);
|
||||
*control = cb(i + t + 0, fl->ids[0], ctxt);
|
||||
}
|
||||
if (*control & fl->groups[0]) {
|
||||
*control = cb(i + t + 1 - len0, i + t + 1, fl->ids[0], ctxt);
|
||||
*control = cb(i + t + 1, fl->ids[0], ctxt);
|
||||
}
|
||||
if (*control & fl->groups[0]) {
|
||||
*control = cb(i + t + 2 - len0, i + t + 2, fl->ids[0], ctxt);
|
||||
*control = cb(i + t + 2, fl->ids[0], ctxt);
|
||||
}
|
||||
if (*control & fl->groups[0]) {
|
||||
*control = cb(i + t + 3 - len0, i + t + 3, fl->ids[0], ctxt);
|
||||
*control = cb(i + t + 3, fl->ids[0], ctxt);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
for (u32 t = 0; t < floodSize && (*control & fl->allGroups); t += 4) {
|
||||
u32 len0 = fl->len[0] - 1;
|
||||
u32 len1 = fl->len[1] - 1;
|
||||
if (*control & fl->groups[0]) {
|
||||
*control = cb(i + t - len0, i + t, fl->ids[0], ctxt);
|
||||
*control = cb(i + t, fl->ids[0], ctxt);
|
||||
}
|
||||
if (*control & fl->groups[1]) {
|
||||
*control = cb(i + t - len1, i + t, fl->ids[1], ctxt);
|
||||
*control = cb(i + t, fl->ids[1], ctxt);
|
||||
}
|
||||
if (*control & fl->groups[0]) {
|
||||
*control =
|
||||
cb(i + t + 1 - len0, i + t + 1, fl->ids[0], ctxt);
|
||||
cb(i + t + 1, fl->ids[0], ctxt);
|
||||
}
|
||||
if (*control & fl->groups[1]) {
|
||||
*control = cb(i + t + 1 - len1, i + t + 1, fl->ids[1], ctxt);
|
||||
*control = cb(i + t + 1, fl->ids[1], ctxt);
|
||||
}
|
||||
if (*control & fl->groups[0]) {
|
||||
*control = cb(i + t + 2 - len0, i + t + 2, fl->ids[0], ctxt);
|
||||
*control = cb(i + t + 2, fl->ids[0], ctxt);
|
||||
}
|
||||
if (*control & fl->groups[1]) {
|
||||
*control = cb(i + t + 2 - len1, i + t + 2, fl->ids[1], ctxt);
|
||||
*control = cb(i + t + 2, fl->ids[1], ctxt);
|
||||
}
|
||||
if (*control & fl->groups[0]) {
|
||||
*control = cb(i + t + 3 - len0, i + t + 3, fl->ids[0], ctxt);
|
||||
*control = cb(i + t + 3, fl->ids[0], ctxt);
|
||||
}
|
||||
if (*control & fl->groups[1]) {
|
||||
*control = cb(i + t + 3 - len1, i + t + 3, fl->ids[1], ctxt);
|
||||
*control = cb(i + t + 3, fl->ids[1], ctxt);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
for (u32 t = 0; t < floodSize && (*control & fl->allGroups); t += 2) {
|
||||
u32 len0 = fl->len[0] - 1;
|
||||
u32 len1 = fl->len[1] - 1;
|
||||
u32 len2 = fl->len[2] - 1;
|
||||
if (*control & fl->groups[0]) {
|
||||
*control = cb(i + t - len0, i + t, fl->ids[0], ctxt);
|
||||
*control = cb(i + t, fl->ids[0], ctxt);
|
||||
}
|
||||
if (*control & fl->groups[1]) {
|
||||
*control = cb(i + t - len1, i + t, fl->ids[1], ctxt);
|
||||
*control = cb(i + t, fl->ids[1], ctxt);
|
||||
}
|
||||
if (*control & fl->groups[2]) {
|
||||
*control = cb(i + t - len2, i + t, fl->ids[2], ctxt);
|
||||
*control = cb(i + t, fl->ids[2], ctxt);
|
||||
}
|
||||
if (*control & fl->groups[0]) {
|
||||
*control = cb(i + t + 1 - len0, i + t + 1, fl->ids[0], ctxt);
|
||||
*control = cb(i + t + 1, fl->ids[0], ctxt);
|
||||
}
|
||||
if (*control & fl->groups[1]) {
|
||||
*control = cb(i + t + 1 - len1, i + t + 1, fl->ids[1], ctxt);
|
||||
*control = cb(i + t + 1, fl->ids[1], ctxt);
|
||||
}
|
||||
if (*control & fl->groups[2]) {
|
||||
*control = cb(i + t + 1 - len2, i + t + 1, fl->ids[2], ctxt);
|
||||
*control = cb(i + t + 1, fl->ids[2], ctxt);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
// slow generalized loop
|
||||
for (u32 t = 0; t < floodSize && (*control & fl->allGroups); t += 2) {
|
||||
u32 len0 = fl->len[0] - 1;
|
||||
u32 len1 = fl->len[1] - 1;
|
||||
u32 len2 = fl->len[2] - 1;
|
||||
u32 len3 = fl->len[3] - 1;
|
||||
|
||||
if (*control & fl->groups[0]) {
|
||||
*control = cb(i + t - len0, i + t, fl->ids[0], ctxt);
|
||||
*control = cb(i + t, fl->ids[0], ctxt);
|
||||
}
|
||||
if (*control & fl->groups[1]) {
|
||||
*control = cb(i + t - len1, i + t, fl->ids[1], ctxt);
|
||||
*control = cb(i + t, fl->ids[1], ctxt);
|
||||
}
|
||||
if (*control & fl->groups[2]) {
|
||||
*control = cb(i + t - len2, i + t, fl->ids[2], ctxt);
|
||||
*control = cb(i + t, fl->ids[2], ctxt);
|
||||
}
|
||||
if (*control & fl->groups[3]) {
|
||||
*control = cb(i + t - len3, i + t, fl->ids[3], ctxt);
|
||||
*control = cb(i + t, fl->ids[3], ctxt);
|
||||
}
|
||||
|
||||
for (u32 t2 = 4; t2 < fl->idCount; t2++) {
|
||||
if (*control & fl->groups[t2]) {
|
||||
*control = cb(i + t - (fl->len[t2] - 1), i + t, fl->ids[t2], ctxt);
|
||||
*control = cb(i + t, fl->ids[t2], ctxt);
|
||||
}
|
||||
}
|
||||
|
||||
if (*control & fl->groups[0]) {
|
||||
*control = cb(i + t + 1 - len0, i + t + 1, fl->ids[0], ctxt);
|
||||
*control = cb(i + t + 1, fl->ids[0], ctxt);
|
||||
}
|
||||
if (*control & fl->groups[1]) {
|
||||
*control = cb(i + t + 1 - len1, i + t + 1, fl->ids[1], ctxt);
|
||||
*control = cb(i + t + 1, fl->ids[1], ctxt);
|
||||
}
|
||||
if (*control & fl->groups[2]) {
|
||||
*control = cb(i + t + 1 - len2, i + t + 1, fl->ids[2], ctxt);
|
||||
*control = cb(i + t + 1, fl->ids[2], ctxt);
|
||||
}
|
||||
if (*control & fl->groups[3]) {
|
||||
*control = cb(i + t + 1 - len3, i + t + 1, fl->ids[3], ctxt);
|
||||
*control = cb(i + t + 1, fl->ids[3], ctxt);
|
||||
}
|
||||
|
||||
for (u32 t2 = 4; t2 < fl->idCount; t2++) {
|
||||
if (*control & fl->groups[t2]) {
|
||||
*control = cb(i + t + 1 - (fl->len[t2] - 1), i + t + 1, fl->ids[t2], ctxt);
|
||||
*control = cb(i + t + 1, fl->ids[t2], ctxt);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -320,7 +310,7 @@ const u8 * floodDetect(const struct FDR * fdr,
|
||||
for (u32 t = 0; t < floodSize && (*control & fl->allGroups); t++) {
|
||||
for (u32 t2 = 0; t2 < fl->idCount; t2++) {
|
||||
if (*control & fl->groups[t2]) {
|
||||
*control = cb(i + t - (fl->len[t2] - 1), i + t, fl->ids[t2], ctxt);
|
||||
*control = cb(i + t, fl->ids[t2], ctxt);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -79,9 +79,9 @@ struct HWLM;
|
||||
|
||||
/** \brief The type for an HWLM callback.
|
||||
*
|
||||
* This callback receives a start-of-match offset, an end-of-match offset, the
|
||||
* ID of the match and the context pointer that was passed into \ref
|
||||
* hwlmExec or \ref hwlmExecStreaming.
|
||||
* This callback receives an end-of-match offset, the ID of the match and
|
||||
* the context pointer that was passed into \ref hwlmExec or
|
||||
* \ref hwlmExecStreaming.
|
||||
*
|
||||
* A callback return of \ref HWLM_TERMINATE_MATCHING will stop matching.
|
||||
*
|
||||
@@ -95,8 +95,7 @@ struct HWLM;
|
||||
* belonging to the literal which was active at the when the end match location
|
||||
* was first reached.
|
||||
*/
|
||||
typedef hwlmcb_rv_t (*HWLMCallback)(size_t start, size_t end, u32 id,
|
||||
void *context);
|
||||
typedef hwlmcb_rv_t (*HWLMCallback)(size_t end, u32 id, void *context);
|
||||
|
||||
/** \brief Match strings in table.
|
||||
*
|
||||
|
@@ -121,9 +121,8 @@ bytecode_ptr<noodTable> noodBuildTable(const hwlmLiteral &lit) {
|
||||
size_t key_offset = findNoodFragOffset(lit);
|
||||
|
||||
n->id = lit.id;
|
||||
n->lit_len = s.length();
|
||||
n->single = s.length() == 1 ? 1 : 0;
|
||||
n->key_offset = verify_u8(n->lit_len - key_offset);
|
||||
n->key_offset = verify_u8(s.length() - key_offset);
|
||||
n->nocase = lit.nocase ? 1 : 0;
|
||||
n->key0 = s[key_offset];
|
||||
if (n->single) {
|
||||
@@ -151,12 +150,12 @@ namespace ue2 {
|
||||
|
||||
void noodPrintStats(const noodTable *n, FILE *f) {
|
||||
fprintf(f, "Noodle table\n");
|
||||
fprintf(f, "Len: %u Key Offset: %u\n", n->lit_len, n->key_offset);
|
||||
fprintf(f, "Key Offset: %u\n", n->key_offset);
|
||||
fprintf(f, "Msk: %llx Cmp: %llx MskLen %u\n",
|
||||
n->msk >> 8 * (8 - n->msk_len), n->cmp >> 8 * (8 - n->msk_len),
|
||||
n->msk_len);
|
||||
fprintf(f, "String: ");
|
||||
for (u32 i = n->msk_len - n->lit_len; i < n->msk_len; i++) {
|
||||
for (u32 i = 0; i < n->msk_len; i++) {
|
||||
const u8 *m = (const u8 *)&n->cmp;
|
||||
if (isgraph(m[i]) && m[i] != '\\') {
|
||||
fprintf(f, "%c", m[i]);
|
||||
|
@@ -128,10 +128,8 @@ hwlm_error_t final(const struct noodTable *n, const u8 *buf, UNUSED size_t len,
|
||||
|
||||
match:
|
||||
pos -= cbi->offsetAdj;
|
||||
DEBUG_PRINTF("match @ %zu->%zu\n", pos + n->key_offset - n->lit_len,
|
||||
pos + n->key_offset);
|
||||
hwlmcb_rv_t rv = cbi->cb(pos + n->key_offset - n->lit_len,
|
||||
pos + n->key_offset - 1, cbi->id, cbi->ctx);
|
||||
DEBUG_PRINTF("match @ %zu\n", pos + n->key_offset);
|
||||
hwlmcb_rv_t rv = cbi->cb(pos + n->key_offset - 1, cbi->id, cbi->ctx);
|
||||
if (rv == HWLM_TERMINATE_MATCHING) {
|
||||
return HWLM_TERMINATED;
|
||||
}
|
||||
@@ -377,8 +375,8 @@ hwlm_error_t noodExec(const struct noodTable *n, const u8 *buf, size_t len,
|
||||
assert(n && buf);
|
||||
|
||||
struct cb_info cbi = {cb, n->id, ctxt, 0};
|
||||
DEBUG_PRINTF("nood scan of %zu bytes for %*s @ %p\n", len, n->lit_len,
|
||||
(const char *)&n->cmp + n->msk_len - n->lit_len, buf);
|
||||
DEBUG_PRINTF("nood scan of %zu bytes for %*s @ %p\n", len, n->msk_len,
|
||||
(const char *)&n->cmp, buf);
|
||||
|
||||
return scan(n, buf, len, start, n->single, n->nocase, &cbi);
|
||||
}
|
||||
@@ -396,8 +394,7 @@ hwlm_error_t noodExecStreaming(const struct noodTable *n, const u8 *hbuf,
|
||||
|
||||
struct cb_info cbi = {cb, n->id, ctxt, 0};
|
||||
DEBUG_PRINTF("nood scan of %zu bytes (%zu hlen) for %*s @ %p\n", len, hlen,
|
||||
n->lit_len, (const char *)&n->cmp + n->msk_len - n->lit_len,
|
||||
buf);
|
||||
n->msk_len, (const char *)&n->cmp, buf);
|
||||
|
||||
if (hlen && n->msk_len > 1) {
|
||||
/*
|
||||
@@ -427,9 +424,8 @@ hwlm_error_t noodExecStreaming(const struct noodTable *n, const u8 *hbuf,
|
||||
u64a v = unaligned_load_u64a(temp_buf + i);
|
||||
if ((v & n->msk) == n->cmp) {
|
||||
size_t m_end = -tl1 + i + n->msk_len - 1;
|
||||
size_t m_start = m_end - n->lit_len;
|
||||
DEBUG_PRINTF("match @ %zu->%zu (i %zu)\n", m_start, m_end, i);
|
||||
hwlmcb_rv_t rv = cb(m_start, m_end, n->id, ctxt);
|
||||
DEBUG_PRINTF("match @ %zu (i %zu)\n", m_end, i);
|
||||
hwlmcb_rv_t rv = cb(m_end, n->id, ctxt);
|
||||
if (rv == HWLM_TERMINATE_MATCHING) {
|
||||
return HWLM_TERMINATED;
|
||||
}
|
||||
|
@@ -39,7 +39,6 @@ struct noodTable {
|
||||
u32 id;
|
||||
u64a msk;
|
||||
u64a cmp;
|
||||
u8 lit_len;
|
||||
u8 msk_len;
|
||||
u8 key_offset;
|
||||
u8 nocase;
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015-2016, Intel Corporation
|
||||
* Copyright (c) 2015-2017, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@@ -178,13 +178,11 @@ void roseBlockEodExec(const struct RoseEngine *t, u64a offset,
|
||||
assert(!scratch->tctxt.filledDelayedSlots);
|
||||
|
||||
const u64a som = 0;
|
||||
const size_t match_len = 0;
|
||||
const u8 flags = ROSE_PROG_FLAG_SKIP_MPV_CATCHUP;
|
||||
|
||||
// Note: we ignore the result, as this is the last thing to ever happen on
|
||||
// a scan.
|
||||
roseRunProgram(t, scratch, t->eodProgramOffset, som, offset, match_len,
|
||||
flags);
|
||||
roseRunProgram(t, scratch, t->eodProgramOffset, som, offset, flags);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015-2016, Intel Corporation
|
||||
* Copyright (c) 2015-2017, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@@ -51,13 +51,12 @@ static really_inline
|
||||
int roseNfaRunProgram(const struct RoseEngine *rose, struct hs_scratch *scratch,
|
||||
u64a som, u64a offset, ReportID id, const char from_mpv) {
|
||||
const u32 program = id;
|
||||
const size_t match_len = 0; // Unused in this path.
|
||||
u8 flags = ROSE_PROG_FLAG_IN_CATCHUP;
|
||||
if (from_mpv) {
|
||||
flags |= ROSE_PROG_FLAG_FROM_MPV;
|
||||
}
|
||||
|
||||
roseRunProgram(rose, scratch, program, som, offset, match_len, flags);
|
||||
roseRunProgram(rose, scratch, program, som, offset, flags);
|
||||
|
||||
return can_stop_matching(scratch) ? MO_HALT_MATCHING : MO_CONTINUE_MATCHING;
|
||||
}
|
||||
|
@@ -66,8 +66,7 @@ void printMatch(const struct core_info *ci, u64a start, u64a end) {
|
||||
}
|
||||
#endif
|
||||
|
||||
hwlmcb_rv_t roseDelayRebuildCallback(size_t start, size_t end, u32 id,
|
||||
void *ctx) {
|
||||
hwlmcb_rv_t roseDelayRebuildCallback(size_t end, u32 id, void *ctx) {
|
||||
struct hs_scratch *scratch = ctx;
|
||||
struct RoseContext *tctx = &scratch->tctxt;
|
||||
struct core_info *ci = &scratch->core_info;
|
||||
@@ -77,9 +76,9 @@ hwlmcb_rv_t roseDelayRebuildCallback(size_t start, size_t end, u32 id,
|
||||
u64a real_end = ci->buf_offset - rb_len + end + 1; // index after last byte
|
||||
|
||||
#ifdef DEBUG
|
||||
DEBUG_PRINTF("REBUILD MATCH id=%u offsets=[%llu,%llu]: ", id,
|
||||
start + ci->buf_offset - rb_len, real_end);
|
||||
printMatch(ci, start + ci->buf_offset - rb_len, real_end);
|
||||
DEBUG_PRINTF("REBUILD MATCH id=%u end offset@%llu]: ", id, real_end);
|
||||
u64a start = real_end < 8 ? 1 : real_end - 7;
|
||||
printMatch(ci, start, real_end);
|
||||
printf("\n");
|
||||
#endif
|
||||
|
||||
@@ -87,10 +86,9 @@ hwlmcb_rv_t roseDelayRebuildCallback(size_t start, size_t end, u32 id,
|
||||
|
||||
assert(id && id < t->size); // id is a program offset
|
||||
const u64a som = 0;
|
||||
const size_t match_len = end - start + 1;
|
||||
const u8 flags = 0;
|
||||
UNUSED hwlmcb_rv_t rv =
|
||||
roseRunProgram(t, scratch, id, som, real_end, match_len, flags);
|
||||
roseRunProgram(t, scratch, id, som, real_end, flags);
|
||||
assert(rv != HWLM_TERMINATE_MATCHING);
|
||||
|
||||
/* we are just repopulating the delay queue, groups should be
|
||||
@@ -200,8 +198,6 @@ int roseAnchoredCallback(u64a start, u64a end, u32 id, void *ctx) {
|
||||
return MO_HALT_MATCHING;
|
||||
}
|
||||
|
||||
const size_t match_len = 0;
|
||||
|
||||
/* delayed literals need to be delivered before real literals; however
|
||||
* delayed literals only come from the floating table so if we are going
|
||||
* to deliver a literal here it must be too early for a delayed literal */
|
||||
@@ -216,8 +212,8 @@ int roseAnchoredCallback(u64a start, u64a end, u32 id, void *ctx) {
|
||||
|
||||
// Note that the "id" we have been handed is the program offset.
|
||||
const u8 flags = ROSE_PROG_FLAG_IN_ANCHORED;
|
||||
if (roseRunProgram(t, scratch, id, start, real_end, match_len,
|
||||
flags) == HWLM_TERMINATE_MATCHING) {
|
||||
if (roseRunProgram(t, scratch, id, start, real_end, flags)
|
||||
== HWLM_TERMINATE_MATCHING) {
|
||||
assert(can_stop_matching(scratch));
|
||||
DEBUG_PRINTF("caller requested termination\n");
|
||||
return MO_HALT_MATCHING;
|
||||
@@ -237,12 +233,12 @@ int roseAnchoredCallback(u64a start, u64a end, u32 id, void *ctx) {
|
||||
static really_inline
|
||||
hwlmcb_rv_t roseProcessMatchInline(const struct RoseEngine *t,
|
||||
struct hs_scratch *scratch, u64a end,
|
||||
size_t match_len, u32 id) {
|
||||
u32 id) {
|
||||
DEBUG_PRINTF("id=%u\n", id);
|
||||
assert(id && id < t->size); // id is an offset into bytecode
|
||||
const u64a som = 0;
|
||||
const u8 flags = 0;
|
||||
return roseRunProgram_i(t, scratch, id, som, end, match_len, flags);
|
||||
return roseRunProgram_i(t, scratch, id, som, end, flags);
|
||||
}
|
||||
|
||||
static rose_inline
|
||||
@@ -274,7 +270,7 @@ hwlmcb_rv_t playDelaySlot(const struct RoseEngine *t,
|
||||
const u64a som = 0;
|
||||
const u8 flags = 0;
|
||||
hwlmcb_rv_t rv = roseRunProgram(t, scratch, programs[it], som, offset,
|
||||
0, flags);
|
||||
flags);
|
||||
DEBUG_PRINTF("DONE groups=0x%016llx\n", tctxt->groups);
|
||||
|
||||
/* delayed literals can't safely set groups.
|
||||
@@ -311,7 +307,7 @@ hwlmcb_rv_t flushAnchoredLiteralAtLoc(const struct RoseEngine *t,
|
||||
const u64a som = 0;
|
||||
const u8 flags = 0;
|
||||
hwlmcb_rv_t rv = roseRunProgram(t, scratch, programs[it], som, curr_loc,
|
||||
0, flags);
|
||||
flags);
|
||||
DEBUG_PRINTF("DONE groups=0x%016llx\n", tctxt->groups);
|
||||
|
||||
/* anchored literals can't safely set groups.
|
||||
@@ -476,7 +472,7 @@ anchored_leftovers:;
|
||||
}
|
||||
|
||||
static really_inline
|
||||
hwlmcb_rv_t roseCallback_i(size_t start, size_t end, u32 id, void *ctxt) {
|
||||
hwlmcb_rv_t roseCallback_i(size_t end, u32 id, void *ctxt) {
|
||||
struct hs_scratch *scratch = ctxt;
|
||||
struct RoseContext *tctx = &scratch->tctxt;
|
||||
const struct RoseEngine *t = scratch->core_info.rose;
|
||||
@@ -484,9 +480,9 @@ hwlmcb_rv_t roseCallback_i(size_t start, size_t end, u32 id, void *ctxt) {
|
||||
u64a real_end = end + tctx->lit_offset_adjust;
|
||||
|
||||
#if defined(DEBUG)
|
||||
DEBUG_PRINTF("MATCH id=%u offsets=[%llu,%llu]: ", id,
|
||||
start + tctx->lit_offset_adjust, real_end);
|
||||
printMatch(&scratch->core_info, start + tctx->lit_offset_adjust, real_end);
|
||||
DEBUG_PRINTF("MATCH id=%u end offset@%llu: ", id, real_end);
|
||||
u64a start = real_end < 8 ? 1 : real_end - 7;
|
||||
printMatch(&scratch->core_info, start, real_end);
|
||||
printf("\n");
|
||||
#endif
|
||||
DEBUG_PRINTF("last end %llu\n", tctx->lastEndOffset);
|
||||
@@ -510,8 +506,7 @@ hwlmcb_rv_t roseCallback_i(size_t start, size_t end, u32 id, void *ctxt) {
|
||||
return HWLM_TERMINATE_MATCHING;
|
||||
}
|
||||
|
||||
size_t match_len = end - start + 1;
|
||||
rv = roseProcessMatchInline(t, scratch, real_end, match_len, id);
|
||||
rv = roseProcessMatchInline(t, scratch, real_end, id);
|
||||
|
||||
DEBUG_PRINTF("DONE groups=0x%016llx\n", tctx->groups);
|
||||
|
||||
@@ -524,15 +519,15 @@ hwlmcb_rv_t roseCallback_i(size_t start, size_t end, u32 id, void *ctxt) {
|
||||
return HWLM_TERMINATE_MATCHING;
|
||||
}
|
||||
|
||||
hwlmcb_rv_t roseCallback(size_t start, size_t end, u32 id, void *ctxt) {
|
||||
return roseCallback_i(start, end, id, ctxt);
|
||||
hwlmcb_rv_t roseCallback(size_t end, u32 id, void *ctxt) {
|
||||
return roseCallback_i(end, id, ctxt);
|
||||
}
|
||||
|
||||
hwlmcb_rv_t roseFloatingCallback(size_t start, size_t end, u32 id, void *ctxt) {
|
||||
hwlmcb_rv_t roseFloatingCallback(size_t end, u32 id, void *ctxt) {
|
||||
struct hs_scratch *scratch = ctxt;
|
||||
const struct RoseEngine *t = scratch->core_info.rose;
|
||||
|
||||
return roseCallback_i(start, end, id, ctxt) & t->floating_group_mask;
|
||||
return roseCallback_i(end, id, ctxt) & t->floating_group_mask;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -567,10 +562,9 @@ int roseRunBoundaryProgram(const struct RoseEngine *rose, u32 program,
|
||||
scratch->tctxt.minMatchOffset = stream_offset;
|
||||
|
||||
const u64a som = 0;
|
||||
const size_t match_len = 0;
|
||||
const u8 flags = 0;
|
||||
hwlmcb_rv_t rv = roseRunProgram(rose, scratch, program, som, stream_offset,
|
||||
match_len, flags);
|
||||
flags);
|
||||
if (rv == HWLM_TERMINATE_MATCHING) {
|
||||
return MO_HALT_MATCHING;
|
||||
}
|
||||
@@ -588,10 +582,9 @@ int roseReportAdaptor(u64a start, u64a end, ReportID id, void *context) {
|
||||
|
||||
// Our match ID is the program offset.
|
||||
const u32 program = id;
|
||||
const size_t match_len = 0; // Unused in this path.
|
||||
const u8 flags = ROSE_PROG_FLAG_SKIP_MPV_CATCHUP;
|
||||
hwlmcb_rv_t rv =
|
||||
roseRunProgram(rose, scratch, program, start, end, match_len, flags);
|
||||
roseRunProgram(rose, scratch, program, start, end, flags);
|
||||
if (rv == HWLM_TERMINATE_MATCHING) {
|
||||
return MO_HALT_MATCHING;
|
||||
}
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015-2016, Intel Corporation
|
||||
* Copyright (c) 2015-2017, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@@ -52,10 +52,9 @@ int roseNfaAdaptor(u64a start, u64a end, ReportID id, void *context);
|
||||
|
||||
/* Callbacks, defined in match.c */
|
||||
|
||||
hwlmcb_rv_t roseCallback(size_t start, size_t end, u32 id, void *ctx);
|
||||
hwlmcb_rv_t roseFloatingCallback(size_t start, size_t end, u32 id, void *ctx);
|
||||
hwlmcb_rv_t roseDelayRebuildCallback(size_t start, size_t end, u32 id,
|
||||
void *ctx);
|
||||
hwlmcb_rv_t roseCallback(size_t end, u32 id, void *ctx);
|
||||
hwlmcb_rv_t roseFloatingCallback(size_t end, u32 id, void *ctx);
|
||||
hwlmcb_rv_t roseDelayRebuildCallback(size_t end, u32 id, void *ctx);
|
||||
int roseAnchoredCallback(u64a start, u64a end, u32 id, void *ctx);
|
||||
|
||||
/* Common code, used all over Rose runtime */
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015-2016, Intel Corporation
|
||||
* Copyright (c) 2015-2017, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@@ -43,8 +43,6 @@ int roseNfaEarliestSom(u64a start, UNUSED u64a end, UNUSED ReportID id,
|
||||
|
||||
hwlmcb_rv_t roseRunProgram(const struct RoseEngine *t,
|
||||
struct hs_scratch *scratch, u32 programOffset,
|
||||
u64a som, u64a end, size_t match_len,
|
||||
u8 prog_flags) {
|
||||
return roseRunProgram_i(t, scratch, programOffset, som, end, match_len,
|
||||
prog_flags);
|
||||
u64a som, u64a end, u8 prog_flags) {
|
||||
return roseRunProgram_i(t, scratch, programOffset, som, end, prog_flags);
|
||||
}
|
||||
|
@@ -69,7 +69,7 @@
|
||||
|
||||
hwlmcb_rv_t roseRunProgram(const struct RoseEngine *t,
|
||||
struct hs_scratch *scratch, u32 programOffset,
|
||||
u64a som, u64a end, size_t match_len, u8 prog_flags);
|
||||
u64a som, u64a end, u8 prog_flags);
|
||||
|
||||
/* Inline implementation follows. */
|
||||
|
||||
@@ -1838,8 +1838,7 @@ void updateSeqPoint(struct RoseContext *tctxt, u64a offset,
|
||||
static rose_inline
|
||||
hwlmcb_rv_t roseRunProgram_i(const struct RoseEngine *t,
|
||||
struct hs_scratch *scratch, u32 programOffset,
|
||||
u64a som, u64a end, UNUSED size_t match_len,
|
||||
u8 prog_flags) {
|
||||
u64a som, u64a end, u8 prog_flags) {
|
||||
DEBUG_PRINTF("program=%u, offsets [%llu,%llu], flags=%u\n", programOffset,
|
||||
som, end, prog_flags);
|
||||
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015-2016, Intel Corporation
|
||||
* Copyright (c) 2015-2017, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@@ -46,7 +46,7 @@ void roseStreamExec(const struct RoseEngine *t, struct hs_scratch *scratch);
|
||||
void roseStreamEodExec(const struct RoseEngine *t, u64a offset,
|
||||
struct hs_scratch *scratch);
|
||||
|
||||
hwlmcb_rv_t roseCallback(size_t start, size_t end, u32 id, void *context);
|
||||
hwlmcb_rv_t roseCallback(size_t end, u32 id, void *context);
|
||||
|
||||
int roseReportAdaptor(u64a start, u64a end, ReportID id, void *context);
|
||||
|
||||
|
@@ -742,11 +742,9 @@ void roseStreamEodExec(const struct RoseEngine *t, u64a offset,
|
||||
assert(!scratch->tctxt.filledDelayedSlots);
|
||||
|
||||
const u64a som = 0;
|
||||
const size_t match_len = 0;
|
||||
const u8 flags = ROSE_PROG_FLAG_SKIP_MPV_CATCHUP;
|
||||
|
||||
// Note: we ignore the result, as this is the last thing to ever happen on
|
||||
// a scan.
|
||||
roseRunProgram(t, scratch, t->eodProgramOffset, som, offset, match_len,
|
||||
flags);
|
||||
roseRunProgram(t, scratch, t->eodProgramOffset, som, offset, flags);
|
||||
}
|
||||
|
Reference in New Issue
Block a user