You copied the Doc URL to your clipboard.

MSR (immediate)

Move immediate value to Special Register 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 ARMv8.0-SSBS is implemented, PSTATE.SSBS.
  • If ARMv8.1-PAN is implemented, PSTATE.PAN.
  • If ARMv8.2-UAO is implemented, PSTATE.UAO.
  • If ARMv8.4-DIT is implemented, PSTATE.DIT.

313029282726252423222120191817161514131211109876543210
1101010100000op10100CRmop211111

System

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');

PSTATEField field;
case op1:op2 of
    when '000 011'
        if !HaveUAOExt() then
            UNDEFINED;
        field = PSTATEField_UAO;
    when '000 100'
        if !HavePANExt() then
            UNDEFINED;
        field = PSTATEField_PAN;
    when '000 101' field = PSTATEField_SP;
    when '011 010'
        if !HaveDITExt() then
            UNDEFINED;
        field = PSTATEField_DIT;
    when '011 110' field = PSTATEField_DAIFSet;
    when '011 111' field = PSTATEField_DAIFClr;
    when '011 001'
        if !HaveSSBSExt() then
            UNDEFINED;
        field = PSTATEField_SSBS;
    otherwise UNDEFINED;

// Check that an AArch64 MSR/MRS access to the DAIF flags is permitted
if op1 == '011' && PSTATE.EL == EL0 && (IsInHost() || SCTLR_EL1.UMA == '0') then
    AArch64.SystemAccessTrap(EL1, 0x18);    // Exception_SystemRegisterTrap

Assembler Symbols

<pstatefield> Is a PSTATE field name, encoded in op1:op2:
op1 op2 <pstatefield> Architectural Feature
000 00x SEE PSTATE -
000 010 SEE PSTATE -
000 011 UAO ARMv8.2-UAO
000 100 PAN ARMv8.1-PAN
000 101 SPSel -
000 11x RESERVED -
001 xxx RESERVED -
010 xxx RESERVED -
011 000 RESERVED -
011 001 SSBS ARMv8.0-SpecRest
011 010 DIT ARMv8.4-DIT
011 011 RESERVED -
011 10x RESERVED -
011 110 DAIFSet -
011 111 DAIFClr -
1xx xxx RESERVED -
<imm>

Is a 4-bit unsigned immediate, in the range 0 to 15, encoded in the "CRm" field.

Operation

case field of
    when PSTATEField_SSBS
        PSTATE.SSBS = CRm<0>;
    when PSTATEField_SP
        PSTATE.SP = CRm<0>;
    when PSTATEField_DAIFSet
        PSTATE.D = PSTATE.D OR CRm<3>;
        PSTATE.A = PSTATE.A OR CRm<2>;
        PSTATE.I = PSTATE.I OR CRm<1>;
        PSTATE.F = PSTATE.F OR CRm<0>;
    when PSTATEField_DAIFClr
        PSTATE.D = PSTATE.D AND NOT(CRm<3>);
        PSTATE.A = PSTATE.A AND NOT(CRm<2>);
        PSTATE.I = PSTATE.I AND NOT(CRm<1>);
        PSTATE.F = PSTATE.F AND NOT(CRm<0>);
    when PSTATEField_PAN
        PSTATE.PAN = CRm<0>;
    when PSTATEField_UAO
        PSTATE.UAO = CRm<0>;
    when PSTATEField_DIT
        PSTATE.DIT = CRm<0>;
Was this page helpful? Yes No