mirror of
https://github.com/logos-storage/plonky2.git
synced 2026-01-08 00:33:06 +00:00
Log stack on panic
This commit is contained in:
parent
ac068845a5
commit
d4a485ece5
@ -73,6 +73,7 @@ global deduct_eth_insufficient_balance:
|
|||||||
|
|
||||||
// Pre stack: addr, amount, redest
|
// Pre stack: addr, amount, redest
|
||||||
// Post stack: (empty)
|
// Post stack: (empty)
|
||||||
|
// TODO: Should it be copy-on-write instead of mutating the trie?
|
||||||
global add_eth:
|
global add_eth:
|
||||||
// stack: addr, amount, retdest
|
// stack: addr, amount, retdest
|
||||||
DUP1 %mpt_read_state_trie
|
DUP1 %mpt_read_state_trie
|
||||||
|
|||||||
@ -7,6 +7,7 @@ use crate::generation::GenerationInputs;
|
|||||||
use crate::witness::memory::MemoryState;
|
use crate::witness::memory::MemoryState;
|
||||||
use crate::witness::state::RegistersState;
|
use crate::witness::state::RegistersState;
|
||||||
use crate::witness::traces::{TraceCheckpoint, Traces};
|
use crate::witness::traces::{TraceCheckpoint, Traces};
|
||||||
|
use crate::witness::util::stack_peek;
|
||||||
|
|
||||||
pub(crate) struct GenerationStateCheckpoint {
|
pub(crate) struct GenerationStateCheckpoint {
|
||||||
pub(crate) registers: RegistersState,
|
pub(crate) registers: RegistersState,
|
||||||
@ -67,4 +68,10 @@ impl<F: Field> GenerationState<F> {
|
|||||||
self.registers = checkpoint.registers;
|
self.registers = checkpoint.registers;
|
||||||
self.traces.rollback(checkpoint.traces);
|
self.traces.rollback(checkpoint.traces);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn stack(&self) -> Vec<U256> {
|
||||||
|
(0..self.registers.stack_len)
|
||||||
|
.map(|i| stack_peek(self, i).unwrap())
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,4 @@
|
|||||||
use anyhow::bail;
|
use anyhow::bail;
|
||||||
use itertools::Itertools;
|
|
||||||
use log::log_enabled;
|
use log::log_enabled;
|
||||||
use plonky2::field::types::Field;
|
use plonky2::field::types::Field;
|
||||||
|
|
||||||
@ -12,7 +11,7 @@ use crate::witness::gas::gas_to_charge;
|
|||||||
use crate::witness::memory::MemoryAddress;
|
use crate::witness::memory::MemoryAddress;
|
||||||
use crate::witness::operation::*;
|
use crate::witness::operation::*;
|
||||||
use crate::witness::state::RegistersState;
|
use crate::witness::state::RegistersState;
|
||||||
use crate::witness::util::{mem_read_code_with_log_and_fill, stack_peek};
|
use crate::witness::util::mem_read_code_with_log_and_fill;
|
||||||
use crate::{arithmetic, logic};
|
use crate::{arithmetic, logic};
|
||||||
|
|
||||||
fn read_code_memory<F: Field>(state: &mut GenerationState<F>, row: &mut CpuColumnsView<F>) -> u8 {
|
fn read_code_memory<F: Field>(state: &mut GenerationState<F>, row: &mut CpuColumnsView<F>) -> u8 {
|
||||||
@ -121,7 +120,7 @@ fn decode(registers: RegistersState, opcode: u8) -> Result<Operation, ProgramErr
|
|||||||
(0xa5, _) => {
|
(0xa5, _) => {
|
||||||
log::warn!(
|
log::warn!(
|
||||||
"Kernel panic at {}",
|
"Kernel panic at {}",
|
||||||
KERNEL.offset_name(registers.program_counter)
|
KERNEL.offset_name(registers.program_counter),
|
||||||
);
|
);
|
||||||
Err(ProgramError::KernelPanic)
|
Err(ProgramError::KernelPanic)
|
||||||
}
|
}
|
||||||
@ -284,9 +283,7 @@ fn log_kernel_instruction<F: Field>(state: &mut GenerationState<F>, op: Operatio
|
|||||||
state.registers.context,
|
state.registers.context,
|
||||||
KERNEL.offset_name(pc),
|
KERNEL.offset_name(pc),
|
||||||
op,
|
op,
|
||||||
(0..state.registers.stack_len)
|
state.stack()
|
||||||
.map(|i| stack_peek(state, i).unwrap())
|
|
||||||
.collect_vec()
|
|
||||||
);
|
);
|
||||||
|
|
||||||
assert!(pc < KERNEL.code.len(), "Kernel PC is out of range: {}", pc);
|
assert!(pc < KERNEL.code.len(), "Kernel PC is out of range: {}", pc);
|
||||||
@ -310,7 +307,12 @@ pub(crate) fn transition<F: Field>(state: &mut GenerationState<F>) -> anyhow::Re
|
|||||||
Err(e) => {
|
Err(e) => {
|
||||||
if state.registers.is_kernel {
|
if state.registers.is_kernel {
|
||||||
let offset_name = KERNEL.offset_name(state.registers.program_counter);
|
let offset_name = KERNEL.offset_name(state.registers.program_counter);
|
||||||
bail!("exception in kernel mode at {}: {:?}", offset_name, e);
|
bail!(
|
||||||
|
"{:?} in kernel at pc={}, stack={:?}",
|
||||||
|
e,
|
||||||
|
offset_name,
|
||||||
|
state.stack()
|
||||||
|
);
|
||||||
}
|
}
|
||||||
state.rollback(checkpoint);
|
state.rollback(checkpoint);
|
||||||
handle_error(state)
|
handle_error(state)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user