/***************************************************************************/ /** **/ /** HPE CONFIDENTIAL. This software is confidential proprietary software **/ /** licensed by Hewlett-Packard Enterprise Development, LP, and is not **/ /** authorized to be used, duplicated OR disclosed to anyone without the **/ /** prior written permission of HPE. **/ /** © 2023 Copyright Hewlett-Packard Enterprise Development, LP **/ /** **/ /** VMS SOFTWARE, INC. CONFIDENTIAL. This software is confidential **/ /** proprietary software licensed by VMS Software, Inc., and is not **/ /** authorized to be used, duplicated or disclosed to anyone without **/ /** the prior written permission of VMS Software, Inc. **/ /** © 2023 Copyright VMS Software, Inc. **/ /** **/ /***************************************************************************/ /********************************************************************************************************************************/ /* Created: 9-Nov-2023 12:06:49 by OpenVMS SDL V3.7 */ /* Source: 02-MAR-2022 06:58:38 $1$DGA8345:[LIB_H.SRC]INTSTKDEF.SDL;1 */ /********************************************************************************************************************************/ /*** MODULE $INTSTKDEF ***/ #ifndef __INTSTKDEF_LOADED #define __INTSTKDEF_LOADED 1 #pragma __nostandard /* This file uses non-ANSI-Standard features */ #pragma __member_alignment __save #pragma __nomember_alignment #ifdef __INITIAL_POINTER_SIZE /* Defined whenever ptr size pragmas supported */ #pragma __required_pointer_size __save /* Save the previously-defined required ptr size */ #pragma __required_pointer_size __short /* And set ptr size default to 32-bit pointers */ #endif #ifdef __cplusplus extern "C" { #define __unknown_params ... #define __optional_params ... #else #define __unknown_params #define __optional_params ... #endif #ifndef __struct #if !defined(__VAXC) #define __struct struct #else #define __struct variant_struct #endif #endif #ifndef __union #if !defined(__VAXC) #define __union union #else #define __union variant_union #endif #endif /* */ /* Interrupt stack - this defines the interrupt frame, which will be on the kernel */ /* or interrupt stack on x86. It is created by the code in XSWIS_EXCEPTION.S */ /* */ /* [LIB]CPUDEF.SDL contains a group of cells BC_FLAGS through BC_SS */ /* which must match the layout here. If $INTSTKDEF is changed, then */ /* $CPUDEF must be changed too. */ /* */ #define INTSTK$M_AST_CALLED 0x1 #define INTSTK$M_ASTDEL 0x2 #define INTSTK$M_XSAVE_SAVED 0x4 #define INTSTK$M_FAULTY_TOWERS 0x8 #define INTSTK$M_IMSEM 0x10 #define INTSTK$M_ALPHAREG_SAVED 0x20 #define INTSTK$M_FROM_SSENTRY 0x40 #if !defined(__NOBASEALIGN_SUPPORT) && !defined(__cplusplus) /* If using pre DECC V4.0 or C++ */ #pragma __nomember_alignment __quadword #else #pragma __nomember_alignment #endif typedef struct _intstk { #pragma __nomember_alignment __union { unsigned char intstk$b_flags; __struct { unsigned intstk$v_ast_called : 1; /* ASTDEL has been called at least once with this frame */ unsigned intstk$v_astdel : 1; /* Performing outer-mode AST delivery */ unsigned intstk$v_xsave_saved : 1; /* XSAVE state saved prior to AST delivery */ unsigned intstk$v_faulty_towers : 1; /* Re-execute system service */ unsigned intstk$v_imsem : 1; /* Inner-mode semaphore needs to be released */ unsigned intstk$v_alphareg_saved : 1; /* Alpha registers saved in this frame */ unsigned intstk$v_from_ssentry : 1; /* in EXE$REFLECT(_SS) the INTSTK was built from an SSENTRY- overlays SSENTRY's SS_\ LOGGED */ unsigned intstk$v_fill_0_ : 1; } intstk$r_flag_bits; } intstk$r_flags_union; unsigned char intstk$b_pprevmode; /* Save interrupted context's PREVMODE */ __union { unsigned char intstk$b_prevmode; /* Save interrupted context's CURMODE */ unsigned char intstk$b_prevstack; } intstk$r_prevmode_union; unsigned char intstk$b_ipl; /* SWIS IPL state */ unsigned int intstk$l_stkalign; /* How much allocated on this stack for int frame? Guaranteed that */ /* STKALIGN & 0XFFF0 is the actual length of the structure. In other */ /* words, the structure is always allocated on a 16-byte boundary is */ /* is a multiple of 16-bytes long. */ __union { unsigned short int intstk$w_size; __struct { unsigned char intstk$b_astmode; /* Current AST delivery mode */ unsigned char intstk$b_interrupt_depth; } intstk$r_size_struct; } intstk$r_size_union; unsigned char intstk$b_type; /* Make this structure look like a standard VMS structure */ unsigned char intstk$b_subtype; int intstk$l_trap_type; /* Trap type */ unsigned __int64 intstk$q_fsbase; /* Saved base of FS segment */ unsigned __int64 intstk$q_rax; /* Saved x86 registers */ unsigned __int64 intstk$q_rdi; unsigned __int64 intstk$q_rsi; unsigned __int64 intstk$q_rdx; unsigned __int64 intstk$q_rcx; unsigned __int64 intstk$q_r8; unsigned __int64 intstk$q_r9; unsigned __int64 intstk$q_rbx; unsigned __int64 intstk$q_rbp; unsigned __int64 intstk$q_r10; unsigned __int64 intstk$q_r11; unsigned __int64 intstk$q_r12; unsigned __int64 intstk$q_r13; unsigned __int64 intstk$q_r14; unsigned __int64 intstk$q_r15; unsigned __int64 intstk$q_alphareg [32]; /* Saved emulated Alpha registers */ #ifdef __INITIAL_POINTER_SIZE /* Defined whenever ptr size pragmas supported */ #pragma __required_pointer_size __long /* And set ptr size default to 64-bit pointers */ void *intstk$pq_prev_frame; /* Pointer to the previously active Interrupt/SSENTRY frame */ #else unsigned __int64 intstk$pq_prev_frame; #endif int intstk$l_prev_frame_mode; /* Mode interrupted by the previous frame */ unsigned int intstk$l_filler_pfm; unsigned short int intstk$w_cpu_num; unsigned short int intstk$w_ssentry_offset; unsigned short int intstk$w_filler_2 [2]; unsigned __int64 intstk$q_vector; /* Interrupt vector we came in on */ unsigned __int64 intstk$q_error_code; /* From here on this is the CPU-defined frame */ unsigned __int64 intstk$q_rip; unsigned __int64 intstk$q_cs; unsigned __int64 intstk$q_rflags; unsigned __int64 intstk$q_rsp; unsigned __int64 intstk$q_ss; } INTSTK; #if !defined(__VAXC) #define intstk$b_flags intstk$r_flags_union.intstk$b_flags #define intstk$r_flag_bits intstk$r_flags_union.intstk$r_flag_bits #define intstk$v_ast_called intstk$r_flag_bits.intstk$v_ast_called #define intstk$v_astdel intstk$r_flag_bits.intstk$v_astdel #define intstk$v_xsave_saved intstk$r_flag_bits.intstk$v_xsave_saved #define intstk$v_faulty_towers intstk$r_flag_bits.intstk$v_faulty_towers #define intstk$v_imsem intstk$r_flag_bits.intstk$v_imsem #define intstk$v_alphareg_saved intstk$r_flag_bits.intstk$v_alphareg_saved #define intstk$v_from_ssentry intstk$r_flag_bits.intstk$v_from_ssentry #define intstk$b_prevmode intstk$r_prevmode_union.intstk$b_prevmode #define intstk$b_prevstack intstk$r_prevmode_union.intstk$b_prevstack #define intstk$w_size intstk$r_size_union.intstk$w_size #define intstk$r_size_struct intstk$r_size_union.intstk$r_size_struct #define intstk$b_astmode intstk$r_size_struct.intstk$b_astmode #define intstk$b_interrupt_depth intstk$r_size_struct.intstk$b_interrupt_depth #endif /* #if !defined(__VAXC) */ #define INTSTK$K_LENGTH 480 #define INTSTK$C_LENGTH 480 #define INTSTK$S_INTSTKDEF 480 /* Old size name, synonym for INTSTK$S_INTSTK */ #define SSENTRY$M_AST_CALLED 0x1 #define SSENTRY$M_ASTDEL 0x2 #define SSENTRY$M_XSAVE_SAVED 0x4 #define SSENTRY$M_FAULTY_TOWERS 0x8 #define SSENTRY$M_IMSEM 0x10 #define SSENTRY$M_ALPHAREG_SAVED 0x20 #define SSENTRY$M_SS_LOGGED 0x40 #if !defined(__NOBASEALIGN_SUPPORT) && !defined(__cplusplus) /* If using pre DECC V4.0 or C++ */ #pragma __nomember_alignment __quadword #else #pragma __nomember_alignment #endif typedef struct _ssentry { #pragma __nomember_alignment __union { unsigned char ssentry$b_flags; __struct { unsigned ssentry$v_ast_called : 1; /* ASTDEL has been called at least once with this frame */ unsigned ssentry$v_astdel : 1; /* Performing outer-mode AST delivery */ unsigned ssentry$v_xsave_saved : 1; /* XSAVE state saved prior to AST delivery */ unsigned ssentry$v_faulty_towers : 1; /* Re-execute system service */ unsigned ssentry$v_imsem : 1; /* Inner-mode semaphore needs to be released */ unsigned ssentry$v_alphareg_saved : 1; /* Alpha registers saved in this frame */ unsigned ssentry$v_ss_logged : 1; /* Service is being logged */ unsigned ssentry$v_fill_1_ : 1; } ssentry$r_flag_bits; } ssentry$r_flags_union; unsigned char ssentry$b_pprevmode; /* Save interrupted context's PREVMODE */ __union { unsigned char ssentry$b_prevmode; /* Save interrupted context's CURMODE */ unsigned char ssentry$b_prevstack; } ssentry$r_prevmode_union; unsigned char ssentry$b_ipl; /* SWIS IPL state */ unsigned int ssentry$l_stkalign; /* How much allocated on this stack for int frame? Guaranteed that */ /* STKALIGN & 0XFFF0 is the actual length of the structure. In other */ /* words, the structure is always allocated on a 16-byte boundary is */ /* is a multiple of 16-bytes long. */ __union { unsigned short int ssentry$w_size; __struct { unsigned char ssentry$b_astmode; /* Current AST delivery mode */ char ssentry$b_filler_1; } ssentry$r_size_struct; } ssentry$r_size_union; unsigned char ssentry$b_type; /* Make this structure look like a standard VMS structure */ unsigned char ssentry$b_subtype; int ssentry$l_filler_3; unsigned __int64 ssentry$q_fsbase; /* Saved base of FS segment */ unsigned __int64 ssentry$q_arg_info; /* RAX */ unsigned __int64 ssentry$q_arg1; /* RDI */ unsigned __int64 ssentry$q_arg2; /* RSI */ unsigned __int64 ssentry$q_arg3; /* RDX */ unsigned __int64 ssentry$q_arg4; /* RCX */ unsigned __int64 ssentry$q_arg5; /* R8 */ unsigned __int64 ssentry$q_arg6; /* R9 */ unsigned __int64 ssentry$q_ss_log_seq; /* System service logging sequence number */ unsigned __int64 ssentry$q_ss_log_buf; /* System service logging buffer address */ unsigned __int64 ssentry$q_ret1; /* RAX return value 1 */ unsigned __int64 ssentry$q_ret2; /* RDX return value 2 */ unsigned __int64 ssentry$q_r12; unsigned __int64 ssentry$q_r13; /* Add a SSDISP structure for temporary use (in case of a priv. image provided service) */ unsigned __int64 ssentry$q_ssdisp_procedure; /* Pointer to the actual procedure */ unsigned int ssentry$l_ssdisp_flags; /* System Service flags */ unsigned char ssentry$b_ssdisp_mode; /* Execution mode for the system service */ char ssentry$b_ssdisp_filler [3]; unsigned __int64 ssentry$q_alphareg [32]; /* Saved emulated Alpha registers */ #ifdef __INITIAL_POINTER_SIZE /* Defined whenever ptr size pragmas supported */ #pragma __required_pointer_size __long /* And set ptr size default to 64-bit pointers */ void *ssentry$pq_prev_frame; /* Pointer to the previously active Interrupt/SSENTRY frame */ #else unsigned __int64 ssentry$pq_prev_frame; #endif int ssentry$l_prev_frame_mode; /* Mode interrupted by the previous frame */ unsigned int ssentry$l_filler_pfm; __int64 ssentry$q_filler_3; unsigned __int64 ssentry$q_service_number; /* Number of the system service called */ unsigned __int64 ssentry$q_service_flags; unsigned __int64 ssentry$q_rip; /* Return Address */ unsigned __int64 ssentry$q_stkargs_size; unsigned __int64 ssentry$q_rflags; unsigned __int64 ssentry$q_rsp; #ifdef __INITIAL_POINTER_SIZE /* Defined whenever ptr size pragmas supported */ #pragma __required_pointer_size __long /* And set ptr size default to 64-bit pointers */ void *ssentry$pq_copied_to; #else unsigned __int64 ssentry$pq_copied_to; #endif } SSENTRY; #if !defined(__VAXC) #define ssentry$b_flags ssentry$r_flags_union.ssentry$b_flags #define ssentry$r_flag_bits ssentry$r_flags_union.ssentry$r_flag_bits #define ssentry$v_ast_called ssentry$r_flag_bits.ssentry$v_ast_called #define ssentry$v_astdel ssentry$r_flag_bits.ssentry$v_astdel #define ssentry$v_xsave_saved ssentry$r_flag_bits.ssentry$v_xsave_saved #define ssentry$v_faulty_towers ssentry$r_flag_bits.ssentry$v_faulty_towers #define ssentry$v_imsem ssentry$r_flag_bits.ssentry$v_imsem #define ssentry$v_alphareg_saved ssentry$r_flag_bits.ssentry$v_alphareg_saved #define ssentry$v_ss_logged ssentry$r_flag_bits.ssentry$v_ss_logged #define ssentry$b_prevmode ssentry$r_prevmode_union.ssentry$b_prevmode #define ssentry$b_prevstack ssentry$r_prevmode_union.ssentry$b_prevstack #define ssentry$w_size ssentry$r_size_union.ssentry$w_size #define ssentry$r_size_struct ssentry$r_size_union.ssentry$r_size_struct #define ssentry$b_astmode ssentry$r_size_struct.ssentry$b_astmode #endif /* #if !defined(__VAXC) */ #define SSENTRY$K_LENGTH 480 #define SSENTRY$C_LENGTH 480 /* X86_64, IA64, Alpha */ #ifdef __INITIAL_POINTER_SIZE #pragma __required_pointer_size __save /* Save current pointer size */ #pragma __required_pointer_size __long /* Pointers are 64-bit */ typedef INTSTK *INTSTK_PQ; /* Long pointer to an INTSTK structure. */ #pragma __required_pointer_size __restore /* Return to previous pointer size */ #else typedef unsigned __int64 INTSTK_PQ; #endif /* __INITIAL_POINTER_SIZE */ #pragma __member_alignment __restore #ifdef __INITIAL_POINTER_SIZE /* Defined whenever ptr size pragmas supported */ #pragma __required_pointer_size __restore /* Restore the previously-defined required ptr size */ #endif #ifdef __cplusplus } #endif #pragma __standard #endif /* __INTSTKDEF_LOADED */