MSR (immediate) Move immediate value to special register This instruction moves an immediate value to selected bits of the PSTATE. For more information, see Process state, PSTATE. The bits that can be written by this instruction are: PSTATE.D, PSTATE.A, PSTATE.I, PSTATE.F, and PSTATE.SP. If FEAT_SSBS is implemented, PSTATE.SSBS. If FEAT_PAN is implemented, PSTATE.PAN. If FEAT_UAO is implemented, PSTATE.UAO. If FEAT_DIT is implemented, PSTATE.DIT. If FEAT_MTE is implemented, PSTATE.TCO. If FEAT_NMI is implemented, PSTATE.ALLINT. If FEAT_SME is implemented, PSTATE.SM and PSTATE.ZA. If FEAT_EBEP is implemented, PSTATE.PM. This instruction is used by the aliases SMSTART op1 == '011' && CRm IN {'0xx1'} && op2 == '011' SMSTOP op1 == '011' && CRm IN {'0xx0'} && op2 == '011' See below for details of when each alias is preferred. 1 1 0 1 0 1 0 1 0 0 0 0 0 0 1 0 0 1 1 1 1 1 MSR <pstatefield>, #<imm> if op1 == '000' && op2 == '000' then SEE "CFINV"; if op1 == '000' && op2 == '001' then SEE "XAFLAG"; if op1 == '000' && op2 == '010' then SEE "AXFLAG"; AArch64.CheckSystemAccess('00', op1, '0100', CRm, op2, '11111', '0'); bits(2) min_EL; boolean need_secure = FALSE; case op1 of when '00x' min_EL = EL1; when '010' min_EL = EL1; when '011' min_EL = EL0; when '100' min_EL = EL2; when '101' if !IsFeatureImplemented(FEAT_VHE) then UNDEFINED; min_EL = EL2; when '110' min_EL = EL3; when '111' min_EL = EL1; need_secure = TRUE; if (UInt(PSTATE.EL) < UInt(min_EL) || (need_secure && CurrentSecurityState() != SS_Secure)) then UNDEFINED; constant bits(4) operand = CRm; PSTATEField field; case op1:op2 of when '000 011' if !IsFeatureImplemented(FEAT_UAO) then UNDEFINED; field = PSTATEField_UAO; when '000 100' if !IsFeatureImplemented(FEAT_PAN) then UNDEFINED; field = PSTATEField_PAN; when '000 101' field = PSTATEField_SP; when '001 000' case CRm of when '000x' if !IsFeatureImplemented(FEAT_NMI) then UNDEFINED; field = PSTATEField_ALLINT; when '001x' if !IsFeatureImplemented(FEAT_EBEP) then UNDEFINED; field = PSTATEField_PM; otherwise UNDEFINED; when '011 010' if !IsFeatureImplemented(FEAT_DIT) then UNDEFINED; field = PSTATEField_DIT; when '011 011' case CRm of when '001x' if !IsFeatureImplemented(FEAT_SME) then UNDEFINED; field = PSTATEField_SVCRSM; when '010x' if !IsFeatureImplemented(FEAT_SME) then UNDEFINED; field = PSTATEField_SVCRZA; when '011x' if !IsFeatureImplemented(FEAT_SME) then UNDEFINED; field = PSTATEField_SVCRSMZA; otherwise UNDEFINED; when '011 100' if !IsFeatureImplemented(FEAT_MTE) then UNDEFINED; field = PSTATEField_TCO; when '011 110' field = PSTATEField_DAIFSet; when '011 111' field = PSTATEField_DAIFClr; when '011 001' if !IsFeatureImplemented(FEAT_SSBS) then UNDEFINED; field = PSTATEField_SSBS; otherwise UNDEFINED; <pstatefield> Is a PSTATE field name. For the MSR instruction, this is CRm<3:1> op1 op2 <pstatefield> Architectural Feature xxx 000 011 UAO xxx 000 100 PAN xxx 000 101 SPSel xxx 000 11x RESERVED 000 001 000 ALLINT xxx 001 001 RESERVED xxx 001 01x RESERVED xxx 001 1xx RESERVED xxx 010 xxx RESERVED xxx 011 000 RESERVED xxx 011 001 SSBS xxx 011 010 DIT 000 011 011 RESERVED xxx 011 100 TCO xxx 011 101 RESERVED xxx 011 110 DAIFSet xxx 011 111 DAIFClr xxx 1xx xxx RESERVED 001 001 000 PM 001 011 011 SVCRSM 01x 001 000 RESERVED 010 011 011 SVCRZA 011 011 011 SVCRSMZA 1xx 001 000 RESERVED 1xx 011 011 RESERVED
For the SMSTART and SMSTOP aliases, this is encoded in "CRm<2:1>", where 0b01 specifies SVCRSM, 0b10 specifies SVCRZA, and 0b11 specifies SVCRSMZA.
<imm> Is a 4-bit unsigned immediate, in the range 0 to 15, encoded in the "CRm" field. Restricted to the range 0 to 1, encoded in "CRm<0>", when <pstatefield> is ALLINT, PM, SVCRSM, SVCRSMZA, or SVCRZA.
Alias Conditions case field of when PSTATEField_SSBS PSTATE.SSBS = operand<0>; when PSTATEField_SP PSTATE.SP = operand<0>; when PSTATEField_DAIFSet AArch64.CheckDAIFAccess(PSTATEField_DAIFSet); PSTATE.D = PSTATE.D OR operand<3>; PSTATE.A = PSTATE.A OR operand<2>; PSTATE.I = PSTATE.I OR operand<1>; PSTATE.F = PSTATE.F OR operand<0>; when PSTATEField_DAIFClr AArch64.CheckDAIFAccess(PSTATEField_DAIFClr); PSTATE.D = PSTATE.D AND NOT(operand<3>); PSTATE.A = PSTATE.A AND NOT(operand<2>); PSTATE.I = PSTATE.I AND NOT(operand<1>); PSTATE.F = PSTATE.F AND NOT(operand<0>); when PSTATEField_PAN PSTATE.PAN = operand<0>; when PSTATEField_UAO PSTATE.UAO = operand<0>; when PSTATEField_DIT PSTATE.DIT = operand<0>; when PSTATEField_TCO PSTATE.TCO = operand<0>; when PSTATEField_ALLINT if (PSTATE.EL == EL1 && IsHCRXEL2Enabled() && HCRX_EL2.TALLINT == '1' && operand<0> == '1') then AArch64.SystemAccessTrap(EL2, 0x18); PSTATE.ALLINT = operand<0>; when PSTATEField_SVCRSM CheckSMEAccess(); SetPSTATE_SM(operand<0>); when PSTATEField_SVCRZA CheckSMEAccess(); SetPSTATE_ZA(operand<0>); when PSTATEField_SVCRSMZA CheckSMEAccess(); SetPSTATE_SM(operand<0>); SetPSTATE_ZA(operand<0>); when PSTATEField_PM PSTATE.PM = operand<0>;