This is a collection of Intel®’ IA32® Software Developer's Manuals (URL of the day) and AMD' AMD64 Architecture Programmer's Manual together with the related specifications, application notes, white papers, and change logs. The collection aims to keep all available revisions. It was originally created by Michal Necasek, see OS/2 Museum.

If you have a public document, related to the IA32® specifications and missing from the collection, please mail it to me. The content of this URL and all sub-ULRs is available for convenient bulk download by rsync x86docs password "" (empty).

S2PIR_EL2

S2PIR_EL2, Stage 2 Permission Indirection Register (EL2)

The S2PIR_EL2 characteristics are:

Purpose

Stage 2 Permission Indirection Register for EL1&0 translation regime.

Configuration

This register is present only when FEAT_S2PIE is implemented and FEAT_AA64 is implemented. Otherwise, direct accesses to S2PIR_EL2 are UNDEFINED.

If EL2 is not implemented, this register is RES0 from EL3.

Attributes

S2PIR_EL2 is a 64-bit register.

Field descriptions

6362616059585756555453525150494847464544434241403938373635343332
313029282726252423222120191817161514131211109876543210
Perm15Perm14Perm13Perm12Perm11Perm10Perm9Perm8
Perm7Perm6Perm5Perm4Perm3Perm2Perm1Perm0

Perm<m>, bits [4m+3:4m], for m = 15 to 0

Represents stage 2 Base Permissions.

Perm<m>Meaning
0b0000

No Access.

0b0001

Reserved - treated as No Access.

0b0010

MRO.

0b0011

MRO-TL1.

0b0100

WO.

0b0101

Reserved - treated as No Access.

0b0110

MRO-TL0.

0b0111

MRO-TL01.

0b1000

RO.

0b1001

RO+uX.

0b1010

RO+pX.

0b1011

RO+puX.

0b1100

RW.

0b1101

RW+uX.

0b1110

RW+pX.

0b1111

RW+puX.

This field is permitted to be cached in a TLB.

When stage 2 Indirect Permission mechanism is disabled, the contents of this register are ignored.

The reset behavior of this field is:

Accessing S2PIR_EL2

Accesses to this register use the following encodings in the System register encoding space:

MRS <Xt>, S2PIR_EL2

op0op1CRnCRmop2
0b110b1000b10100b00100b101

if !(IsFeatureImplemented(FEAT_S2PIE) && IsFeatureImplemented(FEAT_AA64)) then Undefined(); elsif PSTATE.EL == EL0 then Undefined(); elsif PSTATE.EL == EL1 then if EffectiveHCR_EL2_NVx() IN {'1x1'} then X{64}(t) = NVMem(0x2B0); elsif EffectiveHCR_EL2_NVx() IN {'xx1'} then AArch64_SystemAccessTrap(EL2, 0x18); else Undefined(); end; elsif PSTATE.EL == EL2 then if HaveEL(EL3) && EL3SDDUndefPriority() && SCR_EL3().PIEn == '0' then Undefined(); elsif HaveEL(EL3) && SCR_EL3().PIEn == '0' then if EL3SDDUndef() then Undefined(); else AArch64_SystemAccessTrap(EL3, 0x18); end; else X{64}(t) = S2PIR_EL2(); end; elsif PSTATE.EL == EL3 then X{64}(t) = S2PIR_EL2(); end;

MSR S2PIR_EL2, <Xt>

op0op1CRnCRmop2
0b110b1000b10100b00100b101

if !(IsFeatureImplemented(FEAT_S2PIE) && IsFeatureImplemented(FEAT_AA64)) then Undefined(); elsif PSTATE.EL == EL0 then Undefined(); elsif PSTATE.EL == EL1 then if EffectiveHCR_EL2_NVx() IN {'1x1'} then NVMem(0x2B0) = X{64}(t); elsif EffectiveHCR_EL2_NVx() IN {'xx1'} then AArch64_SystemAccessTrap(EL2, 0x18); else Undefined(); end; elsif PSTATE.EL == EL2 then if HaveEL(EL3) && EL3SDDUndefPriority() && SCR_EL3().PIEn == '0' then Undefined(); elsif HaveEL(EL3) && SCR_EL3().PIEn == '0' then if EL3SDDUndef() then Undefined(); else AArch64_SystemAccessTrap(EL3, 0x18); end; else S2PIR_EL2() = X{64}(t); end; elsif PSTATE.EL == EL3 then S2PIR_EL2() = X{64}(t); end;


2026-03-12 12:23:09, 2025-09_rel_asl1

Copyright © 2010-2025 Arm Limited or its affiliates. All rights reserved. This document is Non-Confidential.