- .macro RESTORE_ALL # system exit macro
- mvc __LC_RETURN_PSW(8),SP_PSW(%r15) # move user PSW to lowcore
- ni __LC_RETURN_PSW+1,0xfd # clear wait state bit
- lm %r0,%r15,SP_R0(%r15) # load gprs 0-15 of user
- lpsw __LC_RETURN_PSW # back to caller
- .endm
-
- .macro CLEANUP_RESTORE_ALL
- l %r1,SP_PSW+4(%r15)
- cli 0(%r1),0x82
- jne 0f
- mvc SP_PSW(8,%r15),__LC_RETURN_PSW
- j 1f
-0: l %r1,SP_R15(%r15)
- mvc SP_PSW(8,%r15),SP_PSW(%r1)
- mvc SP_R0(64,%r15),SP_R0(%r1)
-1:
- .endm
-
- .macro GET_THREAD_INFO
- l %r9,__LC_THREAD_INFO
- .endm
-
- .macro CHECK_CRITICAL
- tm SP_PSW+1(%r15),0x01 # test problem state bit
- bnz BASED(0f) # from user -> not critical
- clc SP_PSW+4(4,%r15),BASED(.Lcritical_end)
- jnl 0f
- clc SP_PSW+4(4,%r15),BASED(.Lcritical_start)
- jl 0f
- l %r1,BASED(.Lcleanup_critical)
- basr %r14,%r1
-0:
+ .macro RESTORE_ALL sync
+ mvc __LC_RETURN_PSW(8),SP_PSW(%r15) # move user PSW to lowcore
+ .if !\sync
+ ni __LC_RETURN_PSW+1,0xfd # clear wait state bit
+ .endif
+ lm %r0,%r15,SP_R0(%r15) # load gprs 0-15 of user
+ lpsw __LC_RETURN_PSW # back to caller