Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 7 additions & 17 deletions src/machine/asm/execute_aarch64.S
Original file line number Diff line number Diff line change
Expand Up @@ -1223,8 +1223,7 @@ ckb_vm_x64_execute:
DECODE_R
ldr RS1, REGISTER_ADDRESS(RS1)
ldr RS2, REGISTER_ADDRESS(RS2)
mov RS1w, RS1w
add RS1, RS1, RS2
add RS1, RS2, RS1w, uxtw
WRITE_RD(RS1)
NEXT_INST
.CKB_VM_ASM_LABEL_OP_ANDN:
Expand Down Expand Up @@ -1622,51 +1621,42 @@ ckb_vm_x64_execute:
DECODE_R
ldr RS1, REGISTER_ADDRESS(RS1)
ldr RS2, REGISTER_ADDRESS(RS2)
lsl RS1, RS1, 1
add RS1, RS1, RS2
add RS1, RS2, RS1, lsl #1
WRITE_RD(RS1)
NEXT_INST
.CKB_VM_ASM_LABEL_OP_SH1ADDUW:
DECODE_R
ldr RS1, REGISTER_ADDRESS(RS1)
ldr RS2, REGISTER_ADDRESS(RS2)
mov RS1w, RS1w
lsl RS1, RS1, 1
add RS1, RS1, RS2
add RS1, RS2, RS1w, uxtw #1
WRITE_RD(RS1)
NEXT_INST
.CKB_VM_ASM_LABEL_OP_SH2ADD:
DECODE_R
ldr RS1, REGISTER_ADDRESS(RS1)
ldr RS2, REGISTER_ADDRESS(RS2)
lsl RS1, RS1, 2
add RS1, RS1, RS2
add RS1, RS2, RS1, lsl #2
WRITE_RD(RS1)
NEXT_INST
.CKB_VM_ASM_LABEL_OP_SH2ADDUW:
DECODE_R
ldr RS1, REGISTER_ADDRESS(RS1)
ldr RS2, REGISTER_ADDRESS(RS2)
mov RS1w, RS1w
lsl RS1, RS1, 2
add RS1, RS1, RS2
add RS1, RS2, RS1w, uxtw #2
WRITE_RD(RS1)
NEXT_INST
.CKB_VM_ASM_LABEL_OP_SH3ADD:
DECODE_R
ldr RS1, REGISTER_ADDRESS(RS1)
ldr RS2, REGISTER_ADDRESS(RS2)
lsl RS1, RS1, 3
add RS1, RS1, RS2
add RS1, RS2, RS1, lsl #3
WRITE_RD(RS1)
NEXT_INST
.CKB_VM_ASM_LABEL_OP_SH3ADDUW:
DECODE_R
ldr RS1, REGISTER_ADDRESS(RS1)
ldr RS2, REGISTER_ADDRESS(RS2)
mov RS1w, RS1w
lsl RS1, RS1, 3
add RS1, RS1, RS2
add RS1, RS2, RS1w, uxtw #3
WRITE_RD(RS1)
NEXT_INST
.CKB_VM_ASM_LABEL_OP_SLLIUW:
Expand Down
146 changes: 92 additions & 54 deletions tests/programs/_build_all_native.sh
Original file line number Diff line number Diff line change
@@ -1,75 +1,113 @@
set -ex

riscv64-unknown-elf-gcc -o resume2_load_data resume2_load_data.c
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
# RISC-V toolchain prefix - can be overridden via environment variable
# Examples: RISCV_PREFIX=riscv-none-elf sh _build_all_native.sh
RISCV_PREFIX="${RISCV_PREFIX:-riscv64-unknown-elf}"

# Extra flags for toolchains that default to 32-bit (e.g. xPack riscv-none-elf).
# Examples: RISCV_ASFLAGS="-mabi=lp64" RISCV_LDFLAGS="-m elf64lriscv" RISCV_CFLAGS="-march=rv64imc -mabi=lp64"
RISCV_CFLAGS="${RISCV_CFLAGS:-}"
RISCV_ASFLAGS="${RISCV_ASFLAGS:-}"
RISCV_LDFLAGS="${RISCV_LDFLAGS:-}"

RISCV_GCC="${RISCV_PREFIX}-gcc ${RISCV_CFLAGS}"
RISCV_AS="${RISCV_PREFIX}-as ${RISCV_ASFLAGS}"
RISCV_LD="${RISCV_PREFIX}-ld ${RISCV_LDFLAGS}"

# Compile a .c file to a binary. SOURCE defaults to OUTPUT.c.
# Usage: gcc_compile OUTPUT [SOURCE]
gcc_compile() {
$RISCV_GCC -o "$1" "${2:-$1.c}"
}

# Assemble STEM.S, link to OUTPUT (defaults to STEM), then remove the object file.
# Usage: asm_link [-march=ARCH] [-T LINKER_SCRIPT] STEM [OUTPUT]
asm_link() {
march="" lds=""
while [ $# -gt 0 ]; do
Comment thread
mohanson marked this conversation as resolved.
case "$1" in
-march=*) march="$1"; shift ;;
-T) lds="-T $2"; shift 2 ;;
*) break ;;
esac
done
stem="$1" output="${2:-$1}"
$RISCV_AS $march -o "$stem.o" "$stem.S"
$RISCV_LD $lds -o "$output" "$stem.o"
rm "$stem.o"
}

gcc_compile resume2_load_data
gcc_compile alloc_many
asm_link -T amo_check_write.lds amo_check_write
asm_link -T amo_compare.lds amo_compare
asm_link amo_write_permission
# SKIP: andi
riscv64-unknown-elf-gcc -o argv_null_test argv_null_test.c
riscv64-unknown-elf-gcc -o big_binary big_binary.c
riscv64-unknown-elf-as -march=rv64imc -o cadd_hints.o cadd_hints.S && riscv64-unknown-elf-ld -o cadd_hints cadd_hints.o && rm cadd_hints.o
riscv64-unknown-elf-as -o ckbforks.o ckbforks.S && riscv64-unknown-elf-ld -o ckbforks ckbforks.o && rm ckbforks.o
gcc_compile argv_null_test
gcc_compile big_binary
asm_link -march=rv64imc cadd_hints
asm_link ckbforks
# TODO: clzw_bug
# SKIP: decoder_instructions_cache_pc_out_of_bound_timeout
riscv64-unknown-elf-as -o ebreak.o ebreak.S && riscv64-unknown-elf-ld -o ebreak64 ebreak.o && rm ebreak.o
asm_link ebreak ebreak64
# SKIP: flat_crash_64
# SKIP: goblin_overflow_elf
# SKIP: invalid_file_offset64*
riscv64-unknown-elf-as -o invalid_read.o invalid_read.S && riscv64-unknown-elf-ld -o invalid_read64 invalid_read.o && rm invalid_read.o
riscv64-unknown-elf-as -march=rv64imc -o jalr_bug.o jalr_bug.S && riscv64-unknown-elf-ld -o jalr_bug jalr_bug.o && rm jalr_bug.o
riscv64-unknown-elf-as -o jalr_bug_noc.o jalr_bug_noc.S && riscv64-unknown-elf-ld -o jalr_bug_noc jalr_bug_noc.o && rm jalr_bug_noc.o
riscv64-unknown-elf-as -o jump0.o jump0.S && riscv64-unknown-elf-ld -o jump0_64 jump0.o && rm jump0.o
asm_link invalid_read invalid_read64
asm_link -march=rv64imc jalr_bug
asm_link jalr_bug_noc
asm_link jump0 jump0_64
# SKIP: load_elf_crash_64
# SKIP: load_elf_section_crash_64
# SKIP: load_malformed_elf_crash_64
# SKIP: minimal
riscv64-unknown-elf-as -o misaligned_jump.o misaligned_jump.S && riscv64-unknown-elf-ld -o misaligned_jump64 misaligned_jump.o && rm misaligned_jump.o
riscv64-unknown-elf-as -o mop_adc.o mop_adc.S && riscv64-unknown-elf-ld -o mop_adc mop_adc.o && rm mop_adc.o
riscv64-unknown-elf-as -o mop_adcs.o mop_adcs.S && riscv64-unknown-elf-ld -o mop_adcs mop_adcs.o && rm mop_adcs.o
riscv64-unknown-elf-as -o mop_sbbs.o mop_sbbs.S && riscv64-unknown-elf-ld -o mop_sbbs mop_sbbs.o && rm mop_sbbs.o
riscv64-unknown-elf-as -o mop_add3.o mop_add3.S && riscv64-unknown-elf-ld -o mop_add3 mop_add3.o && rm mop_add3.o
riscv64-unknown-elf-as -march=rv64imc -o mop_far_jump.o mop_far_jump.S && riscv64-unknown-elf-ld -o mop_far_jump mop_far_jump.o && rm mop_far_jump.o
riscv64-unknown-elf-gcc -o mop_ld_signextend_32 mop_ld_signextend_32.c
riscv64-unknown-elf-as -o mop_ld_signextend_32_overflow_bug.o mop_ld_signextend_32_overflow_bug.S && riscv64-unknown-elf-ld -o mop_ld_signextend_32_overflow_bug mop_ld_signextend_32_overflow_bug.o && rm mop_ld_signextend_32_overflow_bug.o
riscv64-unknown-elf-as -o mop_random_adc_sbb.o mop_random_adc_sbb.S && riscv64-unknown-elf-ld -o mop_random_adc_sbb mop_random_adc_sbb.o && rm mop_random_adc_sbb.o
riscv64-unknown-elf-as -o mop_sbb.o mop_sbb.S && riscv64-unknown-elf-ld -o mop_sbb mop_sbb.o && rm mop_sbb.o
riscv64-unknown-elf-as -o mop_wide_div_zero.o mop_wide_div_zero.S && riscv64-unknown-elf-ld -o mop_wide_div_zero mop_wide_div_zero.o && rm mop_wide_div_zero.o
riscv64-unknown-elf-gcc -o mop_wide_divide mop_wide_divide.c
riscv64-unknown-elf-as -o mop_wide_mul_zero.o mop_wide_mul_zero.S && riscv64-unknown-elf-ld -o mop_wide_mul_zero mop_wide_mul_zero.o && rm mop_wide_mul_zero.o
riscv64-unknown-elf-gcc -o mop_wide_multiply mop_wide_multiply.c
riscv64-unknown-elf-as -o mulw.o mulw.S && riscv64-unknown-elf-ld -o mulw64 mulw.o && rm mulw.o
riscv64-unknown-elf-as -o nop64.o nop.S && riscv64-unknown-elf-ld -o nop64 nop64.o && rm nop64.o
riscv64-unknown-elf-as -o nop_loop.o nop_loop.S && riscv64-unknown-elf-ld -o nop_loop nop_loop.o && rm nop_loop.o
asm_link misaligned_jump misaligned_jump64
asm_link mop_adc
asm_link mop_adcs
asm_link mop_sbbs
asm_link mop_add3
asm_link -march=rv64imc mop_far_jump
gcc_compile mop_ld_signextend_32
asm_link mop_ld_signextend_32_overflow_bug
asm_link mop_random_adc_sbb
asm_link mop_sbb
asm_link mop_wide_div_zero
gcc_compile mop_wide_divide
asm_link mop_wide_mul_zero
gcc_compile mop_wide_multiply
asm_link mulw mulw64
asm_link nop nop64
asm_link nop_loop
# SKIP: op_rvc_slli_crash_32
# SKIP: op_rvc_srai_crash_32
# SKIP: op_rvc_srli_crash_32
riscv64-unknown-elf-gcc -o pause_resume pause_resume.c
gcc_compile pause_resume
# TODO: pcnt
riscv64-unknown-elf-as -o read_at_boundary.o read_at_boundary.S && riscv64-unknown-elf-ld -o read_at_boundary64 read_at_boundary.o && rm read_at_boundary.o
riscv64-unknown-elf-as -o read_memory.o read_memory.S && riscv64-unknown-elf-ld -o read_memory read_memory.o && rm read_memory.o
riscv64-unknown-elf-gcc -o reset_callee reset_callee.c
riscv64-unknown-elf-gcc -o reset_caller reset_caller.c
riscv64-unknown-elf-as -o rorw_in_end_of_aot_block.o rorw_in_end_of_aot_block.S && riscv64-unknown-elf-ld -o rorw_in_end_of_aot_block rorw_in_end_of_aot_block.o && rm rorw_in_end_of_aot_block.o
asm_link read_at_boundary read_at_boundary64
asm_link read_memory
gcc_compile reset_callee
gcc_compile reset_caller
asm_link rorw_in_end_of_aot_block
sh rvc_pageend.sh
# TODO: sbinvi_aot_load_imm_bug
riscv64-unknown-elf-as -o sc_after_sc.o sc_after_sc.S && riscv64-unknown-elf-ld -T sc_after_sc.lds -o sc_after_sc sc_after_sc.o && rm sc_after_sc.o
riscv64-unknown-elf-as -o sc_after_snapshot.o sc_after_snapshot.S && riscv64-unknown-elf-ld -T sc_after_snapshot.lds -o sc_after_snapshot sc_after_snapshot.o && rm sc_after_snapshot.o
riscv64-unknown-elf-as -o sc_only.o sc_only.S && riscv64-unknown-elf-ld -T sc_only.lds -o sc_only sc_only.o && rm sc_only.o
asm_link -T sc_after_sc.lds sc_after_sc
asm_link -T sc_after_snapshot.lds sc_after_snapshot
asm_link -T sc_only.lds sc_only
# SKIP: simple
riscv64-unknown-elf-gcc -o simple64 simple.c
riscv64-unknown-elf-as -o sp_alignment_test.o sp_alignment_test.S && riscv64-unknown-elf-ld -o sp_alignment_test sp_alignment_test.o && rm sp_alignment_test.o
riscv64-unknown-elf-gcc -o spawn spawn.c
riscv64-unknown-elf-as -o syscall.o syscall.S && riscv64-unknown-elf-ld -o syscall64 syscall.o && rm syscall.o
riscv64-unknown-elf-as -o trace.o trace.S && riscv64-unknown-elf-ld -o trace64 trace.o && rm trace.o
gcc_compile simple64 simple.c
asm_link sp_alignment_test
gcc_compile spawn
asm_link syscall syscall64
asm_link trace trace64
# SKIP: unaligned64
riscv64-unknown-elf-gcc -o writable_page writable_page.c && riscv64-unknown-elf-objdump -h writable_page > writable_page.dump
riscv64-unknown-elf-as -o write_at_boundary.o write_at_boundary.S && riscv64-unknown-elf-ld -o write_at_boundary64 write_at_boundary.o && rm write_at_boundary.o
riscv64-unknown-elf-as -o write_large_address.o write_large_address.S && riscv64-unknown-elf-ld -o write_large_address64 write_large_address.o && rm write_large_address.o
# riscv64-unknown-elf-as -march=rv64i_zba_zbb_zbc clmul_bug.S -o clmul_bug.o && riscv64-unknown-elf-ld clmul_bug.o -o clmul_bug && rm clmul_bug.o
# riscv64-unknown-elf-as -march=rv64i_zba_zbb_zbc orc_bug.S -o orc_bug.o && riscv64-unknown-elf-ld orc_bug.o -o orc_bug && rm orc_bug.o
riscv64-unknown-elf-as -o zero_address.o zero_address.S && riscv64-unknown-elf-ld -T zero_address.lds -o zero_address zero_address.o && rm zero_address.o
riscv64-unknown-elf-as -o mop_jump_rel_version1_bug.o mop_jump_rel_version1_bug.S && riscv64-unknown-elf-ld -o mop_jump_rel_version1_bug mop_jump_rel_version1_bug.o && rm mop_jump_rel_version1_bug.o
riscv64-unknown-elf-as -o mop_jump_rel_version1_reg_not_updated_bug.o mop_jump_rel_version1_reg_not_updated_bug.S && riscv64-unknown-elf-ld -o mop_jump_rel_version1_reg_not_updated_bug mop_jump_rel_version1_reg_not_updated_bug.o && rm mop_jump_rel_version1_reg_not_updated_bug.o
riscv64-unknown-elf-as -o mop_jump_abs_version1_reg_not_updated_bug.o mop_jump_abs_version1_reg_not_updated_bug.S && riscv64-unknown-elf-ld -o mop_jump_abs_version1_reg_not_updated_bug mop_jump_abs_version1_reg_not_updated_bug.o && rm mop_jump_abs_version1_reg_not_updated_bug.o
gcc_compile writable_page
${RISCV_PREFIX}-objdump -h writable_page > writable_page.dump
asm_link write_at_boundary write_at_boundary64
asm_link write_large_address write_large_address64
# asm_link -march=rv64i_zba_zbb_zbc clmul_bug
# asm_link -march=rv64i_zba_zbb_zbc orc_bug
asm_link -T zero_address.lds zero_address
asm_link mop_jump_rel_version1_bug
asm_link mop_jump_rel_version1_reg_not_updated_bug
asm_link mop_jump_abs_version1_reg_not_updated_bug
echo "done"
Loading