|
110 | 110 | str ZERO_VALUE, ZERO_ADDRESS SEP \ |
111 | 111 | NEXT_INST |
112 | 112 |
|
| 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 | + |
113 | 127 | #define DECODE_R \ |
114 | 128 | ubfx RS1, TEMP1, 0, 8 SEP \ |
115 | 129 | ubfx RS2, TEMP1, 8, 8 |
@@ -1896,21 +1910,64 @@ ckb_vm_x64_execute: |
1896 | 1910 | NEXT_INST_V2 |
1897 | 1911 | .CKB_VM_ASM_LABEL_OP_LPAD: |
1898 | 1912 | 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] |
1899 | 1927 | NEXT_INST |
1900 | 1928 | .CKB_VM_ASM_LABEL_OP_SSPUSH: |
1901 | 1929 | 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] |
1902 | 1935 | NEXT_INST |
1903 | 1936 | .CKB_VM_ASM_LABEL_OP_SSPOPCHK: |
1904 | 1937 | 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 |
1905 | 1945 | NEXT_INST |
1906 | 1946 | .CKB_VM_ASM_LABEL_OP_SSRDP: |
1907 | 1947 | DECODE_I |
| 1948 | + ldr TEMP1, [MACHINE, CKB_VM_ASM_ASM_CORE_MACHINE_OFFSET_SSP] |
| 1949 | + WRITE_RD(TEMP1) |
1908 | 1950 | NEXT_INST |
1909 | 1951 | .CKB_VM_ASM_LABEL_OP_SSAMOSWAP_W: |
1910 | 1952 | 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) |
1911 | 1963 | NEXT_INST |
1912 | 1964 | .CKB_VM_ASM_LABEL_OP_SSAMOSWAP_D: |
1913 | 1965 | 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) |
1914 | 1971 | NEXT_INST |
1915 | 1972 | .exit_max_cycles_exceeded: |
1916 | 1973 | mov x0, CKB_VM_ASM_RET_MAX_CYCLES_EXCEEDED |
|
0 commit comments