Skip to content

Commit 17c0633

Browse files
committed
CFI in asm (aarch64)
1 parent dc0f126 commit 17c0633

File tree

1 file changed

+57
-0
lines changed

1 file changed

+57
-0
lines changed

src/machine/asm/execute_aarch64.S

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,20 @@
110110
str ZERO_VALUE, ZERO_ADDRESS SEP \
111111
NEXT_INST
112112

113+
#define SS_GET(addr_reg, temp_reg) \
114+
ldr TEMP4, =65528 SEP \
115+
cmp addr_reg, TEMP4 SEP \
116+
bhi .exit_shadow_stack_stack_out_of_stack SEP \
117+
add TEMP4, MACHINE, CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_SHADOW_STACK SEP \
118+
ldr temp_reg, [TEMP4, addr_reg]
119+
120+
#define SS_SET(addr_reg, from_reg) \
121+
ldr TEMP4, =65528 SEP \
122+
cmp addr_reg, TEMP4 SEP \
123+
bhi .exit_shadow_stack_stack_out_of_stack SEP \
124+
add TEMP4, MACHINE, CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_SHADOW_STACK SEP \
125+
str from_reg, [TEMP4, addr_reg]
126+
113127
#define DECODE_R \
114128
ubfx RS1, TEMP1, 0, 8 SEP \
115129
ubfx RS2, TEMP1, 8, 8
@@ -1896,21 +1910,64 @@ ckb_vm_x64_execute:
18961910
NEXT_INST_V2
18971911
.CKB_VM_ASM_LABEL_OP_LPAD:
18981912
DECODE_U
1913+
ldrb TEMP1w, [MACHINE, CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_ELP]
1914+
cmp TEMP1, 0
1915+
beq .lpad_branch_success
1916+
ldr TEMP1, PC_ADDRESS
1917+
and TEMP1, TEMP1, 3
1918+
cbnz TEMP1, .exit_shadow_stack_software_check_exception
1919+
ldr TEMP1, [MACHINE, CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_REGISTERS + CKB_VM_ASM_REGISTER_T2 * 8]
1920+
lsr TEMP1, TEMP1, 12
1921+
cmp IMMEDIATE, 0
1922+
beq .lpad_branch_success
1923+
cmp IMMEDIATE, TEMP1
1924+
bne .exit_shadow_stack_software_check_exception
1925+
.lpad_branch_success:
1926+
strb wzr, [MACHINE, CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_ELP]
18991927
NEXT_INST
19001928
.CKB_VM_ASM_LABEL_OP_SSPUSH:
19011929
DECODE_R
1930+
ldr TEMP1, [MACHINE, CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_SSP]
1931+
ldr TEMP2, REGISTER_ADDRESS(RS2)
1932+
sub TEMP1, TEMP1, 8
1933+
SS_SET(TEMP1, TEMP2)
1934+
str TEMP1, [MACHINE, CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_SSP]
19021935
NEXT_INST
19031936
.CKB_VM_ASM_LABEL_OP_SSPOPCHK:
19041937
DECODE_I
1938+
ldr TEMP1, REGISTER_ADDRESS(RS1)
1939+
ldr TEMP2, [MACHINE, CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_SSP]
1940+
SS_GET(TEMP2, TEMP3)
1941+
add TEMP2, TEMP2, 8
1942+
str TEMP2, [MACHINE, CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_SSP]
1943+
cmp TEMP1, TEMP3
1944+
bne .exit_shadow_stack_software_check_exception
19051945
NEXT_INST
19061946
.CKB_VM_ASM_LABEL_OP_SSRDP:
19071947
DECODE_I
1948+
ldr TEMP1, [MACHINE, CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_SSP]
1949+
WRITE_RD(TEMP1)
19081950
NEXT_INST
19091951
.CKB_VM_ASM_LABEL_OP_SSAMOSWAP_W:
19101952
DECODE_R
1953+
ldr TEMP1, REGISTER_ADDRESS(RS1)
1954+
ldr TEMP2, REGISTER_ADDRESS(RS2)
1955+
SS_GET(TEMP1, TEMP3)
1956+
sxtw TEMP4, TEMP3w
1957+
asr TEMP3, TEMP3, 32
1958+
lsl TEMP3, TEMP3, 32
1959+
and TEMP2, TEMP2, 0xFFFFFFFF
1960+
orr TEMP2, TEMP2, TEMP3
1961+
SS_SET(TEMP1, TEMP2)
1962+
WRITE_RD(TEMP4)
19111963
NEXT_INST
19121964
.CKB_VM_ASM_LABEL_OP_SSAMOSWAP_D:
19131965
DECODE_R
1966+
ldr TEMP1, REGISTER_ADDRESS(RS1)
1967+
ldr TEMP2, REGISTER_ADDRESS(RS2)
1968+
SS_GET(TEMP1, TEMP3)
1969+
SS_SET(TEMP1, TEMP2)
1970+
WRITE_RD(TEMP3)
19141971
NEXT_INST
19151972
.exit_max_cycles_exceeded:
19161973
mov x0, CKB_VM_ASM_RET_MAX_CYCLES_EXCEEDED

0 commit comments

Comments
 (0)