Skip to content

Commit

Permalink
Use RS3d as temp_regd parameter for CHECK_WRITE macro (#373) (#376)
Browse files Browse the repository at this point in the history
* Use RS3d as temp_regd for CHECK_WRITE

* Append the negative test case
  • Loading branch information
mohanson committed Aug 22, 2023
1 parent 971b3e3 commit 698ad56
Show file tree
Hide file tree
Showing 6 changed files with 72 additions and 21 deletions.
40 changes: 20 additions & 20 deletions src/machine/asm/execute_x64.S
Expand Up @@ -1277,7 +1277,7 @@ CKB_VM_VERSIONED_SYMBOL(ckb_vm_x64_execute):
DECODE_R
movq REGISTER_ADDRESS(RS1), RS1
movq REGISTER_ADDRESS(RS2r), RS2r
CHECK_WRITE(RS1, TEMP1d, 4)
CHECK_WRITE(RS1, RS3d, 4)
movq LOAD_RESERVATION_ADDRESS, TEMP1
movq $UINT64_MAX, LOAD_RESERVATION_ADDRESS
cmp RS1, TEMP1
Expand All @@ -1292,7 +1292,7 @@ CKB_VM_VERSIONED_SYMBOL(ckb_vm_x64_execute):
DECODE_R
movq REGISTER_ADDRESS(RS1), RS1
movq REGISTER_ADDRESS(RS2r), RS2r
CHECK_WRITE(RS1, TEMP1d, 4)
CHECK_WRITE(RS1, RS3d, 4)
movslq CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_MEMORY(MACHINE, RS1), TEMP1
WRITE_RD(TEMP1)
mov RS2rd, CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_MEMORY(MACHINE, RS1)
Expand All @@ -1302,7 +1302,7 @@ CKB_VM_VERSIONED_SYMBOL(ckb_vm_x64_execute):
DECODE_R
movq REGISTER_ADDRESS(RS1), RS1
movq REGISTER_ADDRESS(RS2r), RS2r
CHECK_WRITE(RS1, TEMP1d, 4)
CHECK_WRITE(RS1, RS3d, 4)
movslq CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_MEMORY(MACHINE, RS1), TEMP1
WRITE_RD(TEMP1)
add TEMP1, RS2r
Expand All @@ -1313,7 +1313,7 @@ CKB_VM_VERSIONED_SYMBOL(ckb_vm_x64_execute):
DECODE_R
movq REGISTER_ADDRESS(RS1), RS1
movq REGISTER_ADDRESS(RS2r), RS2r
CHECK_WRITE(RS1, TEMP1d, 4)
CHECK_WRITE(RS1, RS3d, 4)
movslq CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_MEMORY(MACHINE, RS1), TEMP1
WRITE_RD(TEMP1)
xor TEMP1, RS2r
Expand All @@ -1324,7 +1324,7 @@ CKB_VM_VERSIONED_SYMBOL(ckb_vm_x64_execute):
DECODE_R
movq REGISTER_ADDRESS(RS1), RS1
movq REGISTER_ADDRESS(RS2r), RS2r
CHECK_WRITE(RS1, TEMP1d, 4)
CHECK_WRITE(RS1, RS3d, 4)
movslq CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_MEMORY(MACHINE, RS1), TEMP1
WRITE_RD(TEMP1)
and TEMP1, RS2r
Expand All @@ -1335,7 +1335,7 @@ CKB_VM_VERSIONED_SYMBOL(ckb_vm_x64_execute):
DECODE_R
movq REGISTER_ADDRESS(RS1), RS1
movq REGISTER_ADDRESS(RS2r), RS2r
CHECK_WRITE(RS1, TEMP1d, 4)
CHECK_WRITE(RS1, RS3d, 4)
movslq CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_MEMORY(MACHINE, RS1), TEMP1
WRITE_RD(TEMP1)
or TEMP1, RS2r
Expand All @@ -1346,7 +1346,7 @@ CKB_VM_VERSIONED_SYMBOL(ckb_vm_x64_execute):
DECODE_R
movq REGISTER_ADDRESS(RS1), RS1
movq REGISTER_ADDRESS(RS2r), RS2r
CHECK_WRITE(RS1, TEMP1d, 4)
CHECK_WRITE(RS1, RS3d, 4)
movslq CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_MEMORY(MACHINE, RS1), TEMP1
WRITE_RD(TEMP1)
cmp RS2rd, TEMP1d
Expand All @@ -1358,7 +1358,7 @@ CKB_VM_VERSIONED_SYMBOL(ckb_vm_x64_execute):
DECODE_R
movq REGISTER_ADDRESS(RS1), RS1
movq REGISTER_ADDRESS(RS2r), RS2r
CHECK_WRITE(RS1, TEMP1d, 4)
CHECK_WRITE(RS1, RS3d, 4)
movslq CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_MEMORY(MACHINE, RS1), TEMP1
WRITE_RD(TEMP1)
cmp RS2rd, TEMP1d
Expand All @@ -1370,7 +1370,7 @@ CKB_VM_VERSIONED_SYMBOL(ckb_vm_x64_execute):
DECODE_R
movq REGISTER_ADDRESS(RS1), RS1
movq REGISTER_ADDRESS(RS2r), RS2r
CHECK_WRITE(RS1, TEMP1d, 4)
CHECK_WRITE(RS1, RS3d, 4)
movslq CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_MEMORY(MACHINE, RS1), TEMP1
WRITE_RD(TEMP1)
cmp RS2rd, TEMP1d
Expand All @@ -1382,7 +1382,7 @@ CKB_VM_VERSIONED_SYMBOL(ckb_vm_x64_execute):
DECODE_R
movq REGISTER_ADDRESS(RS1), RS1
movq REGISTER_ADDRESS(RS2r), RS2r
CHECK_WRITE(RS1, TEMP1d, 4)
CHECK_WRITE(RS1, RS3d, 4)
movslq CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_MEMORY(MACHINE, RS1), TEMP1
WRITE_RD(TEMP1)
cmp RS2rd, TEMP1d
Expand All @@ -1403,7 +1403,7 @@ CKB_VM_VERSIONED_SYMBOL(ckb_vm_x64_execute):
DECODE_R
movq REGISTER_ADDRESS(RS1), RS1
movq REGISTER_ADDRESS(RS2r), RS2r
CHECK_WRITE(RS1, TEMP1d, 8)
CHECK_WRITE(RS1, RS3d, 8)
movq LOAD_RESERVATION_ADDRESS, TEMP1
movq $UINT64_MAX, LOAD_RESERVATION_ADDRESS
cmp RS1, TEMP1
Expand All @@ -1418,7 +1418,7 @@ CKB_VM_VERSIONED_SYMBOL(ckb_vm_x64_execute):
DECODE_R
movq REGISTER_ADDRESS(RS1), RS1
movq REGISTER_ADDRESS(RS2r), RS2r
CHECK_WRITE(RS1, TEMP1d, 8)
CHECK_WRITE(RS1, RS3d, 8)
movq CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_MEMORY(MACHINE, RS1), TEMP1
WRITE_RD(TEMP1)
movq RS2r, CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_MEMORY(MACHINE, RS1)
Expand All @@ -1428,7 +1428,7 @@ CKB_VM_VERSIONED_SYMBOL(ckb_vm_x64_execute):
DECODE_R
movq REGISTER_ADDRESS(RS1), RS1
movq REGISTER_ADDRESS(RS2r), RS2r
CHECK_WRITE(RS1, TEMP1d, 8)
CHECK_WRITE(RS1, RS3d, 8)
movq CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_MEMORY(MACHINE, RS1), TEMP1
WRITE_RD(TEMP1)
add TEMP1, RS2r
Expand All @@ -1439,7 +1439,7 @@ CKB_VM_VERSIONED_SYMBOL(ckb_vm_x64_execute):
DECODE_R
movq REGISTER_ADDRESS(RS1), RS1
movq REGISTER_ADDRESS(RS2r), RS2r
CHECK_WRITE(RS1, TEMP1d, 8)
CHECK_WRITE(RS1, RS3d, 8)
movq CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_MEMORY(MACHINE, RS1), TEMP1
WRITE_RD(TEMP1)
xor TEMP1, RS2r
Expand All @@ -1450,7 +1450,7 @@ CKB_VM_VERSIONED_SYMBOL(ckb_vm_x64_execute):
DECODE_R
movq REGISTER_ADDRESS(RS1), RS1
movq REGISTER_ADDRESS(RS2r), RS2r
CHECK_WRITE(RS1, TEMP1d, 8)
CHECK_WRITE(RS1, RS3d, 8)
movq CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_MEMORY(MACHINE, RS1), TEMP1
WRITE_RD(TEMP1)
and TEMP1, RS2r
Expand All @@ -1461,7 +1461,7 @@ CKB_VM_VERSIONED_SYMBOL(ckb_vm_x64_execute):
DECODE_R
movq REGISTER_ADDRESS(RS1), RS1
movq REGISTER_ADDRESS(RS2r), RS2r
CHECK_WRITE(RS1, TEMP1d, 8)
CHECK_WRITE(RS1, RS3d, 8)
movq CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_MEMORY(MACHINE, RS1), TEMP1
WRITE_RD(TEMP1)
or TEMP1, RS2r
Expand All @@ -1472,7 +1472,7 @@ CKB_VM_VERSIONED_SYMBOL(ckb_vm_x64_execute):
DECODE_R
movq REGISTER_ADDRESS(RS1), RS1
movq REGISTER_ADDRESS(RS2r), RS2r
CHECK_WRITE(RS1, TEMP1d, 8)
CHECK_WRITE(RS1, RS3d, 8)
movq CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_MEMORY(MACHINE, RS1), TEMP1
WRITE_RD(TEMP1)
cmp RS2r, TEMP1
Expand All @@ -1484,7 +1484,7 @@ CKB_VM_VERSIONED_SYMBOL(ckb_vm_x64_execute):
DECODE_R
movq REGISTER_ADDRESS(RS1), RS1
movq REGISTER_ADDRESS(RS2r), RS2r
CHECK_WRITE(RS1, TEMP1d, 8)
CHECK_WRITE(RS1, RS3d, 8)
movq CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_MEMORY(MACHINE, RS1), TEMP1
WRITE_RD(TEMP1)
cmp RS2r, TEMP1
Expand All @@ -1496,7 +1496,7 @@ CKB_VM_VERSIONED_SYMBOL(ckb_vm_x64_execute):
DECODE_R
movq REGISTER_ADDRESS(RS1), RS1
movq REGISTER_ADDRESS(RS2r), RS2r
CHECK_WRITE(RS1, TEMP1d, 8)
CHECK_WRITE(RS1, RS3d, 8)
movq CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_MEMORY(MACHINE, RS1), TEMP1
WRITE_RD(TEMP1)
cmp RS2r, TEMP1
Expand All @@ -1508,7 +1508,7 @@ CKB_VM_VERSIONED_SYMBOL(ckb_vm_x64_execute):
DECODE_R
movq REGISTER_ADDRESS(RS1), RS1
movq REGISTER_ADDRESS(RS2r), RS2r
CHECK_WRITE(RS1, TEMP1d, 8)
CHECK_WRITE(RS1, RS3d, 8)
movq CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_MEMORY(MACHINE, RS1), TEMP1
WRITE_RD(TEMP1)
cmp RS2r, TEMP1
Expand Down
1 change: 1 addition & 0 deletions tests/programs/_build_all_native.sh
@@ -1,6 +1,7 @@
set -ex

riscv64-unknown-elf-gcc -o alloc_many alloc_many.c
riscv64-unknown-elf-as -o amo_check_write.o amo_check_write.S && riscv64-unknown-elf-ld -T amo_check_write.lds -o amo_check_write amo_check_write.o && rm amo_check_write.o
riscv64-unknown-elf-as -o amo_compare.o amo_compare.S && riscv64-unknown-elf-ld -T amo_compare.lds -o amo_compare amo_compare.o && rm amo_compare.o
riscv64-unknown-elf-as -o amo_write_permission.o amo_write_permission.S && riscv64-unknown-elf-ld -o amo_write_permission amo_write_permission.o && rm amo_write_permission.o
# SKIP: andi
Expand Down
Binary file added tests/programs/amo_check_write
Binary file not shown.
23 changes: 23 additions & 0 deletions tests/programs/amo_check_write.S
@@ -0,0 +1,23 @@
.global _start
_start:

la a0, n0
li a1, 1
amoadd.w a2, a1, (a0)

ld a3, (a0)
bne a3, a1, fail
bne a2, zero, fail

done:
li a0, 0
li a7, 93
ecall
fail:
li a0, 1
li a7, 93
ecall

.section .data
n0:
.dword 0
7 changes: 7 additions & 0 deletions tests/programs/amo_check_write.lds
@@ -0,0 +1,7 @@
SECTIONS
{
. = 0x100b0;
.text : { *(.text) }
. = 0x11000;
.data : { *(.data) }
}
22 changes: 21 additions & 1 deletion tests/test_a_extension.rs
@@ -1,4 +1,4 @@
use ckb_vm::Error;
use ckb_vm::{CoreMachine, Error, Memory};
pub mod machine_build;

#[test]
Expand Down Expand Up @@ -48,3 +48,23 @@ pub fn test_amo_compare() {
assert_eq!(ret_asm.unwrap(), 0);
}
}

#[test]
pub fn test_amo_check_write() {
#[cfg(has_asm)]
{
let mut machine_asm = machine_build::asm_v2_imacb("tests/programs/amo_check_write");
let page_a = 0;
let page_b = 17;
let flag_a = machine_asm.machine.memory_mut().fetch_flag(page_a).unwrap();
assert_eq!(flag_a, 0);
let ret_asm = machine_asm.run();
assert!(ret_asm.is_ok());
assert_eq!(ret_asm.unwrap(), 0);
assert_eq!(machine_asm.machine.inner_mut().last_write_page, page_b);
let flag_a = machine_asm.machine.memory_mut().fetch_flag(page_a).unwrap();
assert_eq!(flag_a, 0);
let flag_b = machine_asm.machine.memory_mut().fetch_flag(page_b).unwrap();
assert_eq!(flag_b, 4);
}
}

0 comments on commit 698ad56

Please sign in to comment.