Pointer Authentication Code for instruction address, using key B
This instruction computes and inserts a Pointer Authentication Code for an instruction address, using a modifier and key B.
The address is:
The modifier is:
If FEAT_PAuth_LR is implemented and PSTATE.PACM is 1, then PACIB1716 and PACIBSP include a second modifier that is:
A PACIBSP instruction has an implicit BTI instruction. The implicit BTI instruction of a PACIBSP instruction is always compatible with PSTATE.BTYPE == 0b01 and PSTATE.BTYPE == 0b10. Controls in SCTLR_ELx configure whether the implicit BTI instruction of a PACIBSP instruction is compatible with PSTATE.BTYPE == 0b11. For more information, see PSTATE.BTYPE.
Variants: FEAT_PAuth (ARMv8.3)
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
1 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | |||||||||||
sf | S | opcode2 | Z | Rn | Rd |
---|
PACIZB <Xd>
if !IsFeatureImplemented(FEAT_PAuth) then EndOfDecode(Decode_UNDEF); boolean source_is_sp = FALSE; constant boolean pacib1716 = FALSE; constant integer d = UInt(Rd); constant integer n = UInt(Rn); if Z == '0' then // PACIB if n == 31 then source_is_sp = TRUE; else // PACIZB if n != 31 then EndOfDecode(Decode_UNDEF);
Variants: FEAT_PAuth (ARMv8.3)
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
1 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | x | 1 | 0 | 1 | x | 1 | 1 | 1 | 1 | 1 |
CRm | op2 |
---|
PACIB1716
PACIBSP
PACIBZ
if !IsFeatureImplemented(FEAT_PAuth) then EndOfDecode(Decode_NOP); integer d; integer n; boolean source_is_sp = FALSE; boolean pacib1716 = FALSE; case CRm:op2 of when '0011 010' // PACIBZ d = 30; n = 31; when '0011 011' // PACIBSP d = 30; source_is_sp = TRUE; if IsFeatureImplemented(FEAT_BTI) then // Check for branch target compatibility between PSTATE.BTYPE // and implicit branch target of PACIBSP instruction. SetBTypeCompatible(BTypeCompatible_PACIXSP()); when '0001 010' // PACIB1716 d = 17; n = 16; pacib1716 = TRUE;
if source_is_sp then if IsFeatureImplemented(FEAT_PAuth_LR) && PSTATE.PACM == '1' then X[d, 64] = AddPACIB2(X[d, 64], SP[64], PC64); else X[d, 64] = AddPACIB(X[d, 64], SP[64]); else if IsFeatureImplemented(FEAT_PAuth_LR) && PSTATE.PACM == '1' && pacib1716 then X[d, 64] = AddPACIB2(X[d, 64], X[n, 64], X[15, 64]); else X[d, 64] = AddPACIB(X[d, 64], X[n, 64]);