Skip to content

Commit 5de01dd

Browse files
committed
Use more detailed error information
1 parent 4566bf7 commit 5de01dd

File tree

11 files changed

+93
-32
lines changed

11 files changed

+93
-32
lines changed

definitions/src/asm.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,11 @@ pub const RET_OUT_OF_BOUND: u8 = 7;
1515
pub const RET_INVALID_PERMISSION: u8 = 8;
1616
pub const RET_SLOWPATH: u8 = 9;
1717
pub const RET_PAUSE: u8 = 10;
18-
pub const RET_SHADOW_STACK_SOFTWARE_CHECK_EXCEPTION: u8 = 11;
19-
pub const RET_SHADOW_STACK_STACK_OUT_OF_STACK: u8 = 12;
18+
pub const RET_SHADOW_STACK_LPAD_NOT_4BYTE_ALIGNED: u8 = 11;
19+
pub const RET_SHADOW_STACK_NOT_LPAD: u8 = 12;
20+
pub const RET_SHADOW_STACK_LABEL_WRONG: u8 = 13;
21+
pub const RET_SHADOW_STACK_VALUE_WRONG: u8 = 14;
22+
pub const RET_SHADOW_STACK_STACK_OUT_OF_STACK: u8 = 15;
2023

2124
#[inline(always)]
2225
pub fn calculate_slot(addr: u64) -> usize {

definitions/src/generate_asm_constants.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ use ckb_vm_definitions::{
44
asm::{
55
AsmCoreMachine, FixedTrace, InvokeData, RET_CYCLES_OVERFLOW, RET_DECODE_TRACE,
66
RET_DYNAMIC_JUMP, RET_EBREAK, RET_ECALL, RET_INVALID_PERMISSION, RET_MAX_CYCLES_EXCEEDED,
7-
RET_OUT_OF_BOUND, RET_PAUSE, RET_SHADOW_STACK_SOFTWARE_CHECK_EXCEPTION,
8-
RET_SHADOW_STACK_STACK_OUT_OF_STACK, RET_SLOWPATH, TRACE_ITEM_LENGTH,
7+
RET_OUT_OF_BOUND, RET_PAUSE, RET_SHADOW_STACK_LABEL_WRONG,
8+
RET_SHADOW_STACK_LPAD_NOT_4BYTE_ALIGNED, RET_SHADOW_STACK_NOT_LPAD,
9+
RET_SHADOW_STACK_STACK_OUT_OF_STACK, RET_SHADOW_STACK_VALUE_WRONG, RET_SLOWPATH,
10+
TRACE_ITEM_LENGTH,
911
},
1012
for_each_inst,
1113
instructions::{MAXIMUM_OPCODE, MINIMAL_OPCODE, instruction_opcode_name},
@@ -72,8 +74,20 @@ fn main() {
7274
println!("#define CKB_VM_ASM_RET_SLOWPATH {}", RET_SLOWPATH);
7375
println!("#define CKB_VM_ASM_RET_PAUSE {}", RET_PAUSE);
7476
println!(
75-
"#define CKB_VM_ASM_RET_SHADOW_STACK_SOFTWARE_CHECK_EXCEPTION {}",
76-
RET_SHADOW_STACK_SOFTWARE_CHECK_EXCEPTION
77+
"#define CKB_VM_ASM_RET_SHADOW_STACK_LPAD_NOT_4BYTE_ALIGNED {}",
78+
RET_SHADOW_STACK_LPAD_NOT_4BYTE_ALIGNED
79+
);
80+
println!(
81+
"#define CKB_VM_ASM_RET_SHADOW_STACK_NOT_LPAD {}",
82+
RET_SHADOW_STACK_NOT_LPAD
83+
);
84+
println!(
85+
"#define CKB_VM_ASM_RET_SHADOW_STACK_LABEL_WRONG {}",
86+
RET_SHADOW_STACK_LABEL_WRONG
87+
);
88+
println!(
89+
"#define CKB_VM_ASM_RET_SHADOW_STACK_VALUE_WRONG {}",
90+
RET_SHADOW_STACK_VALUE_WRONG
7791
);
7892
println!(
7993
"#define CKB_VM_ASM_RET_SHADOW_STACK_STACK_OUT_OF_STACK {}",

src/decoder.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ impl DefaultDecoder {
124124
if let Some(instruction) = factory(instruction_bits, self.version, self.cfi) {
125125
// Shadow Stack Software Check for LPAD instruction.
126126
if extract_opcode(instruction) == insts::OP_LPAD && pc % 4 != 0 {
127-
return Err(Error::ShadowStackSoftwareCheckException);
127+
return Err(Error::ShadowStackLpadNot4ByteAligned);
128128
}
129129
self.instructions_cache[instruction_cache_key] = (pc, instruction);
130130
return Ok(instruction);

src/error.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,14 @@ pub enum Error {
5151
Unexpected(String),
5252
#[display("yield")]
5353
Yield,
54-
#[display("shadow stack software check exception")]
55-
ShadowStackSoftwareCheckException,
54+
#[display("shadow stack lpad not 4-byte aligned")]
55+
ShadowStackLpadNot4ByteAligned,
56+
#[display("shadow stack not lpad")]
57+
ShadowStackNotLpad,
58+
#[display("shadow stack label wrong")]
59+
ShadowStackLabelWrong,
60+
#[display("shadow stack value wrong")]
61+
ShadowStackValueWrong,
5662
#[display("shadow stack out of stack")]
5763
ShadowStackOutOfStack,
5864
}

src/instructions/execute.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1514,13 +1514,13 @@ pub fn handle_lpad<Mac: Machine>(machine: &mut Mac, inst: Instruction) -> Result
15141514
}
15151515
// If PC not 4-byte aligned then software-check exception.
15161516
if machine.pc().to_u64() % 4 != 0 {
1517-
return Err(Error::ShadowStackSoftwareCheckException);
1517+
return Err(Error::ShadowStackLpadNot4ByteAligned);
15181518
}
15191519
// If landing pad label not matched -> software-check exception
15201520
let lpl = Utype(inst).immediate_u();
15211521
let x7l = machine.registers()[T2].to_u32() & 0xFFFFF000;
15221522
if lpl != x7l && lpl != 0 {
1523-
return Err(Error::ShadowStackSoftwareCheckException);
1523+
return Err(Error::ShadowStackLabelWrong);
15241524
}
15251525
machine.set_elp(0);
15261526
Ok(())
@@ -1546,7 +1546,7 @@ pub fn handle_sspopchk<Mac: Machine>(machine: &mut Mac, inst: Instruction) -> Re
15461546
let ret = machine.ra(&ssp)?.clone();
15471547
let ssp = ssp.overflowing_add(&Mac::REG::from_u8(Mac::REG::BITS / 8));
15481548
if ret.to_u64() != rs1_value.to_u64() {
1549-
return Err(Error::ShadowStackSoftwareCheckException);
1549+
return Err(Error::ShadowStackValueWrong);
15501550
}
15511551
machine.set_ssp(&ssp);
15521552
Ok(())

src/machine/asm/cdefinitions_generated.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,11 @@
1717
#define CKB_VM_ASM_RET_INVALID_PERMISSION 8
1818
#define CKB_VM_ASM_RET_SLOWPATH 9
1919
#define CKB_VM_ASM_RET_PAUSE 10
20-
#define CKB_VM_ASM_RET_SHADOW_STACK_SOFTWARE_CHECK_EXCEPTION 11
21-
#define CKB_VM_ASM_RET_SHADOW_STACK_STACK_OUT_OF_STACK 12
20+
#define CKB_VM_ASM_RET_SHADOW_STACK_LPAD_NOT_4BYTE_ALIGNED 11
21+
#define CKB_VM_ASM_RET_SHADOW_STACK_NOT_LPAD 12
22+
#define CKB_VM_ASM_RET_SHADOW_STACK_LABEL_WRONG 13
23+
#define CKB_VM_ASM_RET_SHADOW_STACK_VALUE_WRONG 14
24+
#define CKB_VM_ASM_RET_SHADOW_STACK_STACK_OUT_OF_STACK 15
2225

2326
#define CKB_VM_ASM_REGISTER_RA 1
2427
#define CKB_VM_ASM_REGISTER_SP 2

src/machine/asm/execute_aarch64.S

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,7 @@ ckb_vm_x64_execute:
376376
ldr TEMP1, [INST_PC]
377377
adr TEMP2, .CKB_VM_ASM_LABEL_OP_LPAD
378378
cmp TEMP1, TEMP2
379-
bne .exit_shadow_stack_software_check_exception
379+
bne .exit_shadow_stack_not_lpad
380380
.trace_loaded_no_elp_check:
381381
NEXT_INST
382382
.CKB_VM_ASM_LABEL_OP_CUSTOM_ASM_TRACE_JUMP:
@@ -1942,7 +1942,7 @@ ckb_vm_x64_execute:
19421942
ldr TEMP1, [MACHINE, CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_REGISTERS + CKB_VM_ASM_REGISTER_T2 * 8]
19431943
and TEMP1, TEMP1, 0xFFFFF000
19441944
cmp IMMEDIATE, TEMP1
1945-
bne .exit_shadow_stack_software_check_exception
1945+
bne .exit_shadow_stack_label_wrong
19461946
.lpad_branch_success:
19471947
strb wzr, [MACHINE, CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_ELP]
19481948
NEXT_INST
@@ -1960,7 +1960,7 @@ ckb_vm_x64_execute:
19601960
ldr TEMP2, [MACHINE, CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_SSP]
19611961
SS_GET(TEMP2, TEMP3)
19621962
cmp TEMP1, TEMP3
1963-
bne .exit_shadow_stack_software_check_exception
1963+
bne .exit_shadow_stack_value_wrong
19641964
add TEMP2, TEMP2, 8
19651965
str TEMP2, [MACHINE, CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_SSP]
19661966
NEXT_INST
@@ -2004,8 +2004,14 @@ ckb_vm_x64_execute:
20042004
str TEMP1, [MACHINE, CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_ERROR_ARG0]
20052005
mov x0, CKB_VM_ASM_RET_INVALID_PERMISSION
20062006
b .exit
2007-
.exit_shadow_stack_software_check_exception:
2008-
mov x0, CKB_VM_ASM_RET_SHADOW_STACK_SOFTWARE_CHECK_EXCEPTION
2007+
.exit_shadow_stack_not_lpad:
2008+
mov x0, CKB_VM_ASM_RET_SHADOW_STACK_NOT_LPAD
2009+
b .exit
2010+
.exit_shadow_stack_label_wrong:
2011+
mov x0, CKB_VM_ASM_RET_SHADOW_STACK_LABEL_WRONG
2012+
b .exit
2013+
.exit_shadow_stack_value_wrong:
2014+
mov x0, CKB_VM_ASM_RET_SHADOW_STACK_VALUE_WRONG
20092015
b .exit
20102016
.exit_shadow_stack_stack_out_of_stack:
20112017
mov x0, CKB_VM_ASM_RET_SHADOW_STACK_STACK_OUT_OF_STACK

src/machine/asm/execute_x64.S

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -488,7 +488,7 @@ ckb_vm_x64_execute:
488488
movq (INST_PC), %rax
489489
leaq .CKB_VM_ASM_LABEL_OP_LPAD(%rip), %rcx
490490
cmp %rcx, %rax
491-
jne .exit_shadow_stack_software_check_exception
491+
jne .exit_shadow_stack_not_lpad
492492
.trace_loaded_no_elp_check:
493493
NEXT_INST
494494
.p2align 3
@@ -2423,7 +2423,7 @@ ckb_vm_x64_execute:
24232423
movq T2_ADDRESS, RS1
24242424
andl $0xFFFFF000, RS1d
24252425
cmp IMMEDIATE, RS1
2426-
jne .exit_shadow_stack_software_check_exception
2426+
jne .exit_shadow_stack_label_wrong
24272427
.lpad_branch_success:
24282428
movl $0, CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_ELP(MACHINE)
24292429
NEXT_INST
@@ -2443,7 +2443,7 @@ ckb_vm_x64_execute:
24432443
movq CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_SSP(MACHINE), RS2r
24442444
SS_GET(RS2r, TEMP1)
24452445
cmp RS1, TEMP1
2446-
jne .exit_shadow_stack_software_check_exception
2446+
jne .exit_shadow_stack_value_wrong
24472447
addq $8, RS2r
24482448
movq RS2r, CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_SSP(MACHINE)
24492449
NEXT_INST
@@ -2495,8 +2495,16 @@ ckb_vm_x64_execute:
24952495
mov $CKB_VM_ASM_RET_INVALID_PERMISSION, ARG_RETd
24962496
jmp .exit
24972497
.p2align 3
2498-
.exit_shadow_stack_software_check_exception:
2499-
mov $CKB_VM_ASM_RET_SHADOW_STACK_SOFTWARE_CHECK_EXCEPTION, ARG_RETd
2498+
.exit_shadow_stack_not_lpad:
2499+
mov $CKB_VM_ASM_RET_SHADOW_STACK_NOT_LPAD, ARG_RETd
2500+
jmp .exit
2501+
.p2align 3
2502+
.exit_shadow_stack_label_wrong:
2503+
mov $CKB_VM_ASM_RET_SHADOW_STACK_LABEL_WRONG, ARG_RETd
2504+
jmp .exit
2505+
.p2align 3
2506+
.exit_shadow_stack_value_wrong:
2507+
mov $CKB_VM_ASM_RET_SHADOW_STACK_VALUE_WRONG, ARG_RETd
25002508
jmp .exit
25012509
.p2align 3
25022510
.exit_shadow_stack_stack_out_of_stack:

src/machine/asm/mod.rs

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@ use ckb_vm_definitions::{
99
asm::{
1010
FixedTrace, InvokeData, RET_CYCLES_OVERFLOW, RET_DECODE_TRACE, RET_DYNAMIC_JUMP,
1111
RET_EBREAK, RET_ECALL, RET_INVALID_PERMISSION, RET_MAX_CYCLES_EXCEEDED, RET_OUT_OF_BOUND,
12-
RET_PAUSE, RET_SHADOW_STACK_SOFTWARE_CHECK_EXCEPTION, RET_SHADOW_STACK_STACK_OUT_OF_STACK,
13-
RET_SLOWPATH,
12+
RET_PAUSE, RET_SHADOW_STACK_LABEL_WRONG, RET_SHADOW_STACK_LPAD_NOT_4BYTE_ALIGNED,
13+
RET_SHADOW_STACK_NOT_LPAD, RET_SHADOW_STACK_STACK_OUT_OF_STACK,
14+
RET_SHADOW_STACK_VALUE_WRONG, RET_SLOWPATH,
1415
},
1516
};
1617
use rand::{SeedableRng, prelude::RngCore};
@@ -869,8 +870,18 @@ impl<R: AsmCoreMachineRevealer, D: TraceDecoder> DefaultMachineRunner for Abstra
869870
self.machine.pause.free();
870871
return Err(Error::Pause);
871872
}
872-
RET_SHADOW_STACK_SOFTWARE_CHECK_EXCEPTION => {
873-
return Err(Error::ShadowStackSoftwareCheckException);
873+
RET_SHADOW_STACK_LPAD_NOT_4BYTE_ALIGNED => {
874+
// Should not be caught. The check occurs during the decoder phase.
875+
unreachable!();
876+
}
877+
RET_SHADOW_STACK_NOT_LPAD => {
878+
return Err(Error::ShadowStackNotLpad);
879+
}
880+
RET_SHADOW_STACK_LABEL_WRONG => {
881+
return Err(Error::ShadowStackLabelWrong);
882+
}
883+
RET_SHADOW_STACK_VALUE_WRONG => {
884+
return Err(Error::ShadowStackValueWrong);
874885
}
875886
RET_SHADOW_STACK_STACK_OUT_OF_STACK => {
876887
return Err(Error::ShadowStackOutOfStack);
@@ -938,8 +949,18 @@ impl<R: AsmCoreMachineRevealer, D: TraceDecoder> AbstractAsmMachine<R, D> {
938949
let instruction = decoder.decode(self.machine.memory_mut(), pc)?;
939950
execute_instruction(instruction, &mut self.machine)?;
940951
}
941-
RET_SHADOW_STACK_SOFTWARE_CHECK_EXCEPTION => {
942-
return Err(Error::ShadowStackSoftwareCheckException);
952+
RET_SHADOW_STACK_LPAD_NOT_4BYTE_ALIGNED => {
953+
// Should not be caught. The check occurs during the decoder phase.
954+
unreachable!();
955+
}
956+
RET_SHADOW_STACK_NOT_LPAD => {
957+
return Err(Error::ShadowStackNotLpad);
958+
}
959+
RET_SHADOW_STACK_LABEL_WRONG => {
960+
return Err(Error::ShadowStackLabelWrong);
961+
}
962+
RET_SHADOW_STACK_VALUE_WRONG => {
963+
return Err(Error::ShadowStackValueWrong);
943964
}
944965
RET_SHADOW_STACK_STACK_OUT_OF_STACK => {
945966
return Err(Error::ShadowStackOutOfStack);

src/machine/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -933,7 +933,7 @@ impl<Inner: SupportMachine, Decoder> DefaultMachine<Inner, Decoder> {
933933
decoder.decode(memory, pc)?
934934
};
935935
if self.elp() != 0 && extract_opcode(instruction) != insts::OP_LPAD {
936-
return Err(Error::ShadowStackSoftwareCheckException);
936+
return Err(Error::ShadowStackNotLpad);
937937
}
938938
let cycles = self.instruction_cycle_func()(instruction);
939939
self.add_cycles(cycles)?;

0 commit comments

Comments
 (0)