Program Status Word

From OSDev Wiki
Jump to navigation Jump to search

The PSW (Program Status Word) describes the current configuration for the context. It control whenever DAT is enabled or not, which allows virtual spaces. It also controls several flags such as the Wait state, Problem state, interrupt masking and other essential execution parameters.

While the 390 documentation lists the PSW in Most-Significant-Bit order, the PSW listed here will be in Least-Significant-Bit order for simplicity.

Bits Name
0 Extended addressing mode (z/Arch only)
1-7 Reserved
8 Unknown (?)
9 Enable exception for Exponent Underflow
10 Enable exception for Decimal Overflow
11 Enable exception for Fixed Point Overflow
12-13 Condition code
14-15 Address space control
16 Problem state (1=Disables unprivileged instruction execution)
17 Wait state (Wait for interrupt)
18 Machine Check Interrupt mask
19 1=S390, 0=z/Arch
20-23 PSW Key for complex memory protection
24 External Interrupt mask
25 Input/Output Interrupt mask
26 Enable DAT
27-29 Reserved
30 Enable program event recording
31 Reserved and must be 0

Examples

Structure (S390)

struct s390_psw {
    uint32_t flags;
    uint32_t address;
} __attribute__((packed, aligned(8)));

Structure (z/Arch)

struct s390x_psw {
    uint32_t hi_flags;
    uint32_t lo_flags; /* It's all zero except for the MSB (in S/390 order) */
    uint32_t hi_address;
    uint32_t lo_address;
} __attribute__((packed, aligned(8)));

Portable PSW declaration

/* Helper function to create a PSW adjusted to the current machine */
#if (MACHINE >= M_ZARCH)
#   define S390_PSW_DEFAULT_TYPE struct s390x_psw
#   define S390_PSW_DECL(name, address, flags)\
 S390_PSW_DEFAULT_TYPE name = {\
    (flags) | S390_PSW_AM64, S390_PSW_AM31, 0, (uint32_t)(address)\
}
#else
#   define S390_PSW_DEFAULT_TYPE struct s390_psw
#   define S390_PSW_DECL(name, address, flags)\
 S390_PSW_DEFAULT_TYPE name = {\
    (flags), (uint32_t)(address) + S390_PSW_DEFAULT_AMBIT\
}
#endif

const S390_PSW_DECL(
    wait_io_psw,
    0,
    S390_PSW_ENABLE_ARCHMODE | S390_PSW_ENABLE_MCI | S390_PSW_WAIT_STATE| S390_PSW_IO_INT | S390_PSW_DAT
);

Service Interrupt handler

.globl s390_supervisor_call_handler_stub
s390_supervisor_call_handler_stub:
    stm %r0, %r15, S390_FLCGRSAV
    lm %r0, %r15, S390_FLCCRSAV

    larl %r15, int_stack_bottom
    brasl %r14, s390_supervisor_call_handler

    lm %r0, %r15, S390_FLCGRSAV
    lpsw S390_FLCSOPSW

See also

External links

Source code