The one exception to this is when an XPLINK function calls a function defined as either OS_UPSTACK or OS_NOSTACK. In this case the called function is non-XPLINK and uses OS linkage conventions. However, since the bind step of XPLINK and non-XPLINK executables uses different data sets (see Planning to link-edit and run), all external references from the non-XPLINK function must be resolved using the XPLINK link-edit data sets. For example, if a called OS_UPSTACK function makes a call to the C runtime (RTL), the C RTL function must be resolved via the CELHS003 side deck in SCEELIB. It cannot use the SCEELKED static stubs since these are not used to bind XPLINK objects.
The intent of OS_UPSTACK is to be able to call a non-XPLINK function that is not going to be recompiled or rewritten as XPLINK, but is itself a leaf routine and does not make any further calls. The intent of OS_NOSTACK is to call non-XPLINK functions that only need an OS linkage register save area, and are either leaf routines or make calls to other system services that do not use the Language Environment stack.
The intent of the XPLINK Assembler support is to be able to call an Assembler function that was rewritten using XPLINK conventions (either for performance reasons or to perform some function not easily implemented in C or C++), but is itself a leaf routine and does not make any further calls.