Skip to content

Commit 22867c6

Browse files
committed
AML: add rudimentary operation tracing for debugging
1 parent a880918 commit 22867c6

File tree

1 file changed

+50
-6
lines changed

1 file changed

+50
-6
lines changed

src/aml/mod.rs

+50-6
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,7 @@ where
319319
};
320320

321321
*operand = new_value;
322+
context.retire_op(op);
322323
}
323324
Opcode::LAnd
324325
| Opcode::LOr
@@ -358,6 +359,7 @@ where
358359
// TODO: use potentially-updated result for return value here
359360
self.do_store(target, result.clone())?;
360361
context.contribute_arg(Argument::Object(result));
362+
context.retire_op(op);
361363
}
362364
Opcode::FromBCD => self.do_from_bcd(&mut context, op)?,
363365
Opcode::ToBCD => self.do_to_bcd(&mut context, op)?,
@@ -368,6 +370,7 @@ where
368370

369371
let name = name.resolve(&context.current_scope)?;
370372
self.namespace.lock().insert(name, object.clone())?;
373+
context.retire_op(op);
371374
}
372375
Opcode::Fatal => {
373376
let [Argument::ByteData(typ), Argument::DWordData(code), Argument::Object(arg)] =
@@ -377,6 +380,7 @@ where
377380
};
378381
let arg = arg.as_integer()?;
379382
self.handler.handle_fatal_error(*typ, *code, arg);
383+
context.retire_op(op);
380384
}
381385
Opcode::OpRegion => {
382386
let [
@@ -396,6 +400,7 @@ where
396400
parent_device_path: context.current_scope.clone(),
397401
});
398402
self.namespace.lock().insert(name.resolve(&context.current_scope)?, region.wrap())?;
403+
context.retire_op(op);
399404
}
400405
Opcode::DataRegion => {
401406
let [
@@ -423,6 +428,7 @@ where
423428
parent_device_path: context.current_scope.clone(),
424429
});
425430
self.namespace.lock().insert(name.resolve(&context.current_scope)?, region.wrap())?;
431+
context.retire_op(op);
426432
}
427433
Opcode::Buffer => {
428434
let [
@@ -444,6 +450,7 @@ where
444450
context.current_block.pc += buffer_len;
445451

446452
context.contribute_arg(Argument::Object(Object::Buffer(buffer).wrap()));
453+
context.retire_op(op);
447454
}
448455
Opcode::Package | Opcode::VarPackage => {
449456
let mut elements = Vec::with_capacity(op.expected_arguments);
@@ -467,6 +474,7 @@ where
467474
assert_eq!(context.peek(), Err(AmlError::RunOutOfStream));
468475
context.current_block = context.block_stack.pop().unwrap();
469476
context.contribute_arg(Argument::Object(Object::Package(elements).wrap()));
477+
context.retire_op(op);
470478
}
471479
Opcode::If => {
472480
let [
@@ -501,6 +509,7 @@ where
501509
Err(other) => Err(other)?,
502510
}
503511
}
512+
context.retire_op(op);
504513
}
505514
opcode @ Opcode::CreateBitField
506515
| opcode @ Opcode::CreateByteField
@@ -524,6 +533,7 @@ where
524533
name.resolve(&context.current_scope)?,
525534
Object::BufferField { buffer: buffer.clone(), offset: offset as usize, length }.wrap(),
526535
)?;
536+
context.retire_op(op);
527537
}
528538
Opcode::CreateField => {
529539
let [Argument::Object(buffer), Argument::Object(bit_index), Argument::Object(num_bits)] =
@@ -544,16 +554,19 @@ where
544554
}
545555
.wrap(),
546556
)?;
557+
context.retire_op(op);
547558
}
548559
Opcode::Store => {
549560
let [Argument::Object(object), target] = &op.arguments[..] else { panic!() };
550561
self.do_store(&target, object.clone())?;
562+
context.retire_op(op);
551563
}
552564
Opcode::RefOf => {
553565
let [Argument::Object(object)] = &op.arguments[..] else { panic!() };
554566
let reference =
555567
Object::Reference { kind: ReferenceKind::RefOf, inner: object.clone() }.wrap();
556568
context.contribute_arg(Argument::Object(reference));
569+
context.retire_op(op);
557570
}
558571
Opcode::CondRefOf => {
559572
let [Argument::Object(object), target] = &op.arguments[..] else { panic!() };
@@ -566,6 +579,7 @@ where
566579
Object::Integer(u64::MAX)
567580
};
568581
context.contribute_arg(Argument::Object(result.wrap()));
582+
context.retire_op(op);
569583
}
570584
Opcode::DerefOf => {
571585
let [Argument::Object(object)] = &op.arguments[..] else { panic!() };
@@ -582,14 +596,17 @@ where
582596
});
583597
};
584598
context.contribute_arg(Argument::Object(result));
599+
context.retire_op(op);
585600
}
586601
Opcode::Sleep => {
587602
let [Argument::Object(msec)] = &op.arguments[..] else { panic!() };
588603
self.handler.sleep(msec.as_integer()?);
604+
context.retire_op(op);
589605
}
590606
Opcode::Stall => {
591607
let [Argument::Object(usec)] = &op.arguments[..] else { panic!() };
592608
self.handler.stall(usec.as_integer()?);
609+
context.retire_op(op);
593610
}
594611
Opcode::Acquire => {
595612
let [Argument::Object(mutex)] = &op.arguments[..] else { panic!() };
@@ -600,6 +617,7 @@ where
600617

601618
// TODO: should we do something with the sync level??
602619
self.handler.acquire(mutex, timeout)?;
620+
context.retire_op(op);
603621
}
604622
Opcode::Release => {
605623
let [Argument::Object(mutex)] = &op.arguments[..] else { panic!() };
@@ -608,6 +626,7 @@ where
608626
};
609627
// TODO: should we do something with the sync level??
610628
self.handler.release(mutex);
629+
context.retire_op(op);
611630
}
612631
Opcode::InternalMethodCall => {
613632
let [Argument::Object(method), Argument::Namestring(method_scope)] = &op.arguments[0..2]
@@ -632,6 +651,7 @@ where
632651
MethodContext::new_from_method(method.clone(), args, method_scope.clone())?;
633652
let old_context = mem::replace(&mut context, new_context);
634653
self.context_stack.lock().push(old_context);
654+
context.retire_op(op);
635655
}
636656
Opcode::Return => {
637657
let [Argument::Object(object)] = &op.arguments[..] else { panic!() };
@@ -640,6 +660,7 @@ where
640660
if let Some(last) = self.context_stack.lock().pop() {
641661
context = last;
642662
context.contribute_arg(Argument::Object(object.clone()));
663+
context.retire_op(op);
643664
} else {
644665
/*
645666
* If this is the top-most context, this is a `Return` from the actual
@@ -675,6 +696,7 @@ where
675696
};
676697

677698
context.contribute_arg(Argument::Object(Object::Integer(typ).wrap()));
699+
context.retire_op(op);
678700
}
679701
Opcode::SizeOf => self.do_size_of(&mut context, op)?,
680702
Opcode::Index => self.do_index(&mut context, op)?,
@@ -701,6 +723,7 @@ where
701723

702724
let kind = FieldUnitKind::Bank { region, bank, bank_value };
703725
self.parse_field_list(&mut context, kind, *start_pc, *pkg_length, field_flags)?;
726+
context.retire_op(op);
704727
}
705728
Opcode::While => {
706729
/*
@@ -713,6 +736,7 @@ where
713736
if predicate == 0 {
714737
// Exit from the while loop by skipping out of the current block
715738
context.current_block = context.block_stack.pop().unwrap();
739+
context.retire_op(op);
716740
}
717741
}
718742
_ => panic!("Unexpected operation has created in-flight op!"),
@@ -1409,6 +1433,7 @@ where
14091433
// TODO: use result for arg
14101434
self.do_store(target, result.clone())?;
14111435
context.contribute_arg(Argument::Object(result));
1436+
context.retire_op(op);
14121437
Ok(())
14131438
}
14141439

@@ -1450,6 +1475,7 @@ where
14501475
};
14511476

14521477
context.contribute_arg(Argument::Object(Object::Integer(result).wrap()));
1478+
context.retire_op(op);
14531479
Ok(())
14541480
}
14551481

@@ -1459,12 +1485,8 @@ where
14591485
let operand = operand.clone().unwrap_transparent_reference().as_integer()?;
14601486
let result = if operand == 0 { u64::MAX } else { 0 };
14611487

1462-
if let Some(prev_op) = context.in_flight.last_mut() {
1463-
if prev_op.arguments.len() < prev_op.expected_arguments {
1464-
prev_op.arguments.push(Argument::Object(Object::Integer(result).wrap()));
1465-
}
1466-
}
1467-
1488+
context.contribute_arg(Argument::Object(Object::Integer(result).wrap()));
1489+
context.retire_op(op);
14681490
return Ok(());
14691491
}
14701492

@@ -1526,6 +1548,7 @@ where
15261548
let result = if result { Object::Integer(u64::MAX) } else { Object::Integer(0) };
15271549

15281550
context.contribute_arg(Argument::Object(result.wrap()));
1551+
context.retire_op(op);
15291552
Ok(())
15301553
}
15311554

@@ -1558,6 +1581,7 @@ where
15581581
// TODO: use result of store
15591582
self.do_store(target, result.clone())?;
15601583
context.contribute_arg(Argument::Object(result));
1584+
context.retire_op(op);
15611585
Ok(())
15621586
}
15631587

@@ -1601,6 +1625,7 @@ where
16011625
// TODO: use result of store
16021626
self.do_store(target, result.clone())?;
16031627
context.contribute_arg(Argument::Object(result));
1628+
context.retire_op(op);
16041629
Ok(())
16051630
}
16061631

@@ -1627,6 +1652,7 @@ where
16271652
// TODO: use result of store
16281653
self.do_store(target, result.clone())?;
16291654
context.contribute_arg(Argument::Object(result));
1655+
context.retire_op(op);
16301656
Ok(())
16311657
}
16321658

@@ -1670,6 +1696,7 @@ where
16701696
// TODO: use result of store
16711697
self.do_store(target, result.clone())?;
16721698
context.contribute_arg(Argument::Object(result));
1699+
context.retire_op(op);
16731700
Ok(())
16741701
}
16751702

@@ -1707,6 +1734,7 @@ where
17071734

17081735
self.do_store(target, result.clone())?;
17091736
context.contribute_arg(Argument::Object(result));
1737+
context.retire_op(op);
17101738

17111739
Ok(())
17121740
}
@@ -1736,6 +1764,7 @@ where
17361764
Object::Debug => "[Debug Object]".to_string(),
17371765
}
17381766
}
1767+
17391768
let result = match source1.typ() {
17401769
ObjectType::Integer => {
17411770
let source1 = source1.as_integer()?;
@@ -1764,6 +1793,7 @@ where
17641793
// TODO: use result of store
17651794
self.do_store(target, result.clone())?;
17661795
context.contribute_arg(Argument::Object(result));
1796+
context.retire_op(op);
17671797
Ok(())
17681798
}
17691799

@@ -1780,6 +1810,7 @@ where
17801810
}
17811811

17821812
context.contribute_arg(Argument::Object(Object::Integer(result).wrap()));
1813+
context.retire_op(op);
17831814
Ok(())
17841815
}
17851816

@@ -1796,6 +1827,7 @@ where
17961827
}
17971828

17981829
context.contribute_arg(Argument::Object(Object::Integer(result).wrap()));
1830+
context.retire_op(op);
17991831
Ok(())
18001832
}
18011833

@@ -1811,6 +1843,7 @@ where
18111843
};
18121844

18131845
context.contribute_arg(Argument::Object(Object::Integer(result as u64).wrap()));
1846+
context.retire_op(op);
18141847
Ok(())
18151848
}
18161849

@@ -1861,6 +1894,7 @@ where
18611894

18621895
self.do_store(target, result.clone())?;
18631896
context.contribute_arg(Argument::Object(result));
1897+
context.retire_op(op);
18641898
Ok(())
18651899
}
18661900

@@ -2374,9 +2408,19 @@ impl MethodContext {
23742408
}
23752409

23762410
fn start_in_flight_op(&mut self, op: OpInFlight) {
2411+
trace!(
2412+
"START OP: {:?}, args: {:?}, with {} more needed",
2413+
op.op,
2414+
op.arguments,
2415+
op.expected_arguments - op.arguments.len()
2416+
);
23772417
self.in_flight.push(op);
23782418
}
23792419

2420+
fn retire_op(&mut self, op: OpInFlight) {
2421+
trace!("RETIRE OP: {:?}, args: {:?}", op.op, op.arguments);
2422+
}
2423+
23802424
fn start_new_block(&mut self, kind: BlockKind, length: usize) {
23812425
let block = Block {
23822426
stream: &self.current_block.stream()[..(self.current_block.pc + length)] as *const [u8],

0 commit comments

Comments
 (0)