|
8 | 8 |
|
9 | 9 | #define RD_ENGINE_QUEUE_SIZE 8192 |
10 | 10 |
|
| 11 | +static inline bool _rd_engine_is_dirty_kind(RDEngineItemKind k) { |
| 12 | + return k == RD_EI_DIRTY || k == RD_EI_CODE; |
| 13 | +} |
| 14 | + |
| 15 | +static inline void _rd_engine_enqueue_dirty(RDContext* ctx, RDAddress address, |
| 16 | + usize n, RDEngineItemKind kind) { |
| 17 | + const RDSegmentFull* seg = rd_i_db_find_segment(ctx, address); |
| 18 | + if(!seg) return; |
| 19 | + |
| 20 | + RDEngineItem item = { |
| 21 | + .kind = kind, |
| 22 | + .address = address, |
| 23 | + .from = address, |
| 24 | + .n = n, |
| 25 | + }; |
| 26 | + |
| 27 | + rd_i_registermap_init(&item.registers); |
| 28 | + queue_push(&ctx->engine.qdirty, item); |
| 29 | + rd_i_engine_mark_dirty(ctx); |
| 30 | +} |
| 31 | + |
11 | 32 | static void _rd_engine_queue_drain(RDEngineQueue* q) { |
12 | 33 | while(!queue_is_empty(q)) { |
13 | 34 | RDEngineItem item; |
@@ -223,19 +244,11 @@ bool rd_i_engine_enqueue_call(RDContext* ctx, RDAddress address, |
223 | 244 | } |
224 | 245 |
|
225 | 246 | void rd_i_engine_enqueue_dirty(RDContext* ctx, RDAddress address, usize n) { |
226 | | - const RDSegmentFull* seg = rd_i_db_find_segment(ctx, address); |
227 | | - if(!seg) return; |
228 | | - |
229 | | - RDEngineItem item = { |
230 | | - .kind = RD_EI_DIRTY, |
231 | | - .address = address, |
232 | | - .from = address, |
233 | | - .n = n, |
234 | | - }; |
| 247 | + _rd_engine_enqueue_dirty(ctx, address, n, RD_EI_DIRTY); |
| 248 | +} |
235 | 249 |
|
236 | | - rd_i_registermap_init(&item.registers); |
237 | | - queue_push(&ctx->engine.qdirty, item); |
238 | | - rd_i_engine_mark_dirty(ctx); |
| 250 | +void rd_i_engine_enqueue_code(RDContext* ctx, RDAddress address, usize n) { |
| 251 | + _rd_engine_enqueue_dirty(ctx, address, n, RD_EI_CODE); |
239 | 252 | } |
240 | 253 |
|
241 | 254 | bool rd_i_engine_mark_dirty(RDContext* ctx) { |
@@ -309,7 +322,7 @@ u16 rd_i_engine_tick(RDContext* ctx) { |
309 | 322 |
|
310 | 323 | // something already re-decoded this range (eg. flow from a neighbour, |
311 | 324 | // or a duplicate mark) there is nothing left to do |
312 | | - if(ctx->engine.current.kind == RD_EI_DIRTY && |
| 325 | + if(_rd_engine_is_dirty_kind(ctx->engine.current.kind) && |
313 | 326 | !rd_flagsbuffer_has_unknown(ctx->engine.segment->flags, idx)) |
314 | 327 | return 0; |
315 | 328 |
|
@@ -402,38 +415,6 @@ u16 rd_i_engine_tick(RDContext* ctx) { |
402 | 415 | return instr.length; |
403 | 416 | } |
404 | 417 |
|
405 | | -void rd_i_engine_reconcile_tick(RDContext* ctx) { |
406 | | - if(queue_is_empty(&ctx->engine.qdirty)) return; |
407 | | - |
408 | | - // RDDirtyRange d; |
409 | | - // queue_pop(&ctx->engine.qdirty, &d); |
410 | | - // |
411 | | - // const RDSegmentFull* seg = rd_i_db_find_segment(ctx, d.address); |
412 | | - // if(!seg) return; // no segment: nothing to reconcile |
413 | | - // |
414 | | - // usize start_idx = rd_i_address2index(seg, d.address); |
415 | | - // usize end_idx = start_idx + d.n; |
416 | | - // |
417 | | - // // clamp: ranges never cross segments |
418 | | - // if(end_idx > rd_flagsbuffer_get_length(seg->flags)) |
419 | | - // end_idx = rd_flagsbuffer_get_length(seg->flags); |
420 | | - // |
421 | | - // // snap both ends outward to item boundaries |
422 | | - // rd_i_flagsbuffer_expand_range(seg->flags, &start_idx, &end_idx); |
423 | | - // |
424 | | - // switch(_rd_engine_reconcile_kind(seg, start_idx, d.hint)) { |
425 | | - // case RD_DIRTY_CODE: |
426 | | - // _rd_engine_reconcile_code(ctx, seg, start_idx, end_idx); |
427 | | - // break; |
428 | | - // |
429 | | - // case RD_DIRTY_DATA: |
430 | | - // _rd_engine_reconcile_data(ctx, seg, start_idx, end_idx); |
431 | | - // break; |
432 | | - // |
433 | | - // default: break; |
434 | | - // } |
435 | | -} |
436 | | - |
437 | 418 | void rd_flow(RDContext* ctx, RDAddress address) { |
438 | 419 | // unset and do checks |
439 | 420 | optional_unset(&ctx->engine.flow); |
|
0 commit comments