diff --git a/.gitignore b/.gitignore index 81c7fc6..456a837 100644 --- a/.gitignore +++ b/.gitignore @@ -36,6 +36,8 @@ artifacts dist cbxp-* *egg-info/ +cbxp/mappings/*.hpp +cbxp/schemas/*.hpp # CMake CMakeLists.txt.user diff --git a/CMakeLists.txt b/CMakeLists.txt index 6bd2eba..84a6582 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -63,6 +63,55 @@ file( # ============================================================================ # Build '/lib/libcbxp.a' # ============================================================================ +# ============================================================================ +# Generate schema header from cbxp/schemas/control_block_v1.json +# ============================================================================ +set(CBXP_SCHEMAS_GENERATED_DIR "${CMAKE_BINARY_DIR}/cbxp/schemas") +file(MAKE_DIRECTORY "${CBXP_SCHEMAS_GENERATED_DIR}") + +file(READ "${CMAKE_CURRENT_SOURCE_DIR}/cbxp/schemas/control_block_v1.json" CBXP_SCHEMA_JSON) + +file(WRITE "${CBXP_SCHEMAS_GENERATED_DIR}/control_block_v1.hpp" +"#ifndef CBXP_SCHEMA_CONTROL_BLOCK_V1_JSON_HPP\n\ +#define CBXP_SCHEMA_CONTROL_BLOCK_V1_JSON_HPP\n\ +\n\ +#define CBXP_SCHEMA_JSON R\"JSON(${CBXP_SCHEMA_JSON})JSON\"\n\ +\n\ +#endif // CBXP_SCHEMA_CONTROL_BLOCK_V1_JSON_HPP\n" +) + +# ============================================================================ +# Generate mapping headers from JSON files in cbxp/mappings/ +# ============================================================================ +set(CBXP_MAPPINGS_GENERATED_DIR "${CMAKE_BINARY_DIR}/cbxp/mappings") +file(MAKE_DIRECTORY "${CBXP_MAPPINGS_GENERATED_DIR}") + +file(GLOB CBXP_MAPPING_JSON_FILES "${CMAKE_CURRENT_SOURCE_DIR}/cbxp/mappings/*.json") + +set(CBXP_MAPPING_FORCED_INCLUDES "") + +foreach(MAPPING_JSON_FILE ${CBXP_MAPPING_JSON_FILES}) + get_filename_component(MAPPING_NAME "${MAPPING_JSON_FILE}" NAME_WE) + string(TOUPPER "${MAPPING_NAME}" MAPPING_NAME_UPPER) + + file(READ "${MAPPING_JSON_FILE}" MAPPING_JSON) + + set(MAPPING_GUARD "${MAPPING_NAME_UPPER}_JSON_HPP") + set(MAPPING_MACRO "${MAPPING_NAME_UPPER}_JSON") + set(MAPPING_HEADER_PATH "${CBXP_MAPPINGS_GENERATED_DIR}/${MAPPING_NAME}.hpp") + + file(WRITE "${MAPPING_HEADER_PATH}" +"#ifndef ${MAPPING_GUARD}\n\ +#define ${MAPPING_GUARD}\n\ +\n\ +#define ${MAPPING_MACRO} R\"JSON(${MAPPING_JSON})JSON\"\n\ +\n\ +#endif // ${MAPPING_GUARD}\n" + ) + + list(APPEND CBXP_MAPPING_FORCED_INCLUDES "--include=${MAPPING_HEADER_PATH}") +endforeach() + add_library(libcbxp STATIC ${CBXP_SRC_LIB}) set_target_properties(libcbxp PROPERTIES OUTPUT_NAME "cbxp") @@ -70,11 +119,17 @@ target_include_directories( libcbxp PUBLIC cbxp cbxp/control_blocks - externals + externals/json + externals/json-schema-validator /usr/include/zos ) -target_compile_options(libcbxp PUBLIC ${COMPILE_OPTIONS}) +target_compile_options( + libcbxp PUBLIC + ${COMPILE_OPTIONS} + "--include=${CBXP_SCHEMAS_GENERATED_DIR}/control_block_v1.hpp" + ${CBXP_MAPPING_FORCED_INCLUDES} +) target_link_options(libcbxp PUBLIC ${LINK_OPTIONS}) # ============================================================================ diff --git a/cbxp/control_block_error.hpp b/cbxp/control_block_error.hpp index 09f8d3a..82c09e4 100644 --- a/cbxp/control_block_error.hpp +++ b/cbxp/control_block_error.hpp @@ -7,7 +7,10 @@ enum Error { BadInclude = 2, BadFilter = 3, DataTooSmall = 4, - NullDataPtr = 5 + NullDataPtr = 5, + BadCbxpPath = 6, + BadJsonFile = 7, + CantReachBlock = 8, }; class CBXPError : public std::exception { @@ -39,6 +42,21 @@ class DataLengthError : public CBXPError { DataLengthError() : CBXPError(Error::DataTooSmall) {} }; +class CbxpPathError : public CBXPError { + public: + CbxpPathError() : CBXPError(Error::BadCbxpPath) {} +}; + +class CbxpJsonError : public CBXPError { + public: + CbxpJsonError() : CBXPError(Error::BadJsonFile) {} +}; + +class CbxpReachBlockError : public CBXPError { + public: + CbxpReachBlockError() : CBXPError(Error::CantReachBlock) {} +}; + } // namespace CBXP #endif diff --git a/cbxp/control_block_explorer.cpp b/cbxp/control_block_explorer.cpp index 548bd42..d0d3014 100644 --- a/cbxp/control_block_explorer.cpp +++ b/cbxp/control_block_explorer.cpp @@ -2,24 +2,104 @@ #include #include +#include +#include #include #include #include "cbxp.h" #include "control_block_error.hpp" -#include "control_blocks/ascb.hpp" -#include "control_blocks/assb.hpp" -#include "control_blocks/asvt.hpp" #include "control_blocks/control_block.hpp" -#include "control_blocks/cvt.hpp" -#include "control_blocks/ecvt.hpp" -#include "control_blocks/ldax.hpp" -#include "control_blocks/oucb.hpp" -#include "control_blocks/psa.hpp" #include "logger.hpp" namespace CBXP { +std::unordered_map +ControlBlockExplorer::loadCustomControlBlocks(std::filesystem::path path) { + std::unordered_map new_maps = {}; + try { + if (!std::filesystem::exists(path) || + !std::filesystem::is_directory(path)) { + throw CbxpPathError(); + } + for (const auto& file : std::filesystem::directory_iterator(path)) { + if (file.extension() != ".json") { + continue; + } + std::string file_name = file.stem().string(); + std::ifstream ifs(file.path()); + nlohmann::json json_data = nlohmann::json::parse(ifs); + Logger::getInstance().debug("Adding '" + file_name + + "' control block from '" + + file.path().string() + "'."); + ControlBlock new_map = ControlBlock(json_data); + new_maps[file_name] = new_map; + } + } catch (const std::filesystem::filesystem_error& e) { + throw CbxpPathError(); + } catch (const std::exception& e) { + throw CbxpJsonError(); + } + return new_maps; +} + +std::string ControlBlockExplorer::mapToString( + const std::unordered_map& map) { + std::string map_as_string = ""; + if (map.empty()) { + return map_as_string; + } + map_as_string = "["; + + bool first_entry = true; + for (const auto& [key, value] : map) { + if (!first_entry) { + map_as_string += ", "; + } else { + first_entry = false; + } + map_as_string += key; + } + + map_as_string += "]"; + return map_as_string; +} + +std::unordered_map +ControlBlockExplorer::buildControlBlock() { + // Load known control blocks + std::unordered_map control_blocks = { + { "psa", ControlBlock(PSA_JSON)}, + { "cvt", ControlBlock(CVT_JSON)}, + {"ecvt", ControlBlock(ECVT_JSON)}, + {"asvt", ControlBlock(ASVT_JSON)}, + {"ascb", ControlBlock(ASCB_JSON)}, + {"assb", ControlBlock(ASSB_JSON)}, + {"oucb", ControlBlock(OUCB_JSON)}, + {"ldax", ControlBlock(LDAX_JSON)}, + }; + + // Load custom control blocks + std::string env_p(std::getenv("CBXPPATH")); + if (env_p.empty()) { + return control_blocks; + } + // Logic for loading custom control block mappings, overwriting any that were + // already loaded with custom mappings as well. + std::filesystem::path cbxp_path(env_p); + for (const auto& path : cbxp_path) { + std::unordered_map custom_control_blocks = + ControlBlockExplorer::loadCustomControlBlocks(path); + if (!custom_control_blocks.empty()) { + Logger::getInstance().debug( + "Added the following custom control blocks from path '" + path + + "': " + ControlBlockExplorer::mapToString(custom_control_blocks)); + custom_control_blocks.insert(control_blocks.begin(), + control_blocks.end()); + } + } +} + std::vector ControlBlockExplorer::createOptionsList( const std::string& comma_separated_string) { if (comma_separated_string == "") { @@ -92,31 +172,11 @@ void ControlBlockExplorer::processControlBlock( nlohmann::json control_block_json = {}; try { - if (control_block_name == "psa") { - control_block_json = - PSA(cbxp_options_).get(p_control_block_, control_block_data_length_); - } else if (control_block_name == "cvt") { - control_block_json = - CVT(cbxp_options_).get(p_control_block_, control_block_data_length_); - } else if (control_block_name == "ecvt") { - control_block_json = - ECVT(cbxp_options_).get(p_control_block_, control_block_data_length_); - } else if (control_block_name == "ascb") { - control_block_json = - ASCB(cbxp_options_).get(p_control_block_, control_block_data_length_); - } else if (control_block_name == "asvt") { - control_block_json = - ASVT(cbxp_options_).get(p_control_block_, control_block_data_length_); - } else if (control_block_name == "assb") { - control_block_json = - ASSB(cbxp_options_).get(p_control_block_, control_block_data_length_); - } else if (control_block_name == "oucb") { - control_block_json = - OUCB(cbxp_options_).get(p_control_block_, control_block_data_length_); - } else if (control_block_name == "ldax") { - control_block_json = - LDAX(cbxp_options_).get(p_control_block_, control_block_data_length_); - + if (control_blocks_.contains(control_block_name)) { + explorer_options_ = + ExplorerOptionsMap(cbxp_options_, control_block_name, control_blocks_, + p_control_block_, control_block_data_length_); + control_block_json = explorer_options_.getControlBlockData(); } else { throw ControlBlockError(); } diff --git a/cbxp/control_block_explorer.hpp b/cbxp/control_block_explorer.hpp index ba1cf8f..1cf24a5 100644 --- a/cbxp/control_block_explorer.hpp +++ b/cbxp/control_block_explorer.hpp @@ -8,13 +8,28 @@ namespace CBXP { +typedef struct { + std::vector include_patterns; + std::vector filters; + bool skip_buffer_length_check; +} cbxp_options_t; + class ControlBlockExplorer { private: + cbxp_options_t cbxp_options_ = {{}, {}, false}; cbxp_result_t* p_result_; - cbxp_options_t cbxp_options_ = {{}, {}, false}; const void* p_control_block_ = nullptr; size_t control_block_data_length_ = 0; std::string control_block_operation_ = ""; + + static std::unordered_map control_blocks_() { + return buildControlBlockMap(); + }; + static std::string mapToString( + const std::unordered_map& map); + static std::unordered_map loadCustomControlBlocks( + std::filesystem::path path); + static std::unordered_map buildControlBlockMap(); static std::vector createOptionsList( const std::string& comma_separated_string); diff --git a/cbxp/control_blocks/ascb.cpp b/cbxp/control_blocks/ascb.cpp deleted file mode 100644 index cef0b7a..0000000 --- a/cbxp/control_blocks/ascb.cpp +++ /dev/null @@ -1,112 +0,0 @@ -#include "ascb.hpp" - -#include -#include - -#include -#include -#include -#include - -#include "assb.hpp" -#include "asvt.hpp" -#include "logger.hpp" -#include "oucb.hpp" - -namespace CBXP { -nlohmann::json ASCB::get(const void* p_control_block, - const size_t buffer_length) { - ASCB::checkDataLength(buffer_length); - nlohmann::json ascb_json = {}; - const ascb* p_ascb; - - if (p_control_block == nullptr) { - // PSA starts at address 0 - const struct psa* __ptr32 p_psa = 0; - - const struct cvtmap* __ptr32 p_cvtmap = - // 'nullPointer' is a false positive because the PSA starts at address 0 - // cppcheck-suppress nullPointer - static_cast(p_psa->flccvt); - asvt_t* __ptr32 p_asvt = static_cast(p_cvtmap->cvtasvt); - - ascb_json["ascbs"] = std::vector(); - std::vector& ascbs = - ascb_json["ascbs"].get_ref&>(); - ascbs.reserve(p_asvt->asvtmaxu); - - uint32_t* __ptr32 p_ascb_addr = - reinterpret_cast(&p_asvt->asvtenty); - for (int i = 0; i < p_asvt->asvtmaxu; i++) { - if (0x80000000 & *p_ascb_addr) { - Logger::getInstance().debug(formatter_.getHex(p_ascb_addr) + - " is not a valid ASCB address"); - p_ascb_addr++; - continue; - } - nlohmann::json next_ascb = - ASCB::get(reinterpret_cast(*p_ascb_addr)); - if (!next_ascb.is_null()) { - ascbs.push_back(next_ascb); - } - p_ascb_addr++; // This SHOULD increment the pointer by 4 bytes. - } - return ascbs; - } else { - p_ascb = static_cast(p_control_block); - } - - ascb_json["ascbassb"] = formatter_.getHex(&(p_ascb->ascbassb)); - ascb_json["ascboucb"] = formatter_.getHex(&(p_ascb->ascboucb)); - - for (const auto& [include, cbxp_options] : options_map_) { - if (include == "assb") { - ascb_json["ascbassb"] = CBXP::ASSB(cbxp_options).get(p_ascb->ascbassb); - if (ascb_json["ascbassb"].is_null()) { - return {}; - } - } else if (include == "oucb") { - ascb_json["ascboucb"] = CBXP::OUCB(cbxp_options).get(p_ascb->ascboucb); - if (ascb_json["ascboucb"].is_null()) { - return {}; - } - } - } - - Logger::getInstance().debug("ASCB hex dump:"); - Logger::getInstance().hexDump(reinterpret_cast(p_ascb), - sizeof(struct ascb)); - - ascb_json["ascbascb"] = formatter_.getString(p_ascb->ascbascb, 4); - ascb_json["ascbasid"] = p_ascb->ascbasn; - ascb_json["ascbasxb"] = formatter_.getHex(&(p_ascb->ascbasxb)); - ascb_json["ascbdcti"] = p_ascb->ascbdcti; - ascb_json["ascbejst"] = formatter_.getBitmap( - reinterpret_cast(&p_ascb->ascbejst)); - ascb_json["ascbflg3"] = formatter_.getBitmap(p_ascb->ascbflg3); - ascb_json["ascbfw3"] = formatter_.getBitmap( - reinterpret_cast(&p_ascb->ascbfw3)); - ascb_json["ascbjbni"] = formatter_.getHex(&(p_ascb->ascbjbni)); - ascb_json["ascbjbns"] = formatter_.getHex(&(p_ascb->ascbjbns)); - ascb_json["ascblsqe"] = p_ascb->ascblsqe; - ascb_json["ascblsqt"] = p_ascb->ascblsqt; - ascb_json["ascbnoft"] = formatter_.getBitmap(p_ascb->ascbnoft); - ascb_json["ascbouxb"] = formatter_.getHex(&(p_ascb->ascbouxb)); - ascb_json["ascbpo1m"] = formatter_.getBitmap(p_ascb->ascbpo1m); - ascb_json["ascbp1m0"] = formatter_.getBitmap(p_ascb->ascbp1m0); - ascb_json["ascbrsme"] = formatter_.getHex(&(p_ascb->ascbrsme)); - ascb_json["ascbsdbf"] = formatter_.getBitmap(p_ascb->ascbsdbf); - ascb_json["ascbsrbt"] = formatter_.getBitmap( - reinterpret_cast(&p_ascb->ascbsrbt)); - ascb_json["ascbtcbe"] = formatter_.getBitmap(p_ascb->ascbtcbe); - ascb_json["ascbtcbs"] = p_ascb->ascbtcbs; - ascb_json["ascbxtcb"] = formatter_.getHex(&(p_ascb->ascbxtcb)); - ascb_json["ascbzcx"] = formatter_.getBitmap(p_ascb->ascbzcx); - - if (ASCB::matchFilter(ascb_json)) { - return ascb_json; - } else { - return {}; - } -} -} // namespace CBXP diff --git a/cbxp/control_blocks/ascb.hpp b/cbxp/control_blocks/ascb.hpp deleted file mode 100644 index b858800..0000000 --- a/cbxp/control_blocks/ascb.hpp +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef __ASCB_H_ -#define __ASCB_H_ - -#include - -#include "control_block.hpp" - -namespace CBXP { - -class ASCB : public ControlBlock { - public: - nlohmann::json get(const void* p_control_block = nullptr, - const size_t buffer_length = 0) override; - explicit ASCB(const cbxp_options_t& cbxp_options) - : ControlBlock("ascb", {"assb", "oucb"}, cbxp_options, - sizeof(struct ascb)) {} -}; - -} // namespace CBXP - -#endif diff --git a/cbxp/control_blocks/assb.cpp b/cbxp/control_blocks/assb.cpp deleted file mode 100644 index c261b73..0000000 --- a/cbxp/control_blocks/assb.cpp +++ /dev/null @@ -1,221 +0,0 @@ -#include -#include -#include - -#include -#include -#include -#include -#include - -#include "ascb.hpp" -#include "asvt.hpp" -#include "ldax.hpp" -#include "logger.hpp" - -namespace CBXP { -nlohmann::json ASSB::get(const void* p_control_block, - const size_t buffer_length) { - ASSB::checkDataLength(buffer_length); - const assb* p_assb; - nlohmann::json assb_json = {}; - if (p_control_block == nullptr) { - // PSA starts at address 0 - const struct psa* __ptr32 p_psa = 0; - - const struct cvtmap* __ptr32 p_cvtmap = - // 'nullPointer' is a false positive because the PSA starts at address 0 - // cppcheck-suppress nullPointer - static_cast(p_psa->flccvt); - const asvt_t* __ptr32 p_asvt = - static_cast(p_cvtmap->cvtasvt); - - assb_json["assbs"] = std::vector(); - std::vector& assbs = - assb_json["assbs"].get_ref&>(); - assbs.reserve(p_asvt->asvtmaxu); - - const uint32_t* __ptr32 p_ascb_addr = - reinterpret_cast(&p_asvt->asvtenty); - for (int i = 0; i < p_asvt->asvtmaxu; i++) { - if (0x80000000 & *p_ascb_addr) { - Logger::getInstance().debug(formatter_.getHex(p_ascb_addr) + - " is not a valid ASCB address"); - p_ascb_addr++; - continue; - } - // cast ascb addr into ascb pointer a - // - const struct ascb* __ptr32 p_ascb = - reinterpret_cast(*p_ascb_addr); - nlohmann::json next_assb = - ASSB::get(reinterpret_cast(p_ascb->ascbassb)); - if (!next_assb.is_null()) { - assbs.push_back(next_assb); - } - p_ascb_addr++; // This SHOULD increment the pointer by 4 bytes. - } - return assbs; - } else { - p_assb = static_cast(p_control_block); - } - - Logger::getInstance().debug("assb hex dump:"); - Logger::getInstance().hexDump(reinterpret_cast(p_assb), - sizeof(struct assb)); - - assb_json["assbldax"] = formatter_.getHex(&(p_assb->assbldax)); - - for (const auto& [include, cbxp_options] : options_map_) { - if (include == "ldax") { - assb_json["assbldax"] = - CBXP::LDAX(cbxp_options) - .get(*reinterpret_cast(p_assb->assbldax)); - if (assb_json["assbldax"].is_null()) { - return {}; - } - } - } - - assb_json["assb_cms_lockinst_addr"] = - formatter_.getHex(&(p_assb->assb_cms_lockinst_addr)); - assb_json["assb_enqdeq_cms_lockinst_addr"] = - formatter_.getHex(&(p_assb->assb_enqdeq_cms_lockinst_addr)); - assb_json["assb_latch_cms_lockinst_addr"] = - formatter_.getHex(&(p_assb->assb_latch_cms_lockinst_addr)); - assb_json["assb_local_lockinst_addr"] = - formatter_.getHex(&(p_assb->assb_local_lockinst_addr)); - assb_json["assb_smfcms_lockinst_addr"] = - formatter_.getHex(&(p_assb->assb_smfcms_lockinst_addr)); - assb_json["assbdlcb"] = formatter_.getHex(&(p_assb->assbdlcb)); - assb_json["assbmqma"] = formatter_.getHex(&(p_assb->assbmqma)); - assb_json["assboasb"] = formatter_.getHex(&(p_assb->assboasb)); - assb_json["assbtasb"] = formatter_.getHex(&(p_assb->assbtasb)); - assb_json["assbvab"] = formatter_.getHex(&(p_assb->assbvab)); - assb_json["assbisqn"] = p_assb->assbisqn; - assb_json["assbjbni"] = formatter_.getString(p_assb->assbjbni, 8); - assb_json["assbjbns"] = formatter_.getString(p_assb->assbjbns, 8); - assb_json["assb_asst_time_on_cp"] = - formatter_.uint(p_assb->assb_asst_time_on_cp); - assb_json["assb_asst_time_on_zcbp"] = - formatter_.uint(p_assb->assb_asst_time_on_zcbp); - assb_json["assb_enct"] = formatter_.uint(p_assb->assb_enct); - assb_json["assb_enct_prezos11"] = - formatter_.uint(p_assb->assb_enct_prezos11); - assb_json["assb_ifa_enct"] = formatter_.uint(p_assb->assb_ifa_enct); - assb_json["assb_ifa_enct_prezos11"] = - formatter_.uint(p_assb->assb_ifa_enct_prezos11); - assb_json["assb_ifa_on_cp_enct"] = - formatter_.uint(p_assb->assb_ifa_on_cp_enct); - assb_json["assb_ifa_phtm"] = formatter_.uint(p_assb->assb_ifa_phtm); - assb_json["assb_srb_time_on_cp"] = - formatter_.uint(p_assb->assb_srb_time_on_cp); - assb_json["assb_srb_time_on_zcbp"] = - formatter_.uint(p_assb->assb_srb_time_on_zcbp); - assb_json["assb_sup_on_cp_enct"] = - formatter_.uint(p_assb->assb_sup_on_cp_enct); - assb_json["assb_task_time_on_cp"] = - formatter_.uint(p_assb->assb_task_time_on_cp); - assb_json["assb_time_ifa_on_cp"] = - formatter_.uint(p_assb->assb_time_ifa_on_cp); - assb_json["assb_time_java_on_cp"] = - formatter_.uint(p_assb->assb_time_java_on_cp); - assb_json["assb_time_java_on_ziip"] = - formatter_.uint(p_assb->assb_time_java_on_ziip); - assb_json["assb_time_on_ifa"] = - formatter_.uint(p_assb->assb_time_on_ifa); - assb_json["assb_time_on_zaap"] = - formatter_.uint(p_assb->assb_time_on_zaap); - assb_json["assb_time_on_zcbp"] = - formatter_.uint(p_assb->assb_time_on_zcbp); - assb_json["assb_time_on_ziip"] = - formatter_.uint(p_assb->assb_time_on_ziip); - assb_json["assb_time_zcbp_on_cp"] = - formatter_.uint(p_assb->assb_time_zcbp_on_cp); - assb_json["assb_time_ziip_on_cp"] = - formatter_.uint(p_assb->assb_time_ziip_on_cp); - assb_json["assb_zaap_enct"] = - formatter_.uint(p_assb->assb_zaap_enct); - assb_json["assb_zaap_phtm"] = - formatter_.uint(p_assb->assb_zaap_phtm); - assb_json["assb_zcbp_base_phtm"] = - formatter_.uint(p_assb->assb_zcbp_base_phtm); - assb_json["assb_zcbp_enct"] = - formatter_.uint(p_assb->assb_zcbp_enct); - assb_json["assb_zcbp_on_cp_enct"] = - formatter_.uint(p_assb->assb_zcbp_on_cp_enct); - assb_json["assb_zcbp_phtm"] = - formatter_.uint(p_assb->assb_zcbp_phtm); - assb_json["assb_ziip_enct"] = - formatter_.uint(p_assb->assb_ziip_enct); - assb_json["assb_ziip_on_cp_enct"] = - formatter_.uint(p_assb->assb_ziip_on_cp_enct); - assb_json["assb_ziip_phtm"] = - formatter_.uint(p_assb->assb_ziip_phtm); - assb_json["assb_ziip_phtm_base"] = - formatter_.uint(p_assb->assb_ziip_phtm_base); - assb_json["assbasst"] = formatter_.uint(p_assb->assbasst); - assb_json["assbphtm"] = formatter_.uint(p_assb->assbphtm); - assb_json["assbphtm_base"] = formatter_.uint(p_assb->assbphtm_base); - assb_json["assbstkn"] = formatter_.uint(p_assb->assbstkn); - assb_json["assbhst"] = formatter_.uint(p_assb->assbhst); - assb_json["assbiipt"] = formatter_.uint(p_assb->assbiipt); - assb_json["assblasb"] = formatter_.uint(p_assb->assblasb); - assb_json["assb_time_on_cp"] = - formatter_.uint(p_assb->assb_time_on_cp); - assb_json["assb_base_phtm"] = - formatter_.uint(p_assb->assb_base_phtm); - assb_json["assb_ifa_base_phtm"] = - formatter_.uint(p_assb->assb_ifa_base_phtm); - assb_json["assb_base_enct"] = - formatter_.uint(p_assb->assb_base_enct); - assb_json["assb_zcbp_base_enct"] = - formatter_.uint(p_assb->assb_zcbp_base_enct); - assb_json["assb_ifa_base_enct"] = - formatter_.uint(p_assb->assb_ifa_base_enct); - assb_json["assb_time_on_sup"] = - formatter_.uint(p_assb->assb_time_on_sup); - assb_json["assb_time_sup_on_cp"] = - formatter_.uint(p_assb->assb_time_sup_on_cp); - assb_json["assb_sup_phtm"] = formatter_.uint(p_assb->assb_sup_phtm); - assb_json["assb_sup_enct"] = formatter_.uint(p_assb->assb_sup_enct); - assb_json["assb_zcbp_on_cp_base_enct"] = - formatter_.uint(p_assb->assb_zcbp_on_cp_base_enct); - assb_json["assb_ifa_on_cp_base_enct"] = - formatter_.uint(p_assb->assb_ifa_on_cp_base_enct); - assb_json["assb_time_at_pdp"] = - formatter_.uint(p_assb->assb_time_at_pdp); - assb_json["assb_srbt_base"] = - formatter_.uint(p_assb->assb_srbt_base); - assb_json["assb_switch_to_zaapziip_count"] = - formatter_.uint(p_assb->assb_switch_to_zaapziip_count); - assb_json["assbasab"] = formatter_.uint(p_assb->assbasab); - assb_json["assb_ziip_base_enct"] = - formatter_.uint(p_assb->assb_ziip_base_enct); - assb_json["assb_sup_base_enct"] = - formatter_.uint(p_assb->assb_sup_base_enct); - assb_json["assb_ziip_on_cp_base_enct"] = - formatter_.uint(p_assb->assb_ziip_on_cp_base_enct); - assb_json["assb_sup_on_cp_base_enct"] = - formatter_.uint(p_assb->assb_sup_on_cp_base_enct); - assb_json["assb_hdlockpromotion_time_at_pdp"] = - formatter_.uint(p_assb->assb_hdlockpromotion_time_at_pdp); - assb_json["assb_enct_hdlockpromote_time"] = - formatter_.uint(p_assb->assb_enct_hdlockpromote_time); - assb_json["assbsupc"] = formatter_.uint(p_assb->assbsupc); - assb_json["assb_vartime_at_pdp"] = - formatter_.uint(p_assb->assb_vartime_at_pdp); - assb_json["assb_varweighted_time_at_pdp"] = - formatter_.uint(p_assb->assb_varweighted_time_at_pdp); - assb_json["assb_scmbc"] = formatter_.uint(p_assb->assb_scmbc); - assb_json["assbinitiatorjobid"] = - formatter_.uint(p_assb->assbinitiatorjobid); - assb_json["assbend"] = formatter_.uint(p_assb->assbend); - - if (ASSB::matchFilter(assb_json)) { - return assb_json; - } else { - return {}; - } -} -} // namespace CBXP diff --git a/cbxp/control_blocks/assb.hpp b/cbxp/control_blocks/assb.hpp deleted file mode 100644 index 9f0c720..0000000 --- a/cbxp/control_blocks/assb.hpp +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef __ASSB_H_ -#define __ASSB_H_ - -#include - -#include "control_block.hpp" - -namespace CBXP { - -class ASSB : public ControlBlock { - public: - nlohmann::json get(const void* p_control_block = nullptr, - const size_t buffer_length = 0) override; - explicit ASSB(const cbxp_options_t& cbxp_options) - : ControlBlock("assb", {"ldax"}, cbxp_options, sizeof(struct assb)) {} -}; - -} // namespace CBXP - -#endif diff --git a/cbxp/control_blocks/asvt.cpp b/cbxp/control_blocks/asvt.cpp deleted file mode 100644 index 0316177..0000000 --- a/cbxp/control_blocks/asvt.cpp +++ /dev/null @@ -1,100 +0,0 @@ -#include "asvt.hpp" - -#include -#include - -#include -#include -#include -#include - -#include "ascb.hpp" -#include "logger.hpp" - -namespace CBXP { -nlohmann::json ASVT::get(const void* p_control_block, - const size_t buffer_length) { - ASVT::checkDataLength(buffer_length); - const asvt_t* p_asvt; - nlohmann::json asvt_json = {}; - - if (p_control_block == nullptr) { - const struct psa* __ptr32 p_psa = 0; - const struct cvtmap* __ptr32 p_cvtmap = - // 'nullPointer' is a false positive because the PSA starts at address 0 - // cppcheck-suppress nullPointer - static_cast(p_psa->flccvt); - p_asvt = static_cast(p_cvtmap->cvtasvt); - } else { - p_asvt = static_cast(p_control_block); - } - - Logger::getInstance().debug("ASCB pointers:"); - Logger::getInstance().hexDump( - reinterpret_cast(&p_asvt->asvtenty), p_asvt->asvtmaxu * 4); - - std::vector ascbs; - ascbs.reserve(p_asvt->asvtmaxu); - const uint32_t* p_ascb = const_cast( - reinterpret_cast(&p_asvt->asvtenty)); - - for (int i = 0; i < p_asvt->asvtmaxu; i++) { - ascbs.push_back(formatter_.getHex(p_ascb)); - p_ascb++; // This SHOULD increment the pointer by 4 bytes. - } - - asvt_json["asvtenty"] = ascbs; - - Logger::getInstance().debug("ASVT hex dump:"); - Logger::getInstance().hexDump(reinterpret_cast(p_asvt), - sizeof(asvt_t)); - for (const auto& [include, cbxp_options] : options_map_) { - if (include == "ascb") { - nlohmann::json ascbs_json; - CBXP::ASCB ascb(cbxp_options); - uint32_t const* __ptr32 p_ascb_addr = const_cast( - reinterpret_cast(&p_asvt->asvtenty)); - for (int i = 0; i < p_asvt->asvtmaxu; i++) { - if (0x80000000 & *p_ascb_addr) { - Logger::getInstance().debug(formatter_.getHex(p_ascb_addr) + - " is not a valid ASCB address"); - p_ascb_addr++; - continue; - } - nlohmann::json ascb_json = - ascb.get(reinterpret_cast(*p_ascb_addr)); - if (!ascb_json.is_null()) { - ascbs_json.push_back(ascb_json); - } - p_ascb_addr++; // This SHOULD increment the pointer by 4 bytes. - } - asvt_json["asvtenty"] = ascbs_json; - if (asvt_json["asvtenty"].is_null()) { - return {}; - } - } - } - - // Get fields - asvt_json["asvthwmasid"] = p_asvt->asvthwmasid; - asvt_json["asvtcurhighasid"] = p_asvt->asvtcurhighasid; - asvt_json["asvtreua"] = formatter_.getHex(p_asvt->asvtreua); - asvt_json["asvtravl"] = formatter_.getHex(p_asvt->asvtravl); - asvt_json["asvtaav"] = p_asvt->asvtaav; - asvt_json["asvtast"] = p_asvt->asvtast; - asvt_json["asvtanr"] = p_asvt->asvtanr; - asvt_json["asvtstrt"] = p_asvt->asvtstrt; - asvt_json["asvtnonr"] = p_asvt->asvtnonr; - asvt_json["asvtmaxi"] = p_asvt->asvtmaxi; - asvt_json["asvtasvt"] = formatter_.getString(p_asvt->asvtasvt, 4); - asvt_json["asvtmaxu"] = p_asvt->asvtmaxu; - asvt_json["asvtmdsc"] = p_asvt->asvtmdsc; - asvt_json["asvtfrst"] = formatter_.getHex(p_asvt->asvtfrst); - - if (ASVT::matchFilter(asvt_json)) { - return asvt_json; - } else { - return {}; - } -} -} // namespace CBXP diff --git a/cbxp/control_blocks/asvt.hpp b/cbxp/control_blocks/asvt.hpp deleted file mode 100644 index 16c15c0..0000000 --- a/cbxp/control_blocks/asvt.hpp +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef __ASVT_H_ -#define __ASVT_H_ - -#include "control_block.hpp" - -#pragma pack(push, 1) // Don't byte align structure members. -typedef struct { - char esvtprfx[464]; - int32_t asvthwmasid; - int32_t asvtcurhighasid; - char* __ptr32 asvtreua; - char* __ptr32 asvtravl; - int32_t asvtaav; - int32_t asvtast; - int32_t asvtanr; - int32_t asvtstrt; - int32_t asvtnonr; - int32_t asvtmaxi; - uint64_t reserved1; - char asvtasvt[4]; - int32_t asvtmaxu; - int32_t asvtmdsc; - char* __ptr32 asvtfrst; - // skipped this single bit - char* __ptr32 asvtenty; - - // skipped ASVTAVAL ---> to bottom -} asvt_t; -#pragma pack(pop) // Restore default structure packing options. - -namespace CBXP { - -class ASVT : public ControlBlock { - public: - nlohmann::json get(const void* p_control_block = nullptr, - const size_t buffer_length = 0) override; - explicit ASVT(const cbxp_options_t& cbxp_options) - : ControlBlock("asvt", {"ascb"}, cbxp_options, sizeof(asvt_t)) {} -}; - -} // namespace CBXP - -#endif diff --git a/cbxp/control_blocks/control_block.cpp b/cbxp/control_blocks/control_block.cpp index eaf2783..2471ed0 100644 --- a/cbxp/control_blocks/control_block.cpp +++ b/cbxp/control_blocks/control_block.cpp @@ -6,297 +6,79 @@ #include "control_block_error.hpp" #include "logger.hpp" +#include "zos_subpools.hpp" namespace CBXP { -void ControlBlock::createOptionsMap(const std::vector& includes, - const std::vector& filters) { - // createFilterLists depends on the construction of the "includes" portion - // of the options_map_ structure and must be called after createIncludeLists - ControlBlock::createIncludeLists(includes); - ControlBlock::createFilterLists(filters); - for (auto it = options_map_.begin(); it != options_map_.end(); ++it) { - options_map_[it->first].skip_buffer_length_check = - skip_buffer_length_check_; - } -} - -void ControlBlock::createIncludeLists( - const std::vector& includes) { - Logger::getInstance().debug( - "Creating include lists for child control blocks to include with the '" + - control_block_name_ + "' control block..."); - for (std::string include : includes) { - if (include == "**") { - Logger::getInstance().debug("Processing '**' include..."); - ControlBlock::processDoubleAsteriskInclude(); - return; - } else if (include == "*") { - Logger::getInstance().debug("Processing '*' include..."); - ControlBlock::processAsteriskInclude(); - } else { - Logger::getInstance().debug("Processing '" + include + "' include..."); - ControlBlock::processExplicitInclude(include); - } - } - Logger::getInstance().debug( - "Include lists for child control blocks to include with the '" + - control_block_name_ + "' control block have been created"); -} - -void ControlBlock::processDoubleAsteriskInclude() { - // Any existing entries in the hash map are redundant, so clear them - options_map_.clear(); - for (const std::string& includable : includables_) { - // Build a map of all includables_ but with "**" at the next level - Logger::getInstance().debug( - "Initializing and adding '**' to the include list for the '" + - includable + "' control block..."); - options_map_[includable].include_patterns = {"**"}; - } -} -void ControlBlock::processAsteriskInclude() { - if (options_map_.empty()) { - for (const std::string& includable : includables_) { - // Build a map of all includables_ - Logger::getInstance().debug("Initializing include list for the '" + - includable + "' control block..."); - options_map_[includable].include_patterns = {}; - } - } - for (const std::string& includable : includables_) { - if (options_map_.find(includable) != options_map_.end()) { - Logger::getInstance().debug("Include list already exists for the '" + - includable + "' control block"); - continue; - } - // Add all includables_ not already present to the map - Logger::getInstance().debug("Initializing include list for the '" + - includable + "' control block..."); - options_map_[includable].include_patterns = {}; - } -} +const nlohmann::json_schema::json_validator + ControlBlock::cbxp_schema_validator_{CBXP_SCHEMA_JSON}; -void ControlBlock::processExplicitInclude(std::string& include) { - // Default case; have to validate against an includable - const std::string del = "."; - std::string include_includes = ""; - size_t del_pos = include.find(del); - if (del_pos != std::string::npos) { - // If there's a "." then separate include into the include and its - // includes - include_includes = include.substr(del_pos + 1); - include.resize(del_pos); +FieldType ControlBlock::stringToType(const std::string& type_str) { + if (type_str == "string") { + return STRING; } - if (std::find(includables_.begin(), includables_.end(), include) == - includables_.end()) { - Logger::getInstance().debug( - "'" + include + - "' is not a known child control block that can be included with the '" + - control_block_name_ + "' control block"); - throw IncludeError(); + if (type_str == "signed-integer") { + return SIGNED_INT; } - if (options_map_.find(include) == options_map_.end()) { - // If we don't already have this include in our map, add it with its - // includes - if (include_includes == "") { - Logger::getInstance().debug("Initializing include list for the '" + - include + "' control block..."); - options_map_[include].include_patterns = {}; - } else { - Logger::getInstance().debug("Adding '" + include_includes + - "' to the include list for the '" + include + - "' control block..."); - options_map_[include].include_patterns = {include_includes}; - } - } else { - // If we DO already have this in our map, then we should add its - // includes if they are useful or new - if (std::find(options_map_[include].include_patterns.begin(), - options_map_[include].include_patterns.end(), - include_includes) != - options_map_[include].include_patterns.end()) { - return; - } - if (include_includes == "") { - return; - } - Logger::getInstance().debug("Adding '" + include_includes + - "' to the include list for the '" + include + - "' control block..."); - options_map_[include].include_patterns.push_back(include_includes); + if (type_str == "unsigned-integer") { + return UNSIGNED_INT; } -} - -void ControlBlock::createFilterLists(const std::vector& filters) { - Logger::getInstance().debug( - "Creating filter lists for the '" + control_block_name_ + - "' control block and included child control blocks..."); - for (const std::string& filter : filters) { - // Only case; specific non-generic filter - const std::string del = "."; - size_t del_pos = filter.find(del); - if (del_pos != std::string::npos) { - // If there's a "." then separate filter into the control_block - // and its filter - std::string control_block_filter = filter.substr(del_pos + 1); - std::string control_block = filter.substr(0, del_pos); - - // Check to make sure we are including the specified control block - auto it = options_map_.find(control_block); - if (it == options_map_.end()) { - Logger::getInstance().debug( - "A filter that requires the '" + control_block + - "' control block was provided, but the '" + control_block + - "' control block was not included"); - throw FilterError(); - } - Logger::getInstance().debug("Adding '" + control_block_filter + - "' to the filter list for the '" + - control_block + "' control block..."); - options_map_[control_block].filters.push_back(control_block_filter); - } else { - ControlBlock::addCurrentFilter(filter); - } + if (type_str == "hex") { + return HEX; } - Logger::getInstance().debug( - "Filter lists for the '" + control_block_name_ + - "' control block and included child control blocks have been created"); -} - -void ControlBlock::addCurrentFilter(const std::string& filter) { - std::vector operations = {"<=", ">=", "<", ">", "="}; - for (std::string operation : operations) { - size_t operation_pos = filter.find(operation); - if (operation_pos != std::string::npos) { - // If there's a delimeter then separate include into the key and its value - std::string filter_value = - filter.substr(operation_pos + operation.length()); - std::string filter_key = filter.substr(0, operation_pos); - cbxp_filter_t filter_data = {operation, filter_value}; - Logger::getInstance().debug("Adding '" + filter_key + operation + - filter_value + - "' to the current filters list for the '" + - control_block_name_ + "' control block..."); - current_filters_[filter_key].push_back(filter_data); - return; - } + if (type_str == "address") { + return ADDRESS; } - Logger::getInstance().debug( - "Filters must be key-value pairs (e.g., 'key=value')"); - throw FilterError(); + throw CbxpJsonError(); } -bool ControlBlock::compare(const nlohmann::json& json_value, - const std::string& filter_value, - const std::string& operation) { - std::string value_str = ""; - bool value_is_string = false; - uint64_t value_uint; - - if (json_value.is_number()) { - value_uint = json_value.get(); - } else { - value_str = json_value.get(); - value_is_string = true; - if (value_str.substr(0, 2) == "0x") { - value_uint = std::stoull(value_str, nullptr, 0); - value_is_string = false; - } - } - if (value_is_string) { - // Filter is testing strings - if (operation == "=") { - Logger::getInstance().debug("\"" + value_str + "\" = \"" + filter_value + - "\" ?"); - return (fnmatch(filter_value.c_str(), value_str.c_str(), 0) == 0); - } else { - Logger::getInstance().debug( - "<, <=, >, and >= cannot be used with string filter values"); - throw FilterError(); +ControlBlock::ControlBlock(const nlohmann::json& control_block_map) { + cbxp_schema_validator_.validate(control_block_map); + control_block_length_ = 0; + + storage_attributes_.key = + control_block_map["storageAttributes"]["key"].get(); + for (auto it = control_block_map["storageAttributes"]["subpools"].begin(); + it != control_block_map["storageAttributes"]["subpools"].end(); ++it) { + unsigned char subpool = (*it).get(); + const zos::SubpoolInfo* info = zos::subpool_info_for(subpool); + storage_attributes_.is_common = zos::is_common(info->location); + storage_attributes_.is_protected = info->fetch_protected; + } + + for (auto it = control_block_map["pointedToBy"].begin(); + it != control_block_map["pointedToBy"].end(); ++it) { + std::string pointed_to_by = (*it).get(); + pointed_to_by_.push_back(pointed_to_by); + } + + for (auto it = control_block_map["controlBlock"].begin(); + it != control_block_map["controlBlock"].end(); ++it) { + std::string name = (*it)["name"].get(); + size_t offset = (*it)["offset"].get(); + size_t length = (*it)["length"].get(); + if (offset + length > max_offset_) { + max_offset_ = offset + length; } - } // Filter is testing non-strings - else { - uint64_t filter_uint; - try { - filter_uint = std::stoull(filter_value, nullptr, 0); - } catch (...) { - Logger::getInstance().debug("'" + filter_value + - "' cannot be compared to a numeric value"); - throw FilterError(); + std::string pointsTo = ""; + if ((*it).contains("pointsTo")) { + // Also build inclusion MAP + pointsTo = (*it)["pointsTo"].get(); + includables_.push_back(pointsTo); } - Logger::getInstance().debug(std::to_string(value_uint) + " " + operation + - " " + std::to_string(filter_uint) + " ?"); - if (operation == "=") { - return value_uint == filter_uint; - } else if (operation == ">") { - return value_uint > filter_uint; - } else if (operation == "<") { - return value_uint < filter_uint; - } else if (operation == ">=") { - return value_uint >= filter_uint; - } else if (operation == "<=") { - return value_uint <= filter_uint; + std::string type_str = (*it)["type"].get(); + FieldType type = ControlBlock::stringToType(type_str); + bool repeated = false; + std::string count = ""; + if ((*it).contains("repeated")) { + repeated = (*it)["repeated"].get(); } - } - // We should never get here, so it would be good to say "no match" just in - // case - return false; -} - -bool ControlBlock::matchFilter(nlohmann::json& control_block_json) { - Logger::getInstance().debug("Applying filters to the '" + - control_block_name_ + "' control block..."); - if (current_filters_.empty()) { - // If the filter map is empty then we want to return the control block - Logger::getInstance().debug("No filters were provided for the '" + - control_block_name_ + "' control block"); - return true; - } - for (const auto& [filter_key, filter_list] : current_filters_) { - if (!control_block_json.contains(filter_key)) { - Logger::getInstance().debug( - "The filter key '" + filter_key + - "' does not correspond to any control block field in the '" + - control_block_name_ + "' control block"); - throw FilterError(); - } - // cppcheck-suppress useStlAlgorithm - for (const cbxp_filter_t& filter_data : filter_list) { - // would require capturing structured bindings to use all_of or none_of - Logger::getInstance().debug("Applying filter '" + filter_key + - filter_data.operation + filter_data.value + - "'..."); - if (!ControlBlock::compare(control_block_json[filter_key], - filter_data.value, filter_data.operation)) { - Logger::getInstance().debug("The filter '" + filter_key + - filter_data.operation + filter_data.value + - "' did not match"); - return false; - } + if (repeated and (*it).contains("count")) { + count = (*it)["count"].get(); } - } - // If we didn't have a reason to return false, we return true - Logger::getInstance().debug("All filters for the '" + control_block_name_ + - "' control block matched"); - return true; -} - -void ControlBlock::checkDataLength(const size_t buffer_length) const { - if (skip_buffer_length_check_) { - // Data length check is only done when formatting - // user provided control block data. - // This check is skipped when extracting and formatting - // control block data from live memory. - return; - } - Logger::getInstance().debug( - "Checking if specified buffer (" + std::to_string(buffer_length) + - " bytes) too small to contain the '" + control_block_name_ + - "' control block (requires " + std::to_string(control_block_length_) + - " bytes)..."); - if (buffer_length < control_block_length_) { - throw DataLengthError(); + control_block_field_t field = {name, offset, length, type, + pointsTo, repeated, count}; + control_block_map_[name] = field; } } } // namespace CBXP diff --git a/cbxp/control_blocks/control_block.hpp b/cbxp/control_blocks/control_block.hpp index e7c8989..f4c5589 100644 --- a/cbxp/control_blocks/control_block.hpp +++ b/cbxp/control_blocks/control_block.hpp @@ -1,61 +1,64 @@ #ifndef __CONTROL_BLOCK_H_ #define __CONTROL_BLOCK_H_ +#include #include #include "control_block_field_formatter.hpp" namespace CBXP { +enum FieldType { STRING, SIGNED_INT, UNSIGNED_INT, HEX, ADDRESS }; + typedef struct { - std::string operation; - std::string value; -} cbxp_filter_t; + std::string name; + size_t offset; + size_t length; + FieldType type; + std::string pointsTo; + bool repeated; + std::string count; +} control_block_field_t; typedef struct { - std::vector include_patterns; - std::vector filters; - bool skip_buffer_length_check; -} cbxp_options_t; + bool is_common; + bool is_protected; + unsigned char key; +} storage_attributes_t; class ControlBlock { private: - const std::string control_block_name_; - const std::vector includables_; - size_t control_block_length_ = 0; - void createIncludeLists(const std::vector& includes); - void processDoubleAsteriskInclude(); - void processAsteriskInclude(); - void processExplicitInclude(std::string& include); - void createFilterLists(const std::vector& filters); - void addCurrentFilter(const std::string& filter); - bool compare(const nlohmann::json& json_value, - const std::string& filter_value, const std::string& operation); - - protected: - ControlBlockFieldFormatter formatter_; - std::unordered_map options_map_; - std::unordered_map> current_filters_; - void createOptionsMap(const std::vector& includes, - const std::vector& filters); - bool matchFilter(nlohmann::json& control_block_json); - bool skip_buffer_length_check_ = false; + static const nlohmann::json_schema::json_validator cbxp_schema_validator_; + std::unordered_map control_block_map_ = + {}; + storage_attributes_t storage_attributes_ = { + true, false, 8}; // actually establish these values as this is finalized + std::string control_block_name_; + std::vector includables_ = {}; + std::vector pointed_to_by_ = {}; + size_t control_block_length_ = 0; + size_t max_offset_ = 0; + void* fixed_address_ = nullptr; + static FieldType stringToType(const std::string& type_str); public: - void checkDataLength(const size_t buffer_length) const; - virtual nlohmann::json get(const void* p_control_block = nullptr, - const size_t buffer_length = 0) = 0; - explicit ControlBlock(const std::string& name, - const std::vector& includables, - const cbxp_options_t& cbxp_options, - size_t control_block_length) - : control_block_name_(name), - includables_(includables), - control_block_length_(control_block_length), - skip_buffer_length_check_(cbxp_options.skip_buffer_length_check) { - ControlBlock::createOptionsMap(cbxp_options.include_patterns, - cbxp_options.filters); + ControlBlockFieldFormatter formatter_; + const std::unordered_map& getMap() const { + return control_block_map_; + } + const storage_attributes_t& getStorageAttributes() const { + return storage_attributes_; + } + const std::string& getName() const { return control_block_name_; } + const std::vector& getIncludables() const { + return includables_; + } + const std::vector& getPointedToBy() const { + return pointed_to_by_; } + size_t getMaxOffset() const { return max_offset_; } + const void* getFixedAddress() const { return fixed_address_; } + explicit ControlBlock(const nlohmann::json& control_block_map); virtual ~ControlBlock() = default; }; diff --git a/cbxp/control_blocks/control_block_field_formatter.hpp b/cbxp/control_blocks/control_block_field_formatter.hpp index f8eac6a..0b14b4c 100644 --- a/cbxp/control_blocks/control_block_field_formatter.hpp +++ b/cbxp/control_blocks/control_block_field_formatter.hpp @@ -37,6 +37,7 @@ class ControlBlockFieldFormatter { return oss.str(); } template + // cppcheck-suppress unusedFunction static const std::string getBitmap(const void* p_field) { std::ostringstream oss; oss << std::bitset{ @@ -49,22 +50,6 @@ class ControlBlockFieldFormatter { oss << std::bitset{field}; return oss.str(); } - static const std::string getPswSmall(const unsigned char* p_field) { - std::ostringstream oss; - oss << getBitmap(p_field); - oss << " | "; - oss << getHex(p_field + 4); - return oss.str(); - } - // Do we plan on using this??? - // cppcheck-suppress unusedFunction - static const std::string getPswBig(const unsigned char* p_field) { - std::ostringstream oss; - oss << getBitmap(p_field); - oss << " | "; - oss << getHex(p_field + 8); - return oss.str(); - } }; } // namespace CBXP diff --git a/cbxp/control_blocks/cvt.cpp b/cbxp/control_blocks/cvt.cpp deleted file mode 100644 index 92daa9e..0000000 --- a/cbxp/control_blocks/cvt.cpp +++ /dev/null @@ -1,188 +0,0 @@ -#include "cvt.hpp" - -#include - -#include -#include -#include - -#include "asvt.hpp" -#include "ecvt.hpp" -#include "logger.hpp" - -namespace CBXP { -nlohmann::json CVT::get(const void* p_control_block, - const size_t buffer_length) { - CVT::checkDataLength(buffer_length); - const struct cvtmap* p_cvtmap; - const struct cvtfix* p_cvtfix; - const struct cvtxtnt2* p_cvtxtnt2; - const struct cvtvstgx* p_cvtvstgx; - nlohmann::json cvt_json = {}; - - if (p_control_block == nullptr) { - // PSA starts at address 0 - const struct psa* __ptr32 p_psa = 0; - // 'nullPointer' is a false positive because the PSA starts at address 0 - // cppcheck-suppress-begin nullPointer - p_cvtmap = static_cast(p_psa->flccvt); - } else { - p_cvtmap = static_cast(p_control_block); - } - p_cvtfix = const_cast( - reinterpret_cast(p_cvtmap)); - p_cvtxtnt2 = const_cast( - reinterpret_cast(p_cvtmap)); - p_cvtvstgx = const_cast( - reinterpret_cast(p_cvtmap)); - // cppcheck-suppress-end nullPointer - - Logger::getInstance().debug("CVT hex dump:"); - Logger::getInstance().hexDump(reinterpret_cast(p_cvtmap), - sizeof(struct cvtmap)); - - cvt_json["cvtasvt"] = formatter_.getHex(&(p_cvtmap->cvtasvt)); - cvt_json["cvtecvt"] = formatter_.getHex(&(p_cvtmap->cvtecvt)); - - for (const auto& [include, cbxp_options] : options_map_) { - if (include == "asvt") { - cvt_json["cvtasvt"] = CBXP::ASVT(cbxp_options).get(p_cvtmap->cvtasvt); - if (cvt_json["cvtasvt"].is_null()) { - return {}; - } - } else if (include == "ecvt") { - cvt_json["cvtecvt"] = CBXP::ECVT(cbxp_options).get(p_cvtmap->cvtecvt); - if (cvt_json["cvtecvt"].is_null()) { - return {}; - } - } - } - - // Get fields - - cvt_json["cvtabend"] = formatter_.getHex(&(p_cvtmap->cvtabend)); - cvt_json["cvtamff"] = formatter_.getHex(&(p_cvtmap->cvtamff)); - cvt_json["cvtasmvt"] = formatter_.getHex(&(p_cvtmap->cvtasmvt)); - cvt_json["cvtbret"] = formatter_.getHex(p_cvtmap->cvtbret); - cvt_json["cvtbsm0f"] = formatter_.getHex(p_cvtmap->cvtbsm0f); - cvt_json["cvtcsd"] = formatter_.getHex(&(p_cvtmap->cvtcsd)); - cvt_json["cvtctlfg"] = formatter_.getBitmap( - reinterpret_cast(&p_cvtmap->cvtctlfg)); - cvt_json["cvtdcb"] = formatter_.getBitmap( - reinterpret_cast(&p_cvtmap->cvtdcb)); - // Read bitfields directly to avoid read-modify-write corruption - cvt_json["cvtdcpa"] = formatter_.getBitmap( - reinterpret_cast(&p_cvtmap->cvtflags) + 3); - cvt_json["cvtdfa"] = formatter_.getHex(p_cvtmap->cvtdfa); - cvt_json["cvtedat2"] = formatter_.getBitmap( - reinterpret_cast(&p_cvtmap->cvtflags) + 3); - cvt_json["cvteplps"] = formatter_.getHex(&(p_cvtvstgx->cvteplps)); - cvt_json["cvtexit"] = formatter_.getHex(p_cvtmap->cvtexit); - cvt_json["cvtexp1"] = formatter_.getHex(&(p_cvtmap->cvtexp1)); - // Read bitfields directly to avoid read-modify-write corruption - cvt_json["cvtflag2"] = formatter_.getBitmap( - reinterpret_cast(&p_cvtmap->cvtflags) + 1); - cvt_json["cvtflag3"] = formatter_.getBitmap( - reinterpret_cast(&p_cvtmap->cvtflags) + 2); - cvt_json["cvtflag4"] = formatter_.getBitmap( - reinterpret_cast(&p_cvtmap->cvtflags) + 3); - cvt_json["cvtflag5"] = formatter_.getBitmap( - reinterpret_cast(&p_cvtmap->cvtaqavt) + 4); - cvt_json["cvtflag6"] = formatter_.getBitmap( - reinterpret_cast(&p_cvtmap->cvtaqavt) + 5); - cvt_json["cvtflag7"] = formatter_.getBitmap( - reinterpret_cast(&p_cvtmap->cvtaqavt) + 6); - cvt_json["cvtflag9"] = formatter_.getBitmap( - reinterpret_cast(&p_cvtmap->cvtflag9)); - // Read cvtflgbt byte directly to avoid bitfield read-modify-write corruption - // cvtflgbt is at offset 5 in cvtxtnt2 (4 bytes cvt2r000 + 1 byte cvtnucls) - const unsigned char* p_cvtflgbt = - reinterpret_cast(p_cvtxtnt2) + 5; - cvt_json["cvtflgbt"] = formatter_.getBitmap(p_cvtflgbt); - cvt_json["cvtgda"] = formatter_.getHex(&(p_cvtmap->cvtgda)); - // Read bitfield directly to avoid read-modify-write corruption - cvt_json["cvtgrsst"] = formatter_.getBitmap( - reinterpret_cast(&p_cvtmap->cvtppgmx) + 4); - cvt_json["cvtgvt"] = formatter_.getHex(&(p_cvtmap->cvtgvt)); - cvt_json["cvthid"] = formatter_.getHex(&(p_cvtmap->cvthid)); - cvt_json["cvtixavl"] = formatter_.getHex(&(p_cvtmap->cvtixavl)); - cvt_json["cvtjesct"] = formatter_.getHex(&(p_cvtmap->cvtjesct)); - cvt_json["cvtlccat"] = formatter_.getHex(&(p_cvtmap->cvtlccat)); - cvt_json["cvtldto"] = formatter_.getHex(p_cvtxtnt2->cvtldto); - cvt_json["cvtlink"] = formatter_.getHex(&(p_cvtmap->cvtlink)); - cvt_json["cvtlso"] = formatter_.getHex(p_cvtxtnt2->cvtlso); - cvt_json["cvtmaxmp"] = p_cvtmap->cvtmaxmp; - cvt_json["cvtmdl"] = formatter_.getHex(p_cvtfix->cvtmdl); - cvt_json["cvtmser"] = formatter_.getHex(&(p_cvtmap->cvtmser)); - cvt_json["cvtopctp"] = formatter_.getHex(&(p_cvtmap->cvtopctp)); - cvt_json["cvtoslvl"] = formatter_.getHex(p_cvtmap->cvtoslvl) + - formatter_.getHex(p_cvtmap->cvtoslvl + 8); - // Read bitfield directly to avoid read-modify-write corruption - cvt_json["cvtover"] = formatter_.getBitmap( - reinterpret_cast(&p_cvtmap->cvtflags)); - cvt_json["cvtpccat"] = formatter_.getHex(&(p_cvtmap->cvtpccat)); - cvt_json["cvtpcnvt"] = formatter_.getHex(&(p_cvtmap->cvtpcnvt)); - cvt_json["cvtprltv"] = formatter_.getHex(&(p_cvtmap->cvtprltv)); - cvt_json["cvtprod"] = formatter_.getHex(p_cvtfix->cvtprod) + - formatter_.getHex(p_cvtfix->cvtprod + 8); - cvt_json["cvtpsxm"] = formatter_.getHex(&(p_cvtmap->cvtpsxm)); - cvt_json["cvtpvtp"] = formatter_.getHex(&(p_cvtmap->cvtpvtp)); - cvt_json["cvtqtd00"] = formatter_.getHex(&(p_cvtmap->cvtqtd00)); - cvt_json["cvtqte00"] = formatter_.getHex(&(p_cvtmap->cvtqte00)); - cvt_json["cvtrac"] = formatter_.getHex(&(p_cvtmap->cvtrac)); - cvt_json["cvtrcep"] = formatter_.getHex(&(p_cvtmap->cvtrcep)); - cvt_json["cvtrczrt"] = formatter_.getHex(&(p_cvtmap->cvtrczrt)); - cvt_json["cvtrelno"] = formatter_.getHex(p_cvtfix->cvtrelno); - // Read bitfield directly to avoid read-modify-write corruption - cvt_json["cvtri"] = formatter_.getBitmap( - reinterpret_cast(&p_cvtmap->cvtflags) + 3); - cvt_json["cvtrtmct"] = formatter_.getHex(&(p_cvtmap->cvtrtmct)); - cvt_json["cvtsaf"] = formatter_.getHex(&(p_cvtmap->cvtsaf)); - cvt_json["cvtscpin"] = formatter_.getHex(&(p_cvtmap->cvtscpin)); - // cvt_json["cvtsdbf"] = formatter_.getBitmap(p_cvtmap->cvtsdbf); - // Read bitfields directly to avoid read-modify-write corruption - cvt_json["cvtsdump"] = formatter_.getBitmap( - reinterpret_cast(&p_cvtmap->cvtdmsr)); - cvt_json["cvtsmca"] = formatter_.getHex(&(p_cvtmap->cvtsmca)); - cvt_json["cvtsname"] = formatter_.getString(p_cvtmap->cvtsname, 8); - cvt_json["cvtsubsp"] = formatter_.getBitmap( - reinterpret_cast(&p_cvtmap->cvtflags)); - cvt_json["cvtsvt"] = formatter_.getHex(&(p_cvtmap->cvtsvt)); - cvt_json["cvtsysad"] = formatter_.getHex(&(p_cvtmap->cvtsysad)); - cvt_json["cvttpc"] = formatter_.getHex(&(p_cvtmap->cvttpc)); - cvt_json["cvttvt"] = formatter_.getHex(&(p_cvtmap->cvttvt)); - // Read bitfields directly to avoid read-modify-write corruption - cvt_json["cvttx"] = formatter_.getBitmap( - reinterpret_cast(&p_cvtmap->cvtflags) + 3); - cvt_json["cvttxc"] = formatter_.getBitmap( - reinterpret_cast(&p_cvtmap->cvtflags) + 3); - cvt_json["cvttxte"] = formatter_.getBitmap( - reinterpret_cast(&p_cvtmap->cvtctlfg)); - ; - cvt_json["cvttz"] = p_cvtmap->cvttz; - cvt_json["cvtucbsc"] = formatter_.getHex(&(p_cvtmap->cvtucbsc)); - // Read cvtundvm bit directly to avoid bitfield read-modify-write corruption - // cvtundvm is bit 3 of the byte at offset 5 in cvtxtnt2 (same byte as - // cvtflgbt) - const unsigned char* p_cvtundvm = - reinterpret_cast(p_cvtxtnt2) + 5; - cvt_json["cvtundvm"] = formatter_.getBitmap(p_cvtundvm); - cvt_json["cvtuser"] = formatter_.getHex(&(p_cvtmap->cvtuser)); - cvt_json["cvtverid"] = formatter_.getHex(p_cvtfix->cvtverid); - cvt_json["cvtvfget"] = formatter_.getHex(&(p_cvtmap->cvtvfget)); - cvt_json["cvtvfind"] = formatter_.getHex(&(p_cvtmap->cvtvfind)); - cvt_json["cvtvpsib"] = formatter_.getHex(&(p_cvtmap->cvtvpsib)); - cvt_json["cvtvwait"] = formatter_.getHex(&(p_cvtmap->cvtvwait)); - cvt_json["cvt0ef00"] = formatter_.getHex(&(p_cvtmap->cvt0ef00)); - cvt_json["cvt0pt0e"] = formatter_.getHex(&(p_cvtmap->cvt0pt0e)); - cvt_json["cvt0pt02"] = formatter_.getHex(&(p_cvtmap->cvt0pt02)); - cvt_json["cvt0pt03"] = formatter_.getHex(&(p_cvtmap->cvt0pt03)); - cvt_json["cvt0scr1"] = formatter_.getHex(&(p_cvtmap->cvt0scr1)); - - if (CVT::matchFilter(cvt_json)) { - return cvt_json; - } else { - return {}; - } -} -} // namespace CBXP diff --git a/cbxp/control_blocks/cvt.hpp b/cbxp/control_blocks/cvt.hpp deleted file mode 100644 index 51ff892..0000000 --- a/cbxp/control_blocks/cvt.hpp +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef __CVT_H_ -#define __CVT_H_ - -#include - -#include "control_block.hpp" - -namespace CBXP { - -class CVT : public ControlBlock { - public: - nlohmann::json get(const void* p_control_block = nullptr, - const size_t buffer_length = 0) override; - explicit CVT(const cbxp_options_t& cbxp_options) - : ControlBlock("cvt", {"ecvt", "asvt"}, cbxp_options, - sizeof(struct cvtmap)) {} -}; - -} // namespace CBXP - -#endif diff --git a/cbxp/control_blocks/ecvt.cpp b/cbxp/control_blocks/ecvt.cpp deleted file mode 100644 index 9735ba3..0000000 --- a/cbxp/control_blocks/ecvt.cpp +++ /dev/null @@ -1,186 +0,0 @@ -#include "ecvt.hpp" - -#include -#include -#include - -#include -#include -#include - -#include "logger.hpp" - -namespace CBXP { -nlohmann::json ECVT::get(const void* p_control_block, - const size_t buffer_length) { - ECVT::checkDataLength(buffer_length); - const struct ecvt* p_ecvt; - nlohmann::json ecvt_json = {}; - - if (p_control_block == nullptr) { - // PSA starts at address 0 - const struct psa* __ptr32 p_psa = 0; - // Get the address of the CVT from the PSA - const struct cvtmap* __ptr32 p_cvt = - // 'nullPointer' is a false positive because the PSA starts at address 0 - // cppcheck-suppress nullPointer - static_cast(p_psa->flccvt); - // Get the address of the EVCT from the CVT - p_ecvt = static_cast(p_cvt->cvtecvt); - } else { - p_ecvt = static_cast(p_control_block); - } - - Logger::getInstance().debug("ECVT hex dump:"); - Logger::getInstance().hexDump(reinterpret_cast(p_ecvt), - sizeof(struct ecvt)); - - // Get Fields - - ecvt_json["ecvt_boostinfo"] = - formatter_.getBitmap( - reinterpret_cast(&p_ecvt->ecvt_boostinfo)) + - formatter_.getBitmap( - reinterpret_cast(&p_ecvt->ecvt_boostinfo + 8)) + - formatter_.getBitmap( - reinterpret_cast(&p_ecvt->ecvt_boostinfo + 16)); - - ecvt_json["ecvt_boostinfo_v1"] = - formatter_.getBitmap( - reinterpret_cast(&p_ecvt->ecvt_boostinfo_v1)) + - formatter_.getBitmap( - reinterpret_cast(&p_ecvt->ecvt_boostinfo_v1 + 8)) + - formatter_.getBitmap( - reinterpret_cast(&p_ecvt->ecvt_boostinfo_v1 + 16)) + - formatter_.getBitmap( - reinterpret_cast(&p_ecvt->ecvt_boostinfo_v1 + 24)); - - ecvt_json["ecvt_boostinfo_v2"] = - formatter_.getBitmap( - reinterpret_cast(&p_ecvt->ecvt_boostinfo_v2)) + - formatter_.getBitmap( - reinterpret_cast(&p_ecvt->ecvt_boostinfo_v2 + 8)) + - formatter_.getBitmap( - reinterpret_cast(&p_ecvt->ecvt_boostinfo_v2 + 16)) + - formatter_.getBitmap( - reinterpret_cast(&p_ecvt->ecvt_boostinfo_v2 + 24)); - - ecvt_json["ecvt_cms_lockinst_addr"] = - formatter_.getHex(p_ecvt->ecvt_cms_lockinst_addr); - ecvt_json["ecvt_customer_area_addr"] = - formatter_.getHex(p_ecvt->ecvt_customer_area_addr); - ecvt_json["ecvt_enqdeq_cms_lockinst_addr"] = - formatter_.getHex(p_ecvt->ecvt_enqdeq_cms_lockinst_addr); - ecvt_json["ecvt_getsrbidtoken"] = - formatter_.getHex(p_ecvt->ecvt_getsrbidtoken); - ecvt_json["ecvt_installed_core_at_ipl"] = p_ecvt->ecvt_installed_core_at_ipl; - ecvt_json["ecvt_installed_core_hwm"] = p_ecvt->ecvt_installed_core_hwm; - ecvt_json["ecvt_installed_cpu_at_ipl"] = p_ecvt->ecvt_installed_cpu_at_ipl; - ecvt_json["ecvt_installed_cpu_hwm"] = p_ecvt->ecvt_installed_cpu_hwm; - ecvt_json["ecvt_latch_cms_lockinst_addr"] = - formatter_.getHex(p_ecvt->ecvt_latch_cms_lockinst_addr); - // ecvt_json["ECVT_MAX_CPUMASKSIZEINBITS"] = ECVT_MAX_CPUMASKSIZEINBITS; - // ecvt_json["ECVT_MAX_CPUMASKSIZEINBYTES"] = ECVT_MAX_CPUMASKSIZEINBYTES; - // ecvt_json["ECVT_MAX_HIGHESTCPUID"] = ECVT_MAX_HIGHESTCPUID; - ecvt_json["ecvt_osprotect"] = formatter_.getBitmap( - reinterpret_cast(&p_ecvt->ecvt_osprotect)); - ecvt_json["ecvt_osprotect_whensystem"] = formatter_.getBitmap( - reinterpret_cast(&p_ecvt->ecvt_osprotect_whensystem)); - ecvt_json["ecvt_smf_cms_lockinst_addr"] = - formatter_.getHex(p_ecvt->ecvt_smf_cms_lockinst_addr); - ecvt_json["ecvt_ziipboostcoresaddr"] = - formatter_.getHex(p_ecvt->ecvtr430 + 4); - // ecvt_json["ECVT_ZOSR11_CPUMASKSIZEINBITS"] = ECVT_ZOSR11_CPUMASKSIZEINBITS; - // ecvt_json["ECVT_ZOSR11_CPUMASKSIZEINBYTES"] = - // ECVT_ZOSR11_CPUMASKSIZEINBYTES; ecvt_json["ECVT_ZOSR11_HIGHESTCPUID"] = - // ECVT_ZOSR11_HIGHESTCPUID; ecvt_json["ECVT_ZOSV2R1_CPUMASKSIZEINBITS"] = - // ECVT_ZOSV2R1_CPUMASKSIZEINBITS; - // ecvt_json["ECVT_ZOSV2R1_CPUMASKSIZEINBYTES"] = - // ECVT_ZOSV2R1_CPUMASKSIZEINBYTES; ecvt_json["ECVT_ZOSV2R1_HIGHESTCPUID"] = - // ECVT_ZOSV2R1_HIGHESTCPUID; - ecvt_json["ecvtalck"] = formatter_.getHex(p_ecvt->ecvtalck); - ecvt_json["ecvtappc"] = formatter_.getHex(p_ecvt->ecvtappc); - ecvt_json["ecvtappflags"] = - formatter_.getBitmap(p_ecvt->ecvtappflags); - ecvt_json["ecvtcachelinesize"] = formatter_.getBitmap( - reinterpret_cast(&p_ecvt->ecvtcachelinesize)); - ecvt_json["ecvtcachelinestartbdy"] = formatter_.getBitmap( - reinterpret_cast(&p_ecvt->ecvtcachelinestartbdy)); - ecvt_json["ecvtclnu"] = formatter_.getBitmap(p_ecvt->ecvtclnu); - ecvt_json["ecvtclon"] = formatter_.getString(p_ecvt->ecvtclon, 2); - ecvt_json["ecvtcrdt"] = formatter_.getHex(p_ecvt->ecvtcrdt); - ecvt_json["ecvtcsm"] = formatter_.getHex(p_ecvt->ecvtcsm); - ecvt_json["ecvtcsvn"] = formatter_.getBitmap( - reinterpret_cast(&p_ecvt->ecvtcsvn)); - ecvt_json["ecvtctbl"] = formatter_.getHex(p_ecvt->ecvtctbl); - ecvt_json["ecvtctb2"] = formatter_.getHex(p_ecvt->ecvtctb2); - ecvt_json["ecvtdgnb"] = formatter_.getHex(p_ecvt->ecvtdgnb); - ecvt_json["ecvtdlpf"] = formatter_.getHex(p_ecvt->ecvtdlpf); - ecvt_json["ecvtdlpl"] = formatter_.getHex(p_ecvt->ecvtdlpl); - // ecvt_json["ecvtdpqh"] = formatter_.getHex(p_ecvt->ecvtdpqh); ---> - // Protection Exception - ecvt_json["ecvtducu"] = formatter_.getHex(p_ecvt->ecvtducu); - ecvt_json["ecvtfacl"] = formatter_.getHex(p_ecvt->ecvtfacl); - ecvt_json["ecvtflg1"] = formatter_.getBitmap(p_ecvt->ecvtflg1); - ecvt_json["ecvtgmod"] = formatter_.getBitmap( - reinterpret_cast(&p_ecvt->ecvtgmod)); - ecvt_json["ecvthdnm"] = formatter_.getString(p_ecvt->ecvthdnm, 8); - ecvt_json["ecvtipa"] = formatter_.getHex(p_ecvt->ecvtipa); - ecvt_json["ecvtjaof"] = formatter_.getHex(p_ecvt->ecvtjaof); - ecvt_json["ecvtldto"] = - formatter_.getBitmap( - reinterpret_cast(&p_ecvt->ecvtldto)) + - formatter_.getBitmap( - reinterpret_cast(&p_ecvt->ecvtldto + 8)); - ecvt_json["ecvtlogicaltophysicalmask"] = formatter_.getBitmap( - reinterpret_cast(&p_ecvt->ecvtlogicaltophysicalmask)); - ecvt_json["ecvtlpdelen"] = formatter_.getBitmap( - reinterpret_cast(&p_ecvt->ecvtlpdelen)); - ecvt_json["ecvtlpnm"] = formatter_.getString(p_ecvt->ecvtlpnm, 8); - ecvt_json["ecvtlsab"] = formatter_.getHex(p_ecvt->ecvtlsab); - ecvt_json["ecvtlsen"] = formatter_.getHex(p_ecvt->ecvtlsen); - ecvt_json["ecvtlso"] = - formatter_.getBitmap( - reinterpret_cast(&p_ecvt->ecvtlso)) + - formatter_.getBitmap( - reinterpret_cast(&p_ecvt->ecvtlso + 8)); - ecvt_json["ecvtmaxcoreid"] = formatter_.getBitmap( - reinterpret_cast(&p_ecvt->ecvtmaxcoreid)); - ecvt_json["ecvtmaxmpnumbytesinmask"] = p_ecvt->ecvtmaxmpnumbytesinmask; - ecvt_json["ecvtnumcpuidsincore"] = formatter_.getBitmap( - reinterpret_cast(&p_ecvt->ecvtnumcpuidsincore)); - ecvt_json["ecvtocvt"] = formatter_.getHex(p_ecvt->ecvtocvt); - ecvt_json["ecvtoext"] = formatter_.getHex(p_ecvt->ecvtoext); - ecvt_json["ecvtomvs"] = formatter_.getBitmap(p_ecvt->ecvtomvs); - ecvt_json["ecvtpdvl"] = formatter_.getBitmap( - reinterpret_cast(&p_ecvt->ecvtpdvl)); - ecvt_json["ecvtphysicaltologicalmask"] = formatter_.getBitmap( - reinterpret_cast(&p_ecvt->ecvtphysicaltologicalmask)); - ecvt_json["ecvtpidn"] = formatter_.getString(p_ecvt->ecvtpidn, 8); - ecvt_json["ecvtpmod"] = formatter_.getString(p_ecvt->ecvtpmod, 2); - ecvt_json["ecvtpnam"] = formatter_.getString(p_ecvt->ecvtpnam, 16); - ecvt_json["ecvtpown"] = formatter_.getString(p_ecvt->ecvtpown, 16); - ecvt_json["ecvtprel"] = formatter_.getString(p_ecvt->ecvtprel, 2); - ecvt_json["ecvtpseq"] = p_ecvt->ecvtpseq; - ecvt_json["ecvtpver"] = formatter_.getString(p_ecvt->ecvtpver, 2); - ecvt_json["ecvtslid"] = formatter_.getBitmap( - reinterpret_cast(&p_ecvt->ecvtslid)); - ecvt_json["ecvtsplx"] = formatter_.getString(p_ecvt->ecvtsplx, 8); - ecvt_json["ecvtsrbj"] = formatter_.getHex(p_ecvt->ecvtsrbj); - ecvt_json["ecvtsrbl"] = formatter_.getHex(p_ecvt->ecvtsrbl); - ecvt_json["ecvtsxmp"] = formatter_.getHex(p_ecvt->ecvtsxmp); - ecvt_json["ecvtsymt"] = formatter_.getHex(p_ecvt->ecvtsymt); - ecvt_json["ecvttcp"] = formatter_.getHex(p_ecvt->ecvttcp); - ecvt_json["ecvtvmnm"] = formatter_.getBitmap( - reinterpret_cast(&p_ecvt->ecvtvmnm)); - ecvt_json["ecvtvser"] = formatter_.getBitmap( - reinterpret_cast(&p_ecvt->ecvtvser)); - ecvt_json["ecvtxtsw"] = formatter_.getHex(p_ecvt->ecvtxtsw); - - if (ECVT::matchFilter(ecvt_json)) { - return ecvt_json; - } else { - return {}; - } -} -} // namespace CBXP diff --git a/cbxp/control_blocks/ecvt.hpp b/cbxp/control_blocks/ecvt.hpp deleted file mode 100644 index a8183a7..0000000 --- a/cbxp/control_blocks/ecvt.hpp +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef __ECVT_H_ -#define __ECVT_H_ - -#include - -#include "control_block.hpp" - -namespace CBXP { - -class ECVT : public ControlBlock { - public: - nlohmann::json get(const void* p_control_block = nullptr, - const size_t buffer_length = 0) override; - explicit ECVT(const cbxp_options_t& cbxp_options) - : ControlBlock("ecvt", {}, cbxp_options, sizeof(struct ecvt)) {} -}; -} // namespace CBXP -#endif diff --git a/cbxp/control_blocks/ldax.cpp b/cbxp/control_blocks/ldax.cpp deleted file mode 100644 index 45f30a9..0000000 --- a/cbxp/control_blocks/ldax.cpp +++ /dev/null @@ -1,130 +0,0 @@ -#include "ldax.hpp" - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "asvt.hpp" -#include "logger.hpp" - -namespace CBXP { - -nlohmann::json LDAX::get(const void* p_control_block, - const size_t buffer_length) { - LDAX::checkDataLength(buffer_length); - const struct ldax* p_ldax; - nlohmann::json ldax_json = {}; - if (p_control_block == nullptr) { - // PSA starts at address 0 - const struct psa* __ptr32 p_psa = 0; - - const struct cvtmap* __ptr32 p_cvtmap = - // cppcheck-suppress nullPointer - static_cast(p_psa->flccvt); - - const asvt_t* __ptr32 p_asvt = - static_cast(p_cvtmap->cvtasvt); - - ldax_json["ldaxs"] = std::vector(); - std::vector& ldaxs = - ldax_json["ldaxs"].get_ref&>(); - - ldaxs.reserve(p_asvt->asvtmaxu); - - const uint32_t* __ptr32 p_ascb_addr = - reinterpret_cast(&(p_asvt->asvtenty)); - - for (int i = 0; i < p_asvt->asvtmaxu; i++) { - if (0x80000000 & *p_ascb_addr) { - Logger::getInstance().debug(formatter_.getHex(p_ascb_addr) + - " is not a valid ASCB address"); - p_ascb_addr++; - continue; - } - - // Cast ASCB address into ASCB pointer - const struct ascb* __ptr32 p_ascb = - reinterpret_cast(*p_ascb_addr); - - // Get ASSB from ASCB - const struct assb* __ptr32 p_assb = - reinterpret_cast(p_ascb->ascbassb); - - nlohmann::json next_ldax = - LDAX::get(*reinterpret_cast(p_assb->assbldax)); - if (!next_ldax.is_null()) { - ldaxs.push_back(next_ldax); - } - - p_ascb_addr++; - } - - return ldaxs; - } else { - p_ldax = static_cast(p_control_block); - } - - Logger::getInstance().debug("ldax hex dump:"); - Logger::getInstance().hexDump(reinterpret_cast(p_ldax), - sizeof(struct ldax)); - - ldax_json["ldax_id"] = formatter_.getString(p_ldax->ldax_id, 4); - ldax_json["ldax_version"] = - formatter_.getBitmap(p_ldax->ldax_version); - ldax_json["ldax_ldaascb"] = - formatter_.getHex(&(p_ldax->ldax_ldaascb)); - ldax_json["ldax_ldastrta"] = - formatter_.getHex(&(p_ldax->ldax_ldastrta)); - ldax_json["ldax_ldasiza"] = p_ldax->ldax_ldasiza; - ldax_json["ldax_ldaestra"] = - formatter_.getHex(&(p_ldax->ldax_ldaestra)); - ldax_json["ldax_ldaesiza"] = p_ldax->ldax_ldaesiza; - ldax_json["ldax_ldacrgtp"] = - formatter_.getHex(&(p_ldax->ldax_ldacrgtp)); - ldax_json["ldax_ldaergtp"] = - formatter_.getHex(&(p_ldax->ldax_ldaergtp)); - ldax_json["ldax_ldalimit"] = - formatter_.getHex(&(p_ldax->ldax_ldalimit)); - ldax_json["ldax_ldavvrg"] = - formatter_.getHex(&(p_ldax->ldax_ldavvrg)); - ldax_json["ldax_ldaelim"] = - formatter_.getHex(&(p_ldax->ldax_ldaelim)); - ldax_json["ldax_ldaevvrg"] = - formatter_.getHex(&(p_ldax->ldax_ldaevvrg)); - ldax_json["ldax_ldaloal"] = - formatter_.getBitmap(p_ldax->ldax_ldaloal); - ldax_json["ldax_ldahial"] = - formatter_.getBitmap(p_ldax->ldax_ldahial); - ldax_json["ldax_ldaeloal"] = - formatter_.getBitmap(p_ldax->ldax_ldaeloal); - ldax_json["ldax_ldaehial"] = - formatter_.getBitmap(p_ldax->ldax_ldaehial); - ldax_json["ldax_tcthwm"] = p_ldax->ldax_tcthwm; - ldax_json["ldax_tctlwm"] = p_ldax->ldax_tctlwm; - ldax_json["ldax_tctehwm"] = p_ldax->ldax_tctehwm; - ldax_json["ldax_tctelwm"] = p_ldax->ldax_tctelwm; - ldax_json["ldax_curhighbot"] = - formatter_.getHex(&(p_ldax->ldax_curhighbot)); - ldax_json["ldax_curehighbot"] = - formatter_.getHex(&(p_ldax->ldax_curehighbot)); - ldax_json["ldax_ldasmad"] = - formatter_.getHex(&(p_ldax->ldax_ldasmad)); - ldax_json["ldax_ldasmsz"] = - formatter_.getHex(&(p_ldax->ldax_ldasmsz)); - ldax_json["ldax_obtainshomespace"] = p_ldax->ldax_obtainshomespace; - - if (LDAX::matchFilter(ldax_json)) { - return ldax_json; - } else { - return {}; - } -} - -} // namespace CBXP diff --git a/cbxp/control_blocks/ldax.hpp b/cbxp/control_blocks/ldax.hpp deleted file mode 100644 index 0878206..0000000 --- a/cbxp/control_blocks/ldax.hpp +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef __LDAX_H_ -#define __LDAX_H_ - -#include - -#include "control_block.hpp" - -namespace CBXP { - -class LDAX : public ControlBlock { - public: - nlohmann::json get(const void* p_control_block = nullptr, - const size_t buffer_length = 0) override; - explicit LDAX(const cbxp_options_t& cbxp_options) - : ControlBlock("ldax", {}, cbxp_options, sizeof(struct ldax)) {} -}; - -} // namespace CBXP - -#endif diff --git a/cbxp/control_blocks/oucb.cpp b/cbxp/control_blocks/oucb.cpp deleted file mode 100644 index 954a3e4..0000000 --- a/cbxp/control_blocks/oucb.cpp +++ /dev/null @@ -1,163 +0,0 @@ -#include "oucb.hpp" - -#include -#include -#include - -#include -#include -#include -#include - -#include "asvt.hpp" -#include "logger.hpp" - -namespace CBXP { -nlohmann::json OUCB::get(const void* p_control_block, - const size_t buffer_length) { - OUCB::checkDataLength(buffer_length); - const oucb_t* p_oucb; - nlohmann::json oucb_json = {}; - if (p_control_block == nullptr) { - // PSA starts at address 0 - const struct psa* __ptr32 p_psa = 0; - - const struct cvtmap* __ptr32 p_cvtmap = - // 'nullPointer' is a false positive because the PSA starts at address - // cppcheck-suppress nullPointer - static_cast(p_psa->flccvt); - const asvt_t* __ptr32 p_asvt = - static_cast(p_cvtmap->cvtasvt); - - oucb_json["oucbs"] = std::vector(); - std::vector& oucbs = - oucb_json["oucbs"].get_ref&>(); - oucbs.reserve(p_asvt->asvtmaxu); - - const uint32_t* __ptr32 p_ascb_addr = - reinterpret_cast(&p_asvt->asvtenty); - for (int i = 0; i < p_asvt->asvtmaxu; i++) { - if (0x80000000 & *p_ascb_addr) { - Logger::getInstance().debug(formatter_.getHex(p_ascb_addr) + - " is not a valid ASCB address"); - p_ascb_addr++; - continue; - } - // cast ascb addr into ascb pointer a - // - const struct ascb* __ptr32 p_ascb = - reinterpret_cast(*p_ascb_addr); - nlohmann::json next_oucb = - OUCB::get(reinterpret_cast(p_ascb->ascboucb)); - if (!next_oucb.is_null()) { - oucbs.push_back(next_oucb); - } - p_ascb_addr++; // This SHOULD increment the pointer by 4 bytes. - } - return oucbs; - } else { - p_oucb = static_cast(p_control_block); - } - - Logger::getInstance().debug("oucb hex dump:"); - Logger::getInstance().hexDump(reinterpret_cast(p_oucb), - sizeof(oucb_t)); - - oucb_json["oucbname"] = formatter_.getString(p_oucb->oucbname, 4); - oucb_json["oucbfwd"] = formatter_.getHex(&(p_oucb->oucbfwd)); - oucb_json["oucbbck"] = formatter_.getHex(&(p_oucb->oucbbck)); - oucb_json["oucbtma"] = p_oucb->oucbtma; - oucb_json["oucbqfl"] = formatter_.getBitmap(p_oucb->oucbqfl); - oucb_json["oucbsfl"] = formatter_.getBitmap(p_oucb->oucbsfl); - oucb_json["oucbyfl"] = formatter_.getBitmap(p_oucb->oucbyfl); - oucb_json["oucbafl"] = formatter_.getBitmap(p_oucb->oucbafl); - oucb_json["oucbtfl"] = formatter_.getBitmap(p_oucb->oucbtfl); - oucb_json["oucbefl"] = formatter_.getBitmap(p_oucb->oucbefl); - oucb_json["oucbasstatus"] = - formatter_.getBitmap(p_oucb->oucbasstatus); - oucb_json["oucbufl"] = formatter_.getBitmap(p_oucb->oucbufl); - oucb_json["oucblfl"] = formatter_.getBitmap(p_oucb->oucblfl); - oucb_json["oucbrfl"] = formatter_.getBitmap(p_oucb->oucbrfl); - oucb_json["oucbndp"] = formatter_.getBitmap(p_oucb->oucbndp); - oucb_json["oucbtndp"] = formatter_.getBitmap(p_oucb->oucbtndp); - oucb_json["oucbmfl"] = formatter_.getBitmap(p_oucb->oucbmfl); - oucb_json["oucbiac"] = p_oucb->oucbiac; - oucb_json["oucbrsv1"] = p_oucb->oucbrsv1; - oucb_json["oucbpgp"] = p_oucb->oucbpgp; - oucb_json["oucbwsci"] = p_oucb->oucbwsci; - oucb_json["oucbwrci"] = p_oucb->oucbwrci; - oucb_json["oucbmfl2"] = formatter_.getBitmap(p_oucb->oucbmfl2); - oucb_json["oucbmfl3"] = formatter_.getBitmap(p_oucb->oucbmfl3); - oucb_json["oucbdmo"] = p_oucb->oucbdmo; - oucb_json["oucbdmn"] = p_oucb->oucbdmn; - oucb_json["oucbsrc"] = p_oucb->oucbsrc; - oucb_json["oucbswc"] = p_oucb->oucbswc; - oucb_json["oucbtmw"] = p_oucb->oucbtmw; - oucb_json["oucbwms"] = p_oucb->oucbwms; - oucb_json["oucbcpu"] = p_oucb->oucbcpu; - oucb_json["oucbioc"] = p_oucb->oucbioc; - oucb_json["oucbmso"] = p_oucb->oucbmso; - oucb_json["oucbtms"] = p_oucb->oucbtms; - oucb_json["oucbtmo"] = p_oucb->oucbtmo; - oucb_json["oucbdrfr"] = p_oucb->oucbdrfr; - // Union - oucb_json["oucbcsw"] = p_oucb->oucbcsw; - oucb_json["oucbacn"] = formatter_.getBitmap(p_oucb->oucbacn); - oucb_json["oucbcfl"] = formatter_.getBitmap(p_oucb->oucbcfl); - oucb_json["oucbcsbt"] = formatter_.getBitmap(p_oucb->oucbcsbt); - oucb_json["oucbcmrv"] = p_oucb->oucbcmrv; - oucb_json["oucbwmrl"] = p_oucb->oucbwmrl; - oucb_json["oucbval"] = p_oucb->oucbval; - oucb_json["oucbpfl"] = formatter_.getBitmap(p_oucb->oucbpfl); - oucb_json["oucbactl"] = p_oucb->oucbactl; - oucb_json["oucbiocl"] = p_oucb->oucbiocl; - oucb_json["oucbdspc"] = formatter_.getBitmap(p_oucb->oucbdspc); - oucb_json["oucbdspn"] = formatter_.getBitmap(p_oucb->oucbdspn); - oucb_json["oucbntsp"] = p_oucb->oucbntsp; - oucb_json["oucbps1"] = p_oucb->oucbps1; - oucb_json["oucbps2"] = p_oucb->oucbps2; - oucb_json["oucbpst"] = p_oucb->oucbpst; - oucb_json["oucbrct"] = p_oucb->oucbrct; - oucb_json["oucbiit"] = p_oucb->oucbiit; - oucb_json["oucbnds"] = p_oucb->oucbnds; - oucb_json["oucbntsg"] = formatter_.getBitmap(p_oucb->oucbntsg); - oucb_json["oucbrsv2"] = p_oucb->oucbrsv2; - oucb_json["oucbtme"] = p_oucb->oucbtme; - oucb_json["oucbtml"] = p_oucb->oucbtml; - oucb_json["oucbdwms"] = p_oucb->oucbdwms; - oucb_json["oucbsrb"] = p_oucb->oucbsrb; - oucb_json["oucbtwss"] = p_oucb->oucbtwss; - oucb_json["oucbtmp"] = p_oucb->oucbtmp; - oucb_json["oucbdlyt"] = p_oucb->oucbdlyt; - oucb_json["oucbhst"] = p_oucb->oucbhst; - oucb_json["oucbcfs"] = p_oucb->oucbcfs; - oucb_json["oucbrpg"] = p_oucb->oucbrpg; - oucb_json["oucbspg"] = p_oucb->oucbspg; - oucb_json["oucbnpg"] = p_oucb->oucbnpg; - oucb_json["oucbsrpg"] = p_oucb->oucbsrpg; - oucb_json["oucbnrpg"] = p_oucb->oucbnrpg; - oucb_json["oucburpg"] = p_oucb->oucburpg; - oucb_json["oucbcrpg"] = p_oucb->oucbcrpg; - oucb_json["oucbarpg"] = p_oucb->oucbarpg; - oucb_json["oucbdrfp"] = p_oucb->oucbdrfp; - oucb_json["oucbtrxn"] = formatter_.getString(p_oucb->oucbtrxn, 8); - oucb_json["oucbusrd"] = formatter_.getString(p_oucb->oucbusrd, 8); - oucb_json["oucbcls"] = formatter_.getString(p_oucb->oucbcls, 8); - oucb_json["oucbtrs"] = p_oucb->oucbtrs; - oucb_json["oucbtrr"] = p_oucb->oucbtrr; - oucb_json["oucbswss"] = p_oucb->oucbswss; - oucb_json["oucbpsum"] = p_oucb->oucbpsum; - oucb_json["oucbfixb"] = p_oucb->oucbfixb; - oucb_json["oucbaplv"] = formatter_.getBitmap(p_oucb->oucbaplv); - oucb_json["oucbesap"] = formatter_.getBitmap(p_oucb->oucbesap); - oucb_json["oucbrst1"] = p_oucb->oucbrst1; - oucb_json["oucbrst2"] = p_oucb->oucbrst2; - oucb_json["oucbx1_0"] = p_oucb->oucbx1_0; - - if (OUCB::matchFilter(oucb_json)) { - return oucb_json; - } else { - return {}; - } -} -} // namespace CBXP diff --git a/cbxp/control_blocks/oucb.hpp b/cbxp/control_blocks/oucb.hpp deleted file mode 100644 index a5cff84..0000000 --- a/cbxp/control_blocks/oucb.hpp +++ /dev/null @@ -1,120 +0,0 @@ -#ifndef __OUCB_H_ -#define __OUCB_H_ - -#include "control_block.hpp" - -#pragma pack(push, 1) // Don't byte align structure members. -typedef struct { - char oucbname[4]; - char* __ptr32 oucbfwd; - char* __ptr32 oucbbck; - int32_t oucbtma; - uint8_t oucbqfl; - uint8_t oucbsfl; - uint8_t oucbyfl; - uint8_t oucbafl; - uint8_t oucbtfl; - uint8_t oucbefl; - uint8_t oucbasstatus; - uint8_t oucbufl; - uint8_t oucblfl; - uint8_t oucbrfl; - uint8_t oucbndp; - uint8_t oucbtndp; - uint8_t oucbmfl; - int8_t oucbiac; - int8_t oucbrsv1; - int8_t oucbpgp; - int16_t oucbwsci; - int16_t oucbwrci; - uint8_t oucbmfl2; - uint8_t oucbmfl3; - int16_t oucbdmo; - int8_t oucbdmn; - int8_t oucbsrc; - int16_t oucbswc; - char* __ptr32 oucbascb; - char* __ptr32 oucbpagp; - int32_t oucbtmw; - int32_t oucbwms; - int32_t oucbcpu; - int32_t oucbioc; - int32_t oucbmso; - int32_t oucbtms; - int32_t oucbtmo; - int32_t oucbdrfr; - char* __ptr32 oucbact; - union { - uint32_t oucbcsw; - struct { - uint16_t oucbacn; - uint8_t oucbcfl; - uint8_t oucbcsbt; - }; - }; - int32_t oucbcmrv; - int32_t oucbwmrl; - int16_t oucbval; - uint8_t oucbpfl; - int8_t oucbactl; - int64_t oucbiocl; - uint8_t oucbdspc; - uint8_t oucbdspn; - int16_t oucbntsp; - int32_t oucbps1; - int32_t oucbps2; - int32_t oucbpst; - int32_t oucbrct; - int32_t oucbiit; - int16_t oucbnds; - uint8_t oucbntsg; - int8_t oucbrsv2; - int32_t oucbtme; - int32_t oucbtml; - int32_t oucbdwms; - int32_t oucbsrb; - int32_t oucbtwss; - int32_t oucbtmp; - int32_t oucbdlyt; - int32_t oucbhst; - int32_t oucbcfs; - char oucbsubn[4]; - int16_t oucbrpg; - int16_t oucbspg; - int16_t oucbnpg; - int16_t oucbsrpg; - int16_t oucbnrpg; - int16_t oucburpg; - int16_t oucbcrpg; - int16_t oucbarpg; - int32_t oucbdrfp; - char oucbtrxn[8]; - char oucbusrd[8]; - char oucbcls[8]; - int32_t oucbtrs; - int32_t oucbtrr; - int32_t oucbactp; - int32_t oucbswss; - int32_t oucbpsum; - int16_t oucbfixb; - uint8_t oucbaplv; - uint8_t oucbesap; - int32_t oucbrst1; - int32_t oucbrst2; - int32_t oucbx1_0; -} oucb_t; -#pragma pack(pop) // Restore default structure packing options. - -namespace CBXP { - -class OUCB : public ControlBlock { - public: - nlohmann::json get(const void* p_control_block = nullptr, - const size_t buffer_length = 0) override; - explicit OUCB(const cbxp_options_t& cbxp_options) - : ControlBlock("oucb", {}, cbxp_options, sizeof(oucb_t)) {} -}; - -} // namespace CBXP - -#endif diff --git a/cbxp/control_blocks/psa.cpp b/cbxp/control_blocks/psa.cpp deleted file mode 100644 index 9824383..0000000 --- a/cbxp/control_blocks/psa.cpp +++ /dev/null @@ -1,73 +0,0 @@ -#include "psa.hpp" - -#include -#include -#include - -#include "cvt.hpp" -#include "logger.hpp" - -namespace CBXP { -nlohmann::json PSA::get(const void* p_control_block, - const size_t buffer_length) { - PSA::checkDataLength(buffer_length); - const struct psa* p_psa; - nlohmann::json psa_json = {}; - - if (p_control_block == nullptr) { - // PSA starts at address 0 - p_psa = 0; - } else { - p_psa = static_cast(p_control_block); - } - - Logger::getInstance().debug("PSA hex dump:"); - Logger::getInstance().hexDump( - reinterpret_cast(p_psa), sizeof(struct psa) / 2, - true); // Only the first "page" of the PSA is not fetch-protected - - psa_json["flccvt"] = formatter_.getHex(&p_psa->flccvt); - - for (const auto& [include, cbxp_options] : options_map_) { - if (include == "cvt") { - psa_json["flccvt"] = CBXP::CVT(cbxp_options).get(p_psa->flccvt); - if (psa_json["flccvt"].is_null()) { - return {}; - } - } - } - - // Get fields - psa_json["psapsa"] = formatter_.getString(p_psa->psapsa, 4); - psa_json["flcsvilc"] = static_cast(p_psa->flcsvilc); - psa_json["flcrnpsw_bitstring"] = - formatter_.getBitmap(p_psa->flcrnpsw); - psa_json["flcrnpsw_hex"] = formatter_.getHex(p_psa->flcrnpsw + 4); - psa_json["flcsopsw"] = formatter_.getPswSmall(p_psa->flcsopsw); - psa_json["flcarch"] = formatter_.getBitmap( - reinterpret_cast(&p_psa->flcarch)); - psa_json["flccvt64"] = formatter_.getHex(p_psa->flccvt64); - psa_json["flcfacl"] = formatter_.getBitmap(p_psa->flcfacl) + - formatter_.getBitmap(p_psa->flcfacl + 8); - psa_json["flcfacle"] = formatter_.getBitmap(p_psa->flcfacle) + - formatter_.getBitmap(p_psa->flcfacle + 8); - psa_json["psaaold"] = formatter_.getHex(p_psa->psaaold); - psa_json["psaecvt"] = formatter_.getHex(p_psa->psaecvt); - psa_json["psaflags"] = formatter_.getBitmap( - reinterpret_cast(&p_psa->psaflags)); - psa_json["psafpfl"] = formatter_.getBitmap( - reinterpret_cast(&p_psa->psafpfl)); - psa_json["psalaa"] = formatter_.getHex(p_psa->psalaa); - psa_json["psalccav"] = formatter_.getHex(&p_psa->psalccav); - psa_json["psatold"] = formatter_.getHex(p_psa->psatold); - psa_json["psatrvt"] = formatter_.getHex(p_psa->psatrvt); - psa_json["psaval"] = formatter_.getBitmap(p_psa->psaval); - psa_json["psaxcvt"] = formatter_.getHex(p_psa->psaxcvt); - - if (PSA::matchFilter(psa_json)) { - return psa_json; - } else { - return {}; - } -} -} // namespace CBXP diff --git a/cbxp/control_blocks/psa.hpp b/cbxp/control_blocks/psa.hpp deleted file mode 100644 index 92db78a..0000000 --- a/cbxp/control_blocks/psa.hpp +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef __PSA_H_ -#define __PSA_H_ - -#include - -#include "control_block.hpp" - -namespace CBXP { - -class PSA : public ControlBlock { - public: - nlohmann::json get(const void* p_control_block = nullptr, - const size_t buffer_length = 0) override; - explicit PSA(const cbxp_options_t& cbxp_options) - : ControlBlock("psa", {"cvt"}, cbxp_options, sizeof(struct psa) / 2) {} -}; -} // namespace CBXP -#endif diff --git a/cbxp/control_blocks/zos_subpools.hpp b/cbxp/control_blocks/zos_subpools.hpp new file mode 100644 index 0000000..8c0611a --- /dev/null +++ b/cbxp/control_blocks/zos_subpools.hpp @@ -0,0 +1,206 @@ +#pragma once + +#include +#include + +// IBM z/OS Storage Subpool attributes +// Source: https://www.ibm.com/docs/en/zos/3.1.0?topic=summary-storage-subpools +// Columns captured: Subpool number, Location (Common vs Private), Fetch +// Protection + +namespace zos { + +// --------------------------------------------------------------------------- +// Whether the subpool belongs to the Common or Private address space. +// --------------------------------------------------------------------------- +enum class SubpoolOwnership : uint8_t { + Private, + Common, +}; + +// --------------------------------------------------------------------------- +// The named storage region within the owning address space. +// +// Low = below the 16 MB line (private only) +// High = above the 16 MB line (private only) +// LSQA = Local System Queue Area (private only) +// SQA = System Queue Area (common only) +// CSA = Common Service Area (common only) +// --------------------------------------------------------------------------- +enum class SubpoolRegion : uint8_t { + Low, // Private: below 16 MB line + High, // Private: above 16 MB line + LSQA, // Private: Local System Queue Area + SQA, // Common: System Queue Area + CSA, // Common: Common Service Area +}; + +// --------------------------------------------------------------------------- +// Whether the subpool spans only the base (non-extended) region, only the +// Extended region (above 2 GB bar), or Both. +// +// Base – traditional 31-bit region only (e.g. "SQA" / "LSQA") +// Extended – 64-bit extended region only (e.g. "ESQA" / "ELSQA") +// Both – subpool covers base AND extended (e.g. "SQA/ESQA", "LSQA/ELSQA") +// --------------------------------------------------------------------------- +enum class SubpoolExtent : uint8_t { + Base, + Extended, + Both, +}; + +// --------------------------------------------------------------------------- +// Full descriptor for a subpool entry. +// --------------------------------------------------------------------------- +struct SubpoolLocation { + SubpoolOwnership ownership; + SubpoolRegion region; + SubpoolExtent extent; +}; + +struct SubpoolInfo { + SubpoolLocation location; + bool fetch_protected; +}; + +// --------------------------------------------------------------------------- +// Convenience construction aliases — keeps the map readable. +// --------------------------------------------------------------------------- +namespace detail { +using O = SubpoolOwnership; +using R = SubpoolRegion; +using E = SubpoolExtent; + +// Private shorthands +static constexpr SubpoolLocation PrivLowBase{O::Private, R::Low, E::Base}; +static constexpr SubpoolLocation PrivHighBase{O::Private, R::High, E::Base}; +static constexpr SubpoolLocation PrivLSQABase{O::Private, R::LSQA, E::Base}; +static constexpr SubpoolLocation PrivLSQAExt{O::Private, R::LSQA, E::Extended}; +static constexpr SubpoolLocation PrivLSQABoth{O::Private, R::LSQA, E::Both}; + +// Common shorthands +static constexpr SubpoolLocation CommSQABoth{O::Common, R::SQA, E::Both}; +static constexpr SubpoolLocation CommSQAExt{O::Common, R::SQA, E::Extended}; +static constexpr SubpoolLocation CommCSABoth{O::Common, R::CSA, E::Both}; +static constexpr SubpoolLocation CommCSAExt{O::Common, R::CSA, E::Extended}; +} // namespace detail + +// --------------------------------------------------------------------------- +// Map from subpool decimal number → SubpoolInfo. +// Subpools 0–127 are handled as a range in subpool_info_for(); they are NOT +// stored individually here. +// --------------------------------------------------------------------------- +// clang-format off +inline const std::unordered_map kSubpoolMap = { + // SP │ location (ownership, region, extent) │ fetch_protected + // ────┼────────────────────────────────────────┼──────────────── + + // ── 129–134 ───────────────────────────────────────────────────────────── + // IBM table: "Private (low)" — standard 31-bit private storage. + // Notes 24 on 133/134 indicate possible ELPA-range behavior but the + // table still lists them as Private low. + { 129, { detail::PrivLowBase, true } }, // 0x81 + { 130, { detail::PrivLowBase, false } }, // 0x82 + { 131, { detail::PrivLowBase, true } }, // 0x83 + { 132, { detail::PrivLowBase, false } }, // 0x84 + { 133, { detail::PrivLowBase, true } }, // 0x85 (see IBM note 24) + { 134, { detail::PrivLowBase, false } }, // 0x86 (see IBM note 24) + + // ── 203–205 ───────────────────────────────────────────────────────────── + // IBM table: "Private ELSQA" — Extended LSQA only, no base counterpart. + { 203, { detail::PrivLSQAExt, false } }, // 0xCB + { 204, { detail::PrivLSQAExt, false } }, // 0xCC + { 205, { detail::PrivLSQAExt, false } }, // 0xCD + + // ── 213–215 ───────────────────────────────────────────────────────────── + { 213, { detail::PrivLSQAExt, true } }, // 0xD5 + { 214, { detail::PrivLSQAExt, true } }, // 0xD6 + { 215, { detail::PrivLSQAExt, true } }, // 0xD7 + + // ── 223–225 ───────────────────────────────────────────────────────────── + { 223, { detail::PrivLSQAExt, true } }, // 0xDF + { 224, { detail::PrivLSQAExt, true } }, // 0xE0 + { 225, { detail::PrivLSQAExt, true } }, // 0xE1 + + // ── 226–231 ───────────────────────────────────────────────────────────── + // IBM table "SQA/ESQA" → Common SQA, Both extents. + // IBM table "CSA/ECSA" → Common CSA, Both extents. + { 226, { detail::CommSQABoth, false } }, // 0xE2 SQA/ESQA + { 227, { detail::CommCSABoth, true } }, // 0xE3 CSA/ECSA + { 228, { detail::CommCSABoth, false } }, // 0xE4 CSA/ECSA + { 229, { detail::PrivHighBase, true } }, // 0xE5 Private high + { 230, { detail::PrivHighBase, false } }, // 0xE6 Private high + { 231, { detail::CommCSABoth, true } }, // 0xE7 CSA/ECSA + + // ── 233–237 ───────────────────────────────────────────────────────────── + // IBM table "LSQA/ELSQA" → Private LSQA, Both extents. + { 233, { detail::PrivLSQABoth, false } }, // 0xE9 LSQA/ELSQA + { 234, { detail::PrivLSQABoth, false } }, // 0xEA LSQA/ELSQA + { 235, { detail::PrivLSQABoth, false } }, // 0xEB LSQA/ELSQA + { 236, { detail::PrivHighBase, false } }, // 0xEC Private high + { 237, { detail::PrivHighBase, false } }, // 0xED Private high + + // ── 239 ───────────────────────────────────────────────────────────────── + { 239, { detail::CommSQABoth, true } }, // 0xEF SQA/ESQA + + // ── 240–255 ───────────────────────────────────────────────────────────── + { 240, { detail::PrivLowBase, true } }, // 0xF0 + { 241, { detail::CommCSABoth, false } }, // 0xF1 CSA/ECSA + { 242, { detail::CommCSABoth, false } }, // 0xF2 CSA/ECSA [change marker] + { 243, { detail::CommCSABoth, false } }, // 0xF3 CSA/ECSA [change marker] + { 244, { detail::PrivLowBase, false } }, // 0xF4 + { 245, { detail::CommSQABoth, false } }, // 0xF5 SQA/ESQA + { 246, { detail::PrivLowBase, false } }, // 0xF6 [change marker] + // IBM table "ESQA" (no base SQA) → Common SQA, Extended only. + { 247, { detail::CommSQAExt, true } }, // 0xF7 ESQA only + { 248, { detail::CommSQAExt, false } }, // 0xF8 ESQA only + { 249, { detail::PrivHighBase, false } }, // 0xF9 Private high + { 250, { detail::PrivLowBase, true } }, // 0xFA + { 251, { detail::PrivLowBase, true } }, // 0xFB + { 252, { detail::PrivLowBase, false } }, // 0xFC + { 253, { detail::PrivLSQABoth, false } }, // 0xFD LSQA/ELSQA + { 254, { detail::PrivLSQABoth, false } }, // 0xFE LSQA/ELSQA + { 255, { detail::PrivLSQABoth, false } }, // 0xFF LSQA/ELSQA +}; +// clang-format on + +// --------------------------------------------------------------------------- +// Predicates +// --------------------------------------------------------------------------- +[[nodiscard]] inline bool is_common(const SubpoolLocation& loc) noexcept { + return loc.ownership == SubpoolOwnership::Common; +} + +// cppcheck-suppress unusedFunction +[[nodiscard]] inline bool is_private(const SubpoolLocation& loc) noexcept { + return loc.ownership == SubpoolOwnership::Private; +} + +// cppcheck-suppress unusedFunction +[[nodiscard]] inline bool is_extended(const SubpoolLocation& loc) noexcept { + return loc.extent == SubpoolExtent::Extended || + loc.extent == SubpoolExtent::Both; +} + +// cppcheck-suppress unusedFunction +[[nodiscard]] inline bool is_base(const SubpoolLocation& loc) noexcept { + return loc.extent == SubpoolExtent::Base; +} + +// --------------------------------------------------------------------------- +// Primary lookup. Handles the 0–127 range inline (all: Private Low Base, +// fetch-protected). Returns nullptr for any subpool not in the IBM table. +// --------------------------------------------------------------------------- +[[nodiscard]] inline const SubpoolInfo* subpool_info_for(uint32_t sp) noexcept { + static constexpr SubpoolInfo k0to127{detail::PrivLowBase, true}; + if (sp <= 127) { + return &k0to127; + } + auto it = kSubpoolMap.find(sp); + if (it == kSubpoolMap.end()) { + return nullptr; + } + return &it->second; +} + +} // namespace zos diff --git a/cbxp/explorer_options_map.cpp b/cbxp/explorer_options_map.cpp new file mode 100644 index 0000000..eea1cf6 --- /dev/null +++ b/cbxp/explorer_options_map.cpp @@ -0,0 +1,512 @@ +#include "explorer_options_map.hpp" + +#include + +#include + +#include "control_block_error.hpp" +#include "logger.hpp" + +namespace CBXP { + +void ExplorerOptionsMap::createIncludeLists( + const std::vector& includes) { + Logger::getInstance().debug( + "Creating include lists for child control blocks to include with the '" + + control_block_->getName() + "' control block..."); + for (std::string include : includes) { + if (include == "**") { + Logger::getInstance().debug("Processing '**' include..."); + ExplorerOptionsMap::processDoubleAsteriskInclude(); + return; + } else if (include == "*") { + Logger::getInstance().debug("Processing '*' include..."); + ExplorerOptionsMap::processAsteriskInclude(); + } else { + Logger::getInstance().debug("Processing '" + include + "' include..."); + ExplorerOptionsMap::processExplicitInclude(include); + } + } + Logger::getInstance().debug( + "Include lists for child control blocks to include with the '" + + control_block_->getName() + "' control block have been created"); +} + +void ExplorerOptionsMap::processDoubleAsteriskInclude() { + // Any existing entries in the hash map are redundant, so clear them + options_map_.clear(); + for (const std::string& includable : control_block_->getIncludables()) { + // Build a map of all control_block_details_.includables but with "**" at + // the next level + Logger::getInstance().debug( + "Initializing and adding '**' to the include list for the '" + + includable + "' control block..."); + options_map_[includable].include_patterns = {"**"}; + } +} + +void ExplorerOptionsMap::processAsteriskInclude() { + if (options_map_.empty()) { + for (const std::string& includable : control_block_->getIncludables()) { + // Build a map of all control_block_details_.includables + Logger::getInstance().debug("Initializing include list for the '" + + includable + "' control block..."); + options_map_[includable].include_patterns = {}; + } + } + for (const std::string& includable : control_block_->getIncludables()) { + if (options_map_.find(includable) != options_map_.end()) { + Logger::getInstance().debug("Include list already exists for the '" + + includable + "' control block"); + continue; + } + // Add all control_block_details_.includables not already present to the map + Logger::getInstance().debug("Initializing include list for the '" + + includable + "' control block..."); + options_map_[includable].include_patterns = {}; + } +} + +void ExplorerOptionsMap::processExplicitInclude(std::string& include) { + // Default case; have to validate against an includable + const std::string del = "."; + std::string include_includes = ""; + size_t del_pos = include.find(del); + if (del_pos != std::string::npos) { + // If there's a "." then separate include into the include and its + // includes + include_includes = include.substr(del_pos + 1); + include.resize(del_pos); + } + if (std::find(control_block_->getIncludables().begin(), + control_block_->getIncludables().end(), + include) == control_block_->getIncludables().end()) { + Logger::getInstance().debug( + "'" + include + + "' is not a known child control block that can be included with the '" + + control_block_->getName() + "' control block"); + throw IncludeError(); + } + if (options_map_.find(include) == options_map_.end()) { + // If we don't already have this include in our map, add it with its + // includes + if (include_includes == "") { + Logger::getInstance().debug("Initializing include list for the '" + + include + "' control block..."); + options_map_[include].include_patterns = {}; + } else { + Logger::getInstance().debug("Adding '" + include_includes + + "' to the include list for the '" + include + + "' control block..."); + options_map_[include].include_patterns = {include_includes}; + } + } else { + // If we DO already have this in our map, then we should add its + // includes if they are useful or new + if (std::find(options_map_[include].include_patterns.begin(), + options_map_[include].include_patterns.end(), + include_includes) != + options_map_[include].include_patterns.end()) { + return; + } + if (include_includes == "") { + return; + } + Logger::getInstance().debug("Adding '" + include_includes + + "' to the include list for the '" + include + + "' control block..."); + options_map_[include].include_patterns.push_back(include_includes); + } +} + +void ExplorerOptionsMap::createFilterLists( + const std::vector& filters) { + Logger::getInstance().debug( + "Creating filter lists for the '" + control_block_->getName() + + "' control block and included child control blocks..."); + for (const std::string& filter : filters) { + // Only case; specific non-generic filter + const std::string del = "."; + size_t del_pos = filter.find(del); + if (del_pos != std::string::npos) { + // If there's a "." then separate filter into the control_block + // and its filter + std::string control_block_filter = filter.substr(del_pos + 1); + std::string control_block = filter.substr(0, del_pos); + + // Check to make sure we are including the specified control block + auto it = options_map_.find(control_block); + if (it == options_map_.end()) { + Logger::getInstance().debug( + "A filter that requires the '" + control_block + + "' control block was provided, but the '" + control_block + + "' control block was not included"); + throw FilterError(); + } + Logger::getInstance().debug("Adding '" + control_block_filter + + "' to the filter list for the '" + + control_block + "' control block..."); + options_map_[control_block].filters.push_back(control_block_filter); + } else { + ExplorerOptionsMap::addCurrentFilter(filter); + } + } + Logger::getInstance().debug( + "Filter lists for the '" + control_block_->getName() + + "' control block and included child control blocks have been created"); +} + +void ExplorerOptionsMap::addCurrentFilter(const std::string& filter) { + std::vector operations = {"<=", ">=", "<", ">", "="}; + for (std::string operation : operations) { + size_t operation_pos = filter.find(operation); + if (operation_pos != std::string::npos) { + // If there's a delimeter then separate include into the key and its value + std::string filter_value = + filter.substr(operation_pos + operation.length()); + std::string filter_key = filter.substr(0, operation_pos); + cbxp_filter_t filter_data = {operation, filter_value}; + Logger::getInstance().debug( + "Adding '" + filter_key + operation + filter_value + + "' to the current filters list for the '" + + control_block_->getName() + "' control block..."); + current_filters_[filter_key].push_back(filter_data); + return; + } + } + Logger::getInstance().debug( + "Filters must be key-value pairs (e.g., 'key=value')"); + throw FilterError(); +} + +bool ExplorerOptionsMap::compare(const nlohmann::json& json_value, + const std::string& filter_value, + const std::string& operation) { + std::string value_str = ""; + bool value_is_string = false; + uint64_t value_uint; + + if (json_value.is_number()) { + value_uint = json_value.get(); + } else { + value_str = json_value.get(); + value_is_string = true; + if (value_str.substr(0, 2) == "0x") { + value_uint = std::stoull(value_str, nullptr, 0); + value_is_string = false; + } + } + if (value_is_string) { + // Filter is testing strings + if (operation == "=") { + Logger::getInstance().debug("\"" + value_str + "\" = \"" + filter_value + + "\" ?"); + return (fnmatch(filter_value.c_str(), value_str.c_str(), 0) == 0); + } else { + Logger::getInstance().debug( + "<, <=, >, and >= cannot be used with string filter values"); + throw FilterError(); + } + } // Filter is testing non-strings + else { + uint64_t filter_uint; + try { + filter_uint = std::stoull(filter_value, nullptr, 0); + } catch (...) { + Logger::getInstance().debug("'" + filter_value + + "' cannot be compared to a numeric value"); + throw FilterError(); + } + Logger::getInstance().debug(std::to_string(value_uint) + " " + operation + + " " + std::to_string(filter_uint) + " ?"); + if (operation == "=") { + return value_uint == filter_uint; + } else if (operation == ">") { + return value_uint > filter_uint; + } else if (operation == "<") { + return value_uint < filter_uint; + } else if (operation == ">=") { + return value_uint >= filter_uint; + } else if (operation == "<=") { + return value_uint <= filter_uint; + } + } + // We should never get here, so it would be good to say "no match" just in + // case + return false; +} + +bool ExplorerOptionsMap::matchFilter(nlohmann::json& control_block_json) { + Logger::getInstance().debug("Applying filters to the '" + + control_block_->getName() + "' control block..."); + if (current_filters_.empty()) { + // If the filter map is empty then we want to return the control block + Logger::getInstance().debug("No filters were provided for the '" + + control_block_->getName() + "' control block"); + return true; + } + for (const auto& [filter_key, filter_list] : current_filters_) { + if (!control_block_json.contains(filter_key)) { + Logger::getInstance().debug( + "The filter key '" + filter_key + + "' does not correspond to any control block field in the '" + + control_block_->getName() + "' control block"); + throw FilterError(); + } + // cppcheck-suppress useStlAlgorithm + for (const cbxp_filter_t& filter_data : filter_list) { + // would require capturing structured bindings to use all_of or none_of + Logger::getInstance().debug("Applying filter '" + filter_key + + filter_data.operation + filter_data.value + + "'..."); + if (!ExplorerOptionsMap::compare(control_block_json[filter_key], + filter_data.value, + filter_data.operation)) { + Logger::getInstance().debug("The filter '" + filter_key + + filter_data.operation + filter_data.value + + "' did not match"); + return false; + } + } + } + // If we didn't have a reason to return false, we return true + Logger::getInstance().debug("All filters for the '" + + control_block_->getName() + + "' control block matched"); + return true; +} + +nlohmann::json ExplorerOptionsMap::fieldToJson(control_block_field_t field_data, + size_t offset) { + ExplorerOptionsMap::checkDataLength(offset); + nlohmann::json field_json; + // do try/except to stop an 0C4? + // check points to field against any current inclusions, if so call this + // recursively for that control block + try { + switch (field_data.type) { + case STRING: + field_json = control_block_->formatter_.getString( + static_cast(p_control_block_) + offset, + field_data.length); + break; + case UNSIGNED_INT: + if (field_data.length == 8) { + field_json = control_block_->formatter_.uint( + static_cast(p_control_block_) + offset); + } else { + field_json = control_block_->formatter_.uint( + static_cast(p_control_block_) + offset); + } + break; + case SIGNED_INT: + if (field_data.length == 8) { + field_json = *(static_cast(p_control_block_) + offset); + } else { + field_json = *(static_cast(p_control_block_) + offset); + } + break; + case HEX: + if (field_data.length == 8) { + field_json = control_block_->formatter_.getHex( + static_cast(p_control_block_) + offset); + } else { + field_json = control_block_->formatter_.getHex( + static_cast(p_control_block_) + offset); + } + break; + case ADDRESS: + if (field_data.length == 8) { + field_json = control_block_->formatter_.getHex( + static_cast(p_control_block_) + offset); + } else { + field_json = control_block_->formatter_.getHex( + static_cast(p_control_block_) + offset); + } + break; + } + } catch (const std::exception& e) { + Logger::getInstance().debug("Unexpected error occurred."); + throw CbxpReachBlockError(); + } + + if (!field_data.pointsTo.empty() && + options_map_.find(field_data.pointsTo) != options_map_.end()) { + std::string control_block_name = field_data.pointsTo; + ControlBlock control_block = control_blocks_.at(control_block_name); + const void* p_control_block; + if (field_data.length == 8) { + p_control_block = + reinterpret_cast(field_json.get()); + } else { + p_control_block = + reinterpret_cast(field_json.get()); + } + field_json = + ExplorerOptionsMap(options_map_[control_block_name], control_block_name, + control_blocks_, p_control_block, 0) + .getControlBlockData(true); + } + return field_json; +} + +void ExplorerOptionsMap::checkDataLength(const size_t offset) const { + if (skip_buffer_length_check_) { + // Data length check is only done when formatting + // user provided control block data. + // This check is skipped when extracting and formatting + // control block data from live memory. + return; + } + Logger::getInstance().debug( + "Checking if specified buffer (" + std::to_string(buffer_length_) + + " bytes) too small to contain the '" + control_block_->getName() + + "' control block (requires at least " + std::to_string(offset) + + " bytes)..."); + if (buffer_length_ < offset) { + throw DataLengthError(); + } +} + +const std::vector ExplorerOptionsMap::findControlBlockPointer( + std::optional control_block) const { + // We have to go exploring for the control block we want + // 1 - Find current control block + // 2 - Check for pointed to by, if empty, check fixed address, if have that, + // move on Loop through pointed to by, checking next pointed to by, then + // looking for fixed address, until hit fixed address (log steps) Start from + // fixed address, iterate through fields looking for points to, keep going + // until we hit our source control block do try except to stop an 0C4 Set our + // p_control_block value + std::vector control_block_pointers{}; + std::vector pointed_to_by = control_block->getPointedToBy(); + if (pointed_to_by.empty()) { + return {control_block->getFixedAddress()}; + } + for (const auto& pointer_name : pointed_to_by) { + // we may eventually want to highlight a specific path rather than choosing + // "all possible paths" + std::optional next_control_block = + control_blocks_.at(pointer_name); + std::unordered_map + next_control_block_map = next_control_block->getMap(); + const std::vector next_vector = + ExplorerOptionsMap::findControlBlockPointer(next_control_block); + std::string count_field = ""; + size_t offset = 0, field_length = 4; + for (const auto& [field_name, field_data] : next_control_block_map) { + if (field_data.pointsTo.empty() || + field_data.pointsTo != control_block->getName()) { + continue; + } + offset = field_data.offset; + field_length = field_data.length; + count_field = field_data.count; + } + for (const auto& next : next_vector) { + // In case we are ALREADY looking at a list of control blocks, we iterate + // through this + Logger::getInstance().debug("Polling '" + next_control_block->getName() + + "' at offset '" + std::to_string(offset) + + "' for control block tree..."); + const size_t count = *(static_cast(next) + + next_control_block_map[count_field].offset); + for (int i = 0; i < count; i++) { + // Then we iterate through the "next" control blocks + const char* base = + static_cast(next) + i * field_length + offset; + // cppcheck-suppress duplicateBranch + if (field_length == 8) { + control_block_pointers.push_back( + reinterpret_cast(*base)); + } else { + // __ptr32 is a z/OS platform qualifier; branches are intentionally + // distinct + control_block_pointers.push_back( + reinterpret_cast(*base)); + } + } + } + return control_block_pointers; + } +} + +nlohmann::json ExplorerOptionsMap::parseFields() { + nlohmann::json control_block_data = {}; + for (const auto& [field_name, field_data] : control_block_->getMap()) { + nlohmann::json field_json = {}; + if (field_data.repeated) { + field_json[field_name + "s"] = {}; + size_t count = control_block_data[field_data.count].get(); + for (int i = 1; i <= count; i++) { + field_json[field_name + "s"].push_back(ExplorerOptionsMap::fieldToJson( + field_data, (i * field_data.length))); + } + } else { + field_json[field_name] = ExplorerOptionsMap::fieldToJson(field_data); + } + control_block_data.merge_patch(field_json); + } +} + +nlohmann::json ExplorerOptionsMap::getControlBlockData(const bool recursive) { + std::string control_block_name = control_block_->getName(); + std::vector p_control_blocks; + nlohmann::json control_block_data = {}, json_to_return = {}; + ; + if (p_control_block_ == nullptr or recursive == true) { + // If we look for a control block in live memory, we need to check that we + // can reach it If the call is recursive, we WILL have a target address + // already + const storage_attributes_t attributes = + control_block_->getStorageAttributes(); + if (attributes.key != 8 and attributes.is_protected and + control_block_name != "psa") { + // The PSA only HALF exists in fetch protected storage, so it gets a + // hard-coded exception + Logger::getInstance().debug( + "The '" + control_block_name + "' control block is key '" + + std::to_string(attributes.key) + + "' and fetch protected, so cbxp cannot access it."); + throw CbxpReachBlockError(); + } + if (!attributes.is_common and current_filters_.empty()) { + Logger::getInstance().debug("The '" + control_block_name + + "' control block is not in common storage " + + " and there are no filters enabled, so cbxp " + "cannot guarantee accuracy."); + throw CbxpReachBlockError(); + } + } + if (p_control_block_ == nullptr && recursive == false) { + p_control_blocks = + ExplorerOptionsMap::findControlBlockPointer(control_block_); + } + if (p_control_blocks.size() == 1) { + p_control_block_ = p_control_blocks[0]; + nlohmann::json single_control_block_json = + ExplorerOptionsMap::parseFields(); + if (ExplorerOptionsMap::matchFilter(single_control_block_json)) { + control_block_data[control_block_name] = single_control_block_json; + } + } else { + control_block_data[control_block_name + "s"] = {}; + for (const auto& p_control_block : p_control_blocks) { + p_control_block_ = p_control_block; + Logger::getInstance().debug(control_block_->getName() + " hex dump:"); + Logger::getInstance().hexDump( + reinterpret_cast(p_control_block_), + control_block_->getMaxOffset()); + nlohmann::json single_control_block_json = + ExplorerOptionsMap::parseFields(); + if (ExplorerOptionsMap::matchFilter(single_control_block_json)) { + control_block_data[control_block_name + "s"].push_back( + single_control_block_json); + } + } + } + return control_block_data; +} + +} // namespace CBXP + diff --git a/cbxp/explorer_options_map.hpp b/cbxp/explorer_options_map.hpp new file mode 100644 index 0000000..3c7ffe6 --- /dev/null +++ b/cbxp/explorer_options_map.hpp @@ -0,0 +1,63 @@ +#ifndef __CONTROL_BLOCK_EXPLORER_OPTIONS_MAP_H_ +#define __CONTROL_BLOCK_EXPLORER_OPTIONS_MAP_H_ + +#include + +#include "cbxp.h" +#include "control_block_explorer.hpp" + +namespace CBXP { + +typedef struct { + std::string operation; + std::string value; +} cbxp_filter_t; + +class ExplorerOptionsMap { + private: + void createIncludeLists(const std::vector& includes); + void processDoubleAsteriskInclude(); + void processAsteriskInclude(); + void processExplicitInclude(std::string& include); + void createFilterLists(const std::vector& filters); + void addCurrentFilter(const std::string& filter); + bool compare(const nlohmann::json& json_value, + const std::string& filter_value, const std::string& operation); + bool matchFilter(nlohmann::json& control_block_json); + void checkDataLength(const size_t offset) const; + const std::vector findControlBlockPointer( + std::optional control_block) const; + nlohmann::json fieldToJson(control_block_field_t field_data, + size_t offset = 0); + nlohmann::json parseFields(); + std::unordered_map options_map_; + std::unordered_map> current_filters_; + bool skip_buffer_length_check_ = false; + std::optional control_block_; + const std::unordered_map& control_blocks_; + const void* p_control_block_; + const size_t buffer_length_; + + public: + nlohmann::json getControlBlockData(const bool recursive = false); + explicit ExplorerOptionsMap( + const cbxp_options_t& cbxp_options, const std::string& control_block_name, + const std::unordered_map& control_blocks, + const void* p_control_block, const size_t buffer_length) + : control_block_(control_blocks.at(control_block_name)), + control_blocks_(control_blocks), + p_control_block_(p_control_block), + buffer_length_(buffer_length) { + // createFilterLists depends on the construction of the "includes" portion + // of the options_map_ structure and must be called after createIncludeLists + ExplorerOptionsMap::createIncludeLists(cbxp_options.include_patterns); + ExplorerOptionsMap::createFilterLists(cbxp_options.filters); + for (auto it = options_map_.begin(); it != options_map_.end(); ++it) { + options_map_[it->first].skip_buffer_length_check = + skip_buffer_length_check_; + } + } +}; +} // namespace CBXP + +#endif diff --git a/cbxp/mappings/ascb.json b/cbxp/mappings/ascb.json new file mode 100644 index 0000000..bd0869a --- /dev/null +++ b/cbxp/mappings/ascb.json @@ -0,0 +1,1659 @@ +{ + "version": 1, + "name": "ascb", + "commonName": "ADDRESS SPACE CONTROL BLOCK", + "macroId": "ihaascb", + "description": "Contain information and pointers needed for */ %GOTO ASCBL2; /*", + "aliases": [], + "pointedToBy": [], + "storageAttributes": { + "subpools": [ + 245 + ], + "key": 0, + "residency": "Below 16M" + }, + "controlBlock": [ + { + "name": "ascbegin", + "description": "BEGINNING OF ASCB", + "offset": 0, + "length": 8, + "type": "hex" + }, + { + "name": "ascbascb", + "description": "ACRONYM IN EBCDIC -ASCB-", + "offset": 0, + "length": 4, + "type": "hex" + }, + { + "name": "ascbfwdp", + "description": "ADDRESS OF NEXT ASCB ON ASCB READY QUEUE", + "offset": 4, + "length": 4, + "type": "address" + }, + { + "name": "ascbbwdp", + "description": "ADDRESS OF PREVIOUS ASCB ON ASCB READY QUEUE", + "offset": 8, + "length": 4, + "type": "address" + }, + { + "name": "ascbltcs", + "description": "TCB and preemptable-class SRB Local lock suspend service queue. Serialization: ASCB CML promotion WEB lock.", + "offset": 12, + "length": 4, + "type": "address" + }, + { + "name": "ascbdiag010", + "description": "IBM use only", + "offset": 16, + "length": 8, + "type": "hex" + }, + { + "name": "ascbsupc_prezos12", + "description": "SUPERVISOR CELL FIELD", + "offset": 16, + "length": 8, + "type": "hex" + }, + { + "name": "ascbsvrb_prezos12", + "description": "SVRB POOL ADDRESS.", + "offset": 16, + "length": 4, + "type": "address" + }, + { + "name": "ascbsync_prezos12", + "description": "COUNT USED TO SYNCHRONIZE SVRB POOL.-", + "offset": 20, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ascbiosp", + "description": "POINTER TO IOS PURGE INTERFACE CONTROL BLOCK (IPIB)", + "offset": 24, + "length": 4, + "type": "address" + }, + { + "name": "ascbwqlk", + "description": "WEB QUEUE LOCK WORD SERIALIZATION: COMPARE AND SWAP OWNERSHIP: SUPERVISOR CONTROL", + "offset": 28, + "length": 4, + "type": "hex" + }, + { + "name": "ascbr01c", + "description": "RESERVED, MUST BE ZERO", + "offset": 28, + "length": 2, + "type": "bitstring", + "bitmasks": { + "ascburrq_prezos11": { + "description": "SYSEVENT USER READY REQUIRED SERIALIZATION: WEB QUEUE LOCK OWNERSHIP: SUPERVISOR CONTROL Not set as of z/OS 1.11", + "offset": 8, + "length": 1 + } + } + }, + { + "name": "ascbwqid", + "description": "LOGICAL CPU ID OF THE PROCESSOR HOLDING THE WEB QUEUE LOCK OWNERSHIP: SUPERVISOR CONTROL", + "offset": 30, + "length": 2, + "type": "signed-integer" + }, + { + "name": "ascb_job_step_seqnum", + "description": "Sequence number incremented at job step change, when ASSB and ASCB time and counts fields are reset. Used to sequence resets of the time and count fields", + "offset": 32, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ascbsawq_prezos11", + "description": "ADDRESS OF ADDRESS SPACE SRB WEB QUEUE SERIALIZATION: WEB QUEUE LOCK OWNERSHIP: SUPERVISOR CONTROL Not set as of z/OS 1.11", + "offset": 32, + "length": 4, + "type": "address" + }, + { + "name": "ascbasn", + "description": "SAME AS ASCBASID", + "offset": 36, + "length": 2, + "type": "signed-integer" + }, + { + "name": "ascbasid", + "description": "ADDRESS SPACE IDENTIFIER FOR THE ASCB", + "offset": 36, + "length": 2, + "type": "signed-integer" + }, + { + "name": "ascbdiag026", + "description": "IBM use only", + "offset": 38, + "length": 1, + "type": "hex" + }, + { + "name": "ascbsrmflags", + "description": "SRM flags Ownership: SRM Serialization: SRMLOCK", + "offset": 39, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ascbvcmoverride": { + "description": "This bit indicates that this address space should not follow the standard SRM management in an VCM=on environment. Instead of trying to assign the work this address space to the same affinity node for cache efficiency concerns, assign this work to any affinity node, ignore any cache concerns. Ownership: SRM", + "offset": 0, + "length": 1 + }, + "ascbbrokenup": { + "description": "This bit indicates that this address space has been broken up by SRM. Ownership: SRM", + "offset": 1, + "length": 1 + }, + "ascbvcmgivepreemption": { + "description": "This bit indicates that this address space should get full preemption. Ownership: SRM", + "offset": 2, + "length": 1 + }, + "ascbvcmgivesigpany": { + "description": "This bit indicates that this address space can SIGP any waiting CPUs to process its work. Ownership: SRM", + "offset": 3, + "length": 1 + }, + "ascbinelighonorpriority": { + "description": "When on, specialty engine eligible work in this address space will not be offloaded to CPs for help processing. Ownership: SRM", + "offset": 4, + "length": 1 + }, + "ascbsrmflagsdiag": { + "description": "Diagnostic data for IBM use only", + "offset": 5, + "length": 2 + } + } + }, + { + "name": "ascbll5", + "description": "FLAGS. SERIALIZATION - LOCAL LOCK", + "offset": 40, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ascbs3s": { + "description": "STAGE II EXIT EFECTOR HAS SCHEDULED AN RQE OR IQE AND STAGE III EXIT EFFECTOR SHOULD BE INVOKED", + "offset": 2, + "length": 1 + } + } + }, + { + "name": "ascbhlhi", + "description": "INDICATION OF SUSPEND LOCKS HELD AT TASK SUSPENSION", + "offset": 41, + "length": 4, + "type": "hex" + }, + { + "name": "ascbdph", + "description": "HALFWORD DISPATCHING PRIORITY", + "offset": 45, + "length": 2, + "type": "signed-integer" + }, + { + "name": "ascbdphi", + "description": "HIGH ORDER BYTE OF HALFWORD DISPATCHING PRIORITY", + "offset": 45, + "length": 4, + "type": "hex" + }, + { + "name": "ascbdp", + "description": "DISPATCHING PRIORITY RANGE FROM 0-255", + "offset": 47, + "length": 4, + "type": "hex" + }, + { + "name": "ascbtcbe", + "description": "Count of ready tcbs in the space that are in an enclave. Ownership: Task Management Serialization: Compare and Swap and WEB Lock of TCB for which this count is being manipulated.", + "offset": 51, + "length": 4, + "type": "hex" + }, + { + "name": "ascblda", + "description": "POINTER TO LOCAL DATA AREA PART OF LSQA FOR VSM", + "offset": 55, + "length": 4, + "type": "address" + }, + { + "name": "ascbrsmf", + "description": "RSM ADDRESS SPACE FLAGS", + "offset": 59, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ascb2lpu": { + "description": "SECOND LEVEL PREFERRED USER. THIS OFFSET FIXED BY ARCHITECTURE.", + "offset": 0, + "length": 1 + }, + "ascb1lpu": { + "description": "FIRST LEVEL PREFERRED USER", + "offset": 1, + "length": 1 + }, + "ascbn2lp": { + "description": "SRM IN SYSEVENT TRANSWAP SHOULD NOT SET ASCB2LPU BIT - HOWEVER IT MAY ALREADY BE ON AND WILL STAY ON", + "offset": 2, + "length": 1 + }, + "ascbveqr": { + "description": "V=R ADDRESS SPACE", + "offset": 3, + "length": 1 + } + } + }, + { + "name": "ascbflg3", + "description": "Flags needing no serialization.", + "offset": 60, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ascbcnip": { + "description": "Address space created during NIP", + "offset": 0, + "length": 1 + }, + "ascbreus": { + "description": "This is a reusable ASID. It may be given out only to a reusable ASID requestor", + "offset": 1, + "length": 1 + }, + "ascbm881": { + "description": "This address space went through IEEMB881", + "offset": 2, + "length": 1 + }, + "ascbsinglestepstartedtask": { + "description": "This address space is a single step started task", + "offset": 3, + "length": 1 + }, + "ascbzcx": { + "description": "This address space is a zCX address space", + "offset": 4, + "length": 1 + } + } + }, + { + "name": "ascbr036", + "description": "Reserved as of z/OS 1.11", + "offset": 61, + "length": 2, + "type": "signed-integer" + }, + { + "name": "ascbhasi_prezos11", + "description": "Local lock owning ASID. Not set as of z/OS 1.11", + "offset": 61, + "length": 2, + "type": "signed-integer" + }, + { + "name": "ascbcscb", + "description": "ADDRESS OF CSCB", + "offset": 63, + "length": 4, + "type": "address" + }, + { + "name": "ascbtsb", + "description": "ADDRESS OF TSB", + "offset": 67, + "length": 4, + "type": "address" + }, + { + "name": "ascbejst", + "description": "Accumulated job step CPU time. Non-enclave TCB time only. Unsigned 64-bit binary number", + "offset": 71, + "length": 8, + "type": "hex" + }, + { + "name": "ascbewst", + "description": "TIME OF DAY WHENEVER I-STREAM IS SWITCHED FROM A MEMORY", + "offset": 79, + "length": 8, + "type": "hex" + }, + { + "name": "ascbjstl", + "description": "CPU TIME LIMIT FOR THE JOB STEP UNSIGNED 32 BIT BINARY NUMBER", + "offset": 87, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ascbecb", + "description": "RCT'S WORK ECB", + "offset": 91, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ascbubet", + "description": "TIME STAMP WHEN USER BECOMES READY", + "offset": 95, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ascbtlch", + "description": "CHAIN FIELD FOR TIME LIMIT EXCEEDED QUEUE", + "offset": 99, + "length": 4, + "type": "address" + }, + { + "name": "ascbdump", + "description": "SVC DUMP TASK TCB ADDRESS", + "offset": 103, + "length": 4, + "type": "address" + }, + { + "name": "ascbfw1", + "description": "FULL-WORD LABEL TO BE USED FOR COMPARE AND SWAP FOR ANY BIT IN THIS WORD", + "offset": 107, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ascbaffn", + "description": "CPU AFFINITY INDICATOR", + "offset": 107, + "length": 2, + "type": "signed-integer" + }, + { + "name": "ascbrctf", + "description": "FLAGS FOR RCT SERIALIZED BY COMPARE AND SWAP", + "offset": 109, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ascbtmno": { + "description": "MEMORY IS BEING QUIESCED, IS QUIESCED, OR IS BEING RESTORED", + "offset": 0, + "length": 1 + }, + "ascbfrs": { + "description": "RESTORE REQUEST", + "offset": 1, + "length": 1 + }, + "ascbfqu": { + "description": "QUIESCE REQUEST", + "offset": 2, + "length": 1 + }, + "ascbjste": { + "description": "JOB STEP TIME EXCEEDED. NOT USED BY RCT", + "offset": 3, + "length": 1 + }, + "ascbwait": { + "description": "LONG WAIT INDICATOR", + "offset": 4, + "length": 1 + }, + "ascbout": { + "description": "ADDRESS SPACE CONSIDERED SWAPPED OUT", + "offset": 5, + "length": 1 + }, + "ascbtmlw": { + "description": "MEMORY IS IN A LONG WAIT", + "offset": 6, + "length": 1 + }, + "ascbtoff": { + "description": "MEMORY SHOULD NOT BE CHECKED FOR JOB STEP TIMING. NOT USED BY RCT", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "ascbflg1", + "description": "FLAG FIELD", + "offset": 110, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ascblsas": { + "description": "ADDRESS SPACE IS LOGICALLY SWAPPED -", + "offset": 0, + "length": 1 + }, + "ascbdstk": { + "description": "SRM REQUIRES A TIME STAMP TO DETERMINE WHEN THE ADDRESS SPACE GOES INTO LONG WAIT. ASCBEWST WILL BE UPDATED WHEN THIS BIT IS ON. NOTE: If this bit moves position the bit constant ASCBDSTZ must also be changed.", + "offset": 1, + "length": 1 + }, + "ascbdstz": { + "description": "Bit constant for bit position ASCBDSTK. PL/X cannot map bit positions in generated code, so this bit constant allows PL/X to set the bit in generated assembler.", + "offset": 1, + "length": 1 + }, + "ascbterm": { + "description": "ADDRESS SPACE TERMINATING NORMALLY", + "offset": 3, + "length": 1 + }, + "ascbabnt": { + "description": "ADDRESS SPACE TERMINATING ABNORMALLY", + "offset": 4, + "length": 1 + }, + "ascbmemp": { + "description": "Memory Termination PURGEDQ flag Serialization: none", + "offset": 5, + "length": 1 + } + } + }, + { + "name": "ascbtmch", + "description": "TERMINATION QUEUE CHAIN", + "offset": 111, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ascbasxb", + "description": "POINTER TO ADDRESS SPACE EXTENSION CONTROL BLOCK (ASXB)", + "offset": 115, + "length": 4, + "type": "address" + }, + { + "name": "ascbfw2", + "description": "FULLWORD LABEL TO ADDRESS BITS IN THIS WORD", + "offset": 119, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ascbswct", + "description": "NUMBER OF TIMES MEMORY ENTERS SHORT WAIT", + "offset": 119, + "length": 2, + "type": "signed-integer" + }, + { + "name": "ascbdsp1", + "description": "NONDISPATCHABILITY FLAGS. SERIALIZATION - GLOBAL INTERSECT.", + "offset": 121, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ascbssnd": { + "description": "SYSTEM SET NONDISPATCHABLE AND THIS ASCB IS NOT EXEMPT", + "offset": 0, + "length": 1 + }, + "ascbfail": { + "description": "A FAILURE HAS OCCURRED WITHIN THE ADDRESS SPACE. THE MEMORY IS NONDISPATCHABLE", + "offset": 1, + "length": 1 + }, + "ascbsnqs": { + "description": "STATUS STOP NON-QUIESCABLE LEVEL SRB'S", + "offset": 2, + "length": 1 + }, + "ascbssss": { + "description": "STATUS STOP SRB SUMMARY", + "offset": 3, + "length": 1 + }, + "ascbstnd": { + "description": "TCB'S NONDISPATCHABLE", + "offset": 4, + "length": 1 + }, + "ascbuwnd": { + "description": "STATUS SET UNLOCKED WORKUNITS NONDISPATCHABLE.", + "offset": 5, + "length": 1 + }, + "ascbnoq": { + "description": "ASCB NOT ON SWAPPED IN QUEUE", + "offset": 6, + "length": 1 + } + } + }, + { + "name": "ascbflg2", + "description": "FLAG BYTE. SERIALIZATION - GLOBAL INTERSECT", + "offset": 122, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ascbxmpt": { + "description": "ASCB EXEMPT FROM SYSTEM NONDISPATCHABLE", + "offset": 0, + "length": 1 + }, + "ascbpxmt": { + "description": "ASCB PERMANENTLY EXEMPT FROM SYSTEM NONDISPATCHABLE", + "offset": 1, + "length": 1 + }, + "ascbcext": { + "description": "CANCEL TIMER EXTENSION BECAUSE EOT PROCESSING IS STARTED FOR THE JOB STEP TCB", + "offset": 2, + "length": 1 + }, + "ascbs2s": { + "description": "FOR LOCK MANAGER, ENTRY MADE TO STAGE II EXIT EFFECTOR WITHOUT CORRESPONDING ENTRY TO STAGE III EXIT EFFECTOR", + "offset": 3, + "length": 1 + }, + "ascbncml": { + "description": "ASCB NOT ELIGIBLE FOR CML LOCK REQUESTS", + "offset": 4, + "length": 1 + }, + "ascbnomt": { + "description": "ADDRESS SPACE MUST NOT BE MEMTERMED UNLESS A DAT ERROR HAS OCCURRED. IF A DAT ERROR HAS OCCURRED, ACTION IS CONTROLLED BY ASCBNOMD. OWNERSHIP - SCHEDULER", + "offset": 5, + "length": 1 + }, + "ascbnomd": { + "description": "IF ON,ADDRESS SPACE CANNOT BE MEMTERMED ON A DAT ERROR. IF OFF, PROCESS MEMTERM ON A DAT ERROR. OWNERSHIP - SCHEDULER", + "offset": 6, + "length": 1 + }, + "ascbs3nl": { + "description": "THE LOCAL LOCK IS NEEDED BY THE STAGE 3 EXIT EFFECTOR TO QUEUE ASYNCHRONOUS EXITS E SERIALIZATION: CDS WITH ASCBLOCK OWNERSHIP: SUPERVISOR CONTROL", + "offset": 0, + "length": 1 + }, + "ascbltcl": { + "description": "THE LOCAL LOCK IS NEEDED BY SOME TCB or preemptable-class SRB WHEN SET IN BIT 31 OF ASCBLSWQ.", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "ascbscnt", + "description": "FULLWORD LABEL FOR COMPARE AND SWAP (CS)", + "offset": 123, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ascbsrbs", + "description": "COUNT OF SRB'S SUSPENDED IN THIS MEMORY", + "offset": 123, + "length": 2, + "type": "signed-integer" + }, + { + "name": "ascbllwq", + "description": "ADDRESS SPACE LOCAL LOCK SUSPEND SERVICE WEB QUEUE SERIALIZATION: WEB QUEUE LOCK OWNERSHIP: SUPERVISOR CONTROL", + "offset": 125, + "length": 4, + "type": "address" + }, + { + "name": "ascbrctp", + "description": "POINTER TO REGION CONTROL TASK (RCT) TCB", + "offset": 127, + "length": 4, + "type": "address" + }, + { + "name": "ascblkgp", + "description": "LOCK GROUP", + "offset": 131, + "length": 8, + "type": "hex" + }, + { + "name": "ascblock", + "description": "LOCAL LOCK. THIS OFFSET FIXED BY ARCHITECTURE.", + "offset": 131, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ascblswq", + "description": "ADDRESS SPACE LOCAL LOCK WEB SUSPEND QUEUE THIS OFFSET FIXED BY ARCHITECTURE. SERIALIZATION: CDS WITH ASCBLOCK OWNERSHIP: SUPERVISOR CONTROL", + "offset": 135, + "length": 4, + "type": "address" + }, + { + "name": "ascbqecb", + "description": "QUIESCE ECB", + "offset": 139, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ascbmecb", + "description": "MEMORY CREATE/DELETE ECB", + "offset": 143, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ascboucb", + "description": "SYSTEM RESOURCES MANAGER (SRM) USER CONTROL BLOCK POINTER", + "offset": 147, + "length": 4, + "type": "address" + }, + { + "name": "ascbouxb", + "description": "SYSTEM RESOURCES MANAGER (SRM) USER EXTENSION BLOCK POINTER", + "offset": 151, + "length": 4, + "type": "address" + }, + { + "name": "ascbfw2a", + "description": "FULLWORD LABEL TO ADDRESS BITS IN THIS WORD. SERIALIZATION - CS.", + "offset": 155, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ascbfmct", + "description": "RESERVED. ALLOCATED PAGE FRAME COUNT NOW RESIDES IN THE RAX (MAPPING MACRO IARRAX).", + "offset": 155, + "length": 2, + "type": "signed-integer" + }, + { + "name": "ascblevl", + "description": "LEVEL NUMBER OF ASCB", + "offset": 157, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ascbvs01": { + "description": "", + "offset": 7, + "length": 1 + }, + "ascbvs02": { + "description": "", + "offset": 6, + "length": 1 + }, + "ascbvs03": { + "description": "", + "offset": 6, + "length": 2 + }, + "ascbvers": { + "description": "LEVEL OF THIS MAPPING", + "offset": 6, + "length": 2 + } + } + }, + { + "name": "ascbfl2a", + "description": "FLAG BYTE.", + "offset": 158, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ascbnopr": { + "description": "NO PREEMPTION FLAG 1=DO NOT SIGP ANOTHER PROCESSOR TO EXECUTE READY WORK IN THIS SPACE 0=DO SIGP ANOTHER PROCESSOR OWNERSHIP: SRM SERIALIZATION: CS ON ASCBFW2A", + "offset": 0, + "length": 1 + } + } + }, + { + "name": "ascbhreq_prezos11", + "description": "Local lock requestor address Not set as of z/OS 1.11", + "offset": 159, + "length": 4, + "type": "address" + }, + { + "name": "ascbejst_disps", + "description": "Count of task dispatches. Incremented and cache aligned with ASCBEJST. SERIALIZATION - CS. OWNERSHIP - SUPERVISOR.", + "offset": 159, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ascbiqea", + "description": "POINTER TO IQE FOR ATCAM ASYNCHRONOUS PROCESSING", + "offset": 163, + "length": 4, + "type": "address" + }, + { + "name": "ascbrtmc", + "description": "ANCHOR FOR SQA SDWA QUEUE", + "offset": 167, + "length": 4, + "type": "address" + }, + { + "name": "ascbmcc", + "description": "USED TO HOLD A MEMORY TERMINATION COMPLETION CODE ON ABNORMAL MEMORY TERMINATION", + "offset": 171, + "length": 4, + "type": "hex" + }, + { + "name": "ascbjbni", + "description": "POINTER TO JOBNAME FIELD FOR INITIATED PROGRAMS OR ZERO", + "offset": 175, + "length": 4, + "type": "address" + }, + { + "name": "ascbjbns", + "description": "POINTER TO JOBNAME FIELD FOR START/MOUNT/LOGON OR ZERO", + "offset": 179, + "length": 4, + "type": "address" + }, + { + "name": "ascbsrq", + "description": "DISPATCHER SERIALIZATION REQUIRED", + "offset": 183, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ascbsrq1", + "description": "FIRST BYTE OF ASCBSRQ", + "offset": 183, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ascbdsg4": { + "description": "SIGNAL WAITING PROCESSORS WHEN INTERSECT IS RESET", + "offset": 0, + "length": 1 + }, + "ascbdflt": { + "description": "DEFAULT LOCAL INTERSECT", + "offset": 1, + "length": 1 + } + } + }, + { + "name": "ascbsrq2", + "description": "SECOND BYTE OF ASCBSRQ", + "offset": 184, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ascbdsg3": { + "description": "SIGNAL WAITING PROCESSORS WHEN INTERSECT IS RESET", + "offset": 0, + "length": 1 + }, + "ascbsrm1": { + "description": "SYSTEM RESOURCE MANAGER (SRM) INTERSECTING", + "offset": 6, + "length": 1 + }, + "ascbqver": { + "description": "QUEUE VERIFICATION INTERSECTING", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "ascbsrq3", + "description": "THIRD BYTE OF ASCBSRQ", + "offset": 185, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ascbdsg2": { + "description": "SIGNAL WAITING PROCESSORS WHEN INTERSECT IS RESET", + "offset": 0, + "length": 1 + }, + "ascbrcti": { + "description": "REGION CONTROL TASK (RCT) INTERSECTING", + "offset": 1, + "length": 1 + }, + "ascbtcbv": { + "description": "TCB VERIFICATION INTERSECTING", + "offset": 2, + "length": 1 + }, + "ascbacha": { + "description": "ASCB CHAP INTERSECTING", + "offset": 3, + "length": 1 + }, + "ascbmter": { + "description": "MEMORY TERMINATION INTERSECTING", + "offset": 5, + "length": 1 + }, + "ascbmini": { + "description": "MEMORY INITIALIZATION INTERSECTING", + "offset": 6, + "length": 1 + }, + "ascbcbve": { + "description": "CONTROL BLOCK VERIFICATION INTERSECTING", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "ascbsrq4", + "description": "FOURTH BYTE OF ASCBSRQ", + "offset": 186, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ascbdsg1": { + "description": "SIGNAL WAITING PROCESSORS WHEN INTERSECT IS RESET", + "offset": 0, + "length": 1 + }, + "ascbdeta": { + "description": "DETACH INTERSECTING", + "offset": 1, + "length": 1 + }, + "ascbatta": { + "description": "ATTACH INTERSECTING", + "offset": 2, + "length": 1 + }, + "ascbrtm2": { + "description": "RTM2 INTERSECTING", + "offset": 3, + "length": 1 + }, + "ascbrtm1": { + "description": "RTM1 INTERSECTING", + "offset": 4, + "length": 1 + }, + "ascbchap": { + "description": "CHAP INTERSECTING", + "offset": 5, + "length": 1 + }, + "ascbstat": { + "description": "STATUS INTERSECTING", + "offset": 6, + "length": 1 + }, + "ascbpurd": { + "description": "PURGEDQ INTERSECTING", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "ascbvgtt", + "description": "ADDRESS OF VSAM GLOBAL TERMINATION TABLE (VGTT)", + "offset": 187, + "length": 4, + "type": "address" + }, + { + "name": "ascbpctt", + "description": "ADDRESS OF PRIVATE CATALOG TERMINATION TABLE (PCTT)", + "offset": 191, + "length": 4, + "type": "address" + }, + { + "name": "ascbssrb", + "description": "COUNT OF STATUS STOP SRB'S", + "offset": 195, + "length": 2, + "type": "signed-integer" + }, + { + "name": "ascbsmct", + "description": "NUMBER OF OUTSTANDING STEP MUST COMPLETE REQUESTS IN ADDRESS SPACE", + "offset": 197, + "length": 4, + "type": "hex" + }, + { + "name": "ascbsrbm", + "description": "MODEL PSW BYTE 0 USED BY SRB DISPATCHER", + "offset": 201, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ascbper": { + "description": "PER BIT IN ASCBSRBM - ALSO USED TO SHOW PER STATUS FOR THE ADDRESS SPACE", + "offset": 1, + "length": 1 + } + } + }, + { + "name": "ascbswtl", + "description": "STEP WAIT TIME LIMIT", + "offset": 202, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ascbsrbt", + "description": "ACCUMULATED SRB TIME", + "offset": 206, + "length": 8, + "type": "hex" + }, + { + "name": "ascbltcb", + "description": "TCB and preemptable-class SRB Local lock suspend queue. Serialization: Adding, CS. Deleting, ASCB CML promotion WEB lock and CS.", + "offset": 214, + "length": 4, + "type": "address" + }, + { + "name": "ascbltcn", + "description": "Count of TCB and preemptable- class SRB (local and CML) requestors needing this local lock. Serialization: CS", + "offset": 218, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ascbtcbs", + "description": "NUMBER OF READY TCB'S. THE ACTUAL NUMBER OF READY TCBS IS ASCBTCBS-ASCBLSQT. SERIALIZATION: CS OWNERSHIP: TASK MANAGEMENT", + "offset": 222, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ascblsqt", + "description": "NUMBER OF TCBS ON A LOCAL LOCK SUSPEND QUEUE. SERIALIZATION: CS OWNERSHIP: TASK MANAGEMENT", + "offset": 226, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ascbwprb", + "description": "ADDRESS OF WAIT POST REQUEST BLOCK", + "offset": 230, + "length": 4, + "type": "address" + }, + { + "name": "ascbsrdp", + "description": "SYSTEM RESOURCE MANAGER (SRM) DISPATCHING PRIORITY", + "offset": 234, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ascbndp", + "description": "NEW DISPATCHING PRIORITY", + "offset": 234, + "length": 4, + "type": "hex" + }, + { + "name": "ascbtndp", + "description": "NEW TIME SLICE DISPATCHING PRIORITY", + "offset": 238, + "length": 4, + "type": "hex" + }, + { + "name": "ascbntsg", + "description": "NEW TIME SLICE GROUP", + "offset": 242, + "length": 4, + "type": "hex" + }, + { + "name": "ascbiodp", + "description": "I/O PRIORITY", + "offset": 246, + "length": 4, + "type": "hex" + }, + { + "name": "ascbloci", + "description": "LOCK IMAGE, ADDRESS OF ASCB HOLDING THIS ASCB'S LOCAL LOCK AS A CML LOCK. SERIALIZATION - LOCAL LOCK. OWNERSHIP - SUPERVISOR.", + "offset": 250, + "length": 4, + "type": "address" + }, + { + "name": "ascbcmlw", + "description": "ADDRESS OF THE WEB REPRESENTING THE WORKUNIT THAT IS HOLDING THIS ASCB'S LOCAL LOCK AS A CML OR LOCAL LOCK. SERIALIZATION - LOCAL LOCK. OWNERSHIP - SUPERVISOR CONTROL", + "offset": 254, + "length": 4, + "type": "address" + }, + { + "name": "ascbcmlc_prezos12", + "description": "COUNT OF CML LOCKS HELD BY THIS ADDRESS SPACE.", + "offset": 258, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ascbsrbt_disps", + "description": "Count of SRB dispatches. Incremented and cache aligned with ASCBSRBT. SERIALIZATION - CS. OWNERSHIP - SUPERVISOR.", + "offset": 258, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ascbssom", + "description": "SPACE SWITCH EVENT OWNER MASK. SERIALIZATION - CS. OWNERSHIP - SUPERVISOR.", + "offset": 262, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ascbsso1", + "description": "SPACE SWITCH EVENT OWNER MASK BYTES 1 - 3.", + "offset": 262, + "length": 3, + "type": "hex" + }, + { + "name": "ascbsso4", + "description": "SPACE SWITCH EVENT OWNER MASK BYTE 4.", + "offset": 265, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ascbsssp": { + "description": "SLIP/PER REQUESTED NOTIFICATION ON SPACE SWITCH EVENTS.", + "offset": 6, + "length": 1 + }, + "ascbssjs": { + "description": "JOB STEP TERMINATION REQUESTED SPACE SWITCH EVENTS FOR BREAKING LATENT ADDRESSING BINDS", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "ascbaste", + "description": "VIRTUAL ADDRESS OF ADDRESS SPACE SECOND TABLE ENTRY (ASTE). SERIALIZATION - N/A. OWNERSHIP - SUPERVISOR.", + "offset": 266, + "length": 4, + "type": "address" + }, + { + "name": "ascbltov", + "description": "VIRTUAL ADDRESS OF THE LINKAGE TABLE ORIGIN. (LOCATED IN PC/AUTH ADDRESS SPACE LSQA). SERIALIZATION - PC/AUTH ADDRESS SPACE LOCAL LOCK. OWNERSHIP - XM SERVICES.", + "offset": 270, + "length": 4, + "type": "address" + }, + { + "name": "ascbatov", + "description": "VIRTUAL ADDRESS OF AUTHORIZATION TABLE (LOCATED IN PC/AUTH ADDRESS SPACE LSQA). SERIALIZATION: PC/AUTH, ADDRESS SPACE LOCAL LOCK. OWNERSHIP: XM SERVICES", + "offset": 274, + "length": 4, + "type": "address" + }, + { + "name": "ascbetc", + "description": "NUMBER OF ENTRY TABLES CURRENTLY OWNED BY THIS ADDRESS SPACE. SERIALIZATION - PC/AUTH ADDRESS SPACE LOCAL LOCK. OWNERSHIP - XM SERVICES.", + "offset": 278, + "length": 2, + "type": "signed-integer" + }, + { + "name": "ascbetcn", + "description": "NUMBER OF CONNECTIONS TO ENTRY TABLES IN THIS ADDRESS SPACE CONTAINING ANY SPACE SWITCH ENTRIES. SERIALIZATION - PC/AUTH ADDRESS SPACE LOCAL LOCK. OWNERSHIP - XM SERVICES.", + "offset": 280, + "length": 2, + "type": "signed-integer" + }, + { + "name": "ascblxr", + "description": "NUMBER OF LINKAGE INDEXES RESERVED BY THIS ADDRESS SPACE. SERIALIZATION - PC/AUTH ADDRESS SPACE LOCAL LOCK. OWNERSHIP - XM SERVICES.", + "offset": 282, + "length": 2, + "type": "signed-integer" + }, + { + "name": "ascbaxr", + "description": "NUMBER OF AUTHORIZATION INDEXES RESERVED BY THIS ADDRESS SPACE. SERIALIZATION - PC/AUTH ADDRESS SPACE LOCAL LOCK. OWNERSHIP - XM SERVICES.", + "offset": 284, + "length": 2, + "type": "signed-integer" + }, + { + "name": "ascbstkh", + "description": "ADDRESS OF LOCAL STACK POOL HEADER FOR PCLINK SERVICE. SERIALIZATION - N/A. OWNERSHIP - XM SERVICES.", + "offset": 286, + "length": 4, + "type": "address" + }, + { + "name": "ascbcswd", + "description": "CS-serialized word cleared at step term / start", + "offset": 290, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ascbcsw0", + "description": "Byte 0", + "offset": 290, + "length": 1, + "type": "hex" + }, + { + "name": "ascbcsw1", + "description": "Byte 1", + "offset": 291, + "length": 1, + "type": "hex" + }, + { + "name": "ascbcsw2", + "description": "Byte 2, Ser: CS", + "offset": 292, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ascbzkf": { + "description": "", + "offset": 0, + "length": 1 + } + } + }, + { + "name": "ascbcsw3", + "description": "Byte 3, Ser: CS", + "offset": 293, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ascbzu": { + "description": "", + "offset": 1, + "length": 1 + }, + "ascbzf": { + "description": "", + "offset": 2, + "length": 1 + }, + "ascbzn": { + "description": "", + "offset": 3, + "length": 1 + }, + "ascbzm": { + "description": "", + "offset": 5, + "length": 1 + }, + "ascbzs": { + "description": "", + "offset": 6, + "length": 1 + }, + "ascbzc": { + "description": "Checked.", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "ascbr114", + "description": "Reserved.", + "offset": 294, + "length": 4, + "type": "hex" + }, + { + "name": "ascbjafbaddr", + "description": "Address of the JAFB", + "offset": 298, + "length": 4, + "type": "address" + }, + { + "name": "ascbxtcb", + "description": "ADDRESS OF THE JOB STEP TASK TCB WHICH OWNS THE CROSS MEMORY RESOURCES IN THIS ADDRESS SPACE. SERIALIZATION - LOCAL LOCK. OWNERSHIP - SUPERVISOR.", + "offset": 302, + "length": 4, + "type": "address" + }, + { + "name": "ascbfw3", + "description": "Fullword label to address bits in this word. Serialization - CS. This word is a programming interface only for bits ASCBSDBF, ASCBNOFT, ASCBPO1M, ASCBP1M0", + "offset": 306, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ascbcs1", + "description": "FIRST BYTE OF COMPARE AND SWAP FLAGS.", + "offset": 306, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ascbxmet": { + "description": "IF ONE, THE ADDRESS SPACE IS NON-REUSABLE BECAUSE OF CROSS MEMORY CONNECTIONS TO IT. THIS CONDITION MAY NOT BE PERMANENT. SERIALIZATION - CS AND PC/AUTH ADDRESS SPACE LOCAL LOCK. OWNERSHIP - XM SERVICES.", + "offset": 0, + "length": 1 + }, + "ascbxmec": { + "description": "CROSS MEMORY ENTRY TABLES CONTAINING SPACE SWITCH ENTRIES HAVE BEEN CREATED BY THIS ADDRESS SPACE. SERIALIZATION - CS AND PC/AUTH ADDRESS SPACE LOCAL LOCK. OWNERSHIP - XM SERVICES.", + "offset": 1, + "length": 1 + }, + "ascbxmpa": { + "description": "IF ONE, THE ADDRESS SPACE IS PERMANENTLY NON-REUSABLE BECAUSE OF INCOMPLETE TERMINATION PROCESSING OF PC/AUTH RESOURCE MANAGER. SERIALIZATION - CS AND PC/AUTH ADDRESS SPACE LOCAL LOCK. OWNERSHIP - XM SERVICES.", + "offset": 2, + "length": 1 + }, + "ascbxmlk": { + "description": "IF ONE, THE ADDRESS SPACE IS PERMANENTLY NON-REUSABLE BECAUSE OF A CML BIND. SERIALIZATION - CS AND PC/AUTH ADDRESS SPACE LOCAL LOCK. OWNERSHIP - XM SERVICES.", + "offset": 3, + "length": 1 + }, + "ascbpers": { + "description": "COMMUNICATION BIT FOR SLIP/PER SRB ROUTINES. IF 1, THE LOCAL SRB ROUTINE WILL ACTIVATE PER FOR THE SPECIFIED ADDRESS SPACE/JOB/CROSS MEMORY REFERENCES. IF 0, THE LOCAL SRB ROUTINE WILL DEACTIVATE PER FOR THE ADDRESS SPACE. SERIALIZATION - CS AND SLIP SERIALIZATION WORD, SHDRSEQ.", + "offset": 4, + "length": 1 + }, + "ascbdter": { + "description": "A DAT ERROR HAS OCCURRED FOR THIS ADDRESS SPACE. SERIALIZATION - CS. OWNERSHIP - RTM.", + "offset": 5, + "length": 1 + }, + "ascbpero": { + "description": "PER PROCESSING NEEDS TO BE DONE WHEN ADDRESS SPACE IS SWAPPED IN. SERIALIZATION - CS. OWNERSHIP - SLIP.", + "offset": 6, + "length": 1 + }, + "ascbswop": { + "description": "ADDRESS SPACE IS SWAPPED OUT WITH RESPECT TO PER PROCESSING BEING DONE. SERIALIZATION - CS. OWNERSHIP - RCT.", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "ascbcs2", + "description": "SECOND BYTE OF COMPARE AND SWAP FLAGS.", + "offset": 307, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ascbsas": { + "description": "INDICATES THAT STORAGE ALTERATION SELECTION (PER 2) IS ON FOR EITHER A DATA SPACE ASSOCIATED WITH THE ADDRESS SPACE, OR THE ADDRESS SPACE ITSELF.", + "offset": 0, + "length": 1 + }, + "ascbsmgr": { + "description": "This space is or has been associated with the session manager", + "offset": 1, + "length": 1 + }, + "ascbdtin": { + "description": "This space is or has been associated with ISPF", + "offset": 2, + "length": 1 + }, + "ascbxmnr": { + "description": "The address space is permanently non-reusable because of cross memory connections to a system LX. Serialization - CS and PC/AUTH address space Local lock. Ownership - XM services", + "offset": 3, + "length": 1 + }, + "ascbsdbf": { + "description": "A work unit in this address space has set CVTSDBF bit 0 to 1. If this address space is memtermed when this bit is on, the system will reset CVTSDBF. ASCBSDBF must be set on only by the work unit that has just set CVTSDBF bit 0 to 1. ASCBSDBF must be reset just prior to resetting CVTSDBF. ASCBSDBF must be set in the home address space. The SVC Dump request must properly indicate BUFFER=YES. Serialization: CS", + "offset": 4, + "length": 1 + }, + "ascbnoft": { + "description": "Set this to exempt all tasks in this address space from being affected by the FORCE TCB command. Serialization: CS", + "offset": 5, + "length": 1 + }, + "ascbpo1m": { + "description": "Set this to indicate that the RMODE 31 portion of program objects is to be backed by 1M pages (when available). The bit is reset at jobstep start. It applies only to modules loaded into private storage. Serialization: CS", + "offset": 6, + "length": 1 + }, + "ascbp1m0": { + "description": "Set this to indicate that the RMODE 31 portion of program objects is to be backed by 1M pages (when available), but only when the module will be placed into SP252. The bit is reset at jobstep start. It applies only to modules loaded into private storage. Do not also set ASCBPO1M. Serialization: CS", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "ascbcs3", + "description": "3rd byte of CS flags", + "offset": 308, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ascbxmso": { + "description": "This address space has owned a XM table with a space-switch PC", + "offset": 0, + "length": 1 + } + } + }, + { + "name": "ascbcs4", + "description": "4th byte of CS flags", + "offset": 309, + "length": 1, + "type": "bitstring" + }, + { + "name": "ascbgxl", + "description": "ADDRESS OF GLOBALLY LOADED MODULE EXTENT INFORMATION CONTROL BLOCK. SERIALIZATION - LOCAL LOCK. OWNERSHIP - CONTENTS SUPERVISION", + "offset": 310, + "length": 4, + "type": "address" + }, + { + "name": "ascbeatt", + "description": "EXPENDED AND ACCOUNTED TASK TIME. SERIALIZATION - N/A. OWNERSHIP - SCHEDULER.", + "offset": 314, + "length": 8, + "type": "hex" + }, + { + "name": "ascbints", + "description": "JOB SELECTION TIME STAMP. SERIALIZATION - N/A. OWNERSHIP - SCHEDULER.", + "offset": 322, + "length": 8, + "type": "hex" + }, + { + "name": "ascbfw4", + "description": "FULLWORD LABEL TO ADDRESS BITS IN THIS WORD. SERIALIZATION - LOCAL LOCK.", + "offset": 330, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ascbll1", + "description": "FIRST BYTE OF FLAGS. SERIALIZATION - LOCAL LOCK.", + "offset": 330, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ascbsspc": { + "description": "STATUS STOP TASKS PENDING A CML LOCK RELEASE.", + "offset": 0, + "length": 1 + } + } + }, + { + "name": "ascbll2", + "description": "SECOND BYTE OF FLAGS. SERIALIZATION - LOCAL LOCK.", + "offset": 331, + "length": 1, + "type": "bitstring" + }, + { + "name": "ascbll3", + "description": "THIRD BYTE OF FLAGS. SERIALIZATION - LOCAL LOCK.", + "offset": 332, + "length": 1, + "type": "bitstring" + }, + { + "name": "ascbll4", + "description": "FOURTH BYTE OF FLAGS. SERIALIZATION - LOCAL LOCK.", + "offset": 333, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ascbnrll": { + "description": "No release of Local Lock OK. Set only after obtaining LL.", + "offset": 0, + "length": 1 + }, + "ascbtyp1": { + "description": "TYPE 1 SVC HAS CONTROL. THIS OFFSET FIXED BY ARCHITECTURE.", + "offset": 6, + "length": 1 + }, + "ascbgqab": { + "description": "ISGQSCAN INFORMATION ROUTINE ABENDED FLAG. IF ON, ISGQSCAN INFORMATION ROUTINE UNEXPECTEDLY ABENDED.", + "offset": 0, + "length": 1 + } + } + }, + { + "name": "ascbrcms", + "description": "ADDRESS OF THE REQUESTED CMS CLASS LOCK FOR WHICH THE LOCAL LOCK HOLDER IS SUSPENDED. SERIALIZATION - LOCAL LOCK. OWNERSHIP - SUPERVISOR.", + "offset": 334, + "length": 4, + "type": "address" + }, + { + "name": "ascbiosc", + "description": "I/O SERVICE MEASURE. SERIALIZATION - CS. UPDATED BY JES2,JES3,SMF. READ BY RMF,SMF,SRM.", + "offset": 338, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ascbpkml", + "description": "PKM OF LAST TASK DISPATCHED IN THIS ADDRESS SPACE. SERIALIZATION - NONE. OWNERSHIP - DISPATCHER.", + "offset": 342, + "length": 2, + "type": "signed-integer" + }, + { + "name": "ascbxcnt", + "description": "EXCP COUNT FIELD. SERIALIZATION - LOCAL LOCK. OWNERSHIP - EXCP.", + "offset": 344, + "length": 2, + "type": "signed-integer" + }, + { + "name": "ascbnsqa", + "description": "ADDRESS OF THE SQA RESIDENT NSSA CHAIN. SERIALIZATION - DISPATCHER LOCK. OWNERSHIP - DISPATCHER.", + "offset": 346, + "length": 4, + "type": "address" + }, + { + "name": "ascbasm", + "description": "ADDRESS OF THE ASM HEADER. SERIALIZATION - NONE. OWNERSHIP - ASM.", + "offset": 350, + "length": 4, + "type": "address" + }, + { + "name": "ascbassb", + "description": "POINTER TO ADDRESS SPACE SECONDARY BLOCK (ASSB).", + "offset": 354, + "length": 4, + "type": "address" + }, + { + "name": "ascbtcme", + "description": "POINTER TO TCXTB. OWNERSHIP - TCAM.", + "offset": 358, + "length": 4, + "type": "address" + }, + { + "name": "ascbgqir", + "description": "ISGQSCAN INFORMATION ROUTINE ADDRESS. SERIALIZATION - COMPARE AND SWAP. OWNERSHIP - GRS", + "offset": 362, + "length": 4, + "type": "address" + }, + { + "name": "ascbgqi3", + "description": "BYTE 3 OF ASCBGQIR", + "offset": 362, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ascbgqds": { + "description": "ISGQSCAN INFORMATION ROUTINE DISABLED FLAG. IF ON, ISGQSCAN WILL NOT INVOKE THE ISGQSCAN INFORMATION ROUTINE.", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "ascblsqe", + "description": "Number of Enclave TCBs that are on a Local Lock Suspend Queue. Ownership: Task Management Serialization: Compare and Swap", + "offset": 363, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ascbiosx", + "description": "I/O service measure extended. This is like ASCBIOSC but it is extended to 8 bytes, so its value continuestto grow past the 4GB ASCBIOSC maximum capacity. Serialization - CSG.", + "offset": 366, + "length": 8, + "type": "hex" + }, + { + "name": "ascbr168", + "description": "RESERVED.", + "offset": 374, + "length": 2, + "type": "hex" + }, + { + "name": "ascbsvcn", + "description": "SVC Number for type-1 SVC Serialization - local lock", + "offset": 376, + "length": 2, + "type": "hex" + }, + { + "name": "ascbrsme", + "description": "POINTER TO RSM ADDRESS SPACE BLOCK EXTENSION. SERIALIZATION: RSMAD LOCK OWNERSHIP: RSM", + "offset": 378, + "length": 4, + "type": "address" + }, + { + "name": "ascbavm", + "description": "AVAILABILITY MANAGER ADDRESS SPACE RELATED DATA. SERIALIZATION: CS. OWNERSHIP: AVM.", + "offset": 382, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ascbavm1", + "description": "FIRST BYTE OF ASCBAVM. RESERVED.", + "offset": 382, + "length": 1, + "type": "bitstring" + }, + { + "name": "ascbavm2", + "description": "SECOND BYTE OF ASCBAVM. RESERVED.", + "offset": 383, + "length": 1, + "type": "bitstring" + }, + { + "name": "ascbagen", + "description": "AVM ASID REUSE GENERATION NUMBER.", + "offset": 384, + "length": 2, + "type": "signed-integer" + }, + { + "name": "ascbarc", + "description": "REASON CODE ON MEMTERM. SERIALIZATION - N/A. OWNERSHIP - RTM.", + "offset": 386, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ascbrsm", + "description": "ADDRESS OF RSM'S CONTROL BLOCK HEADER.", + "offset": 390, + "length": 4, + "type": "address" + }, + { + "name": "ascbrsma", + "description": "ADDRESS OF RSM'S CONTROL BLOCK HEADER.", + "offset": 390, + "length": 4, + "type": "address" + }, + { + "name": "ascbdcti", + "description": "ACCUMULATED CHANNEL CONNECT TIME INCURRED BY THIS MEMORY", + "offset": 394, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ascbend", + "description": "END OF ASCB", + "offset": 398, + "length": 8, + "type": "hex" + } + ] +} \ No newline at end of file diff --git a/cbxp/mappings/assb.json b/cbxp/mappings/assb.json new file mode 100644 index 0000000..cd3c9c3 --- /dev/null +++ b/cbxp/mappings/assb.json @@ -0,0 +1,2159 @@ +{ + "version": 1, + "name": "assb", + "commonName": "Address Space Secondary Block", + "macroId": "ihaassb", + "description": "%GOTO ASSBL2; /*", + "aliases": [], + "pointedToBy": [], + "storageAttributes": { + "subpools": [ + 245 + ], + "key": 0, + "residency": "Above 16M line" + }, + "controlBlock": [ + { + "name": "assbegin", + "description": "BEGINNING OF ASSB.", + "offset": 0, + "length": 8, + "type": "hex" + }, + { + "name": "assbassb", + "description": "ACRONYM IN EBCDIC - ASSB.", + "offset": 0, + "length": 4, + "type": "hex" + }, + { + "name": "assbsmfl", + "description": "Lock word for BMFLSD lock for TCTIOT serialization", + "offset": 4, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbubav", + "description": "", + "offset": 8, + "length": 4, + "type": "address" + }, + { + "name": "assbubad", + "description": "", + "offset": 12, + "length": 4, + "type": "address" + }, + { + "name": "assbupav", + "description": "", + "offset": 16, + "length": 4, + "type": "address" + }, + { + "name": "assbr014", + "description": "", + "offset": 20, + "length": 4, + "type": "hex" + }, + { + "name": "assbxmf1", + "description": "CROSS MEMORY FLAGS 1 OWNERSHIP: PC/AUTH SERIALIZATION: PC/AUTH ADDRESS SPACE LOCAL LOCK.", + "offset": 24, + "length": 1, + "type": "bitstring", + "bitmasks": { + "assbxeax": { + "description": "ADDRESS SPACE OWNS ENTRY TABLES CONTAINING NON-ZERO EAX VALUES", + "offset": 0, + "length": 1 + } + } + }, + { + "name": "assbxmf2", + "description": "CROSS MEMORY FLAGS 2 OWNERSHIP: PC/AUTH SERIALIZATION: PC/AUTH ADDRESS SPACE LOCAL LOCK.", + "offset": 25, + "length": 1, + "type": "bitstring", + "bitmasks": { + "assbstyp": { + "description": "FIRST 4 BITS REPRESENT STOKEN TYPE INFORMATION. ALWAYS ZERO FOR ADDRESS SPACE STOKENS.", + "offset": 0, + "length": 4 + } + } + }, + { + "name": "assbxmcc", + "description": "CROSS MEMORY CONNECTIONS COUNT. NUMBER OF SPACE SWITCHING CONNECTIONS DONE TO THIS SPACE. OWNERSHIP: PC/AUTH SERIALIZATION: PC/AUTH ADDRESS SPACE LOCAL LOCK.", + "offset": 26, + "length": 2, + "type": "signed-integer" + }, + { + "name": "assbcbtp", + "description": "POINTER TO IHAACBT SERIALIZATION: CMS LOCK", + "offset": 28, + "length": 4, + "type": "address" + }, + { + "name": "assbvsc", + "description": "VIO SLOT ALLOCATED COUNT. OWNERSHIP: ASM. SERIALIZATION: ASM ADDRESS SPACE RELATED CLASS LOCK.", + "offset": 32, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbnvsc", + "description": "NON-VIO SLOT ALLOCATED COUNT. OWNERSHIP: ASM. SERIALIZATION: ASMGL LOCK.", + "offset": 36, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbasrr", + "description": "ADDRESS SPACE RE-READS TO BE REPORTED IN THE TYPE 30 SMF RECORD.", + "offset": 40, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbdexp", + "description": "POINTER TO IHADEXP SERIALIZATION: LOCAL LOCK", + "offset": 44, + "length": 4, + "type": "address" + }, + { + "name": "assbstkn", + "description": "STOKEN. OWNERSHIP: SUPERVISOR CONTROL. SERIALIZATION: NONE. As with other ASCB/ASSB fields, serialization may be required when accessing something other than your address space's data.", + "offset": 48, + "length": 8, + "type": "hex" + }, + { + "name": "assbstw1", + "description": "FIRST WORD OF ASSBSTKN.", + "offset": 48, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbisqn", + "description": "Initial address space sequence number / instance number. It can be used with ASCBASID for the SSAIR instruction", + "offset": 52, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbbpsa", + "description": "IBMPM ANCHOR BLOCK. OWNERSHIP: IBM PRESENTATION MANAGER. SERIALIZATION: NONE.", + "offset": 56, + "length": 4, + "type": "address" + }, + { + "name": "assbcsct", + "description": "CACHING FACILITY STOP COUNT OWNERSHIP: DFP SERIALIZATION: LOCAL LOCK", + "offset": 60, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbbalv", + "description": "VIRTUAL ADDRESS OF THE BASIC ACCESS LIST. OWNERSHIP: SUPERVISOR CONTROL. SERIALIZATION: LOCAL LOCK.", + "offset": 64, + "length": 4, + "type": "address" + }, + { + "name": "assbbald", + "description": "BASIC ACCESS LIST DESIGNATOR. BITS 1-24 WITH SEVEN ZEROES APPENDED ON THE RIGHT FORM THE 31-BIT REAL ADDRESS OF THE BASIC ACCESS LIST. BITS 25-31 REPRESENT THE NUMBER OF 128 BYTE ACCESS LISTS, MINUS ONE. OWNERSHIP: SUPERVISOR CONTROL. SERIALIZATION: LOCAL LOCK.", + "offset": 68, + "length": 4, + "type": "address" + }, + { + "name": "assbxmse", + "description": "ADDRESS OF XMSE FOR THIS ADDRESS SPACE", + "offset": 72, + "length": 4, + "type": "address" + }, + { + "name": "assbtsqn", + "description": "NEXT TTOKEN SEQUENCE NUMBER. OWNERSHIP: SUPERVISOR CONTROL. SERIALIZATION: LOCAL LOCK.", + "offset": 76, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbvcnt", + "description": "COUNT OF CURRENT TASKS WITH VECTOR AFFINITY. SERIALIZED WITH SRM VIA COMPARE AND SWAP", + "offset": 80, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbpalv", + "description": "PASN ACCESS LIST VIRTUAL OWNERSHIP: SUPERVISOR CONTROL. SERIALIZATION: LOCAL LOCK.", + "offset": 84, + "length": 4, + "type": "address" + }, + { + "name": "assbasei", + "description": "ADDRESS OF ADDRESS SPACE RELATED INFORMATION. OWNERSHIP: ADDRESS SPACE SERVICES. SERIALIZATION: NONE.", + "offset": 88, + "length": 4, + "type": "address" + }, + { + "name": "assbrma", + "description": "ADDRESS OF ADDRESS SPACE RELATED RESOURCE MANAGER CONTROL STRUCTURE. OWNERSHIP: RTM. SERIALIZATION: NONE.", + "offset": 92, + "length": 4, + "type": "address" + }, + { + "name": "assbhst", + "description": "CPU time for Hiperspace reads and writes. This CPU time is \"normalized\" to standard CP time. Ownership: RSM. Serialization: CSG", + "offset": 96, + "length": 8, + "type": "hex" + }, + { + "name": "assbiipt", + "description": "CPU time for I/O interrupt processing. This CPU time is \"normalized\" to standard CP time. Ownership: IOS. Serialization: CSG", + "offset": 104, + "length": 8, + "type": "bitstring", + "bitmasks": { + "assbemcs_activated": { + "description": "At least one EMCS console was activated by this address space.", + "offset": 56, + "length": 1 + } + } + }, + { + "name": "assbanec", + "description": "ALESERV ADD WITH NO EAX COUNT. OWNERSHIP: PC/AUTH. SERIALIZATION: COMPARE AND SWAP (CS).", + "offset": 112, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbsdov", + "description": "ADDRESS OF SHARED DATA OBJECT MANAGER VECTOR TABLE OWNERSHIP: VLF SERIALIZATION: CS", + "offset": 116, + "length": 4, + "type": "address" + }, + { + "name": "assbmcso", + "description": "NUMBER OF CONSOLE IDS ACTIVATED BY THIS ADDRESS SPACE. OWNERSHIP: CONSOLE SERVICES. SERIALIZATION: COMPARE AND SWAP.", + "offset": 120, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbdfas", + "description": "ADDRESS OF DFP=SMSX STRUCTURE FOR THE ADDRESS SPACE. OWNERSHIP: DFP. SERIALIZATION: NONE.", + "offset": 124, + "length": 4, + "type": "address" + }, + { + "name": "assbflgs", + "description": "ASSB FLAGS.", + "offset": 128, + "length": 4, + "type": "hex" + }, + { + "name": "assbflg0", + "description": "ASSB FLAG BYTE 0. SERIALIZATION: COMPARE AND SWAP.", + "offset": 128, + "length": 1, + "type": "bitstring", + "bitmasks": { + "assbbsdn": { + "description": "BYPASS SVC DUMP NON-DISPATCHABILITY. OWNERSHIP: SDUMP.", + "offset": 0, + "length": 1 + }, + "assbcdsi": { + "description": "CDSI Resources Held or signalling resources held. Once set, must stay set. OWNERSHIP: XCF.", + "offset": 1, + "length": 1 + }, + "assbpsch": { + "description": "Parallel Detach SRB scheduled to this address space Ownership: RTM", + "offset": 2, + "length": 1 + }, + "assbpnsw": { + "description": "If on, this space is declared by the setter to be permanently non-swappable. The validity is not checked. System routines may rely on the space being non-swappable if the bit is on. Must be set by CS", + "offset": 3, + "length": 1 + }, + "assbnoml": { + "description": "NoML used internally Ownership: RTM Must be set by CS The following 3 bits are OWNERSHIP: SDUMP / and Must be set via C/S", + "offset": 4, + "length": 1 + }, + "assbsdumpas": { + "description": "SDUMP is dumping this address space", + "offset": 5, + "length": 1 + }, + "assbsdumpnd": { + "description": "SDUMP set the tasks in this space non-dispatchable", + "offset": 6, + "length": 1 + }, + "assbsdumpresetnd": { + "description": "Request SDUMP to set tasks dispatchable The previous 3 bits are OWNERSHIP: SDUMP / and Must be set via C/S", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "assbflg1", + "description": "ASSB FLAG BYTE 1 OWNERSHIP: SUPERVISOR CONTROL. SERIALIZATION: COMPARE AND SWAP. EQU X'80' Available EQU X'40' Available", + "offset": 129, + "length": 1, + "type": "bitstring", + "bitmasks": { + "assbntsl": { + "description": "JOB STEP HAS CREATED SYSTEM LEVEL NAME/TOKEN PAIRS.", + "offset": 2, + "length": 1 + }, + "assbfrst": { + "description": "The first pool of SVRBs has been obtained.", + "offset": 3, + "length": 1 + } + } + }, + { + "name": "assbflg2", + "description": "ASSB FLAG BYTE 2.", + "offset": 130, + "length": 1, + "type": "bitstring", + "bitmasks": { + "assbenfl": { + "description": "IF ON, INDICATES ADDRESS SPACE ISSUED ENF LISTEN REQUEST. OWNERSHIP: ENF. SERIALIZATION: NONE.", + "offset": 0, + "length": 1 + }, + "assbnswf": { + "description": "If on, indicates IEAVEGR found a WEB on the TAWQ, not marked SWAP. The TCBs in this space must be examined. Ownership: Supervisor Control Serialization: IEAVEGR", + "offset": 1, + "length": 1 + }, + "assbpran": { + "description": "No longer set - kept for compatibility. Ownership: RTM. Serialization: Local lock.", + "offset": 2, + "length": 1 + } + } + }, + { + "name": "assbflg3", + "description": "ASSB FLAG BYTE 3", + "offset": 131, + "length": 1, + "type": "bitstring", + "bitmasks": { + "assbarm": { + "description": "The job or STC running in this address space is registered with the Automatic Restart Manager (ARM). Serialization: Compare and Swap. Ownership: XCF (ARM)", + "offset": 0, + "length": 1 + }, + "assbnrst": { + "description": "The Automatic Restart Manager (ARM) should not restart the job or STC running in this address space even if it is registered with ARM. Serialization: Compare and Swap. Ownership: XCF (ARM)", + "offset": 1, + "length": 1 + }, + "assbgdps": { + "description": "If on, indicates this is the Geographically Dispersed Parallel Sysplex (GDPS) service address space. Ownership: GDPS Serialization: Compare and Swap", + "offset": 2, + "length": 1 + }, + "assbmdip": { + "description": "If on, indicates that a Memterm dump is in progress. Ownership: RTM Serialization: Compare and Swap", + "offset": 3, + "length": 1 + }, + "assbbcpiiused": { + "description": "If on, indicates this space has used BCPii services Ownership: BCPii Serialization: Compare and swap", + "offset": 4, + "length": 1 + }, + "assb_initially_zaap_on_ziip": { + "description": "Indicates that zAAP on zIIP was active when this job started. Ownership: SUP Serialization: Compare and swap", + "offset": 5, + "length": 1 + }, + "assbmtdc": { + "description": "If on, indicates that Memterm dump has completed Ownership: RTM Serialization: Compare and Swap", + "offset": 6, + "length": 1 + } + } + }, + { + "name": "assbascb", + "description": "ADDRESS OF ASCB.", + "offset": 132, + "length": 4, + "type": "address" + }, + { + "name": "assbasrf", + "description": "CREATED ASSB FORWARD POINTER.", + "offset": 136, + "length": 4, + "type": "address" + }, + { + "name": "assbasrb", + "description": "CREATED ASSB BACKWARD POINTER.", + "offset": 140, + "length": 4, + "type": "address" + }, + { + "name": "assbssd", + "description": "ADDRESS OF THE SUSPENDED SRB DESCRIPTOR (SSD) QUEUE. SERIALIZATION: DISPATCHER LOCK. OWNERSHIP: SUPERVISOR CONTROL.", + "offset": 144, + "length": 4, + "type": "address" + }, + { + "name": "assbmqma", + "description": "CONTROL BLOCK ANCHOR FOR MQM MVS/ESA. SERIALIZATION: NONE. OWNERSHIP: MQSERIES", + "offset": 148, + "length": 4, + "type": "address" + }, + { + "name": "assblasb", + "description": "TOKEN INDICATING IF MVS/APPC RESOURCES ARE ASSOCIATED WITH THIS ADDRESS SPACE. IF 0, THEN NONE ARE ASSOCIATED. OWNERSHIP: MVS/APPC. SERIALIZATION: NONE.", + "offset": 152, + "length": 8, + "type": "hex" + }, + { + "name": "assbsch", + "description": "POINTER TO APPC SCHEDULER ADDRESS SPACE BLOCK. OWNERSHIP: MVS/APPC. SERIALIZATION: NONE.", + "offset": 160, + "length": 4, + "type": "address" + }, + { + "name": "assbfsc", + "description": "COUNT ACCUMULATED BY IEAMFCNT FOR THIS ADDRESS SPACE. SERIALIZATION: CS.", + "offset": 164, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbjsab", + "description": "ADDRESS OF JOB SCHEDULER ADDRESS SPACE BLOCK. OWNERSHIP: CONTROLLING JOB SCHEDULER. SERIALIZATION: SEE IAZXJSAB MACRO", + "offset": 168, + "length": 4, + "type": "address" + }, + { + "name": "assbrctw", + "description": "ADDRESS OF RCT's WEB. OWNERSHIP: Supervisor Control. SERIALIZATION: Disablement.", + "offset": 172, + "length": 4, + "type": "address" + }, + { + "name": "assbldax", + "description": "Address of LDAX for this space", + "offset": 176, + "length": 8, + "type": "address" + }, + { + "name": "assbldxh", + "description": "High half", + "offset": 176, + "length": 4, + "type": "bitstring", + "bitmasks": { + "assbmtp": { + "description": "MEMTERM PENDING. TURNED ON WHEN A MEMTERM IS RECEIVED FOR A MEMTERMABLE ADDRESS SPACE. PREVENTS FURTHER DISABLEMENT.", + "offset": 24, + "length": 1 + } + } + }, + { + "name": "assbldxl", + "description": "Low half of address", + "offset": 180, + "length": 4, + "type": "address" + }, + { + "name": "assbtlmi", + "description": "ADDRESS OF TAILORED LOCK MANAGER INFORMATION BLOCK. OWNERSHIP: SYSTEM LOCK MANAGER. SERIALIZATION: LOCAL LOCK.", + "offset": 184, + "length": 4, + "type": "address" + }, + { + "name": "assbsdas", + "description": "POINTER TO WORKING STORAGE OBTAINED BY THE DUMP TASK. OWNERSHIP: SVC DUMP. SERIALIZATION: SVC DUMP.", + "offset": 188, + "length": 4, + "type": "address" + }, + { + "name": "assbtpin", + "description": "THE COUNT OF UCB PIN REQUESTS ISSUED IN TASK MODE OUTSTANDING FOR THE ADDRESS SPACE. SERIALIZATION: COMPARE AND SWAP. OWNERSHIP: IOS.", + "offset": 192, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbspin", + "description": "THE COUNT OF UCB PIN REQUESTS ISSUED IN SRB MODE OUTSTANDING FOR THE ADDRESS SPACE. SERIALIZATION: COMPARE AND SWAP. OWNERSHIP: IOS.", + "offset": 196, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbect1", + "description": "THE COUNT OF ALLOCATION REQUESTS IN THIS ADDRESS SPACE CURRENTLY BOUND ON EDT NUMBER ONE. SERIALIZATION: COMPARE AND SWAP. OWNERSHIP: ALLOCATION.", + "offset": 200, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbect2", + "description": "THE COUNT OF ALLOCATION REQUESTS IN THIS ADDRESS SPACE CURRENTLY BOUND ON EDT NUMBER TWO. SERIALIZATION: COMPARE AND SWAP. OWNERSHIP: ALLOCATION.", + "offset": 204, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbdfp", + "description": "RESERVED FOR USE BY DFP. OWNERSHIP: DFP. SERIALIZATION: LOCAL LOCK.", + "offset": 208, + "length": 4, + "type": "bitstring", + "bitmasks": { + "assboam": { + "description": "ADDRESS SPACE IS A USER OF OAM RESOURCES.", + "offset": 24, + "length": 1 + } + } + }, + { + "name": "assbsasi", + "description": "SASI info", + "offset": 212, + "length": 2, + "type": "signed-integer" + }, + { + "name": "assbsnew", + "description": "Count of SASN=NEW connections included in ASCBETCN SERIALIZATION - PC/AUTH Address space Local Lock. OWNERSHIP - XM Services.", + "offset": 214, + "length": 2, + "type": "signed-integer" + }, + { + "name": "assbnttp", + "description": "ADDRESS OF ADDRESS SPACE LEVEL NAME/TOKEN HEADER. SERIALIZATION: LOCAL LOCK. OWNERSHIP: SUPERVISOR CONTROL.", + "offset": 216, + "length": 4, + "type": "address" + }, + { + "name": "assboecb", + "description": "ECB WHICH IS WAITED ON BY THE INITIATOR FOR AN OpenMVS EVENT. SERIALIZATION: POST AND WAIT. OWNERSHIP: OpenMVS.", + "offset": 220, + "length": 4, + "type": "address" + }, + { + "name": "assboepc", + "description": "POST CODE: '81'X=>BPX1EXC '82'X=>BPX1EXI", + "offset": 220, + "length": 1, + "type": "bitstring" + }, + { + "name": "assboecd", + "description": "OpenMVS completion codes.", + "offset": 221, + "length": 3, + "type": "hex" + }, + { + "name": "assboees", + "description": "Exit Status passed on BPX1EXI.", + "offset": 221, + "length": 1, + "type": "bitstring" + }, + { + "name": "assboasb", + "description": "OpenMVS ADDRESS SPACE BLOCK. SERIALIZATION: ENQ MAJOR=SYSZBPX MINOR=PROCESS_INIT. OWNERSHIP: OpenMVS.", + "offset": 222, + "length": 4, + "type": "address" + }, + { + "name": "assbxsba", + "description": "XSB POOL QUEUE. SERIALIZATION: COMPARE-AND-SWAP WHEN RETURNING XSBS. : COMPARE-AND-SWAP AND THE LOCAL LOCK WHEN REMOVING XSBS OWNERSHIP: SUPERVISOR CONTROL.", + "offset": 224, + "length": 4, + "type": "address" + }, + { + "name": "assbdlcb", + "description": "Contains the address of the Dynamic LNKLST Control Block (DLCB) mapped by CSVDLCB. Ownership: CSV Serialization: ENQ", + "offset": 228, + "length": 4, + "type": "address" + }, + { + "name": "assbvab", + "description": "ADDRESS OF VSM ADDRESS SPACE BLOCK (VAB), WHICH ANCHORS SOME OF THE VSM CONTROL BLOCKS THAT DESCRIBE COMMON STORAGE. SERIALIZATION: NONE. OWNERSHIP: VIRTUAL STORAGE MANAGER.", + "offset": 232, + "length": 4, + "type": "address" + }, + { + "name": "assblmab", + "description": "LATCH MANAGER ADDRESS SPACE BLOCK. SERIALIZATION: CMSEQDQ LOCK. OWNERSHIP: GRS.", + "offset": 236, + "length": 4, + "type": "address" + }, + { + "name": "assbioct", + "description": "DIV/IO count", + "offset": 240, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbctt", + "description": "CTT field", + "offset": 244, + "length": 4, + "type": "address" + }, + { + "name": "assbxrct", + "description": "XES REQUEST COUNT SERIALIZATION: COMPARE AND SWAP. OWNERSHIP: XES.", + "offset": 248, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbetsc_prezos11", + "description": "Enclave TCB Summary Count Not set as of z/OS 1.11", + "offset": 252, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assb_nonenct_psrb_cp_disps", + "description": "Count of non-enclave preemptable SRB dispatches for CP work. Incremented when ASSBPHTM updated for CP work on non-enclave SRBs. Cache aligned with ASSBPHTM. Corresponding time is: ASSBPHTM - ASSB_zCBP_PHTM - ASSB_zIIP_PHTM - ASSB_ENCT SERIALIZATION: COMPARE AND SWAP. OWNERSHIP: Supervisor Control", + "offset": 252, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbtasb", + "description": "TCPIP ASSB Extension Ownership: TCPIP Serialization: Compare and Swap when first TCPIP client is initialized in this space.", + "offset": 256, + "length": 4, + "type": "address" + }, + { + "name": "assbtpma", + "description": "OWNER: IOS.", + "offset": 260, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbrosu", + "description": "OWNER: IOS.", + "offset": 264, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbtpmt", + "description": "OWNER: IOS.", + "offset": 268, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbssdt", + "description": "SSD Trailer", + "offset": 272, + "length": 4, + "type": "hex" + }, + { + "name": "assbtawq", + "description": "ADDRESS OF TASK WEB QUEUE. SERIALIZATION: WEB QUEUE LOCK OWNERSHIP: SUPERVISOR CONTROL", + "offset": 276, + "length": 4, + "type": "address" + }, + { + "name": "assbwcml", + "description": "ADDRESS OF CML PROMOTION WEB. SERIALIZATION: NONE OWNERSHIP: SUPERVISOR CONTROL", + "offset": 280, + "length": 4, + "type": "address" + }, + { + "name": "assbws3s", + "description": "ADDRESS OF ASYNCHRONOUS EXIT WEB. SERIALIZATION: NONE OWNERSHIP: SUPERVISOR CONTROL", + "offset": 284, + "length": 4, + "type": "address" + }, + { + "name": "assbwsss", + "description": "ADDRESS OF SUSPENDED STATUS WEB. SERIALIZATION: GLOBAL INTERSECT OWNERSHIP: SUPERVISOR CONTROL", + "offset": 288, + "length": 4, + "type": "address" + }, + { + "name": "assbcapq", + "description": "ADDRESS OF FIRST WEB ON THE CAP QUEUE. SERIALIZATION: DISPATCHER ACTIVE AND COMPARE AND SWAP TO ENQUEUE, GLOBAL INTERSECT TO DEQUEUE. OWNERSHIP: SUPERVISOR CONTROL", + "offset": 292, + "length": 4, + "type": "address" + }, + { + "name": "assbptar", + "description": "Pointer used by RTM processing to control task structure terminations. Ownership: RTM2. Serialization: Local lock.", + "offset": 296, + "length": 4, + "type": "address" + }, + { + "name": "assbwtct", + "description": "When this counter is non-zero, a recovery routine has requested temporary deferral of Parallel Detach trigger detection. Ownership: RTM Serialization: Compare and Swap.", + "offset": 300, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbsbct", + "description": "XES-owned count of requests with storage binds, incremented in the ASSB of the storage owner. Ownership: XES Serialization: Compare and Swap", + "offset": 304, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbarbp", + "description": "ARM (Automatic Restart Manager) Resource Block. Serialization: Local Lock Ownership: XCF (ARM)", + "offset": 308, + "length": 4, + "type": "address" + }, + { + "name": "assbrctr", + "description": "ADDRESS OF RCT's RB OWNERSHIP: Region Control Task SERIALIZATION: None", + "offset": 312, + "length": 4, + "type": "address" + }, + { + "name": "assbscah", + "description": "Address of the SCA (SPIE/ESPIE Control Area) chain Ownership: RTM Serialization: Local Lock", + "offset": 316, + "length": 4, + "type": "address" + }, + { + "name": "assbttfl", + "description": "Transaction Trace flags. Serialization: None Ownership: Transaction Trace", + "offset": 320, + "length": 1, + "type": "bitstring", + "bitmasks": { + "assbttrc": { + "description": "Transaction Trace has been used.", + "offset": 0, + "length": 1 + } + } + }, + { + "name": "assbwmf1", + "description": "WLM flags SERIALIZATION: none", + "offset": 321, + "length": 1, + "type": "bitstring", + "bitmasks": { + "assbwini": { + "description": "WLM Managed Batch initiator", + "offset": 0, + "length": 1 + }, + "assbfsas": { + "description": "WLM Managed OE Forked/Spawned address space", + "offset": 1, + "length": 1 + } + } + }, + { + "name": "assbpswc", + "description": "Preemptable-class SRB short wait count. OWNERSHIP: Supervisor control SERIALIZATION: none", + "offset": 322, + "length": 2, + "type": "signed-integer" + }, + { + "name": "assbixga", + "description": "Pointer to SLC address space related information. Serialization: Local Lock and CMS Lock Ownership: System Logger", + "offset": 324, + "length": 4, + "type": "address" + }, + { + "name": "assbjbni", + "description": "Jobname for the Initiated Program that is associated with this Address Space. If the first byte is x'00', none is associated. OWNERSHIP: Initiator. SERIALIZATION: None.", + "offset": 328, + "length": 8, + "type": "hex" + }, + { + "name": "assbjbns", + "description": "Jobname for the START/MOUNT/ LOGON that is associated with this Address Space. If the first byte is x'00', none is associated. OWNERSHIP: Console Services. SERIALIZATION: None.", + "offset": 336, + "length": 8, + "type": "hex" + }, + { + "name": "assbasst", + "description": "Additional SRB Service Time. CPU time is accumulated here for this address space's non-Enclave Preemptable SRBs and for Client Related SRBs for which this address space is the client. Format: TOD Clock Format Ownership: Supervisor Control Serialization: CS", + "offset": 344, + "length": 8, + "type": "hex" + }, + { + "name": "assbphtm", + "description": "Preemptable-class Time. The CPU time for all types of preemptable SRBs (PSRB, CSRB, ESRB) executing with this address space as their home space and enclave tasks is accumulated here. This value is not used in SMF or SRM calculations. This value is not reset at step/job start.", + "offset": 352, + "length": 8, + "type": "hex" + }, + { + "name": "assbcrwq", + "description": "Client Related WEB Queue. Address of the first WEB on the queue. WEBs on this queue are client SRBs for which this space is the client. Ownership: Supervisor Control Serialization: AWQ Lock", + "offset": 360, + "length": 4, + "type": "address" + }, + { + "name": "assbscwq", + "description": "Suspended Client related WEB Queue. Address of the first WEB on the queue. WEBs on this queue are suspended client SRBs for which this space is the client. Ownership: Supervisor Control Serialization: AWQ Lock", + "offset": 364, + "length": 4, + "type": "address" + }, + { + "name": "assblcnt", + "description": "Number of latched operations in progess for System Logger in an address space. Ownership: System Logger Serialization: CS", + "offset": 368, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbacnt", + "description": "Number of asynchronous requests in progress in System. This information will be used by TSO during 'Authorized' command processing Ownership: System Logger Serialization: CS", + "offset": 372, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assblcpd", + "description": "CPOOLID of the cpool created by system logger", + "offset": 376, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbslsc", + "description": "Slip serialization counts. Ownership: SLIP Serialization: CS", + "offset": 380, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbslpc", + "description": "Slip PER serialization count", + "offset": 380, + "length": 2, + "type": "signed-integer" + }, + { + "name": "assbslnc", + "description": "Slip Non-PER serialization count", + "offset": 382, + "length": 2, + "type": "signed-integer" + }, + { + "name": "assbpvtc", + "description": "Queue of privately managed contexts for this address space Ownership: Context Services Serialization: Local lock", + "offset": 384, + "length": 4, + "type": "address" + }, + { + "name": "assbctx", + "description": "Context Services Word", + "offset": 388, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbctxf", + "description": "Context Services flags Ownership: Context Services Serialization: Local lock", + "offset": 388, + "length": 1, + "type": "bitstring", + "bitmasks": { + "assbncl": { + "description": "There is no limit to the number of private contexts in this space", + "offset": 0, + "length": 1 + }, + "assbmsgi": { + "description": "The message to relax the above limit has been issued and rejected", + "offset": 1, + "length": 1 + }, + "assburmx": { + "description": "There is no limit to the number of unauthorized resource managers in this space.", + "offset": 2, + "length": 1 + }, + "assburmm": { + "description": "The message to relax the above limit has been issued for this space.", + "offset": 3, + "length": 1 + } + } + }, + { + "name": "assbctx2", + "description": "Reserved context services.", + "offset": 389, + "length": 3, + "type": "hex" + }, + { + "name": "assbhale", + "description": "Copy of Home ALE", + "offset": 392, + "length": 16, + "type": "hex" + }, + { + "name": "assb_time_on_zcbp_disps", + "description": "Count of task dispatches for zCBP work. Incremented and cache aligned with ASSB_TIME_ON_zCBP. SERIALIZATION: COMPARE AND SWAP. OWNERSHIP: Supervisor Control", + "offset": 408, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assb_time_on_zaap_disps", + "description": "Count of task dispatches for zAAP work. Incremented and cache aligned with ASSB_TIME_ON_zAAP. SERIALIZATION: COMPARE AND SWAP. OWNERSHIP: Supervisor Control", + "offset": 408, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbsrsn", + "description": "Suspend/Resume sequence number Ownership: Supervisor Control Serialization: CS", + "offset": 412, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbwlms", + "description": "Address of WLM managed server SERIALIZATION: WLMQ lock", + "offset": 416, + "length": 4, + "type": "address" + }, + { + "name": "assbbcba", + "description": "Address of SOMObjects data structure Ownership: SOMObjects for OS/390 Serialization: CS", + "offset": 420, + "length": 4, + "type": "address" + }, + { + "name": "assbcsm", + "description": "CSM user bitmap Ownership: VTAM", + "offset": 424, + "length": 4, + "type": "hex" + }, + { + "name": "assbpect", + "description": "Number of Pause elements allocated by unauthorized programs Ownership: Supervisor Control Serialization: Dispatcher lock", + "offset": 428, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbrrsa", + "description": "RRS data area pointer", + "offset": 432, + "length": 4, + "type": "address" + }, + { + "name": "assboflg", + "description": "ASSB USS flags Ownership: USS Serialization: None", + "offset": 436, + "length": 2, + "type": "hex" + }, + { + "name": "assbofl0", + "description": "ASSB USS flag byte 0", + "offset": 436, + "length": 1, + "type": "bitstring", + "bitmasks": { + "assbomsc": { + "description": "USS address space must remain program controlled.", + "offset": 0, + "length": 1 + }, + "assbodwt": { + "description": "USS process awaiting dub.", + "offset": 1, + "length": 1 + }, + "assbosdb": { + "description": "Allow address space to dub at same time as superusers", + "offset": 2, + "length": 1 + }, + "assbtdaff": { + "description": "CInet Addr Sp Transport Dr Affinity has been setup", + "offset": 3, + "length": 1 + } + } + }, + { + "name": "assbofl1", + "description": "ASSB USS flag byte 1", + "offset": 437, + "length": 1, + "type": "hex" + }, + { + "name": "assbscaf", + "description": "CPU affinity indicator associated with SRM. Serialization: SRM spin lock", + "offset": 438, + "length": 2, + "type": "bitstring" + }, + { + "name": "assbctxc", + "description": "Number of private contexts owned by PKM 8 to 15 resource managers in this space. Ownership: Context Services Serialization: C&S", + "offset": 440, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbrmct", + "description": "Number of PKM 8 to 15 resource managers. Ownership: Registration Services Serialization: C&S", + "offset": 444, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assblrba", + "description": "License manager resource block", + "offset": 448, + "length": 4, + "type": "address" + }, + { + "name": "assbslfa", + "description": "Shadow LFT address", + "offset": 452, + "length": 4, + "type": "address" + }, + { + "name": "assbpfidassigncnt", + "description": "PCIE PFID Assign Count to track the number of assigned items Owner: IOS PCIE Serialization: PCTE Latch", + "offset": 456, + "length": 1, + "type": "hex" + }, + { + "name": "assbfabricpriority", + "description": "Fabric I/O Priority. Will be zero if the system does not support Fabric I/O Priority. Owner: WLM/SRM Serialization: SRM Lock", + "offset": 457, + "length": 1, + "type": "hex" + }, + { + "name": "assbioms", + "description": "I/O Management Support Data. -", + "offset": 458, + "length": 2, + "type": "hex" + }, + { + "name": "assbpromotioncount", + "description": "Number of WEBs to promote. -", + "offset": 460, + "length": 2, + "type": "signed-integer" + }, + { + "name": "assbtiop", + "description": "Tape I/O Priority", + "offset": 462, + "length": 4, + "type": "hex" + }, + { + "name": "assbcsdp", + "description": "Channel Subsystem I/O Priority. Will be zero if the system does not support channel subsystem priority. Ownership: SRM Serialization: SRM lock", + "offset": 466, + "length": 4, + "type": "hex" + }, + { + "name": "assb_zcbp_time_area", + "description": "", + "offset": 470, + "length": 16, + "type": "hex" + }, + { + "name": "assb_ifa_time_area", + "description": "", + "offset": 470, + "length": 16, + "type": "hex" + }, + { + "name": "assb_time_zcbp_on_cp", + "description": "", + "offset": 470, + "length": 8, + "type": "hex" + }, + { + "name": "assb_time_ifa_on_cp", + "description": "", + "offset": 470, + "length": 8, + "type": "hex" + }, + { + "name": "assb_time_on_zcbp", + "description": "zCBP time. Enclave time not included", + "offset": 478, + "length": 8, + "type": "hex" + }, + { + "name": "assb_time_on_zaap", + "description": "zAAP time. Enclave time not included", + "offset": 478, + "length": 8, + "type": "hex" + }, + { + "name": "assb_time_on_ifa", + "description": "", + "offset": 478, + "length": 8, + "type": "hex" + }, + { + "name": "assb_task_time_on_cp", + "description": "Time on CP in task mode for this space. Valid only when zCBPs, zAAPs or zIIPs are installed", + "offset": 486, + "length": 8, + "type": "hex" + }, + { + "name": "assb_time_on_cp", + "description": "Synonym for ASSB_TASK_TIME_ON_CP", + "offset": 486, + "length": 8, + "type": "hex" + }, + { + "name": "assbmtci", + "description": "Memterm component ID. Set only when sdump needs to be taken", + "offset": 494, + "length": 5, + "type": "hex" + }, + { + "name": "assbflg4", + "description": "Flags Ownership: LE Serialization: none", + "offset": 499, + "length": 4, + "type": "bitstring", + "bitmasks": { + "assb_authle": { + "description": "Resources have been allocated.", + "offset": 24, + "length": 1 + } + } + }, + { + "name": "assbqiop", + "description": "Queued Director I/O Priority Owner: WLM/SRM Serialization: SRM lock", + "offset": 503, + "length": 4, + "type": "hex" + }, + { + "name": "assbcryp", + "description": "Crypto flags. Serialization: none.", + "offset": 507, + "length": 1, + "type": "bitstring", + "bitmasks": { + "assbsods": { + "description": "If set to '1'b, the address space is using an ICSF session object data space.", + "offset": 0, + "length": 1 + }, + "assbcrnq": { + "description": "If set to '1'b, the address space has done key data set serialization.", + "offset": 1, + "length": 1 + }, + "assbssl": { + "description": "If set to '1'b, the address space has called the SSL session caching service and may hold a GRS latch.", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "assbphtm_base", + "description": "Value in ASSBPHTM at the end of the previous jobstep. Serialization: none", + "offset": 508, + "length": 8, + "type": "hex" + }, + { + "name": "assbearlymemtermrm", + "description": "Address of Early Memterm Resource Manager", + "offset": 516, + "length": 4, + "type": "address" + }, + { + "name": "assb_laa_cpid", + "description": "Anchor for LAA CPOOL Ownership: LE", + "offset": 520, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assb_zcbp_phtm", + "description": "zCBP-only equivalent of ASSBPHTM This is \"normalized\" time", + "offset": 524, + "length": 8, + "type": "hex" + }, + { + "name": "assb_zaap_phtm", + "description": "zAAP-only equivalent of ASSBPHTM This is \"normalized\" time This value is not reset at step/job start.", + "offset": 524, + "length": 8, + "type": "hex" + }, + { + "name": "assb_ifa_phtm", + "description": "", + "offset": 524, + "length": 8, + "type": "hex" + }, + { + "name": "assb_enct_prezos11", + "description": "Enclave time in an address space on a standard CP Not set as of z/OS 1.11", + "offset": 532, + "length": 8, + "type": "hex" + }, + { + "name": "assb_time_on_ziip_disps", + "description": "Count of task dispatches for zIIP work. Incremented and cache aligned with ASSB_TIME_ON_zIIP. SERIALIZATION: COMPARE AND SWAP. OWNERSHIP: Supervisor Control", + "offset": 532, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assb_ziip_enct_disps", + "description": "Count of enclave dispatches for zIIP work. Incremented and cache aligned with ASSB_zIIP_ENCT. This value is not reset at step/job start. SERIALIZATION: COMPARE AND SWAP. OWNERSHIP: Supervisor Control", + "offset": 536, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assb_ifa_enct_prezos11", + "description": "Enclave IFA time in an address space. This is \"normalized\" time Not set as of z/OS 1.11", + "offset": 540, + "length": 8, + "type": "hex" + }, + { + "name": "assb_nonenct_psrb_zcbp_disps", + "description": "Count of non-enclave preemptable SRB dispatches for zCBP work. Incremented when ASSB_zCBP_PHTM updated for non-enclave SRBs. Cache aligned with ASSB_zCBP_PHTM. Corresponding time is: ASSB_zCBP_PHTM - ASSB_zCBP_ENCT SERIALIZATION: COMPARE AND SWAP. OWNERSHIP: Supervisor Control", + "offset": 540, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assb_nonenct_psrb_zaap_disps", + "description": "Count of non-enclave preemptable SRB dispatches for zAAP work. Incremented when ASSB_zAAP_PHTM updated for non-enclave SRBs. Cache aligned with ASSB_zAAP_PHTM. Corresponding time is: ASSB_zAAP_PHTM - ASSB_zAAP_ENCT SERIALIZATION: COMPARE AND SWAP. OWNERSHIP: Supervisor Control", + "offset": 540, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assb_nonenct_psrb_ziip_disps", + "description": "Count of non-enclave preemptable SRB dispatches for zIIP work. Incremented when ASSB_zIIP_PHTM updated for non-enclave SRBs. Cache aligned with ASSB_zIIP_PHTM. Corresponding time is: ASSB_zIIP_PHTM - ASSB_zIIP_ENCT SERIALIZATION: COMPARE AND SWAP. OWNERSHIP: Supervisor Control", + "offset": 544, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assb_base_phtm", + "description": "Base value, set by WLM", + "offset": 548, + "length": 8, + "type": "hex" + }, + { + "name": "assb_zcbp_base_phtm", + "description": "Base value, set by WLM", + "offset": 556, + "length": 8, + "type": "hex" + }, + { + "name": "assb_ifa_base_phtm", + "description": "Base value, set by WLM", + "offset": 556, + "length": 8, + "type": "hex" + }, + { + "name": "assb_base_enct", + "description": "Base value, set by WLM", + "offset": 564, + "length": 8, + "type": "hex" + }, + { + "name": "assb_zcbp_base_enct", + "description": "Base value, set by WLM", + "offset": 572, + "length": 8, + "type": "hex" + }, + { + "name": "assb_ifa_base_enct", + "description": "Base value, set by WLM", + "offset": 572, + "length": 8, + "type": "bitstring", + "bitmasks": { + "assb_entitle_nominee": { + "description": "Entitle nominee", + "offset": 56, + "length": 1 + } + } + }, + { + "name": "assb_cp_affinity_node", + "description": "WUQ for CP affinity", + "offset": 580, + "length": 4, + "type": "address" + }, + { + "name": "assb_zcbp_affinity_node", + "description": "WUQ for zCBP affinity", + "offset": 584, + "length": 4, + "type": "address" + }, + { + "name": "assb_ifa_affinity_node", + "description": "WUQ for IFA affinity", + "offset": 584, + "length": 4, + "type": "address" + }, + { + "name": "assb_ziip_affinity_node", + "description": "WUQ for zIIP affinity", + "offset": 588, + "length": 4, + "type": "address" + }, + { + "name": "assb_sup_affinity_node", + "description": "", + "offset": 588, + "length": 4, + "type": "address" + }, + { + "name": "assbsrbcpoolpmecount", + "description": "Count of active SRB CPOOL PMEs in the Home address space Serialization: Compare and Swap", + "offset": 592, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assb_time_on_ziip", + "description": "zIIP time. Enclave time not included", + "offset": 596, + "length": 8, + "type": "hex" + }, + { + "name": "assb_time_on_sup", + "description": "", + "offset": 596, + "length": 8, + "type": "hex" + }, + { + "name": "assb_time_ziip_on_cp", + "description": "zIIP time on CP. Enclave time not included. When zAAPzIIP=YES is in effect, zAAP-eligible work running on a CP is included.", + "offset": 604, + "length": 8, + "type": "hex" + }, + { + "name": "assb_time_sup_on_cp", + "description": "", + "offset": 604, + "length": 8, + "type": "hex" + }, + { + "name": "assb_ziip_phtm", + "description": "zIIP-only equivalent of ASSBPHTM This is \"normalized\" time This value is not reset at step/job start.", + "offset": 612, + "length": 8, + "type": "hex" + }, + { + "name": "assb_sup_phtm", + "description": "", + "offset": 612, + "length": 8, + "type": "hex" + }, + { + "name": "assb_srb_time_on_cp", + "description": "Time on CP in SRB mode for this space. Valid only when zAAPs or SUPs are installed", + "offset": 620, + "length": 8, + "type": "hex" + }, + { + "name": "assb_ziip_enct", + "description": "Enclave zIIP time in an address space. This is \"normalized\" time This value is not reset at step/job start.", + "offset": 628, + "length": 8, + "type": "hex" + }, + { + "name": "assb_sup_enct", + "description": "", + "offset": 628, + "length": 8, + "type": "hex" + }, + { + "name": "assb_zcbp_on_cp_enct", + "description": "Enclave time for zCBP on CP in an address space This value is not reset at step/job start.", + "offset": 636, + "length": 8, + "type": "hex" + }, + { + "name": "assb_ifa_on_cp_enct", + "description": "Enclave time for IFA on CP in an address space This value is not reset at step/job start.", + "offset": 636, + "length": 8, + "type": "hex" + }, + { + "name": "assbsown", + "description": "Address of the Suspended SRB Descriptor (SSD) static queue. Serialization: Dispatcher Lock. Ownership: Supervisor Control.", + "offset": 644, + "length": 4, + "type": "address" + }, + { + "name": "assbsowt", + "description": "SSD Static Ownership queue trailer.", + "offset": 648, + "length": 4, + "type": "address" + }, + { + "name": "assb_zcbp_on_cp_base_enct", + "description": "Enclave base time for zCBP on CP in an address space", + "offset": 652, + "length": 8, + "type": "hex" + }, + { + "name": "assb_ifa_on_cp_base_enct", + "description": "Enclave base time for IFA on CP in an address space", + "offset": 652, + "length": 8, + "type": "hex" + }, + { + "name": "assb_time_at_pdp", + "description": "Trickle promotion CPU time (PDP means Promotion Dispatch Priority) Owner: Supervisor Control Serialization: Compare and Swap", + "offset": 660, + "length": 8, + "type": "hex" + }, + { + "name": "assb_srbt_base", + "description": "BASE TIME FOR ASCBSRBT Ownership: SRM Serialization: SRMLOCK", + "offset": 668, + "length": 8, + "type": "hex" + }, + { + "name": "assbcasc", + "description": "Address of the Console Address Space Control block. Ownership: Console Services Serialization: Compare and Swap", + "offset": 676, + "length": 4, + "type": "address" + }, + { + "name": "assbnumberunauthpets", + "description": "Number of unauthorized PETs currently in use in the Home address space Serialization: DISP lock", + "offset": 680, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assb_asst_time_on_cp", + "description": "Additional SRB Service Time on a standard CP. CPU time is accumulated here for this address space's Preemptable SRBs and for Client Related SRBs for which this address space is the client. Valid only when zAAPs or zIIPs are installed Format: TOD Clock Format Ownership: Supervisor Control", + "offset": 684, + "length": 8, + "type": "hex" + }, + { + "name": "assb_switch_to_zaapziip_count", + "description": "When not zAAP_On_zIIP initially, this is incremented on switches to zAAP. When zAAP_On_zIIP initially, this is incremented on switches to both zAAP and zIIP", + "offset": 692, + "length": 8, + "type": "hex" + }, + { + "name": "assbasab", + "description": "Address of IQP ASAB Owner: IQP Serialization: local lock", + "offset": 700, + "length": 8, + "type": "address" + }, + { + "name": "assb_ziip_base_enct", + "description": "Base value, set by WLM", + "offset": 708, + "length": 8, + "type": "hex" + }, + { + "name": "assb_sup_base_enct", + "description": "Base value, set by WLM", + "offset": 708, + "length": 8, + "type": "hex" + }, + { + "name": "assb_ziip_on_cp_enct", + "description": "Enclave time for zIIP on CP in an address space. When zAAPzIIP=YES is in effect, zAAP-eligible work running on a CP is included. This value is not reset at step/job start.", + "offset": 716, + "length": 8, + "type": "hex" + }, + { + "name": "assb_sup_on_cp_enct", + "description": "See ASSB_zIIP_ON_CP_ENCT", + "offset": 716, + "length": 8, + "type": "hex" + }, + { + "name": "assb_ziip_on_cp_base_enct", + "description": "Enclave base time for zIIP on CP in an address space. When zAAPzIIP=YES is in effect, zAAP-eligible work running on a CP is included.", + "offset": 724, + "length": 8, + "type": "hex" + }, + { + "name": "assb_sup_on_cp_base_enct", + "description": "Enclave base time for SUP on CP in an address space. When zAAPzIIP=YES is in effect, zAAP-eligible work running on a CP is included.", + "offset": 724, + "length": 8, + "type": "bitstring", + "bitmasks": { + "assbrtmi": { + "description": "When on, the reserved RMPL pointed to by ASSBRMIN and the reserved RTM2WA pointed to by ASSBRTMA are in use", + "offset": 56, + "length": 1 + } + } + }, + { + "name": "assbrmin", + "description": "Address of RTM's reserved RMPL and associated storage - this will always be below the 16M line Ownership: RTM Serialization: Local lock", + "offset": 732, + "length": 4, + "type": "address" + }, + { + "name": "assbrtma", + "description": "Address of RTM's reserved RTM2WA and associated storage Ownership: RTM Serialization: Local lock", + "offset": 736, + "length": 4, + "type": "address" + }, + { + "name": "assb_hdlockpromotion_time_at_pdp", + "description": "Non-enclave HD=YES lock promote CPU time (PDP means Promotion Dispatch Priority). This is \"normalized\" time. SERIALIZATION: COMPARE AND SWAP. OWNERSHIP: Supervisor Control", + "offset": 740, + "length": 8, + "type": "bitstring", + "bitmasks": { + "assburrq": { + "description": "SYSEVENT USER READY REQUIRED SERIALIZATION: WEB QUEUE LOCK OWNERSHIP: SUPERVISOR CONTROL", + "offset": 56, + "length": 1 + } + } + }, + { + "name": "assb_lockinst_ptrs", + "description": "", + "offset": 748, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assb_smfcms_lockinst_addr", + "description": "Address of the SMF CMS instrumentation data for this address space", + "offset": 748, + "length": 4, + "type": "address" + }, + { + "name": "assb_enqdeq_cms_lockinst_addr", + "description": "Address of the ENQ/DEQ CMS instrumentation data for this address space", + "offset": 752, + "length": 4, + "type": "address" + }, + { + "name": "assb_latch_cms_lockinst_addr", + "description": "Address of the Latch CMS instrumentation data for this address space", + "offset": 756, + "length": 4, + "type": "address" + }, + { + "name": "assb_cms_lockinst_addr", + "description": "Address of the CMS instrumentation data for this address space", + "offset": 760, + "length": 4, + "type": "address" + }, + { + "name": "assb_local_lockinst_addr", + "description": "Address of the local and CML lock instrumentation data for this address space", + "offset": 764, + "length": 4, + "type": "address" + }, + { + "name": "assb_hdlockpromote_disps", + "description": "Count of non-enclave HD=YES lock promote dispatches. Incremented and cache aligned with ASSB_HdLockPromotion_Time_At_PDP. SERIALIZATION: COMPARE AND SWAP. OWNERSHIP: Supervisor Control Start of x'300' primarily write cache line", + "offset": 768, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assb_300", + "description": "", + "offset": 772, + "length": 256, + "type": "hex" + }, + { + "name": "assbsawq", + "description": "ADDRESS OF ADDRESS SPACE SRB WEB QUEUE SERIALIZATION: WEB QUEUE LOCK OWNERSHIP: SUPERVISOR CONTROL", + "offset": 772, + "length": 4, + "type": "address" + }, + { + "name": "assbr304", + "description": "Reserved. DO NOT USE Start of x'400' primarily write cache line", + "offset": 776, + "length": 252, + "type": "hex" + }, + { + "name": "assb_400", + "description": "", + "offset": 1028, + "length": 256, + "type": "hex" + }, + { + "name": "assbhreq", + "description": "Local lock requestor address", + "offset": 1028, + "length": 4, + "type": "address" + }, + { + "name": "assbhasi", + "description": "Local lock owning ASID", + "offset": 1032, + "length": 2, + "type": "signed-integer" + }, + { + "name": "assbr406", + "description": "Reserved. DO NOT USE Start of x'500' primarily write cache line", + "offset": 1034, + "length": 250, + "type": "hex" + }, + { + "name": "assb_500", + "description": "", + "offset": 1284, + "length": 256, + "type": "hex" + }, + { + "name": "assb_enct", + "description": "Enclave time in an address space on a standard CP This value is not reset at step/job start.", + "offset": 1284, + "length": 8, + "type": "hex" + }, + { + "name": "assb_enct_disps", + "description": "Count of enclave dispatches for cp work. Incremented and cache aligned with ASSB_ENCT. This value is not reset at step/job start. SERIALIZATION: COMPARE AND SWAP. OWNERSHIP: Supervisor Control", + "offset": 1292, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assb_enct_hdlockpromote_disps", + "description": "Count of enclave HD=YES lock promote dispatches. Incremented and cache aligned with ASSB_ENCT_HdLockPromote_Time. SERIALIZATION: COMPARE AND SWAP. OWNERSHIP: Supervisor Control", + "offset": 1296, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assb_enct_hdlockpromote_time", + "description": "Enclave HD=YES lock promote CPU time. This is \"normalized\" time. This is the enclave version of ASSB_HdLockPromotion_Time_At_PDP. SERIALIZATION: COMPARE AND SWAP. OWNERSHIP: Supervisor Control", + "offset": 1300, + "length": 8, + "type": "hex" + }, + { + "name": "assbr518", + "description": "Reserved. DO NOT USE Start of x'600' primarily write cache line", + "offset": 1308, + "length": 232, + "type": "hex" + }, + { + "name": "assb_600", + "description": "", + "offset": 1540, + "length": 256, + "type": "hex" + }, + { + "name": "assb_zcbp_enct", + "description": "Enclave zCBP time in an address space. This is \"normalized\" time This value is not reset at step/job start.", + "offset": 1540, + "length": 8, + "type": "hex" + }, + { + "name": "assb_zaap_enct", + "description": "Enclave zAAP time in an address space. This is \"normalized\" time This value is not reset at step/job start.", + "offset": 1540, + "length": 8, + "type": "hex" + }, + { + "name": "assb_ifa_enct", + "description": "", + "offset": 1540, + "length": 8, + "type": "hex" + }, + { + "name": "assb_zcbp_enct_disps", + "description": "Count of enclave dispatches for zCBP work Incremented when ASSB_zCBP_ENCT updated. Incremented and cache aligned with ASSB_zCBP_ENCT. This value is not reset at step/job start. SERIALIZATION: COMPARE AND SWAP. OWNERSHIP: Supervisor Control", + "offset": 1548, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assb_zaap_enct_disps", + "description": "Count of enclave dispatches for zAAP work Incremented when ASSB_zAAP_ENCT updated. Incremented and cache aligned with ASSB_zAAP_ENCT. This value is not reset at step/job start. SERIALIZATION: COMPARE AND SWAP. OWNERSHIP: Supervisor Control", + "offset": 1548, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbbrokenup_seqnum", + "description": "Sequence number of changes to ASCBBrokenUp", + "offset": 1552, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbdiag610", + "description": "Diagnostic data for IBM use only", + "offset": 1556, + "length": 160, + "type": "hex" + }, + { + "name": "assb_ccbaicb_realaddrs", + "description": "", + "offset": 1716, + "length": 16, + "type": "hex" + }, + { + "name": "assb_ccb_realaddr", + "description": "Real address of CCB for this AS, or 0", + "offset": 1716, + "length": 4, + "type": "address" + }, + { + "name": "assb_aicb_realaddr", + "description": "Real address of area for AICB for this AS, or 0", + "offset": 1720, + "length": 4, + "type": "address" + }, + { + "name": "assbr6c0", + "description": "Reserved. DO NOT USE", + "offset": 1724, + "length": 16, + "type": "hex" + }, + { + "name": "assb_ctrs_virtaddr", + "description": "", + "offset": 1732, + "length": 24, + "type": "hex" + }, + { + "name": "assb_aicb_virtaddr", + "description": "Virtual address of area for other counter sets for this AS, or 0", + "offset": 1732, + "length": 4, + "type": "address" + }, + { + "name": "assb_crypctrs_virtaddr", + "description": "Virtual address of crypto counter set for this AS, or 0", + "offset": 1736, + "length": 4, + "type": "address" + }, + { + "name": "assb_nnpictrs_virtaddr", + "description": "Virtual address of NNPI counter set for this AS, or 0", + "offset": 1740, + "length": 4, + "type": "address" + }, + { + "name": "assb_after_ctrs", + "description": "", + "offset": 1744, + "length": 8, + "type": "hex" + }, + { + "name": "assb_srb_time_on_zcbp", + "description": "Non-preemptable SRB time on zCBP", + "offset": 1744, + "length": 8, + "type": "hex" + }, + { + "name": "assb_asst_time_on_zcbp", + "description": "non-enclave preemptable SRB time on zCBP", + "offset": 1752, + "length": 8, + "type": "hex" + }, + { + "name": "assb_srb_time_on_zcbp_disps", + "description": "Count of dispatches for non-preemptable SRB time on zCBP", + "offset": 1760, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assb_asst_time_on_zcbp_disps", + "description": "Count of dispatches for non-enclave preemptable SRB time on zCBP Start of x'700' primarily write cache line - these fields can be written to from any address space", + "offset": 1764, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assb_700", + "description": "", + "offset": 1768, + "length": 256, + "type": "hex" + }, + { + "name": "assbetsc", + "description": "Enclave TCB Summary Count SERIALIZATION: CS OWNERSHIP: SUPERVISOR CONTROL", + "offset": 1768, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbr704", + "description": "Reserved. DO NOT USE Start of x'800' primarily write cache line", + "offset": 1772, + "length": 252, + "type": "hex" + }, + { + "name": "assb_800", + "description": "We considered putting ASSBCMLC and ASSBSUPC into separate cache lines as opposed to a single cache line. The performance people said to put then into the same cache line.", + "offset": 2024, + "length": 256, + "type": "hex" + }, + { + "name": "assbcmlc", + "description": "Count of CML locks held by -", + "offset": 2024, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbr804", + "description": "Reserved.", + "offset": 2028, + "length": 4, + "type": "hex" + }, + { + "name": "assbsupc", + "description": "SVRB pool header", + "offset": 2032, + "length": 8, + "type": "hex" + }, + { + "name": "assbsvrb", + "description": "Address of first available SVRB", + "offset": 2032, + "length": 4, + "type": "address" + }, + { + "name": "assbsync", + "description": "Synchronization count", + "offset": 2036, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbr810", + "description": "Reserved. DO NOT USE End of cache line Start of x'900' Miscellaneous fields", + "offset": 2040, + "length": 240, + "type": "hex" + }, + { + "name": "assb_900", + "description": "", + "offset": 2280, + "length": 192, + "type": "hex" + }, + { + "name": "assb_vartime_at_pdp", + "description": "Total time promoted to a variable dispatch priority", + "offset": 2280, + "length": 8, + "type": "hex" + }, + { + "name": "assb_varweighted_time_at_pdp", + "description": "Time promoted to a variable dispatch priority weighted by the dispatch priority", + "offset": 2288, + "length": 8, + "type": "hex" + }, + { + "name": "assb_hcwa", + "description": "HCW", + "offset": 2296, + "length": 8, + "type": "hex" + }, + { + "name": "assb_scmbc", + "description": "Storage Class Memory (SCM) block x", + "offset": 2304, + "length": 8, + "type": "hex" + }, + { + "name": "assb_ziip_phtm_base", + "description": "Value in ASSB_zIIP_PHTM at the end x", + "offset": 2312, + "length": 8, + "type": "hex" + }, + { + "name": "assb_majors_preempted", + "description": "Number of times major timeslices were preempted for this address space", + "offset": 2320, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assb_minors_preempted", + "description": "Number of times minor timeslices were preempted for this address space", + "offset": 2324, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbinitiatorjobid", + "description": "Initiator JOB ID SERIALIZATION: NONE. Ownership - Supervisor.", + "offset": 2328, + "length": 8, + "type": "hex" + }, + { + "name": "assbinitiatorseqnum", + "description": "Initiator Sequence Number. Incremented when ASSBJBNI is changed. SERIALIZATION: NONE. Ownership - Supervisor.", + "offset": 2336, + "length": 4, + "type": "signed-integer" + }, + { + "name": "assbr93c", + "description": "Reserved", + "offset": 2340, + "length": 4, + "type": "hex" + }, + { + "name": "assbdiag940", + "description": "Diagnostic data for IBM use only", + "offset": 2344, + "length": 112, + "type": "hex" + }, + { + "name": "assb_time_java_on_ziip", + "description": "Time Java is zIIP eligible and executing on zIIP engines and not in an enclave. (Unnormalized)", + "offset": 2456, + "length": 8, + "type": "hex" + }, + { + "name": "assb_time_java_on_cp", + "description": "Time Java is zIIP eligible and executing on CP engines and not in an enclave", + "offset": 2464, + "length": 8, + "type": "hex" + }, + { + "name": "assbend", + "description": "END OF ASSB.", + "offset": 2472, + "length": 8, + "type": "hex" + } + ] +} \ No newline at end of file diff --git a/cbxp/mappings/asvt.json b/cbxp/mappings/asvt.json new file mode 100644 index 0000000..9e84dd6 --- /dev/null +++ b/cbxp/mappings/asvt.json @@ -0,0 +1,149 @@ +{ + "version": 1, + "name": "asvt", + "commonName": "ASVT", + "macroId": "ihaasvt", + "description": "", + "aliases": [], + "pointedToBy": [], + "storageAttributes": { + "subpools": [ + 245 + ], + "key": 0, + "residency": "Below 16M" + }, + "controlBlock": [ + { + "name": "asvtprfx", + "description": "Reserved for future expansion", + "offset": 0, + "length": 464, + "type": "hex" + }, + { + "name": "asvtbegn", + "description": "BEGINNING OF ASVT", + "offset": 464, + "length": 1, + "type": "hex" + }, + { + "name": "asvthwmasid", + "description": "Highest ASID used since IPL", + "offset": 464, + "length": 4, + "type": "signed-integer" + }, + { + "name": "asvtcurhighasid", + "description": "Highest ASID currently used", + "offset": 465, + "length": 4, + "type": "signed-integer" + }, + { + "name": "asvtreua", + "description": "ADDRESS OF ASVTREUS BITS", + "offset": 469, + "length": 4, + "type": "address" + }, + { + "name": "asvtravl", + "description": "ADDRESS OF FIRST AVAILABLE REUSABLE ASID SLOT", + "offset": 473, + "length": 4, + "type": "address" + }, + { + "name": "asvtaav", + "description": "NUMBER OF FREE SLOTS ON THE ASVT AVAILABLE QUEUE.", + "offset": 477, + "length": 4, + "type": "signed-integer" + }, + { + "name": "asvtast", + "description": "NUMBER OF FREE SLOTS ON THE START/SASI QUEUE.", + "offset": 481, + "length": 4, + "type": "signed-integer" + }, + { + "name": "asvtanr", + "description": "NUMBER OF FREE SLOTS ON THE NON-REUSABLE REPLACEMENT QUEUE.", + "offset": 485, + "length": 4, + "type": "signed-integer" + }, + { + "name": "asvtstrt", + "description": "ORIGINAL SIZE OF START/SASI QUEUE.", + "offset": 489, + "length": 4, + "type": "signed-integer" + }, + { + "name": "asvtnonr", + "description": "ORIGINAL SIZE OF NON-REUSABLE REPLACEMENT QUEUE.", + "offset": 493, + "length": 4, + "type": "signed-integer" + }, + { + "name": "asvtmaxi", + "description": "ORIGINAL MAX USERS COUNT AS INPUT TO IEAVNP09. OWNERSHIP - SUPERVISOR CONTROL SERIALIZATION - NIP RIM PROCESS", + "offset": 497, + "length": 4, + "type": "signed-integer" + }, + { + "name": "asvtasvt", + "description": "ACRONYM IN EBCDIC -ASVT-", + "offset": 509, + "length": 4, + "type": "bitstring", + "bitmasks": { + "asvtavai": { + "description": "BIT ONE IF ASID IS AVAILABLE AND ZERO IF ASID IS ASSIGNED", + "offset": 24, + "length": 1 + }, + "asvtaval": { + "description": "BIT ONE IF ASID IS AVAILABLE AND ZERO IF ASID IS ASSIGNED", + "offset": 24, + "length": 1 + } + } + }, + { + "name": "asvtmaxu", + "description": "MAXIMUM NUMBER OF ADDRESS SPACES", + "offset": 513, + "length": 4, + "type": "signed-integer" + }, + { + "name": "asvtmdsc", + "description": "MAXUSER DEFICIT SLOT COUNT. ASVTMDSC = ASVTMAXI - ASVTAAV - NUMBER OF ACTIVE A.S. INCREMENTED WHEN WE TRY TO TAKE A REPLACEMENT SLOT BUT THERE AREN'T ANY. DECREMENTED WHEN NON-ZERO AND A NONREUSEABLE ASID BECOMES REUSEABLE AND WE ADD A SLOT TO THE MAXUSER POOL WHEN AN ADDRESS SPACE BECOMES REUSEABLE.", + "offset": 517, + "length": 4, + "type": "signed-integer" + }, + { + "name": "asvtfrst", + "description": "ADDRESS OF FIRST AVAILABLE ASVT ENTRY", + "offset": 521, + "length": 4, + "type": "address" + }, + { + "name": "asvtenty", + "description": "ENTRY FOR EACH POSSIBLE ASID. IF ADDRESS SPACE ASSIGNED, ENTRY CONTAINS ADDRESS OF ASCB. IF NOT ASSIGNED, ENTRY CONTAINS EITHER ADDRESS OF NEXT AVAILABLE ASID OR ZEROS WITH HIGH-ORDER BIT ON IF LAST ENTRY. IF THE ADDRESS SPACE IS MARKED NON-REUSABLE, THE ENTRY CONTAINS THE ADDRESS OF MASTER'S ASVT ENTRY WITH THE HIGH BIT ON.", + "offset": 525, + "length": 4, + "type": "address" + } + ] +} \ No newline at end of file diff --git a/cbxp/mappings/cvt.json b/cbxp/mappings/cvt.json new file mode 100644 index 0000000..e60cf11 --- /dev/null +++ b/cbxp/mappings/cvt.json @@ -0,0 +1,4728 @@ +{ + "version": 1, + "name": "cvt", + "commonName": "Communications Vector Table", + "macroId": "cvt", + "description": "", + "aliases": [], + "pointedToBy": [ + "psa" + ], + "storageAttributes": { + "subpools": [], + "key": 0, + "residency": "Below 16M line" + }, + "controlBlock": [ + { + "name": "cvtprod", + "description": "SYSTEM CONTROL PROGRAM PRODUCT LEVEL.", + "offset": 216, + "length": 16, + "type": "hex" + }, + { + "name": "cvtprodn", + "description": "PRODUCT NAME OF THE CONTROL PROGRAM, EX.(SP3.2). This is maintained for compatibility reasons only. The true product name version, release, and modification level information is in the ECVT (ECVTPNAM, PVER, PREL, PMOD). This can be considered a shorthand for the offical name For z/OS V3R2 (HBB77F0), the value is SP7.3.2", + "offset": 216, + "length": 8, + "type": "string" + }, + { + "name": "cvtprodi", + "description": "PRODUCT FMID IDENTIFIER FOR THE CONTROL PROGRAM, EX.(JBB1328).", + "offset": 224, + "length": 8, + "type": "string" + }, + { + "name": "cvtverid", + "description": "OPTIONAL USER PERSONALIZATION OF SOFTWARE SYSTEM VERSION.", + "offset": 232, + "length": 16, + "type": "string" + }, + { + "name": "cvtmdl", + "description": "CPU NUMBER IN SIGNLESS PACKED DECIMAL, I.E., A 3090 PROCESSOR WOULD APPEAR AS X'3090'", + "offset": 250, + "length": 2, + "type": "hex" + }, + { + "name": "cvtrelno", + "description": "RELEASE NUMBER (EBCDIC)", + "offset": 252, + "length": 4, + "type": "hex" + }, + { + "name": "cvtnumb", + "description": "RELEASE NUMBER", + "offset": 252, + "length": 2, + "type": "hex" + }, + { + "name": "cvtlevl", + "description": "LEVEL NUMBER OF THIS RELEASE", + "offset": 254, + "length": 2, + "type": "hex" + }, + { + "name": "cvttcbp", + "description": "Address of PSATNEW.", + "offset": 256, + "length": 4, + "type": "address", + "pointsTo": "tcbp" + }, + { + "name": "cvt0ef00", + "description": "ADDRESS OF ROUTINE TO SCHEDULE ASYNCHRONOUS EXITS", + "offset": 260, + "length": 4, + "type": "address", + "pointsTo": "0ef" + }, + { + "name": "cvtlink", + "description": "ADDRESS OF DCB FOR SYS1.LINKLIB DATA SET. UPDATED BY CONTENTS SUPERVISION RIM. OWNERSHIP: CONTENTS SUPERVISION.", + "offset": 264, + "length": 4, + "type": "address", + "pointsTo": "0vl" + }, + { + "name": "cvtauscb", + "description": "ADDRESS OF ASSIGN/UNASSIGN SERVICE DATA MODULE.", + "offset": 268, + "length": 4, + "type": "address", + "pointsTo": "0vl" + }, + { + "name": "cvtbuf", + "description": "ADDRESS OF THE BUFFER OF THE RESIDENT CONSOLE INTERRUPT ROUTINE", + "offset": 272, + "length": 4, + "type": "address", + "pointsTo": "0vl" + }, + { + "name": "cvtxapg", + "description": "ADDRESS OF I/O SUPERVISOR APPENDAGE VECTOR TABLE", + "offset": 276, + "length": 4, + "type": "address", + "pointsTo": "0vl" + }, + { + "name": "cvt0vl00", + "description": "ADDRESS OF ENTRY POINT OF THE TASK SUPERVISOR'S ADDRESS VALIDITY CHECKING ROUTINE", + "offset": 280, + "length": 4, + "type": "address", + "pointsTo": "0vl" + }, + { + "name": "cvtpcnvt", + "description": "ADDRESS OF ENTRY POINT OF THE ROUTINE WHICH CONVERTS A RELATIVE TRACK ADDRESS (TTR) TO AN ABSOLUTE TRACK ADDRESS (MBBCCHHR)", + "offset": 284, + "length": 4, + "type": "address", + "pointsTo": "entry" + }, + { + "name": "cvtprltv", + "description": "ADDRESS OF ENTRY POINT OF THE ROUTINE WHICH CONVERTS AN ABSOLUTE TRACK ADDRESS (MBBCCHHR) TO A RELATIVE TRACK ADDRESS (TTR)", + "offset": 288, + "length": 4, + "type": "address", + "pointsTo": "entry" + }, + { + "name": "cvtllcb", + "description": "ADDRESS OF THE LLCB.", + "offset": 292, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "cvtlltrm", + "description": "ADDRESS OF LLA'S MEMORY TERNIMATION RESOURCE MANAGER.", + "offset": 296, + "length": 4, + "type": "address", + "pointsTo": "vtrg" + }, + { + "name": "cvtxtler", + "description": "ADDRESS OF ERROR RECOVERY PROCEDURE (ERP) LOADER (IECVERPL) ENTRY POINT IECXTLER", + "offset": 300, + "length": 4, + "type": "address", + "pointsTo": "vtrg" + }, + { + "name": "cvtsysad", + "description": "UCB ADDRESS FOR THE SYSTEM RESIDENCE VOLUME (MDCXXX)", + "offset": 304, + "length": 4, + "type": "address", + "pointsTo": "vtrg" + }, + { + "name": "cvtbterm", + "description": "ADDRESS OF ENTRY POINT OF THE ABTERM ROUTINE", + "offset": 308, + "length": 4, + "type": "address", + "pointsTo": "vtrg" + }, + { + "name": "cvtdate", + "description": "CURRENT DATE IN PACKED DECIMAL", + "offset": 312, + "length": 4, + "type": "signed-integer" + }, + { + "name": "cvtmslt", + "description": "ADDRESS OF THE MASTER COMMON AREA IN MASTER SCHEDULER RESIDENT DATA AREA. NOTE - USE CVTMSER INSTEAD TO ADDRESS MASTER SCHEDULER RESIDENT DATA AREA", + "offset": 316, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "cvtzdtab", + "description": "ADDRESS OF I/O DEVICE CHARACTERISTIC TABLE", + "offset": 320, + "length": 4, + "type": "address" + }, + { + "name": "cvtxitp", + "description": "ADDRESS OF ERROR INTERPRETER ROUTINE", + "offset": 324, + "length": 4, + "type": "address", + "pointsTo": "error" + }, + { + "name": "cvt0ef01", + "description": "ENTRY POINT IN STAGE II EXIT EFFECTOR USED BY SCHEDXIT MACRO", + "offset": 328, + "length": 4, + "type": "address", + "pointsTo": "0ef" + }, + { + "name": "cvtvprm", + "description": "VECTOR PARAMETERS", + "offset": 332, + "length": 4, + "type": "signed-integer" + }, + { + "name": "cvtvss", + "description": "VECTOR SECTION SIZE", + "offset": 332, + "length": 2, + "type": "signed-integer" + }, + { + "name": "cvtvpsm", + "description": "VECTOR PARTIAL SUM NUMBER", + "offset": 334, + "length": 2, + "type": "signed-integer" + }, + { + "name": "cvtexit", + "description": "An SVC 3 instruction. Exit to dispatcher. This is a programming interface for IRBs only. An IRB may return to the system by branching to this location", + "offset": 336, + "length": 2, + "type": "signed-integer" + }, + { + "name": "cvtbret", + "description": "A BR 14 INSTRUCTION. RETURN TO CALLER (USED BY DATA MANAGEMENT ROUTINES)", + "offset": 338, + "length": 2, + "type": "signed-integer" + }, + { + "name": "cvtsvdcb", + "description": "ADDRESS OF THE DCB FOR THE SYS1.SVCLIB DATA SET", + "offset": 340, + "length": 4, + "type": "address", + "pointsTo": "svdcb" + }, + { + "name": "cvttpc", + "description": "ADDRESS OF THE TIMER SUPERVISOR WORK AREA", + "offset": 344, + "length": 4, + "type": "address", + "pointsTo": "tpc" + }, + { + "name": "cvtflgcs", + "description": "Flags set by CS", + "offset": 348, + "length": 4, + "type": "signed-integer" + }, + { + "name": "cvtflgc0", + "description": "Flags", + "offset": 348, + "length": 1, + "type": "bitstring", + "bitmasks": { + "cvtmulnf": { + "description": "For users of IFAUSAGE, REQUEST=FUNCTIONxxx*", + "offset": 0, + "length": 1 + } + } + }, + { + "name": "cvtflgc1", + "description": "Flags", + "offset": 349, + "length": 1, + "type": "hex" + }, + { + "name": "cvticpid", + "description": "IPL'ED CPU PHYSICAL ID", + "offset": 350, + "length": 2, + "type": "signed-integer" + }, + { + "name": "cvtcvt", + "description": "CVT ACRONYM IN EBCDIC (EYE-CATCHER)", + "offset": 352, + "length": 4, + "type": "string" + }, + { + "name": "cvtcucb", + "description": "ADDRESS OF THE UNIT CONTOL MODULE (UCM)", + "offset": 356, + "length": 4, + "type": "address", + "pointsTo": "qte" + }, + { + "name": "cvtqte00", + "description": "ADDRESS OF THE TIMER ENQUEUE ROUTINE FOR INTERVAL TIMER", + "offset": 360, + "length": 4, + "type": "address", + "pointsTo": "qte" + }, + { + "name": "cvtqtd00", + "description": "ADDRESS OF THE TIMER DEQUEUE ROUTINE FOR INTERVAL TIMER", + "offset": 364, + "length": 4, + "type": "address", + "pointsTo": "qtd" + }, + { + "name": "cvtstb", + "description": "ADDRESS OF THE I/O DEVICE STATISTICS TABLE", + "offset": 368, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "cvtdcb", + "description": "OPERATING SYSTEM FOR S/370-XA MODE EXECUTION, CVTMVSE, CVT4MS1, CVTOSEXT, CVT6DAT, AND CVTMVS2 ARE SET ON AT CVT CREATION", + "offset": 372, + "length": 1, + "type": "bitstring", + "bitmasks": { + "cvtmvse": { + "description": "S/370-XA MODE EXECUTION", + "offset": 0, + "length": 1 + }, + "cvt1sss": { + "description": "OPTION 1 (PCP) SSS. ALSO, LANGUAGE COMPILERS MAY USE THIS BIT TO DETERMINE IF THEY ARE RUNNING UNDER OS OR VM (WILL BE 0 FOR OS).", + "offset": 1, + "length": 1 + }, + "cvt2sps": { + "description": "OPTION 2 (MFT) SPS, OS/VS1, VSE", + "offset": 2, + "length": 1 + }, + "cvt4ms1": { + "description": "OPTION 4 (MVT) MS1, OS/VS2", + "offset": 3, + "length": 1 + }, + "cvtosext": { + "description": "INDICATOR THAT THE CVTOSLVL AREA IS PRESENT AND MAY BE REFERENCED. This bit is on for all releases starting with MVS/SP3.1.0.", + "offset": 4, + "length": 1 + }, + "cvt4mps": { + "description": "MODEL 65 MULTIPROCESSING", + "offset": 5, + "length": 1 + }, + "cvt6dat": { + "description": "DYNAMIC ADDRESS TRANSLATION BY CPU (OS/VS1, OS/VS2)", + "offset": 6, + "length": 1 + }, + "cvtmvs2": { + "description": "MULTIPLE MEMORY OPTION OF OS/VS2 IS PRESENT", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "cvtdcba", + "description": "ADDRESS OF THE DCB FOR THE SYS1.LOGREC (OUTBOARD RECORDER) DATA SET FOR SYSTEM ENVIRONMENT RECORDING (SER)", + "offset": 373, + "length": 3, + "type": "hex" + }, + { + "name": "cvtsv76m", + "description": "SVC 76 MESSAGE COUNT FIELD (OS/VS2)", + "offset": 376, + "length": 4, + "type": "signed-integer" + }, + { + "name": "cvtixavl", + "description": "ADDRESS OF THE I/O SUPERVISOR'S FREELIST POINTER WHICH CONTAINS THE ADDRESS OF THE NEXT REQUEST ELEMENT (OS/VS1) ADDRESS OF THE I/O SUPERVISOR'S COMMUNICATION AREA (IOCOM) (OS/VS2)", + "offset": 380, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "cvtnucb", + "description": "RESERVED (MDCXXX)", + "offset": 384, + "length": 4, + "type": "address", + "pointsTo": "0ds" + }, + { + "name": "cvtfbosv", + "description": "ADDRESS OF PROGRAM FETCH ROUTINE", + "offset": 388, + "length": 4, + "type": "address", + "pointsTo": "0ds" + }, + { + "name": "cvt0ds", + "description": "V(IEA0DS) - ADDRESS OF ENTRY POINT OF THE DISPATCHER", + "offset": 392, + "length": 4, + "type": "address", + "pointsTo": "0ds" + }, + { + "name": "cvtecvt", + "description": "POINTER TO THE EXTENDED CVT", + "offset": 396, + "length": 4, + "type": "address", + "pointsTo": "ecvt" + }, + { + "name": "cvtdairx", + "description": "ADDRESS OF THE 31- BIT ENTRY POINT OF IKJDAIR, TSO DYNAMIC ALLOCATION INTERFACE ROUTINE.", + "offset": 400, + "length": 4, + "type": "address", + "pointsTo": "0pt" + }, + { + "name": "cvtmser", + "description": "ADDRESS OF DATA AREA OF MASTER SCHEDULER RESIDENT DATA AREA", + "offset": 404, + "length": 4, + "type": "address", + "pointsTo": "0pt" + }, + { + "name": "cvt0pt01", + "description": "ADDRESS OF BRANCH ENTRY POINT OF POST ROUTINE", + "offset": 408, + "length": 4, + "type": "address", + "pointsTo": "0pt" + }, + { + "name": "cvttvt", + "description": "ADDRESS OF TSO VECTOR TABLE", + "offset": 412, + "length": 4, + "type": "address", + "pointsTo": "tso" + }, + { + "name": "cvt040id", + "description": "IFB040I WTO MESSAGE ID. OWNERSHIP: OUTBOARD RECORDING (OBR). SERIALIZATION: COMPARE AND SWAP.", + "offset": 416, + "length": 4, + "type": "signed-integer" + }, + { + "name": "cvtmz00", + "description": "HIGHEST ADDRESS IN VIRTUAL STORAGE FOR THIS MACHINE", + "offset": 420, + "length": 4, + "type": "hex", + "pointsTo": "routine" + }, + { + "name": "cvt1ef00", + "description": "ADDRESS OF ROUTINE WHICH CREATES IRB'S FOR EXITS", + "offset": 424, + "length": 4, + "type": "address", + "pointsTo": "routine" + }, + { + "name": "cvtqocr", + "description": "GRAPHICS INTERFACE TASK (GFX) FIELD. ADDRESS OF SEVENTH WORD OF GFX PARAMETER LIST, IF GFX IS ACTIVE. ZERO IF GFX IS NOT ACTIVE", + "offset": 428, + "length": 4, + "type": "address", + "pointsTo": "seventh" + }, + { + "name": "cvtqmwr", + "description": "ADDRESS OF THE ALLOCATION COMMUNICATION AREA (MAPPED BY IEFZB432) - CONTAINS THE ADDRESSES OF SERVICE ROUTINES AND THE CHAIN OF MOUNT AND VERIFY COMMUNICATION AREAS.", + "offset": 432, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "cvtsnctr", + "description": "SERIAL NUMBER COUNTER FOR ASSIGNING SERIAL NUMBERS TO NON-SPECIFIC, UNLABELED MAGNETIC TAPE VOLUMES", + "offset": 436, + "length": 2, + "type": "signed-integer" + }, + { + "name": "cvtopta", + "description": "OPTION INDICATORS", + "offset": 438, + "length": 1, + "type": "bitstring", + "bitmasks": { + "cvtcch": { + "description": "CHANNEL CHECK HANDLER (CCH) OPTION PRESENT - RECOVERY MANAGEMENT SUPPORT (RMS)", + "offset": 0, + "length": 1 + }, + "cvtapr": { + "description": "ALTERNATE PATH RETRY (APR) OPTION PRESENT - RECOVERY MANAGEMENT SUPPORT (RMS)", + "offset": 1, + "length": 1 + }, + "cvtddr": { + "description": "DYNAMIC DEVICE RECONFIGURATION (DDR) OPTION PRESENT - RECOVERY MANAGEMENT SUPPORT (RMS) (OS/VS1) DDR SYSTEM-INITIATED SWAP ACTIVE (OS/VS2)", + "offset": 2, + "length": 1 + }, + "cvtnip": { + "description": "NIP IS EXECUTING", + "offset": 3, + "length": 1 + }, + "cvtwarnund": { + "description": "WARNUND processing is in effect", + "offset": 4, + "length": 1 + }, + "cvt121tr": { + "description": ",,C'X' - DO NOT TRANSLATE EXCP V=R.", + "offset": 5, + "length": 1 + }, + "cvtascii": { + "description": "ASCII TAPE PROCESSING IS GENERATED IN THIS SYSTEM", + "offset": 6, + "length": 1 + }, + "cvtxpfp": { + "description": "CPU HAS EXTENDED PRECISION FLOATING POINT FEATURE", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "cvtoptb", + "description": "MISCELLANEOUS FLAGS", + "offset": 439, + "length": 1, + "type": "bitstring", + "bitmasks": { + "cvtprot": { + "description": "CPU HAS STORE PROTECTION FEATURE (OS/VS1)", + "offset": 0, + "length": 1 + }, + "cvtctims": { + "description": "IF ON, HARDWARE HAS THE CLOCK COMPARATOR AND CPU TIMER FEATURE INSTALLED, AND OS/VS1 SYSGEN HAS SPECIFIED THIS FEATURE (OS/VS1)", + "offset": 1, + "length": 1 + }, + "cvttod": { + "description": "CPU HAS TIME-OF-DAY CLOCK FEATURE", + "offset": 2, + "length": 1 + }, + "cvtnlog": { + "description": "SYS1.LOGREC IS UNAVAILABLE FOR ERROR RECORDING. ALWAYS SET TO ZERO FOR OS/VS1.", + "offset": 3, + "length": 1 + }, + "cvtapthr": { + "description": "NIP SETS THIS BIT TO 1 WHEN DEVICE TESTING IS COMPLETE. IF 1, I/O SUPERVISOR USES AN ALTERNATE PATH TO A DEVICE WHEN A CONDITION CODE OF 3 EXISTS. THIS BIT IS RESET TO 0 BY NIP AFTER THE LINK PACK AREA IS INITIALIZED.", + "offset": 4, + "length": 1 + }, + "cvtfp": { + "description": "CPU HAS FETCH PROTECTION FEATURE (OS/VS1)", + "offset": 5, + "length": 1 + }, + "cvtvs1a": { + "description": "VS1 ASSIST IS AVAILABLE FOR USE (OS/VS1)", + "offset": 6, + "length": 1 + }, + "cvtvs1b": { + "description": "VS1 ASSIST SUBSET IS AVAILABLE FOR USE (OS/VS1)", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "cvtqcdsr", + "description": "CDE SEARCH ROUTINE ADDRESS (OS/VS2)", + "offset": 440, + "length": 4, + "type": "address", + "pointsTo": "qcdsr" + }, + { + "name": "cvtqlpaq", + "description": "ADDRESS OF POINTER TO MOST RECENT ENTRY ON LINK PACK AREA CDE QUEUE (OS/VS2)", + "offset": 444, + "length": 4, + "type": "address", + "pointsTo": "qlpaq" + }, + { + "name": "cvtenfct", + "description": "EVENT NOTIFICATION CONTROL TABLE", + "offset": 448, + "length": 4, + "type": "address", + "pointsTo": "bend" + }, + { + "name": "cvtsmca", + "description": "ADDRESS OF THE SYSTEM MANAGEMENT CONTROL AREA (SMCA) IF THE SYSTEM MANAGEMENT FACILITIES (SMF) OPTION IS PRESENT IN THE SYSTEM. OTHERWISE, ZERO.", + "offset": 452, + "length": 4, + "type": "address", + "pointsTo": "bend" + }, + { + "name": "cvtabend", + "description": "ADDRESS OF SECONDARY CVT FOR ABEND IN EOT (OS/VS2)", + "offset": 456, + "length": 4, + "type": "address", + "pointsTo": "bend" + }, + { + "name": "cvtuser", + "description": "A WORD AVAILABLE TO THE USER", + "offset": 460, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "cvtmdlds", + "description": "A(0) - RESERVED FOR MODEL-DEPENDENT SUPPORT", + "offset": 464, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "cvtqabst", + "description": "AN SVC 13 (ABEND) INVOCATION (OS/VS2)", + "offset": 468, + "length": 2, + "type": "signed-integer" + }, + { + "name": "cvtlnksc", + "description": "AN SVC 6 (LINK) INVOCATION", + "offset": 470, + "length": 2, + "type": "signed-integer" + }, + { + "name": "cvttsce", + "description": "ADDRESS OF THE FIRST TIME SLICE CONTROL ELEMENT (TSCE)", + "offset": 472, + "length": 4, + "type": "address", + "pointsTo": "patch" + }, + { + "name": "cvtpatch", + "description": "ADDRESS OF A 200-BYTE FE PATCH AREA", + "offset": 476, + "length": 4, + "type": "address", + "pointsTo": "patch" + }, + { + "name": "cvtrms", + "description": "RECOVERY MANAGEMENT SUPPORT (RMS) COMMUNICATIONS VECTOR. ADDRESS OF A MACHINE STATUS BLOCK.", + "offset": 480, + "length": 4, + "type": "address" + }, + { + "name": "cvtspdme", + "description": "SERVICE PROCESSOR DAMAGE MONITOR ECB.", + "offset": 484, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "cvt0scr1", + "description": "ADDRESS OF THE SECTOR CALCULATION ROUTINE FOR ROTATIONAL POSITION SENSING (RPS)", + "offset": 488, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "cvtgtf", + "description": "GENERALIZED TRACE FACILITY (GTF) CONTROL WORD", + "offset": 492, + "length": 4, + "type": "address" + }, + { + "name": "cvtgtfst", + "description": "GTF FLAG BYTES", + "offset": 492, + "length": 1, + "type": "bitstring", + "bitmasks": { + "cvtgtfav": { + "description": "IF ZERO, GTF NOT ACTIVE. IF ONE, GTF ACTIVE. (OS/VS2)", + "offset": 0, + "length": 1 + }, + "cvtspd": { + "description": "SERVICE PROCESSOR DAMAGE. (1) INDICATES DAMAGE. (0) INDICATES NO DAMAGE.", + "offset": 1, + "length": 1 + }, + "cvtwspr": { + "description": "WAITING FOR SERVICE PROCESSOR RESPONSE. (1) INDICATES OUTSTANDING REQUEST. (0) INDICATES NO OUTSTANDING REQUEST.", + "offset": 2, + "length": 1 + }, + "cvtusr": { + "description": "TRACE=USR SPECIFIED. USER-REQUESTED TRACE DATA IS TO BE INCLUDED IN THE TRACE DATA SET.", + "offset": 5, + "length": 1 + }, + "cvtrnio": { + "description": "GTF IS ACTIVE AND TRACING RNIO EVENTS", + "offset": 6, + "length": 1 + } + } + }, + { + "name": "cvtgtfa", + "description": "ADDRESS OF MAIN MONITOR CALL ROUTING TABLE, MCHEAD (OS/VS2)", + "offset": 493, + "length": 3, + "type": "hex" + }, + { + "name": "cvtaqavt", + "description": "ADDRESS OF THE FIRST WORD OF THE TCAM DISPATCHER WHICH CONTAINS THE ADDRESS OF THE ADDRESS VECTOR TABLE (AVT). IF ZERO, TCAM IS NOT STARTED.", + "offset": 496, + "length": 4, + "type": "address" + }, + { + "name": "cvttcmfg", + "description": "TCAM FLAGS", + "offset": 496, + "length": 1, + "type": "bitstring", + "bitmasks": { + "cvttcrdy": { + "description": "TCAM IS READY TO ACCEPT USERS", + "offset": 0, + "length": 1 + }, + "cvtldev": { + "description": "LOCAL DEVICE ATTACHED TO TCAM", + "offset": 1, + "length": 1 + }, + "cvtnwtcm": { + "description": "MULTIPLE TCAM FEATURE ACTIVE.", + "offset": 2, + "length": 1 + } + } + }, + { + "name": "cvtaqavb", + "description": "SAME AS CVTAQAVT ABOVE", + "offset": 497, + "length": 3, + "type": "hex" + }, + { + "name": "cvtflag5", + "description": "Flags, refreshed upon error, set during NIP and never changed", + "offset": 500, + "length": 1, + "type": "bitstring", + "bitmasks": { + "cvtvef": { + "description": "Vector Extension Facility", + "offset": 0, + "length": 1 + }, + "cvtz1": { + "description": "Z1", + "offset": 0, + "length": 1 + }, + "cvteec": { + "description": "EEC", + "offset": 1, + "length": 1 + }, + "cvtnnpaf": { + "description": "NNPA facility", + "offset": 2, + "length": 1 + } + } + }, + { + "name": "cvtflag6", + "description": "More flags", + "offset": 501, + "length": 1, + "type": "bitstring", + "bitmasks": { + "cvtsoled": { + "description": "Solution Edition", + "offset": 0, + "length": 1 + } + } + }, + { + "name": "cvtflag7", + "description": "More flags", + "offset": 502, + "length": 1, + "type": "bitstring", + "bitmasks": { + "cvtsysplexzaaponline": { + "description": "The sysplex has one or more zAAP processors currently online", + "offset": 0, + "length": 1 + }, + "cvtsysplexzcbponline": { + "description": "The sysplex has one or more zCBP processors currently online", + "offset": 1, + "length": 1 + } + } + }, + { + "name": "cvtflag8", + "description": "More flags. IBM use only", + "offset": 503, + "length": 1, + "type": "bitstring", + "bitmasks": { + "cvtpqap": { + "description": "", + "offset": 0, + "length": 1 + } + } + }, + { + "name": "cvtsaf", + "description": "ADDRESS OF ROUTER VECTOR TABLE.", + "offset": 504, + "length": 4, + "type": "address", + "pointsTo": "vmsgs" + }, + { + "name": "cvtext1", + "description": "ADDRESS OF OS - OS/VS COMMON EXTENSION", + "offset": 508, + "length": 4, + "type": "address", + "pointsTo": "vmsgs" + }, + { + "name": "cvtcbsp", + "description": "ADDRESS OF ACCESS METHOD CONTROL BLOCK STRUCTURE", + "offset": 512, + "length": 4, + "type": "address", + "pointsTo": "vmsgs" + }, + { + "name": "cvtpurg", + "description": "ADDRESS OF SUBSYSTEM PURGE ROUTINE", + "offset": 516, + "length": 4, + "type": "address" + }, + { + "name": "cvtpurga", + "description": "ADDRESS OF SUBSYSTEM PURGE ROUTINE", + "offset": 517, + "length": 3, + "type": "hex" + }, + { + "name": "cvtamff", + "description": "RESERVED FOR ACCESS METHOD FLAGS", + "offset": 520, + "length": 4, + "type": "hex", + "pointsTo": "vmsgs" + }, + { + "name": "cvtqmsg", + "description": "ADDRESS OF INFORMATION TO BE PRINTED BY ABEND.", + "offset": 524, + "length": 4, + "type": "address", + "pointsTo": "vmsgs" + }, + { + "name": "cvtdmsr", + "description": "SAME AS CVTDMSRA BELOW", + "offset": 528, + "length": 4, + "type": "address" + }, + { + "name": "cvtdmsrf", + "description": "OPEN/CLOSE/EOV FLAG BYTE. SETTING BOTH BIT 0 AND BIT 1 ON WILL CAUSE BOTH KINDS OF DUMPS TO BE TAKEN. THESE BITS ARE USED DURING TESTING AND DEBUGGING WHEN OTHER DEBUG METHODS ARE INEFFECTIVE. (OS/VS2)", + "offset": 528, + "length": 1, + "type": "bitstring", + "bitmasks": { + "cvtsdump": { + "description": "SET BY COREZAP. WILL CAUSE AN SDUMP TO BE TAKEN AND IEC999I MESSAGE ISSUED FOR EVERY ABEND ISSUED WITHIN AN OPEN/CLOSE/EOV OR DADSM FUNCTION. (OS/VS2)", + "offset": 0, + "length": 1 + }, + "cvtudump": { + "description": "SET BY COREZAP. WILL CAUSE AN ABEND DUMP TO BE TAKEN FOR EVERY ABEND ISSUED WITHIN AN OPEN/CLOSE/EOV OR DADSM FUNCTION. (OS/VS2)", + "offset": 1, + "length": 1 + } + } + }, + { + "name": "cvtdmsra", + "description": "ADDRESS OF THE OPEN/CLOSE/EOV SUPERVISORY ROUTINE IN LPA. THIS ROUTINE HANDLES THE ROUTING OF CONTROL AMONG THE I/O SUPPORT ROUTINES.", + "offset": 529, + "length": 3, + "type": "hex" + }, + { + "name": "cvtsfr", + "description": "ADDRESS OF SETFRR ROUTINE (IEAVTSFR)", + "offset": 532, + "length": 4, + "type": "address", + "pointsTo": "vtsfr" + }, + { + "name": "cvtgxl", + "description": "ADDRESS OF CONTENTS SUPERVISION MEMORY TERMINATION ROUTINE OWNERSHIP - CONTENTS SUPERVISION.", + "offset": 536, + "length": 4, + "type": "address", + "pointsTo": "contents" + }, + { + "name": "cvtreal", + "description": "ADDRESS OF THE VIRTUAL STORAGE BYTE FOLLOWING THE HIGHEST V=R STORAGE ADDRESS.", + "offset": 540, + "length": 4, + "type": "address", + "pointsTo": "ptrv" + }, + { + "name": "cvtptrv", + "description": "ADDRESS OF PAGING SUPERVISOR GENERAL ROUTINE TO TRANSLATE 24 BIT REAL ADDRESSES TO VIRTUAL ADDRESSES.", + "offset": 544, + "length": 4, + "type": "address", + "pointsTo": "ptrv" + }, + { + "name": "cvtihvp", + "description": "POINTER TO IHV$COMM. INITIALIZED TO ZERO. OWNER: IHV/DATA HANDLER. SET BY: IHVSTRTM. SERIALIZATION: NONE.", + "offset": 548, + "length": 4, + "type": "address", + "pointsTo": "job" + }, + { + "name": "cvtjesct", + "description": "ADDRESS OF JOB ENTRY SUBSYSTEM (JES) CONTROL TABLE", + "offset": 552, + "length": 4, + "type": "address", + "pointsTo": "job" + }, + { + "name": "cvtrs12c", + "description": "RESERVED", + "offset": 556, + "length": 4, + "type": "hex", + "pointsTo": "machine" + }, + { + "name": "cvttz", + "description": "Difference between local time and UTC (Coordinated Universal Time) in binary units of 1.048576 seconds. Contains the same value as CVTLDTOL. CVTLDTO (which contains CVTLDTOL) has this difference to a finer degree of accuracy.", + "offset": 560, + "length": 4, + "type": "signed-integer" + }, + { + "name": "cvtmchpr", + "description": "ADDRESS OF MACHINE CHECK PARAMETER LIST", + "offset": 564, + "length": 4, + "type": "address", + "pointsTo": "machine" + }, + { + "name": "cvteorm", + "description": "POTENTIAL REAL HIGH STORAGE ADDRESS. ONLY VALID PRE-z/Architecture. (SEE ECVTEORM IN IHAECVT).", + "offset": 568, + "length": 4, + "type": "address", + "pointsTo": "vtrv" + }, + { + "name": "cvtptrv3", + "description": "ADDRESS OF PAGING SUPERVISOR ROUTINE TO TRANSLATE REAL ADDRESSES WHICH MAY EXCEED 24 BITS TO VIRTUAL ADDRESSES.", + "offset": 572, + "length": 4, + "type": "address", + "pointsTo": "vtrv" + }, + { + "name": "cvtlkrm", + "description": "ADDRESS OF CML LOCK RESOURCE MANAGER", + "offset": 576, + "length": 4, + "type": "address", + "pointsTo": "vlkrm" + }, + { + "name": "cvtapf", + "description": "SAME AS CVTAPFA BELOW", + "offset": 580, + "length": 4, + "type": "address" + }, + { + "name": "cvtapfa", + "description": "ADDRESS OF BRANCH ENTRY POINT IN AUTHORIZED PROGRAM FACILITY (APF) ROUTINE", + "offset": 581, + "length": 3, + "type": "hex" + }, + { + "name": "cvtext2", + "description": "ADDRESS OF OS/VS1 - OS/VS2 COMMON EXTENSION", + "offset": 584, + "length": 4, + "type": "address" + }, + { + "name": "cvtext2a", + "description": "SAME AS CVTEXT2 ABOVE", + "offset": 585, + "length": 3, + "type": "hex" + }, + { + "name": "cvthjes", + "description": "SAME AS CVTHJESA BELOW", + "offset": 588, + "length": 4, + "type": "address" + }, + { + "name": "cvthjesa", + "description": "ADDRESS OF OPTIONAL JOB ENTRY SUBSYSTEM (JES) COMMUNICATION VECTOR TABLE", + "offset": 589, + "length": 3, + "type": "hex" + }, + { + "name": "cvtrstw2", + "description": "STATUS DATA FOR RESTART FLIH OWNERSHIP: RESTART FLIH SERIALIZATION: RESTART RESOURCE", + "offset": 592, + "length": 4, + "type": "hex" + }, + { + "name": "cvtrs150", + "description": "Reserved. Was CVTRSTCP: LOGICAL CPU ADDRESS OF TARGET OF RESTART.", + "offset": 592, + "length": 1, + "type": "hex" + }, + { + "name": "cvtrstrs", + "description": "RESTART REASON.", + "offset": 593, + "length": 1, + "type": "hex" + }, + { + "name": "cvtrcp2b", + "description": "Logical CPU address of target of the restart.", + "offset": 594, + "length": 2, + "type": "signed-integer" + }, + { + "name": "cvtsname", + "description": "SYSTEM NAME FOR CURRENT SYSTEM. OWNERSHIP: IPL/NIP. SERIALIZATION: NONE.", + "offset": 596, + "length": 8, + "type": "string" + }, + { + "name": "cvtgetl", + "description": "ADDRESS OF IKJGETL, TSO GET LINE ROUTINE", + "offset": 604, + "length": 4, + "type": "address", + "pointsTo": "vvmsr" + }, + { + "name": "cvtlpdsr", + "description": "ADDRESS OF LINK PACK AREA (LPA) DIRECTORY SEARCH ROUTINE", + "offset": 608, + "length": 4, + "type": "address", + "pointsTo": "vvmsr" + }, + { + "name": "cvtpvtp", + "description": "ADDRESS OF PAGE VECTOR TABLE", + "offset": 612, + "length": 4, + "type": "address", + "pointsTo": "page" + }, + { + "name": "cvtlpdia", + "description": "ADDRESS OF LINK PACK AREA (LPA) DIRECTORY (ON PAGE BOUNDARY)", + "offset": 616, + "length": 4, + "type": "address" + }, + { + "name": "cvtdirst", + "description": "FLAG BYTE", + "offset": 616, + "length": 1, + "type": "bitstring", + "bitmasks": { + "cvtdicom": { + "description": "LPA DIRECTORY HAS BEEN INITIALIZED BY NIP", + "offset": 0, + "length": 1 + } + } + }, + { + "name": "cvtlpdir", + "description": "ADDRESS OF LINK PACK AREA (LPA) DIRECTORY (ON PAGE BOUNDARY)", + "offset": 617, + "length": 3, + "type": "hex" + }, + { + "name": "cvtrbcb", + "description": "ADDRESS OF THE RECORD BUFFER'S CONTROL BLOCK", + "offset": 620, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "cvtrs170", + "description": "RESERVED", + "offset": 624, + "length": 4, + "type": "hex" + }, + { + "name": "cvtslida", + "description": "IDENTITY OF TCB CAUSING SUPERVISOR LOCK BYTE (CVTSYLK) TO BE SET OR IDENTITY OF TCB THAT SECOND EXIT PROCESSING IS FOR WHEN CVTSEIC=1", + "offset": 628, + "length": 4, + "type": "hex" + }, + { + "name": "cvtsylk", + "description": "SUPERVISOR LOCK. ONLY ENABLED TASKS MAY BE DISPATCHED", + "offset": 628, + "length": 1, + "type": "bitstring", + "bitmasks": { + "cvtsylks": { + "description": "SET LOCK BYTE", + "offset": 0, + "length": 8 + } + } + }, + { + "name": "cvtslid", + "description": "SAME AS CVTSLIDA ABOVE", + "offset": 629, + "length": 3, + "type": "hex" + }, + { + "name": "cvtflags", + "description": "SYSTEM GLOBAL FLAGS", + "offset": 632, + "length": 4, + "type": "signed-integer" + }, + { + "name": "cvtflag1", + "description": "FLAG BYTE", + "offset": 632, + "length": 1, + "type": "bitstring", + "bitmasks": { + "cvtrsmwd": { + "description": "IF ONE REAL STORAGE MANAGER WINDOW WAS BUILT, INITIALIZED BY NIP.", + "offset": 0, + "length": 1 + }, + "cvtsvprc": { + "description": "SERVICE PROCESSOR ARCHITECTURE SUPPORTED.", + "offset": 1, + "length": 1 + }, + "cvtcuse": { + "description": "CUSE. SET BY NIP", + "offset": 2, + "length": 1 + }, + "cvtmvpg": { + "description": "IF ONE, MOVEPAGE CAPABILITY IS PRESENT ON THIS SYSTEM. INITIALIZED BY NIP", + "offset": 3, + "length": 1 + }, + "cvtover": { + "description": "SUBPOOL OVERRIDE IS SUPPORTED. INITIALIZED BY NIP.", + "offset": 4, + "length": 1 + }, + "cvtcstr": { + "description": "IF ONE, CSTRING FACILITY IS PRESENT ON THIS SYSTEM. INITIALIZED BY NIP.", + "offset": 5, + "length": 1 + }, + "cvtsubsp": { + "description": "IF ONE, SUBSPACE FACILITY IS PRESENT ON THIS SYSTEM. INITIALIZED BY NIP.", + "offset": 6, + "length": 1 + }, + "cvtkpar": { + "description": "RESERVED FOR USE BY RTM ONLY. OWNERSHIP: RTM SERIALIZATION: NONE.", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "cvtflag2", + "description": "FLAG BYTE", + "offset": 633, + "length": 1, + "type": "bitstring", + "bitmasks": { + "cvtcmpsc": { + "description": "IF ONE, INDICATES PRESENCE OF MVS COMPRESSION/EXPANSION SERVICE. INITIALIZED ON. OWNERSHIP: CALLABLE SERVICES. SERIALIZATION: NONE.", + "offset": 0, + "length": 1 + }, + "cvtcmpsh": { + "description": "IF ONE, INDICATES PRESENCE OF CMPSC COMPRESSION/EXPANSION HARDWARE INSTRUCTION SET BY NIP. OWNERSHIP: CALLABLE SERVICES. SERIALIZATION: NONE (UNCHANGED AFTER NIP).", + "offset": 1, + "length": 1 + }, + "cvtsopf": { + "description": "IF ONE, INDICATES PRESENCE OF THE SUPPRESSION-ON-PROTECTION HARDWARE FACILITY. SET BY NIP. OWNERSHIP: SUPERVISOR CONTROL SERIALIZATION: NONE (UNCHANGED AFTER NIP).", + "offset": 2, + "length": 1 + }, + "cvtbfph": { + "description": "If one, indicates presence of BFP hardware instruction set. Set by NIP. Ownership: Supervisor. Serialization: None (unchanged after NIP).", + "offset": 3, + "length": 1 + }, + "cvtper2": { + "description": "If one, indicates presence of PER2 hardware on all CPUs Set by NIP. Ownership: Supervisor. Serialization: None (unchanged after NIP).", + "offset": 4, + "length": 1 + }, + "cvtiqd": { + "description": "If one, indicates that Internal Queued Direct Communications is supported. Set by IOS during NIP. Ownership: IOS Serialization: None (unchanged after NIP).", + "offset": 5, + "length": 1 + }, + "cvtalr": { + "description": "If one, indicates ASN and LX Reuse Architecture is enabled. Set by NIP. Ownership: Supervisor. Serialization: None (unchanged after NIP).", + "offset": 6, + "length": 1 + }, + "cvtedat": { + "description": "If one, indicates that the Enhanced DAT Architecture is available Set by NIP. Ownership: Supervisor. Serialization: None (unchanged after NIP).", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "cvtflag3", + "description": "FLAG BYTE refreshed upon error, set during NIP and never changed", + "offset": 634, + "length": 1, + "type": "bitstring", + "bitmasks": { + "cvtesame": { + "description": "", + "offset": 0, + "length": 1 + }, + "cvtzarch": { + "description": "If one, indicates presence of z/Architecture hardware. Note that it is often simpler to check if PSA field FLCARCH is non-zero to determine this. Set by NIP. Ownership: Supervisor. Serialization: None (unchanged after NIP).", + "offset": 0, + "length": 1 + }, + "cvtprocascore": { + "description": "A processor resource is viewed as a CPU Core", + "offset": 1, + "length": 1 + }, + "cvtmulticpuspercore": { + "description": "When CvtProcAsCore is on, this indicates there are multiple CPUs defined within a CPU Core (On MT hardware). When CvtProcAsCore is off, this is always off", + "offset": 2, + "length": 1 + }, + "cvtcpuasaliastocore": { + "description": "When CvtProcAsCore is on, the term \"CPU\" is treated as an alias to \"CORE\" for D M and CF system commands. When CvtProcAsCore is off, this is always off", + "offset": 3, + "length": 1 + }, + "cvtflag3diag": { + "description": "Diagnostic data for IBM use only", + "offset": 4, + "length": 1 + }, + "cvtflag3rsvd": { + "description": "Reserved for IBM use", + "offset": 5, + "length": 1 + }, + "cvtzcbp": { + "description": "When bit is on, system fields with zCBP names and and aliases with corresponding zAAP names contain data about zCBP processors.", + "offset": 6, + "length": 1 + }, + "cvtgsf": { + "description": "GSF is available", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "cvtflag4", + "description": "Flag byte This is an interface for CA CVTZNALC, CVTDCPA, CVTTX, CVTTXC, CVTEDAT2 only", + "offset": 635, + "length": 1, + "type": "bitstring", + "bitmasks": { + "cvtp001i": { + "description": "If one, indicates that P001 support is installed", + "offset": 0, + "length": 1 + }, + "cvtp001a": { + "description": "If one, indicates that the system is in P001_Active mode Ownership: IPL/NIP Serialization: SALLOC", + "offset": 1, + "length": 1 + }, + "cvtznalc": { + "description": "zNALC", + "offset": 2, + "length": 1 + }, + "cvtdcpa": { + "description": "Dynamic CPU Addition is enabled", + "offset": 3, + "length": 1 + }, + "cvttx": { + "description": "TX support is enabled", + "offset": 4, + "length": 1 + }, + "cvtp002": { + "description": "P002 support is enabled", + "offset": 4, + "length": 1 + }, + "cvttxc": { + "description": "TXC support is enabled", + "offset": 5, + "length": 1 + }, + "cvtp002c": { + "description": "P002C support is enabled", + "offset": 5, + "length": 1 + }, + "cvtri": { + "description": "RI support is enabled", + "offset": 6, + "length": 1 + }, + "cvtedat2": { + "description": "EDAT2 is enabled", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "cvtrt03", + "description": "ADDRESS OF SRB TIMING INITIALIZATION MODULE.", + "offset": 636, + "length": 4, + "type": "address", + "pointsTo": "vrt" + }, + { + "name": "cvtrs180", + "description": "RESERVED", + "offset": 640, + "length": 8, + "type": "hex" + }, + { + "name": "cvtexsnr", + "description": "ADDRESS OF EXCESSIVE SPIN NOTIFICATION ROUTINE", + "offset": 648, + "length": 4, + "type": "address" + }, + { + "name": "cvtexsnl", + "description": "SERIALIZATION BYTE FOR EXCESSIVE SPIN NOTIFICATION ROUTINE", + "offset": 652, + "length": 1, + "type": "hex" + }, + { + "name": "cvtspvlk", + "description": "NUMBER OF TASKS WHICH HAVE TERMINATED WHILE OWNING SUPERVISOR LOCK WITHOUT OPERATOR HAVING YET BEEN NOTIFIED", + "offset": 653, + "length": 1, + "type": "hex" + }, + { + "name": "cvtctlfg", + "description": "SYSTEM CONTROL FLAGS", + "offset": 654, + "length": 1, + "type": "bitstring", + "bitmasks": { + "cvttxte": { + "description": "A Transactional Execution test", + "offset": 0, + "length": 1 + }, + "cvttxj": { + "description": "Not a programming interface", + "offset": 0, + "length": 1 + }, + "cvtctlfgdiag": { + "description": "Diagnostic data for IBM use only", + "offset": 1, + "length": 2 + }, + "cvtdstat": { + "description": "DEVSTAT OPTION IN EFFECT. DEVICE ADDRESS FOR 2319, 3330, 2314, 3330-1, 3340 CAN VARY ACROSS SYSTEMS. Not a programming interface.", + "offset": 3, + "length": 1 + }, + "cvtdrmod": { + "description": "Set on when DRMODE=YES was specified.", + "offset": 4, + "length": 1 + }, + "cvtnomp": { + "description": "MULTIPROCESSING CODE IS NOT IN THE SYSTEM. Not a programming interface.", + "offset": 5, + "length": 1 + }, + "cvtgtrce": { + "description": "GENERALIZED TRACE FACILITY (GTF) HAS SUPPRESSED SUPERVISOR TRACE. Not a programming interface.", + "offset": 6, + "length": 1 + }, + "cvtsdtrc": { + "description": "SVC DUMP HAS SUPPRESSED SUPERVISOR TRACE. Not a programming interface.", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "cvtapg", + "description": "DISPATCHING PRIORITY OF AUTOMATIC PRIORITY GROUP (APG)", + "offset": 655, + "length": 1, + "type": "hex" + }, + { + "name": "cvtrscn", + "description": "ADDRESS OF ROUTINE TO SCAN TCB TREE", + "offset": 656, + "length": 4, + "type": "address", + "pointsTo": "trscn" + }, + { + "name": "cvttas", + "description": "ADDRESS OF ROUTINE TO TRANSFER ADDRESS SPACE", + "offset": 660, + "length": 4, + "type": "address", + "pointsTo": "0vl" + }, + { + "name": "cvttrcrm", + "description": "ADDRESS POINTER OF THE SYSTEM TRACE RESOURCE MANAGER.", + "offset": 664, + "length": 4, + "type": "address", + "pointsTo": "0vl" + }, + { + "name": "cvtshrvm", + "description": "LOWEST ADDRESS OF SHARED VIRTUAL STORAGE AREA. THIS ADDRESS WILL BE THE BEGINNING OF THE COMMON SERVICE AREA (CSA)", + "offset": 668, + "length": 4, + "type": "address", + "pointsTo": "0vl" + }, + { + "name": "cvt0vl01", + "description": "ENTRY POINT ADDRESS OF VALIDITY CHECK ROUTINE (IEA0VL01) USED TO COMPARE PROTECT KEY OF AN ADDRESS WITH TCB PROTECT KEY", + "offset": 672, + "length": 4, + "type": "address", + "pointsTo": "0vl" + }, + { + "name": "cvtppgmx", + "description": "ADDRESS POINTER FOR MVS/370-XA.", + "offset": 676, + "length": 4, + "type": "address", + "pointsTo": "address" + }, + { + "name": "cvtgrsst", + "description": "GRS status. SERIALIZATION: None.", + "offset": 680, + "length": 1, + "type": "bitstring", + "bitmasks": { + "cvte51gn": { + "description": "When on, global resource contention data normally reported via ENF event code 51 to listeners on this system is unavailable or incomplete.", + "offset": 0, + "length": 1 + }, + "cvte51ln": { + "description": "When on, local resource contention data normally reported via ENF event code 51 to listeners on this system is unavailable or incomplete.", + "offset": 1, + "length": 1 + } + } + }, + { + "name": "cvtflag9", + "description": "Function-available flags", + "offset": 681, + "length": 1, + "type": "bitstring", + "bitmasks": { + "cvt_llacopy_deblockexclok": { + "description": "LLACOPY supports DEBLOCKEXCLOK=YES", + "offset": 1, + "length": 1 + }, + "cvtifawicavailable": { + "description": "IFAWIC service is available for use", + "offset": 6, + "length": 1 + }, + "cvtifawicinstalled": { + "description": "IFAWIC service is installed", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "cvtbsm0f", + "description": "Return via reg 15, BSM 0,15", + "offset": 682, + "length": 2, + "type": "hex" + }, + { + "name": "cvtgvt", + "description": "ADDRESS OF THE GRS VECTOR TABLE", + "offset": 684, + "length": 4, + "type": "address", + "pointsTo": "pdsrt" + }, + { + "name": "cvtascrf", + "description": "CREATED ASCB QUEUE HEADER", + "offset": 688, + "length": 4, + "type": "address", + "pointsTo": "pdsrt" + }, + { + "name": "cvtascrl", + "description": "CREATED ASCB QUEUE TRAILER", + "offset": 692, + "length": 4, + "type": "address", + "pointsTo": "pdsrt" + }, + { + "name": "cvtputl", + "description": "ADDRESS OF IKJPUTL, TSO PUT LINE ROUTINE", + "offset": 696, + "length": 4, + "type": "address", + "pointsTo": "pdsrt" + }, + { + "name": "cvtsrbrt", + "description": "DISPATCHER RETURN ADDRESS FOR SRB ROUTINES", + "offset": 700, + "length": 4, + "type": "address", + "pointsTo": "pdsrt" + }, + { + "name": "cvtolt0a", + "description": "BRANCH ENTRY TO OLTEP MEMORY TERMINATION RESOURCE MANAGER", + "offset": 704, + "length": 4, + "type": "address", + "pointsTo": "smfeg" + }, + { + "name": "cvtsmfex", + "description": "BRANCH ENTRY TO SYSTEM MANAGEMENT FACILITIES (SMF) EXCP COUNTING ROUTINE FOR VAM WINDOW INTERCEPT", + "offset": 708, + "length": 4, + "type": "address", + "pointsTo": "smfeg" + }, + { + "name": "cvtcspie", + "description": "ENTRY POINT ADDRESS OF THE SUPERVISOR CHECKPOINT/RESTART ROUTER (IEAVCKRS). RESOLVED BY IEAVNP05 AFTER THE LPA HAS BEEN BUILT. PREVIOUSLY CONTAINED THE ENTRY POINT ADDRESS OF THE RTM CHECKPOINT/ RESTART EXIT ROUTINE (IEAVSPI).", + "offset": 712, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "cvtptgt", + "description": "ADDRESS OF IKJPTGT, TSO PUTGET ROUTINE", + "offset": 716, + "length": 4, + "type": "address", + "pointsTo": "ikjptgt" + }, + { + "name": "cvtsigpt", + "description": "SIGP TIMEOUT VALUE. OWNERSHIP: MACHINE CHECK HANDLER (MCH). SERIALIZATION: NONE (SET DURING IPL).", + "offset": 720, + "length": 1, + "type": "hex" + }, + { + "name": "cvtspdmc", + "description": "SERVICE PROCESSOR DAMAGE MACHINE CHECK LOCK BYTE.", + "offset": 721, + "length": 1, + "type": "hex" + }, + { + "name": "cvtdssac", + "description": "DYNAMIC SUPPORT SYSTEM (DSS) ACTIVATED FLAG - USED BY RESTART FLIH. IF X'00', DSS NOT INITIALIZED. IF X'FF', DSS HAS BEEN INITIALIZED.", + "offset": 722, + "length": 1, + "type": "hex" + }, + { + "name": "cvtrs1d7", + "description": "RESERVED", + "offset": 723, + "length": 1, + "type": "hex" + }, + { + "name": "cvtstck", + "description": "ADDRESS OF IKJSTCK, TSO STACK ROUTINE", + "offset": 724, + "length": 4, + "type": "address", + "pointsTo": "vbldp" + }, + { + "name": "cvtmaxmp", + "description": "Maximum CPU address available for this IPL", + "offset": 728, + "length": 2, + "type": "signed-integer" + }, + { + "name": "cvtbsm2", + "description": "RETURN VIA REG 2, BSM 0,2.", + "offset": 730, + "length": 2, + "type": "hex" + }, + { + "name": "cvtscan", + "description": "ADDRESS OF IKJSCAN, TSO SCAN ROUTINE", + "offset": 732, + "length": 4, + "type": "address", + "pointsTo": "vbldp" + }, + { + "name": "cvtauthl", + "description": "POINTER TO AUTHORIZED LIBRARY TABLE. X'7FFFF001' IF DYNAMIC FORMAT APF TABLE. OWNED AND SET BY CONTENTS SUPERVISOR.", + "offset": 736, + "length": 4, + "type": "address", + "pointsTo": "vbldp" + }, + { + "name": "cvtbldcp", + "description": "BRANCH ENTRY TO BUILD POOL", + "offset": 740, + "length": 4, + "type": "address", + "pointsTo": "vbldp" + }, + { + "name": "cvtgetcl", + "description": "BRANCH ENTRY TO GET CELL", + "offset": 744, + "length": 4, + "type": "address", + "pointsTo": "vgtcl" + }, + { + "name": "cvtfrecl", + "description": "BRANCH ENTRY TO FREE CELL", + "offset": 748, + "length": 4, + "type": "address", + "pointsTo": "vfrcl" + }, + { + "name": "cvtdelcp", + "description": "BRANCH ENTRY TO DELETE POOL", + "offset": 752, + "length": 4, + "type": "address", + "pointsTo": "vdelp" + }, + { + "name": "cvtcrmn", + "description": "BRANCH ENTRY TO SVC 120 (GETMAIN/FREEMAIN CRBRANCH)", + "offset": 756, + "length": 4, + "type": "address", + "pointsTo": "branch" + }, + { + "name": "cvtcras", + "description": "POINTER DEFINED ADDRESS OF BRANCH ENTRY TO 'CREATE ADDRESS SPACE'", + "offset": 760, + "length": 4, + "type": "address", + "pointsTo": "branch" + }, + { + "name": "cvtqsas", + "description": "POINTER DEFINED ADDRESS OF BRANCH ENTRY TO TASK TERMINATION", + "offset": 764, + "length": 4, + "type": "address" + }, + { + "name": "cvtfras", + "description": "POINTER DEFINED ENTRY TO TASK TERMINATION", + "offset": 768, + "length": 4, + "type": "address", + "pointsTo": "var" + }, + { + "name": "cvts1ee", + "description": "BRANCH ENTRY TO STAGE 1 EXIT EFFECTOR", + "offset": 772, + "length": 4, + "type": "address", + "pointsTo": "var" + }, + { + "name": "cvtpars", + "description": "ADDRESS OF IKJPARS, TSO PARSE ROUTINE", + "offset": 776, + "length": 4, + "type": "address", + "pointsTo": "var" + }, + { + "name": "cvtquis", + "description": "BRANCH ENTRY TO QUIESCE", + "offset": 780, + "length": 4, + "type": "address", + "pointsTo": "var" + }, + { + "name": "cvtstxu", + "description": "BRANCH ENTRY TO ATTENTION EXIT EPILOGUE", + "offset": 784, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "cvtopte", + "description": "BRANCH ENTRY ADDRESS TO SYSEVENT", + "offset": 788, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "cvtsdrm", + "description": "BRANCH ENTRY ADDRESS OF THE RESOURCE MANAGER ROUTINE FOR SVC DUMP. THIS ROUTINE CAN BE INVOKED BY MEMORY TERMINATION", + "offset": 792, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "cvtcsrt", + "description": "POINTER TO CALLABLE SERVICE REQUEST TABLE OWNERSHIP: CSR SERIALIZATION: NONE", + "offset": 796, + "length": 4, + "type": "address", + "pointsTo": "callable" + }, + { + "name": "cvtaqtop", + "description": "POINTER TO THE ALLOCATION QUEUE LOCK AREA.", + "offset": 800, + "length": 4, + "type": "address", + "pointsTo": "mascb" + }, + { + "name": "cvtvvmdi", + "description": "CONSTANT USED BY PAGED LINK PACK AREA (LPA) DIRECTORY SEARCH ALGORITHM", + "offset": 804, + "length": 4, + "type": "address", + "pointsTo": "mascb" + }, + { + "name": "cvtasvt", + "description": "POINTER TO ADDRESS SPACE VECTOR TABLE (ASVT)", + "offset": 808, + "length": 4, + "type": "address", + "pointsTo": "mascb" + }, + { + "name": "cvtgda", + "description": "POINTER TO GLOBAL DATA AREA (GDA) IN SQA", + "offset": 812, + "length": 4, + "type": "address", + "pointsTo": "mascb" + }, + { + "name": "cvtascbh", + "description": "POINTER TO HIGHEST PRIORITY ADDRESS SPACE CONTROL BLOCK (ASCB) ON THE ASCB DISPATCHING QUEUE (HEAD OF ASCB QUEUE)", + "offset": 816, + "length": 4, + "type": "address", + "pointsTo": "mascb" + }, + { + "name": "cvtascbl", + "description": "POINTER TO LOWEST PRIORITY ASCB ON THE ASCB DISPATCHING QUEUE", + "offset": 820, + "length": 4, + "type": "address", + "pointsTo": "mascb" + }, + { + "name": "cvtrtmct", + "description": "POINTER TO RECOVERY/TERMINATION CONTROL TABLE", + "offset": 824, + "length": 4, + "type": "address", + "pointsTo": "vstag" + }, + { + "name": "cvtsv60", + "description": "BRANCH ENTRY ADDRESS FOR 24 OR 31 BIT ADDRESSING MODE USERS OF SVC 60. ENTRY TO A GLUE ROUTINE.", + "offset": 828, + "length": 4, + "type": "address", + "pointsTo": "vstag" + }, + { + "name": "cvtsdmp", + "description": "ADDRESS OF SVC DUMP BRANCH ENTRY POINT", + "offset": 832, + "length": 4, + "type": "address", + "pointsTo": "vtsgl" + }, + { + "name": "cvtscbp", + "description": "ADDRESS OF SCB PURGE RESOURCE MANAGER.", + "offset": 836, + "length": 4, + "type": "address", + "pointsTo": "vtsbp" + }, + { + "name": "cvtsdbf", + "description": "Address of 4K SQA buffer used by SVC Dump. High-order bit of this CVT word is used as lock to indicate buffer is in use. See related bit ASCBSDBF in macro IHAASCB.", + "offset": 840, + "length": 4, + "type": "address", + "pointsTo": "4k" + }, + { + "name": "cvtrtms", + "description": "ADDRESS OF SERVICABILITY LEVEL INDICATOR PROCESSING (SLIP) HEADER", + "offset": 844, + "length": 4, + "type": "address", + "pointsTo": "vexpr" + }, + { + "name": "cvttpios", + "description": "ADDRESS OF THE TELEPROCESSING I/O SUPERVISOR ROUTINE (TPIOS)", + "offset": 848, + "length": 4, + "type": "address", + "pointsTo": "vexpr" + }, + { + "name": "cvtsic", + "description": "BRANCH ADDRESS OF THE ROUTINE TO SCHEDULE SYSTEM INITIALIZED CANCEL", + "offset": 852, + "length": 4, + "type": "address", + "pointsTo": "vexpr" + }, + { + "name": "cvtopctp", + "description": "ADDRESS OF SYSTEM RESOURCES MANAGER (SRM) CONTROL TABLE", + "offset": 856, + "length": 4, + "type": "address", + "pointsTo": "vexpr" + }, + { + "name": "cvtexpro", + "description": "ADDRESS OF EXIT PROLOGUE/TYPE 1 EXIT", + "offset": 860, + "length": 4, + "type": "address", + "pointsTo": "vexpr" + }, + { + "name": "cvtgsmq", + "description": "ADDRESS OF GLOBAL SERVICE MANAGER QUEUE", + "offset": 864, + "length": 4, + "type": "address", + "pointsTo": "gsmq" + }, + { + "name": "cvtlsmq", + "description": "ADDRESS OF LOCAL SERVICE MANAGER QUEUE", + "offset": 868, + "length": 4, + "type": "address", + "pointsTo": "lsmq" + }, + { + "name": "cvtrs26c", + "description": "RESERVED.", + "offset": 872, + "length": 4, + "type": "hex", + "pointsTo": "vwait" + }, + { + "name": "cvtvwait", + "description": "ADDRESS OF WAIT ROUTINE", + "offset": 876, + "length": 4, + "type": "address", + "pointsTo": "vwait" + }, + { + "name": "cvtparrl", + "description": "ADDRESS OF PARTIALLY LOADED DELETE QUEUE.", + "offset": 880, + "length": 4, + "type": "address", + "pointsTo": "qcs" + }, + { + "name": "cvtapft", + "description": "ADDRESS OF AUTHORIZED PROGRAM FACILITY (APF) TABLE. INITIALIZED BY NIP.", + "offset": 884, + "length": 4, + "type": "address", + "pointsTo": "qcs" + }, + { + "name": "cvtqcs01", + "description": "BRANCH ENTRY ADDRESS TO PROGRAM MANAGER USED BY ATTACH", + "offset": 888, + "length": 4, + "type": "address", + "pointsTo": "qcs" + }, + { + "name": "cvtfqcb", + "description": "FORMERLY USED BY ENQ/DEQ. SHOULD ALWAYS BE ZERO.", + "offset": 892, + "length": 4, + "type": "signed-integer" + }, + { + "name": "cvtlqcb", + "description": "FORMERLY USED BY ENQ/DEQ. SHOULD ALWAYS BE ZERO.", + "offset": 896, + "length": 4, + "type": "signed-integer" + }, + { + "name": "cvtrenq", + "description": "RESOURCE MANAGER ADDRESS FOR ENQ", + "offset": 900, + "length": 4, + "type": "address", + "pointsTo": "venq" + }, + { + "name": "cvtrspie", + "description": "RESOURCE MANAGER FOR SPIE.", + "offset": 904, + "length": 4, + "type": "address", + "pointsTo": "velrm" + }, + { + "name": "cvtlkrma", + "description": "RESOURCE MANAGER ADDRESS FOR LOCK MANAGER.", + "offset": 908, + "length": 4, + "type": "address", + "pointsTo": "velrm" + }, + { + "name": "cvtcsd", + "description": "VIRTUAL ADDRESS OF COMMON SYSTEM DATA AREA (CSD). INITIALIZED BY NIP.", + "offset": 912, + "length": 4, + "type": "address", + "pointsTo": "dqiqe" + }, + { + "name": "cvtdqiqe", + "description": "RESOURCE MANAGER FOR EXIT EFFECTORS.", + "offset": 916, + "length": 4, + "type": "address", + "pointsTo": "dqiqe" + }, + { + "name": "cvtrpost", + "description": "RESOURCE MANAGER FOR POST.", + "offset": 920, + "length": 4, + "type": "address", + "pointsTo": "rpost" + }, + { + "name": "cvt062r1", + "description": "BRANCH ENTRY TO DETACH", + "offset": 924, + "length": 4, + "type": "address", + "pointsTo": "veac" + }, + { + "name": "cvtveac0", + "description": "ASCBCHAP BRANCH ENTRY", + "offset": 928, + "length": 4, + "type": "address", + "pointsTo": "veac" + }, + { + "name": "cvtglmn", + "description": "GLOBAL BRANCH ENTRY ADDRESS FOR GETMAIN/FREEMAIN", + "offset": 932, + "length": 4, + "type": "address", + "pointsTo": "vgwsa" + }, + { + "name": "cvtspsa", + "description": "POINTER TO GLOBAL WORK/SAVE AREA VECTOR TABLE (WSAG)", + "offset": 936, + "length": 4, + "type": "address", + "pointsTo": "vgwsa" + }, + { + "name": "cvtwsal", + "description": "ADDRESS OF TABLE OF LENGTHS OF LOCAL WORK/SAVE AREAS", + "offset": 940, + "length": 4, + "type": "address", + "pointsTo": "vwsal" + }, + { + "name": "cvtwsag", + "description": "ADDRESS OF TABLE OF LENGTHS OF GLOBAL WORK/SAVE AREAS", + "offset": 944, + "length": 4, + "type": "address", + "pointsTo": "vwsag" + }, + { + "name": "cvtwsac", + "description": "ADDRESS OF TABLE OF LENGTHS OF CPU WORK/SAVE AREAS", + "offset": 948, + "length": 4, + "type": "address", + "pointsTo": "vwsac" + }, + { + "name": "cvtrecrq", + "description": "ADDRESS OF THE RECORDING REQUEST FACILITY (PART OF RTM1 - CALLED BY RTM2 AND RMS).", + "offset": 952, + "length": 4, + "type": "address", + "pointsTo": "vtrgr" + }, + { + "name": "cvtasmvt", + "description": "POINTER TO AUXILIARY STORAGE MANAGEMENT VECTOR TABLE (AMVT)", + "offset": 956, + "length": 4, + "type": "address", + "pointsTo": "spost" + }, + { + "name": "cvtiobp", + "description": "ADDRESS OF THE BLOCK PROCESSOR CVT", + "offset": 960, + "length": 4, + "type": "address", + "pointsTo": "spost" + }, + { + "name": "cvtspost", + "description": "POST RESOURCE MANAGER TERMINATION ROUTINE (RMTR) ENTRY POINT", + "offset": 964, + "length": 4, + "type": "address", + "pointsTo": "spost" + }, + { + "name": "cvtrstwd", + "description": "RESTART RESOURCE MANAGEMENT WORD. CONTAINS IDENTIFIER OF USER IF RESTART IS IN USE. OTHERWISE, ZERO.", + "offset": 968, + "length": 4, + "type": "signed-integer" + }, + { + "name": "cvtrstci", + "description": "CPU ID OF THE CPU HOLDING THE RESTART RESOURCE.", + "offset": 968, + "length": 2, + "type": "signed-integer" + }, + { + "name": "cvtrstri", + "description": "IDENTIFIER OF OWNING ROUTINE", + "offset": 970, + "length": 2, + "type": "bitstring", + "bitmasks": { + "cvtmfact": { + "description": "IF ONE, I/O SUPERVISOR AND TIMER SECOND LEVEL INTERRUPT HANDLER HOOKS BRANCH TO MEASUREMENT FACILITY ROUTER. USED TO SET HIGH-ORDER BIT OF CVTMFRTR.", + "offset": 8, + "length": 1 + }, + "cvtgsdab": { + "description": "IF HIGH-ORDER BIT IS ONE, THERE IS A VALID VALUE IN FOLLOWING 31 BITS.", + "offset": 8, + "length": 1 + } + } + }, + { + "name": "cvtfetch", + "description": "ADDRESS OF ENTRY POINT FOR BASIC FETCH.", + "offset": 972, + "length": 4, + "type": "address", + "pointsTo": "entry" + }, + { + "name": "cvt044r2", + "description": "ADDRESS OF IGC044R2 IN CHAP SERVICE ROUTINE", + "offset": 976, + "length": 4, + "type": "address", + "pointsTo": "igc044r" + }, + { + "name": "cvtperfm", + "description": "ADDRESS OF THE PERFORMANCE WORK AREA. SET BY IGX00018.", + "offset": 980, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "cvtdair", + "description": "ADDRESS OF IKJDAIR, TSO DYNAMIC ALLOCATION INTERFACE ROUTINE", + "offset": 984, + "length": 4, + "type": "address", + "pointsTo": "vedr" + }, + { + "name": "cvtehdef", + "description": "ADDRESS OF IKJEHDEF, TSO DEFAULT SERVICE ROUTINE.", + "offset": 988, + "length": 4, + "type": "address", + "pointsTo": "vedr" + }, + { + "name": "cvtehcir", + "description": "ADDRESS OF IKJEHCIR, TSO CATALOG INFORMATION ROUTINE.", + "offset": 992, + "length": 4, + "type": "address", + "pointsTo": "vedr" + }, + { + "name": "cvtssap", + "description": "ADDRESS OF SYSTEM SAVE AREA", + "offset": 996, + "length": 4, + "type": "address", + "pointsTo": "vedr" + }, + { + "name": "cvtaidvt", + "description": "POINTER TO APPENDAGE ID VECTOR TABLE", + "offset": 1000, + "length": 4, + "type": "address", + "pointsTo": "vedr" + }, + { + "name": "cvtipcds", + "description": "V(IEAVEDR1) - BRANCH ENTRY FOR DIRECT SIGNAL SERVICE ROUTINE", + "offset": 1004, + "length": 4, + "type": "address", + "pointsTo": "vedr" + }, + { + "name": "cvtipcri", + "description": "BRANCH ENTRY FOR REMOTE IMMEDIATE SIGNAL SERVICE ROUTINE", + "offset": 1008, + "length": 4, + "type": "address", + "pointsTo": "veri" + }, + { + "name": "cvtipcrp", + "description": "BRANCH ENTRY FOR REMOTE PENDABLE SIGNAL SERVICE ROUTINE", + "offset": 1012, + "length": 4, + "type": "address", + "pointsTo": "verp" + }, + { + "name": "cvtpccat", + "description": "POINTER TO PHYSICAL CCA VECTOR TABLE", + "offset": 1016, + "length": 4, + "type": "address", + "pointsTo": "vxsft" + }, + { + "name": "cvtlccat", + "description": "POINTER TO LOGICAL CCA VECTOR TABLE", + "offset": 1020, + "length": 4, + "type": "address", + "pointsTo": "vxsft" + }, + { + "name": "cvtxsft", + "description": "ADDRESS OF SYSTEM FUNCTION TABLE CONTAINING LINKAGE INDEX (LX) AND ENTRY INDEX (EX) NUMBERS FOR SYSTEM ROUTINES.", + "offset": 1024, + "length": 4, + "type": "address", + "pointsTo": "vxsft" + }, + { + "name": "cvtxstks", + "description": "ADDRESS OF PCLINK STACK (SAVE=YES) ROUTINE.", + "offset": 1028, + "length": 4, + "type": "address", + "pointsTo": "vxsts" + }, + { + "name": "cvtxstkn", + "description": "ADDRESS OF PCLINK STACK (SAVE=NO) ROUTINE.", + "offset": 1032, + "length": 4, + "type": "address", + "pointsTo": "vxstn" + }, + { + "name": "cvtxunss", + "description": "ADDRESS OF PCLINK UNSTACK (SAVE=YES) ROUTINE.", + "offset": 1036, + "length": 4, + "type": "address", + "pointsTo": "vxuns" + }, + { + "name": "cvtpwi", + "description": "ADDRESS OF THE WINDOW INTERCEPT ROUTINE", + "offset": 1040, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "cvtpvbp", + "description": "ADDRESS OF THE VIRTUAL BLOCK PROCESSOR", + "offset": 1044, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "cvtmfctl", + "description": "POINTER TO MEASUREMENT FACILITY CONTROL BLOCK", + "offset": 1048, + "length": 4, + "type": "address" + }, + { + "name": "cvtmfrtr", + "description": "IF MEASUREMENT FACILITY IS ACTIVE, CONTAINS ADDRESS OF MEASUREMENT FACILITY ROUTINE. OTHERWISE, ADDRESS OF CVTBRET.", + "offset": 1052, + "length": 4, + "type": "address" + }, + { + "name": "cvtvpsib", + "description": "BRANCH ENTRY TO PAGE SERVICES", + "offset": 1056, + "length": 4, + "type": "address" + }, + { + "name": "cvtvsi", + "description": "POINTER DEFINED, BRANCH ENTRY TO VAM SERVICES.", + "offset": 1060, + "length": 4, + "type": "address", + "pointsTo": "excp" + }, + { + "name": "cvtexcl", + "description": "ADDRESS POINTER TO THE EXCP TERMINATION ROUTINE.", + "offset": 1064, + "length": 4, + "type": "address", + "pointsTo": "vxunn" + }, + { + "name": "cvtxunsn", + "description": "ADDRESS OF PCLINK UNSTACK (SAVE=NO) ROUTINE.", + "offset": 1068, + "length": 4, + "type": "address", + "pointsTo": "vxunn" + }, + { + "name": "cvtisnbr", + "description": "ENTRY POINT ADDRESS OF DISABLED SERVICE PROCESSOR INTERFACE MODULE", + "offset": 1072, + "length": 4, + "type": "address", + "pointsTo": "vxext" + }, + { + "name": "cvtxextr", + "description": "ADDRESS OF PCLINK EXTRACT ROUTINE", + "offset": 1076, + "length": 4, + "type": "address", + "pointsTo": "vxext" + }, + { + "name": "cvtmsfrm", + "description": "ADDRESS OF THE PROCESSOR CONTROLLER.", + "offset": 1080, + "length": 4, + "type": "address", + "pointsTo": "vmfrm" + }, + { + "name": "cvtscpin", + "description": "ADDRESS OF IPL-TIME SCPINFO DATA BLOCK (ECVTSCPIN has address of \"current\"). Mapped by IHASCCB", + "offset": 1084, + "length": 4, + "type": "address", + "pointsTo": "ipl" + }, + { + "name": "cvtwsma", + "description": "ADDRESS OF WAIT STATE MESSAGE AREA MUST BE DISPLAYABLE BY OPERATOR", + "offset": 1088, + "length": 4, + "type": "address", + "pointsTo": "wait" + }, + { + "name": "cvtrmbr", + "description": "ADDRESS OF REGMAIN BRANCH ENTRY.", + "offset": 1092, + "length": 4, + "type": "address", + "pointsTo": "regmain" + }, + { + "name": "cvtlfrm", + "description": "LIST FORMAT FREEMAIN BRANCH ENTRY POINT.", + "offset": 1096, + "length": 4, + "type": "address", + "pointsTo": "task" + }, + { + "name": "cvtgmbr", + "description": "LIST FORMAT GETMAIN BRANCH ENTRY POINT.", + "offset": 1100, + "length": 4, + "type": "address", + "pointsTo": "task" + }, + { + "name": "cvt0tc0a", + "description": "ADDRESS OF TASK CLOSE MODULE IFG0TC0A.", + "offset": 1104, + "length": 4, + "type": "address", + "pointsTo": "task" + }, + { + "name": "cvtrlstg", + "description": "SIZE OF ACTUAL REAL STORAGE ONLINE AT IPL TIME IN 'K'. ACCURATE ONLY BELOW 4TB, FOR LARGER SYSTEMS THIS CONTAINS 'FFFFFFFF'X. SEE RCE_ONLINEFRAMECOUNTATIPL.", + "offset": 1108, + "length": 4, + "type": "signed-integer" + }, + { + "name": "cvtspfrr", + "description": "'SUPER FRR' ADDRESS (ADDRESS OF FUNCTIONAL RECOVERY ROUTINE ESTABLISHED AT NIP0 TIME TO PROTECT SUPERVISOR CONTROL PROGRAM).", + "offset": 1112, + "length": 4, + "type": "address", + "pointsTo": "vespr" + }, + { + "name": "cvtrs360", + "description": "RESERVED.", + "offset": 1116, + "length": 4, + "type": "hex", + "pointsTo": "vesvt" + }, + { + "name": "cvtsvt", + "description": "ADDRESS POINTER FOR FETCH PROTECTED PSASVT.", + "offset": 1120, + "length": 4, + "type": "address", + "pointsTo": "vesvt" + }, + { + "name": "cvtirecm", + "description": "ADDRESS OF INITIATOR RESOURCE MANAGER.", + "offset": 1124, + "length": 4, + "type": "address", + "pointsTo": "0pt" + }, + { + "name": "cvtdarcm", + "description": "ADDRESS OF DEVICE ALLOCATION RESOURCE MANAGER.", + "offset": 1128, + "length": 4, + "type": "address", + "pointsTo": "0pt" + }, + { + "name": "cvt0pt02", + "description": "ADDRESS OF POST ENTRY POINT IEA0PT02.", + "offset": 1132, + "length": 4, + "type": "address", + "pointsTo": "0pt" + }, + { + "name": "cvtrs374", + "description": "RESERVED", + "offset": 1136, + "length": 4, + "type": "hex", + "pointsTo": "wtcb" + }, + { + "name": "cvtwtcb", + "description": "ADDRESS OF WAIT STATE TCB.", + "offset": 1140, + "length": 4, + "type": "address", + "pointsTo": "wtcb" + }, + { + "name": "cvtvacr", + "description": "ACR/VARY CPU CHANNEL RECOVERY ROUTINE ADDRESS. ADDRESS FILLED IN BY VARY CPU PROCESSOR.", + "offset": 1144, + "length": 4, + "type": "address", + "pointsTo": "vary" + }, + { + "name": "cvtrecon", + "description": "VARY CPU SHUTDOWN ROUTINE ADDRESS. ADDRESS FILLED IN BY VARY CPU PROCESSOR.", + "offset": 1148, + "length": 4, + "type": "address", + "pointsTo": "vary" + }, + { + "name": "cvtgtfr8", + "description": "GENERALIZED TRACE FACILITY (GTF) CONTROL REGISTER 8 INITIALIZATION ROUTINE ADDRESS.", + "offset": 1152, + "length": 4, + "type": "address", + "pointsTo": "vary" + }, + { + "name": "cvtvstop", + "description": "ADDRESS OF VARY CPU STOP CPU ROUTINE.", + "offset": 1156, + "length": 4, + "type": "address", + "pointsTo": "vary" + }, + { + "name": "cvtvpsa", + "description": "ADDRESS OF COPY OF SYSGEN'ED PSA - PLACED HERE BY NIP.", + "offset": 1160, + "length": 4, + "type": "address", + "pointsTo": "vexp" + }, + { + "name": "cvtrmptt", + "description": "ADDRESS OF ISTRAMA1, THE VTAM RESOURCE MANAGER FOR NORMAL AND ABNORMAL TASK TERMINATION.", + "offset": 1164, + "length": 4, + "type": "address", + "pointsTo": "vexp" + }, + { + "name": "cvtrmpmt", + "description": "ADDRESS OF ISTRAMA2, THE VTAM RESOURCE MANAGER FOR NORMAL AND ABNORMAL MEMORY TERMINATION.", + "offset": 1168, + "length": 4, + "type": "address", + "pointsTo": "vexp" + }, + { + "name": "cvtexp1", + "description": "ADDRESS OF EXIT PROLOGUE WHICH RETURNS TO THE DISPATCHER.", + "offset": 1172, + "length": 4, + "type": "address", + "pointsTo": "vexp" + }, + { + "name": "cvtcsdrl", + "description": "REAL ADDRESS OF COMMON SYSTEM DATA AREA (CSD). INITIALIZED BY NIP.", + "offset": 1176, + "length": 4, + "type": "address", + "pointsTo": "vgqv" + }, + { + "name": "cvtssrb", + "description": "STATUS STOP SRB ENTRY.", + "offset": 1180, + "length": 4, + "type": "address", + "pointsTo": "vgqv" + }, + { + "name": "cvtrs3a4", + "description": "RESERVED", + "offset": 1184, + "length": 4, + "type": "hex", + "pointsTo": "vgqv" + }, + { + "name": "cvtqv1", + "description": "ADDRESS OF QUEUE VERIFICATION FOR SINGLE THREADED QUEUES WITH HEADERS ONLY.", + "offset": 1188, + "length": 4, + "type": "address", + "pointsTo": "vgqv" + }, + { + "name": "cvtqv2", + "description": "ADDRESS OF QUEUE VERIFICATION FOR SINGLE THREADED QUEUES WITH HEADER AND TRAILER.", + "offset": 1192, + "length": 4, + "type": "address", + "pointsTo": "veqv" + }, + { + "name": "cvtqv3", + "description": "ADDRESS OF QUEUE VERIFICATION FOR DOUBLE THREADED QUEUES.", + "offset": 1196, + "length": 4, + "type": "address", + "pointsTo": "veqv" + }, + { + "name": "cvtgsda", + "description": "ADDRESS OF GLOBAL SYSTEM DUPLEX AREA.", + "offset": 1200, + "length": 4, + "type": "address", + "pointsTo": "vgsda" + }, + { + "name": "cvtadv", + "description": "ADDRESS OF ADDRESS VERIFICATION ROUTINE.", + "offset": 1204, + "length": 4, + "type": "address", + "pointsTo": "veadv" + }, + { + "name": "cvttpio", + "description": "ADDRESS OF VTAM TPIO (SVC 124) ROUTINE.", + "offset": 1208, + "length": 4, + "type": "address", + "pointsTo": "vevt" + }, + { + "name": "cvtrs3c0", + "description": "RESERVED", + "offset": 1212, + "length": 4, + "type": "hex", + "pointsTo": "vevt" + }, + { + "name": "cvtevent", + "description": "BRANCH ENTRY ADDRESS TO EVENTS (FAST MULTIPLE WAIT ROUTINE).", + "offset": 1216, + "length": 4, + "type": "address", + "pointsTo": "vevt" + }, + { + "name": "cvtsscr", + "description": "ADDRESS OF STORAGE SYSTEM CONTROLLER RECOVERY MANAGER CLEANUP ROUTINE (SSC RMCR).", + "offset": 1220, + "length": 4, + "type": "address", + "pointsTo": "vesc" + }, + { + "name": "cvtcbbr", + "description": "BRANCH ENTRY ADDRESS TO GETMAIN/FREEMAIN.", + "offset": 1224, + "length": 4, + "type": "address", + "pointsTo": "vesc" + }, + { + "name": "cvteff02", + "description": "ADDRESS OF IKJEFF02, TSO MESSAGE ISSUER SERVICE ROUTINE.", + "offset": 1228, + "length": 4, + "type": "address", + "pointsTo": "vesc" + }, + { + "name": "cvtlsch", + "description": "ADDRESS OF LOCAL SCHEDULE.", + "offset": 1232, + "length": 4, + "type": "address", + "pointsTo": "vesc" + }, + { + "name": "cvtcdeq", + "description": "ADDRESS OF PROGRAM MANAGER AVAILBLE CDE QUEUE CONTROL AREA.", + "offset": 1236, + "length": 4, + "type": "address", + "pointsTo": "program" + }, + { + "name": "cvthsm", + "description": "POINTER TO HIERARCHICAL STORAGE MANAGER (HSM) QUEUE CONTROL TABLE.", + "offset": 1240, + "length": 4, + "type": "address", + "pointsTo": "access" + }, + { + "name": "cvtrac", + "description": "ADDRESS OF ACCESS CONTROL CVT.", + "offset": 1244, + "length": 4, + "type": "address", + "pointsTo": "access" + }, + { + "name": "cvtcgk", + "description": "ADDRESS OF ROUTINE USED TO CHANGE THE KEY OF VIRTUAL PAGES.", + "offset": 1248, + "length": 4, + "type": "address", + "pointsTo": "0pt0e" + }, + { + "name": "cvtsrm", + "description": "ADDRESS OF ENTRY TABLE FOR SRM, ENTRY TABLE IS INITIALIZED BY NIP10.", + "offset": 1252, + "length": 4, + "type": "address", + "pointsTo": "0pt0e" + }, + { + "name": "cvt0pt0e", + "description": "ENTRY POINT TO IDENTIFY POST EXIT ROUTINES.", + "offset": 1256, + "length": 4, + "type": "address", + "pointsTo": "0pt0e" + }, + { + "name": "cvt0pt03", + "description": "POST REINVOCATION ENTRY POINT FROM POST EXIT ROUTINES.", + "offset": 1260, + "length": 4, + "type": "address", + "pointsTo": "0pt" + }, + { + "name": "cvttcasp", + "description": "POINTER TO THE TSO/VTAM TERMINAL CONTROL ADDRESS SPACE (TCAS) TABLE.", + "offset": 1264, + "length": 4, + "type": "address", + "pointsTo": "tso" + }, + { + "name": "cvtcttvt", + "description": "CTT VT", + "offset": 1268, + "length": 4, + "type": "address" + }, + { + "name": "cvtjterm", + "description": "POINTER DEFINED ADDRESS OF AUXILIARY STORAGE MANAGEMENT JOB TERMINATION RESOURCE MANAGER.", + "offset": 1272, + "length": 4, + "type": "address", + "pointsTo": "vrsuh" + }, + { + "name": "cvtrsume", + "description": "ADDRESS OF RESUME FUNCTION.", + "offset": 1276, + "length": 4, + "type": "address", + "pointsTo": "vrsuh" + }, + { + "name": "cvttctl", + "description": "ADDRESS OF TRANSFER CONTROL (TCTL) FUNCTION.", + "offset": 1280, + "length": 4, + "type": "address", + "pointsTo": "vtctl" + }, + { + "name": "cvtrmt", + "description": "ADDRESS OF RESOURCE MANAGER CONTROL STRUCTURE (RMT) OWNERSHIP: RTM. SERIALIZATION: NONE.", + "offset": 1284, + "length": 4, + "type": "address", + "pointsTo": "vet6e" + }, + { + "name": "cvtt6svc", + "description": "ENTRY POINT ADDRESS FOR TYPE 6 SVC EXIT FUNCTION.", + "offset": 1288, + "length": 4, + "type": "address", + "pointsTo": "vet6e" + }, + { + "name": "cvtsusp", + "description": "ADDRESS OF SUSPEND ROUTINE.", + "offset": 1292, + "length": 4, + "type": "address", + "pointsTo": "vspnd" + }, + { + "name": "cvtihasu", + "description": "ADDRESS OF BIT STRING.", + "offset": 1296, + "length": 4, + "type": "address", + "pointsTo": "su" + }, + { + "name": "cvtsfv", + "description": "ADDRESS OF SETFRR ROUTINE ABOVE 16M", + "offset": 1300, + "length": 4, + "type": "address", + "pointsTo": "vtsfv" + }, + { + "name": "cvtidevn", + "description": "ADDRESS OF DEVICE NUMBER CONVERSION ROUTINE OWNERSHIP: IOS. SERIALIZATION: NONE.", + "offset": 1304, + "length": 4, + "type": "address", + "pointsTo": "device" + }, + { + "name": "cvtsmf83", + "description": "ADDRESS OF BRANCH ENTRY TO SMF SVC 83.", + "offset": 1308, + "length": 4, + "type": "address", + "pointsTo": "smfsp" + }, + { + "name": "cvtsmfsp", + "description": "ADDRESS OF SMF SUSPEND HANDLER.", + "offset": 1312, + "length": 4, + "type": "address", + "pointsTo": "smfsp" + }, + { + "name": "cvtmsfcb", + "description": "ADDRESS OF MAINTENANCE AND SERVICE FACILITY CONTROL BLOCK (MSFCB).", + "offset": 1316, + "length": 4, + "type": "address" + }, + { + "name": "cvthid", + "description": "ADDRESS OF SCP HOST ID.", + "offset": 1320, + "length": 4, + "type": "address", + "pointsTo": "scp" + }, + { + "name": "cvtpsxm", + "description": "ADDRESS OF CROSS MEMORY PAGE FIX AND PAGE FREE.", + "offset": 1324, + "length": 4, + "type": "address", + "pointsTo": "cross" + }, + { + "name": "cvtucbsc", + "description": "ADDRESS OF UCB SCAN SERVICE.", + "offset": 1328, + "length": 4, + "type": "address", + "pointsTo": "ucb" + }, + { + "name": "cvttpur", + "description": "DDR QUEUE OF TAPE UNIT-RECORD SWAP REQUESTS.", + "offset": 1332, + "length": 4, + "type": "address" + }, + { + "name": "cvtdpur", + "description": "DDR QUEUE OF DASD SWAP REQUESTS.", + "offset": 1336, + "length": 4, + "type": "address" + }, + { + "name": "cvttrpos", + "description": "DDR QUEUE OF TAPES TO BE REPRESENTED.", + "offset": 1340, + "length": 4, + "type": "address" + }, + { + "name": "cvtrs444", + "description": "Reserved, must always be 0. Was CVTRESTX, VIRTUAL ADDRESS OF TEXT TO BE PLACED ON CONSOLE FRAME.", + "offset": 1344, + "length": 4, + "type": "address" + }, + { + "name": "cvtxcpct", + "description": "MAXIMUM EXCP COUNT PER ADDRESS SPACE.", + "offset": 1348, + "length": 2, + "type": "signed-integer" + }, + { + "name": "cvtcall", + "description": "A BASSM 14,15 INSTRUCTION. POINTER USED VIA AN EXECUTE INSTRUCTION TO BRANCH TO USERS EXITS", + "offset": 1350, + "length": 2, + "type": "signed-integer" + }, + { + "name": "cvtvfind", + "description": "THE POINTER TO VIRTUAL FETCH BUILD AND FIND ROUTINE.", + "offset": 1352, + "length": 4, + "type": "address", + "pointsTo": "virtual" + }, + { + "name": "cvtvfget", + "description": "THE POINTER TO VIRTUAL FETCH GET ROUTINE.", + "offset": 1356, + "length": 4, + "type": "address", + "pointsTo": "virtual" + }, + { + "name": "cvtvfmem", + "description": "RESERVED. THIS FIELD IS NO LONGER USED. ANYONE USING IT AS A POINTER WILL PROGRAM CHECK", + "offset": 1360, + "length": 4, + "type": "address", + "pointsTo": "virtual" + }, + { + "name": "cvtvfcb", + "description": "THE POINTER TO VIRTUAL FETCH INTERNAL CONTROL BLOCK IN CSA, INITIALIZED TO ZERO AND SET TO NON-ZERO VALUE BY VIRTUAL FETCH INITIALIZATION ROUTINE.", + "offset": 1364, + "length": 4, + "type": "address", + "pointsTo": "virtual" + }, + { + "name": "cvtpgser", + "description": "POINTER DEFINED ADDRESS OF ENTRY TO PAGE SERVICES (FIX,FREE,LOAD, OUT,RLSE,ANYWHER).", + "offset": 1368, + "length": 4, + "type": "address", + "pointsTo": "entry" + }, + { + "name": "cvttski", + "description": "POINTER DEFINED ADDRESS OF TASK MANAGEMENT/STORAGE MANAGEMENT INTERFACE ROUTINE.", + "offset": 1372, + "length": 4, + "type": "address", + "pointsTo": "task" + }, + { + "name": "cvtcpgub", + "description": "POINTER DEFINED ADDRESS OF CPOOL GET UNCONDITIONAL BRANCH ENTRY ROUTINE.", + "offset": 1376, + "length": 4, + "type": "address", + "pointsTo": "cpool" + }, + { + "name": "cvtcpgup", + "description": "POINTER DEFINED ADDRESS OF CPOOL GET UNCONDITIONAL PC-ENTRY ROUTINE.", + "offset": 1380, + "length": 4, + "type": "address", + "pointsTo": "cpool" + }, + { + "name": "cvtcpgtc", + "description": "POINTER DEFINED ADDRESS OF GET UNCONDITIONAL ROUTINE.", + "offset": 1384, + "length": 4, + "type": "address", + "pointsTo": "get" + }, + { + "name": "cvtcpfre", + "description": "POINTER DEFINED ADDRESS OF CPOOL FREE ROUTINE.", + "offset": 1388, + "length": 4, + "type": "address", + "pointsTo": "cpool" + }, + { + "name": "cvtslist", + "description": "POINTER DEFINED ADDRESS OF VSM LIST SERVICE.", + "offset": 1392, + "length": 4, + "type": "address", + "pointsTo": "vsm" + }, + { + "name": "cvtsregn", + "description": "POINTER DEFINED ADDRESS OF VSM REGION SIZE.", + "offset": 1396, + "length": 4, + "type": "address", + "pointsTo": "vsm" + }, + { + "name": "cvtsloc", + "description": "POINTER DEFINED ADDRESS OF VSM LOCATOR SERVICE.", + "offset": 1400, + "length": 4, + "type": "address", + "pointsTo": "vsm" + }, + { + "name": "cvtcpbdb", + "description": "POINTER DEFINED ADDRESS OF CPOOL BUILD ENTRY ROUTINE.", + "offset": 1404, + "length": 4, + "type": "address", + "pointsTo": "cpool" + }, + { + "name": "cvtcpdlb", + "description": "POINTER DEFINED ADDRESS OF CPOOL DELETE BRANCH ENTRY ROUTINE.", + "offset": 1408, + "length": 4, + "type": "address", + "pointsTo": "cpool" + }, + { + "name": "cvtdoffs", + "description": "STARTING REAL ADDRESS OF DAT-OFF NUCLEUS.", + "offset": 1412, + "length": 4, + "type": "address", + "pointsTo": "dat" + }, + { + "name": "cvtdoffe", + "description": "ENDING REAL ADDRESS OF DAT-OFF NUCLEUS.", + "offset": 1416, + "length": 4, + "type": "address", + "pointsTo": "dat" + }, + { + "name": "cvtrcep", + "description": "ADDRESS OF THE RSM CONTROL AND ENUMERATION AREA.", + "offset": 1420, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "cvtcpgus", + "description": "ADDRESS OF CPOOL GET UNCONDITIONAL PC-ENTRY ROUTINE WHICH SAVES SECONDARY ASID STATUS.", + "offset": 1424, + "length": 4, + "type": "address", + "pointsTo": "cpool" + }, + { + "name": "cvtgrrgn", + "description": "POINTER DEFINED ADDRESS OF GET REAL REGION ROUTINE.", + "offset": 1428, + "length": 4, + "type": "address", + "pointsTo": "get" + }, + { + "name": "cvtgvrgn", + "description": "POINTER DEFINED ADDRESS OF GET VIRTUAL REGION ROUTINE.", + "offset": 1432, + "length": 4, + "type": "address", + "pointsTo": "get" + }, + { + "name": "cvtionlv", + "description": "DEFAULT VALUE OF IOS LEVEL.", + "offset": 1436, + "length": 1, + "type": "hex" + }, + { + "name": "cvtrs4a1", + "description": "RESERVED EXIT CODE FOR NORMAL AND/OR ABNORMAL END APPENDAGES FOR I/O DRIVERS.", + "offset": 1437, + "length": 5, + "type": "bitstring", + "bitmasks": { + "cvtsoln": { + "description": "If high order bit is on, this is not a full function MVS system, but rather, a solution/offering.", + "offset": 32, + "length": 1 + } + } + }, + { + "name": "cvtfunc", + "description": "Reserved for solution/offering use. Must be zero for full function MVS.", + "offset": 1442, + "length": 4, + "type": "hex", + "pointsTo": "storage" + }, + { + "name": "cvtsmext", + "description": "ADDRESS OF STORAGE MAP EXTENSION.", + "offset": 1446, + "length": 4, + "type": "address", + "pointsTo": "storage" + }, + { + "name": "cvtnucmp", + "description": "ADDRESS OF NUCLEUS MAP.", + "offset": 1450, + "length": 4, + "type": "address", + "pointsTo": "nucleus" + }, + { + "name": "cvtxafl", + "description": "FLAG BYTE FOR MVS/XA PROCESSING.", + "offset": 1454, + "length": 1, + "type": "bitstring", + "bitmasks": { + "cvtcsrim": { + "description": "EXPLICIT LOAD PROCESSING REQUIRED FOR CONTENTS SUPERVISOR RIM.", + "offset": 0, + "length": 1 + } + } + }, + { + "name": "cvtrs4b5", + "description": "RESERVED", + "offset": 1455, + "length": 3, + "type": "hex" + }, + { + "name": "cvtvtam", + "description": "ADDRESS OF VTAM COMMAND PROCESSOR (ISTCFF3D).", + "offset": 1458, + "length": 4, + "type": "address", + "pointsTo": "vnvt" + }, + { + "name": "cvtspip", + "description": "ADDRESS OF RTM INTERFACE TO RETURN PROGRAM MASK TO CONTENTS SUPERVISOR,(ON SPIE/ESPIE).", + "offset": 1462, + "length": 4, + "type": "address", + "pointsTo": "vnvt" + }, + { + "name": "cvtckras", + "description": "OLD NAME FOR CVTDFA FIELD.", + "offset": 1466, + "length": 4, + "type": "address" + }, + { + "name": "cvtdfa", + "description": "ADDRESS OF DFP ID TABLE, MAPPED BY THE DFA. OWNERSHIP: DFP.", + "offset": 1466, + "length": 4, + "type": "address", + "pointsTo": "vnvt" + }, + { + "name": "cvtnvt0", + "description": "ADDRESS OF DATA IN DAT-ON NUCLEUS", + "offset": 1470, + "length": 4, + "type": "address", + "pointsTo": "vnvt" + }, + { + "name": "cvtcsomf", + "description": "OWNER OF CHANNEL MEASUREMENT FACILITY.", + "offset": 1474, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "cvtcsoal", + "description": "OWNER OF ADDRESS LIMIT FACILITY.", + "offset": 1478, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "cvtichpt", + "description": "ADDRESS OF THE INSTALLED CHANNEL PATH TABLE.", + "offset": 1482, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "cvtcsocr", + "description": "CHANNEL SUBSYSTEM OWNER - CHANNEL PATH RESET FACILITY.", + "offset": 1486, + "length": 4, + "type": "address", + "pointsTo": "device" + }, + { + "name": "cvtcsocs", + "description": "CHANNEL SUBSYSTEM OWNER - CHANNEL PATH STATUS FACILITY.", + "offset": 1490, + "length": 4, + "type": "address", + "pointsTo": "device" + }, + { + "name": "cvtllta", + "description": "LINK LIST TABLE ADDRESS.", + "offset": 1494, + "length": 4, + "type": "address", + "pointsTo": "device" + }, + { + "name": "cvtdcqa", + "description": "ADDRESS OF DEVICE CLASS QUEUE", + "offset": 1498, + "length": 4, + "type": "address", + "pointsTo": "vestu" + }, + { + "name": "cvtucba", + "description": "ADDRESS OF THE FIRST UCB IN THE CHAIN OF UCB'S.", + "offset": 1502, + "length": 4, + "type": "address", + "pointsTo": "vestu" + }, + { + "name": "cvtvestu", + "description": "ADDRESS OF THE ENTRY POINT OF THE SVC UPDATE ROUTINE.", + "offset": 1506, + "length": 4, + "type": "address", + "pointsTo": "vestu" + }, + { + "name": "cvtnuclu", + "description": "ADDRESS TO SUPPORT THE NUCLEUS MAP LOOKUP ROUTINE.", + "offset": 1510, + "length": 4, + "type": "address", + "pointsTo": "venlu" + }, + { + "name": "cvtoslvl", + "description": "SYSTEM LEVEL INDICATORS The presence of certain hardware functions is indicated within the SCCB (mapped by macro IHASCCB, pointed to by CVTSCPIN and/or ECVTSCPIN). The presence of other hardware functions can be found within CVT field CVTFLAGS2.", + "offset": 1514, + "length": 16, + "type": "hex" + }, + { + "name": "cvtoslv0", + "description": "BYTE 0 OF CVTOSLVL", + "offset": 1514, + "length": 1, + "type": "bitstring", + "bitmasks": { + "cvth3310": { + "description": "HBB3310 FUNCTIONS ARE PRESENT", + "offset": 0, + "length": 1 + }, + "cvtesa": { + "description": "ESA/370 IS SUPPORTED", + "offset": 0, + "length": 1 + }, + "cvtxax": { + "description": "ESA/370 IS SUPPORTED (XAX - OLD NAME)", + "offset": 0, + "length": 1 + }, + "cvth4420": { + "description": "HBB4420 FUNCTIONS ARE PRESENT.", + "offset": 1, + "length": 1 + }, + "cvtj3313": { + "description": "JBB3313 FUNCTIONS ARE PRESENT", + "offset": 2, + "length": 1 + }, + "cvtj3311": { + "description": "JBB3311 FUNCTIONS ARE PRESENT", + "offset": 3, + "length": 1 + }, + "cvthiper": { + "description": "HIPERSPACES ARE SUPPORTED", + "offset": 3, + "length": 1 + }, + "cvth4410": { + "description": "HBB4410 FUNCTIONS ARE PRESENT.", + "offset": 4, + "length": 1 + }, + "cvtlkr": { + "description": "SPIN LOCK RESTRUCTURE INDICATOR.", + "offset": 4, + "length": 1 + }, + "cvtucbsv": { + "description": "UCB SERVICES INSTALLED.", + "offset": 4, + "length": 1 + }, + "cvtcads": { + "description": "SCOPE=COMMON DATA SPACES SUPPORTED", + "offset": 5, + "length": 1 + }, + "cvtcrptl": { + "description": "ENCRYPTION ASYMMETRIC FEATURE IS SUPPORTED", + "offset": 6, + "length": 1 + }, + "cvtj4422": { + "description": "JBB4422 FUNCTIONS ARE PRESENT", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "cvtoslv1", + "description": "BYTE 1 OF CVTOSLVL", + "offset": 1515, + "length": 1, + "type": "bitstring", + "bitmasks": { + "cvth4430": { + "description": "HBB4430 FUNCTIONS ARE PRESENT", + "offset": 0, + "length": 1 + }, + "cvtdyapf": { + "description": "DYNAMIC APF, THROUGH CSVAPF, PRESENT", + "offset": 0, + "length": 1 + }, + "cvtwlm": { + "description": "WORKLOAD MANAGER IS INSTALLED", + "offset": 1, + "length": 1 + }, + "cvth5510": { + "description": "HBB5510 FUNCTIONS ARE PRESENT", + "offset": 2, + "length": 1 + }, + "cvtdynex": { + "description": "CSVDYNEX FOR DYNAMIC EXITS IS PRESENT", + "offset": 2, + "length": 1 + }, + "cvth5520": { + "description": "HBB5520 FUNCTIONS ARE PRESENT", + "offset": 3, + "length": 1 + }, + "cvtenclv": { + "description": "ENCLAVES FUNCTION IS PRESENT", + "offset": 3, + "length": 1 + }, + "cvtj5522": { + "description": "JBB5522 FUNCTIONS ARE PRESENT", + "offset": 4, + "length": 1 + }, + "cvth5530": { + "description": "HBB6603 FUNCTIONS ARE PRESENT", + "offset": 5, + "length": 1 + }, + "cvth6603": { + "description": "HBB6603 FUNCTIONS ARE PRESENT", + "offset": 5, + "length": 1 + }, + "cvtos390_010300": { + "description": "OS/390 R3", + "offset": 5, + "length": 1 + }, + "cvtos390_r3": { + "description": "OS/390 R3", + "offset": 5, + "length": 1 + }, + "cvtdynl": { + "description": "Dynamic LNKLST, via CSVDYNL, is present", + "offset": 5, + "length": 1 + }, + "cvth6601": { + "description": "OS/390 release 1", + "offset": 6, + "length": 1 + }, + "cvtos390": { + "description": "OS/390 release 1 This bit is on for all releases starting with OS/390 release 1", + "offset": 6, + "length": 1 + }, + "cvtos390_010100": { + "description": "OS/390 R1", + "offset": 6, + "length": 1 + }, + "cvtos390_r1": { + "description": "OS/390 R1", + "offset": 6, + "length": 1 + }, + "cvtprded": { + "description": "Product enable/disable (IFAEDxxx) is present", + "offset": 6, + "length": 1 + }, + "cvtj6602": { + "description": "OS/390 release 2", + "offset": 7, + "length": 1 + }, + "cvtos390_010200": { + "description": "OS/390 R2", + "offset": 7, + "length": 1 + }, + "cvtos390_r2": { + "description": "OS/390 R2", + "offset": 7, + "length": 1 + }, + "cvtparmc": { + "description": "Logical Parmlib Service is available via IEFPRMLB.", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "cvtoslv2", + "description": "BYTE 2 OF CVTOSLVL", + "offset": 1516, + "length": 1, + "type": "bitstring", + "bitmasks": { + "cvtos390_010400": { + "description": "OS/390 R4", + "offset": 0, + "length": 1 + }, + "cvtos390_020400": { + "description": "OS/390 R4", + "offset": 0, + "length": 1 + }, + "cvtos390_r4": { + "description": "OS/390 R4", + "offset": 0, + "length": 1 + }, + "cvtj6604": { + "description": "OS/390 R4", + "offset": 0, + "length": 1 + }, + "cvtdylpa": { + "description": "Dynamic LPA (CSVDYLPA) available", + "offset": 0, + "length": 1 + }, + "cvtrtls": { + "description": "Runtime Library Services (CSVRTLS)", + "offset": 0, + "length": 1 + }, + "cvtos390_020500": { + "description": "OS/390 R5", + "offset": 1, + "length": 1 + }, + "cvtos390_r5": { + "description": "OS/390 R5", + "offset": 1, + "length": 1 + }, + "cvth6605": { + "description": "OS/390 R5", + "offset": 1, + "length": 1 + }, + "cvtos390_020600": { + "description": "OS/390 R6", + "offset": 2, + "length": 1 + }, + "cvtos390_r6": { + "description": "OS/390 R6", + "offset": 2, + "length": 1 + }, + "cvth6606": { + "description": "OS/390 R6", + "offset": 2, + "length": 1 + }, + "cvtbfp": { + "description": "Binary Floating Point support (simulated unless CVTBFPH is on)", + "offset": 3, + "length": 1 + }, + "cvtos390_020700": { + "description": "OS/390 R7", + "offset": 4, + "length": 1 + }, + "cvtos390_r7": { + "description": "OS/390 R7", + "offset": 4, + "length": 1 + }, + "cvtj6607": { + "description": "OS/390 R7", + "offset": 4, + "length": 1 + }, + "cvtos390_020800": { + "description": "OS/390 R8", + "offset": 5, + "length": 1 + }, + "cvtos390_r8": { + "description": "OS/390 R8", + "offset": 5, + "length": 1 + }, + "cvth6608": { + "description": "OS/390 R8", + "offset": 5, + "length": 1 + }, + "cvtos390_020900": { + "description": "OS/390 R9", + "offset": 6, + "length": 1 + }, + "cvtos390_r9": { + "description": "OS/390 R9", + "offset": 6, + "length": 1 + }, + "cvtj6609": { + "description": "OS/390 R9", + "offset": 6, + "length": 1 + }, + "cvth6609": { + "description": "OS/390 R9", + "offset": 6, + "length": 1 + }, + "cvtos390_021000": { + "description": "OS/390 R10 functions are present", + "offset": 7, + "length": 1 + }, + "cvtos390_r10": { + "description": "OS/390 R10 functions are present", + "offset": 7, + "length": 1 + }, + "cvth7703": { + "description": "OS/390 R10 functions are present", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "cvtoslv3", + "description": "BYTE 3 OF CVTOSLVL", + "offset": 1517, + "length": 1, + "type": "bitstring", + "bitmasks": { + "cvtpause": { + "description": "Pause/Release services are present", + "offset": 0, + "length": 1 + }, + "cvtpaus2": { + "description": "IEAVAPE2 and related services, and Ownership options.", + "offset": 1, + "length": 1 + }, + "cvtzos": { + "description": "z/OS V1R1 functions are present This bit is on for all releases starting with z/OS release 1.", + "offset": 2, + "length": 1 + }, + "cvtzos_010100": { + "description": "z/OS V1R1 functions are present", + "offset": 2, + "length": 1 + }, + "cvtzos_v1r1": { + "description": "z/OS V1R1 functions are present", + "offset": 2, + "length": 1 + }, + "cvtj7713": { + "description": "", + "offset": 2, + "length": 1 + }, + "cvtlparc": { + "description": "LPAR Clustering is present.", + "offset": 2, + "length": 1 + }, + "cvtzos_010200": { + "description": "z/OS V1R2 functions are present", + "offset": 3, + "length": 1 + }, + "cvtzos_v1r2": { + "description": "z/OS V1R2 functions are present", + "offset": 3, + "length": 1 + }, + "cvth7705": { + "description": "HBB7705 functions are present", + "offset": 3, + "length": 1 + }, + "cvtv64": { + "description": "64-bit virtual services are present. You should ensure FLCARCH (in IHAPSA) is non-zero before using", + "offset": 3, + "length": 1 + }, + "cvtzos_010300": { + "description": "z/OS V1R3 functions are present", + "offset": 4, + "length": 1 + }, + "cvtzos_v1r3": { + "description": "z/OS V1R3 functions are present", + "offset": 4, + "length": 1 + }, + "cvth7706": { + "description": "HBB7706 functions are present", + "offset": 4, + "length": 1 + }, + "cvtzos_010400": { + "description": "z/OS V1R4 functions are present", + "offset": 5, + "length": 1 + }, + "cvtzos_v1r4": { + "description": "z/OS V1R4 functions are present", + "offset": 5, + "length": 1 + }, + "cvth7707": { + "description": "HBB7707 functions are present", + "offset": 5, + "length": 1 + }, + "cvtzos_010500": { + "description": "z/OS V1R5 functions are present", + "offset": 6, + "length": 1 + }, + "cvtzos_v1r5": { + "description": "z/OS V1R5 functions are present", + "offset": 6, + "length": 1 + }, + "cvth7708": { + "description": "HBB7708 functions are present", + "offset": 6, + "length": 1 + }, + "cvtzos_010600": { + "description": "z/OS V1R6 functions are present", + "offset": 7, + "length": 1 + }, + "cvtzos_v1r6": { + "description": "z/OS V1R6 functions are present", + "offset": 7, + "length": 1 + }, + "cvth7709": { + "description": "HBB7709 functions are present", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "cvtoslv4", + "description": "BYTE 4 OF CVTOSLVL", + "offset": 1518, + "length": 1, + "type": "bitstring", + "bitmasks": { + "cvtcsrsi": { + "description": "CSRSI service is available", + "offset": 0, + "length": 1 + }, + "cvtunics": { + "description": "Unicode callable services available", + "offset": 1, + "length": 1 + }, + "cvtcsrun": { + "description": "CSRUNIC callable service available", + "offset": 2, + "length": 1 + }, + "cvtilm": { + "description": "IBM License Manager functions are present", + "offset": 3, + "length": 1 + }, + "cvtalrs": { + "description": "ASN-and-LX-Reuse architecture is supported. It might not be enabled. See CVTALR.", + "offset": 4, + "length": 1 + }, + "cvttocp": { + "description": "TIMEUSED TIME_ON_CP", + "offset": 5, + "length": 1 + }, + "cvtziip": { + "description": "zIIP support is present", + "offset": 6, + "length": 1 + }, + "cvtsup": { + "description": "zIIP support is present", + "offset": 6, + "length": 1 + }, + "cvtifar": { + "description": "IFA routine is present", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "cvtoslv5", + "description": "BYTE 5 OF CVTOSLVL", + "offset": 1519, + "length": 1, + "type": "bitstring", + "bitmasks": { + "cvtzose": { + "description": "z/OS.e", + "offset": 0, + "length": 1 + }, + "cvtzosas": { + "description": "z/OS.e", + "offset": 0, + "length": 1 + }, + "cvtpuma": { + "description": "z/OS.e", + "offset": 0, + "length": 1 + }, + "cvtzos_010700": { + "description": "z/OS V1R7 functions are present", + "offset": 1, + "length": 1 + }, + "cvtzos_v1r7": { + "description": "z/OS V1R7 functions are present", + "offset": 1, + "length": 1 + }, + "cvth7720": { + "description": "HBB7720 functions are present", + "offset": 1, + "length": 1 + }, + "cvtzos_010800": { + "description": "z/OS V1R8 functions are present", + "offset": 2, + "length": 1 + }, + "cvtzos_v1r8": { + "description": "z/OS V1R8 functions are present", + "offset": 2, + "length": 1 + }, + "cvth7730": { + "description": "HBB7730 functions are present", + "offset": 2, + "length": 1 + }, + "cvtzos_010900": { + "description": "z/OS V1R9 functions are present", + "offset": 3, + "length": 1 + }, + "cvtzos_v1r9": { + "description": "z/OS V1R9 functions are present", + "offset": 3, + "length": 1 + }, + "cvth7740": { + "description": "HBB7740 functions are present", + "offset": 3, + "length": 1 + }, + "cvtzos_011000": { + "description": "z/OS V1R10 functions are present", + "offset": 4, + "length": 1 + }, + "cvtzos_v1r10": { + "description": "z/OS V1R10 functions are present", + "offset": 4, + "length": 1 + }, + "cvth7750": { + "description": "HBB7750 functions are present", + "offset": 4, + "length": 1 + }, + "cvtzos_011100": { + "description": "z/OS V1R11 functions are present", + "offset": 5, + "length": 1 + }, + "cvtzos_v1r11": { + "description": "z/OS V1R11 functions are present", + "offset": 5, + "length": 1 + }, + "cvt_g64cpu_infrastructure": { + "description": "G64CPU Infrastructure present", + "offset": 5, + "length": 1 + }, + "cvth7760": { + "description": "HBB7760 functions are present", + "offset": 5, + "length": 1 + }, + "cvtzos_011200": { + "description": "z/OS V1R12 functions are present", + "offset": 6, + "length": 1 + }, + "cvtzos_v1r12": { + "description": "z/OS V1R12 functions are present", + "offset": 6, + "length": 1 + }, + "cvth7770": { + "description": "HBB7770 functions are present", + "offset": 6, + "length": 1 + }, + "cvtzos_011300": { + "description": "z/OS V1R13 functions are present", + "offset": 7, + "length": 1 + }, + "cvtzos_v1r13": { + "description": "z/OS V1R13 functions are present", + "offset": 7, + "length": 1 + }, + "cvth7780": { + "description": "HBB7780 functions are present", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "cvtoslv6", + "description": "BYTE 6 OF CVTOSLVL", + "offset": 1520, + "length": 1, + "type": "bitstring", + "bitmasks": { + "cvtzos_020100": { + "description": "z/OS V2R1 functions are present", + "offset": 0, + "length": 1 + }, + "cvtzos_v2r1": { + "description": "z/OS V2R1 functions are present", + "offset": 0, + "length": 1 + }, + "cvth7790": { + "description": "HBB7790 functions are present", + "offset": 0, + "length": 1 + }, + "cvtzos_020200": { + "description": "z/OS V2R2 functions are present", + "offset": 1, + "length": 1 + }, + "cvtzos_v2r2": { + "description": "z/OS V2R2 functions are present", + "offset": 1, + "length": 1 + }, + "cvtpausemultiple": { + "description": "Pause Multiple", + "offset": 1, + "length": 1 + }, + "cvth77a0": { + "description": "HBB77A0 functions are present", + "offset": 1, + "length": 1 + }, + "cvtj778h": { + "description": "JBB778H functions are present", + "offset": 2, + "length": 1 + }, + "cvtzos_v1r13_jbb778h": { + "description": "JBB778H functions are present", + "offset": 2, + "length": 1 + }, + "cvtzos_011300_jbb778h": { + "description": "", + "offset": 2, + "length": 1 + }, + "cvtzos_020300": { + "description": "z/OS V2R3 functions are present", + "offset": 3, + "length": 1 + }, + "cvtzos_v2r3": { + "description": "z/OS V2R3 functions are present", + "offset": 3, + "length": 1 + }, + "cvth77b0": { + "description": "HBB77B0 functions are present", + "offset": 3, + "length": 1 + }, + "cvtzos_020400": { + "description": "z/OS V2R4 functions are present", + "offset": 4, + "length": 1 + }, + "cvtzos_v2r4": { + "description": "z/OS V2R4 functions are present", + "offset": 4, + "length": 1 + }, + "cvth77c0": { + "description": "HBB77C0 functions are present", + "offset": 4, + "length": 1 + }, + "cvtzos_020500": { + "description": "z/OS V2R5 functions are present", + "offset": 5, + "length": 1 + }, + "cvtzos_v2r5": { + "description": "z/OS V2R5 functions are present", + "offset": 5, + "length": 1 + }, + "cvth77d0": { + "description": "HBB77D0 functions are present", + "offset": 5, + "length": 1 + }, + "cvtzos_030100": { + "description": "z/OS V3R1 functions are present", + "offset": 6, + "length": 1 + }, + "cvtzos_v3r1": { + "description": "z/OS V3R1 functions are present", + "offset": 6, + "length": 1 + }, + "cvth77e0": { + "description": "HBB77E0 functions are present", + "offset": 6, + "length": 1 + }, + "cvtzos_030200": { + "description": "z/OS V3R2 functions are present", + "offset": 7, + "length": 1 + }, + "cvtzos_v3r2": { + "description": "z/OS V3R2 functions are present", + "offset": 7, + "length": 1 + }, + "cvth77f0": { + "description": "HBB77F0 functions are present", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "cvtoslv7", + "description": "BYTE 7 OF CVTOSLVL", + "offset": 1521, + "length": 1, + "type": "hex" + }, + { + "name": "cvtoslv8", + "description": "BYTE 8 OF CVTOSLVL", + "offset": 1522, + "length": 1, + "type": "bitstring", + "bitmasks": { + "cvtpaus3": { + "description": "IEA4xxxx", + "offset": 0, + "length": 1 + }, + "cvtpaus4": { + "description": "Pause with checkpoint-OK", + "offset": 1, + "length": 1 + }, + "cvtect1": { + "description": "TIMEUSED ECT=YES with TIME_ON_CP, OFFLOAD_TIME, OFFLOAD_ON_CP", + "offset": 2, + "length": 1 + }, + "cvtoocp": { + "description": "TIMEUSED with TIME_ON_CP and OFFLOAD_ON_CP", + "offset": 3, + "length": 1 + }, + "cvtiefopz": { + "description": "IEFOPZ", + "offset": 4, + "length": 1 + }, + "cvtboost": { + "description": "Support for BOOST system parameter is available", + "offset": 5, + "length": 1 + }, + "cvt_csvvoldsn": { + "description": "Support for OutVolDSN in CSVQUERY is available", + "offset": 6, + "length": 1 + }, + "cvt_rpilocallock": { + "description": "IEAVRPI/4RPI/VRPI2/4RPI2 support being called while holding LOCAL or CML lock", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "cvtoslv9", + "description": "BYTE 9 OF CVTOSLVL", + "offset": 1523, + "length": 1, + "type": "hex" + }, + { + "name": "cvtoslva", + "description": "BYTE 10 OF CVTOSLVL", + "offset": 1524, + "length": 1, + "type": "hex" + }, + { + "name": "cvtoslvb", + "description": "BYTE 11 OF CVTOSLVL", + "offset": 1525, + "length": 1, + "type": "hex" + }, + { + "name": "cvtoslvc", + "description": "BYTE 12 OF CVTOSLVL", + "offset": 1526, + "length": 1, + "type": "hex" + }, + { + "name": "cvtoslvd", + "description": "BYTE 13 OF CVTOSLVL", + "offset": 1527, + "length": 1, + "type": "hex" + }, + { + "name": "cvtoslve", + "description": "BYTE 14 OF CVTOSLVL", + "offset": 1528, + "length": 1, + "type": "hex" + }, + { + "name": "cvtoslvf", + "description": "BYTE 15 OF CVTOSLVL OS/VS2 - VIRTUAL STORAGE ADDRESS EXTENSION ADDRESS OF EXTENSION IS IN CVTSMEXT NOTE- ALL STARTING ADDRESSES POINT TO FIRST BYTE IN STORAGE AREA. ALL ENDING ADDRESSES POINT TO LAST BYTE WITHIN STORAGE AREA (NOT BEYOND STORAGE AREA).", + "offset": 1529, + "length": 1, + "type": "hex" + }, + { + "name": "cvtbldls", + "description": "RESERVED - WAS STARTING ADDRESS OF BLDL LIST. MUST BE ZERO NOW.", + "offset": 1530, + "length": 4, + "type": "address", + "pointsTo": "mlpa" + }, + { + "name": "cvtbldle", + "description": "RESERVED - WAS ENDING ADDRESS OF BLDL LIST. MUST BE ZERO NOW.", + "offset": 1534, + "length": 4, + "type": "address", + "pointsTo": "mlpa" + }, + { + "name": "cvtmlpas", + "description": "STARTING VIRTUAL ADDRESS OF MLPA.", + "offset": 1538, + "length": 4, + "type": "address", + "pointsTo": "mlpa" + }, + { + "name": "cvtmlpae", + "description": "ENDING VIRTUAL ADDRESS OF MLPA.", + "offset": 1542, + "length": 4, + "type": "address", + "pointsTo": "mlpa" + }, + { + "name": "cvtflpas", + "description": "STARTING VIRTUAL ADDRESS OF FLPA.", + "offset": 1546, + "length": 4, + "type": "address", + "pointsTo": "flpa" + }, + { + "name": "cvtflpae", + "description": "ENDING VIRTUAL ADDRESS OF FLPA.", + "offset": 1550, + "length": 4, + "type": "address", + "pointsTo": "flpa" + }, + { + "name": "cvtplpas", + "description": "STARTING VIRTUAL ADDRESS OF PLPA.", + "offset": 1554, + "length": 4, + "type": "address", + "pointsTo": "plpa" + }, + { + "name": "cvtplpae", + "description": "ENDING VIRTUAL ADDRESS OF PLPA.", + "offset": 1558, + "length": 4, + "type": "address", + "pointsTo": "plpa" + }, + { + "name": "cvtrwns", + "description": "STARTING VIRTUAL ADDRESS OF READ-WRITE NUCLEUS. (MDCXXX)", + "offset": 1562, + "length": 4, + "type": "address" + }, + { + "name": "cvtrwne", + "description": "ENDING VIRTUAL ADDRESS OF READ-WRITE NUCLEUS. (MDCXXX)", + "offset": 1566, + "length": 4, + "type": "address" + }, + { + "name": "cvtrons", + "description": "STARTING VIRTUAL ADDRESS OF READ-ONLY NUCLEUS. (MDCXXX)", + "offset": 1570, + "length": 4, + "type": "address" + }, + { + "name": "cvtrone", + "description": "ENDING VIRTUAL ADDRESS OF READ-ONLY NUCLEUS. (MDCXXX)", + "offset": 1574, + "length": 4, + "type": "address" + }, + { + "name": "cvterwns", + "description": "STARTING EXTENDED ADDRESS READ/WRITE NUCLEUS.", + "offset": 1578, + "length": 4, + "type": "address" + }, + { + "name": "cvterwne", + "description": "ENDING EXTENDED ADDRESS READ/WRITE NUCLEUS.", + "offset": 1582, + "length": 4, + "type": "address" + }, + { + "name": "cvteplps", + "description": "Starting virtual address of extended PLPA. This is an interface for accessing the LPAT only.", + "offset": 1586, + "length": 4, + "type": "address" + }, + { + "name": "cvteplpe", + "description": "ENDING VIRTUAL ADDRESS OF EXTENDED PLPA.", + "offset": 1590, + "length": 4, + "type": "address" + }, + { + "name": "cvteflps", + "description": "STARTING VIRTUAL ADDRESS OF EXTENDED FLPA.", + "offset": 1594, + "length": 4, + "type": "address" + }, + { + "name": "cvteflpe", + "description": "ENDING VIRTUAL ADDRESS OF EXTENDED FLPA.", + "offset": 1598, + "length": 4, + "type": "address" + }, + { + "name": "cvtemlps", + "description": "STARTING VIRTUAL ADDRESS OF EXTENDED MLPA.", + "offset": 1602, + "length": 4, + "type": "address" + }, + { + "name": "cvtemlpe", + "description": "ENDING VIRTUAL ADDRESS OF EXTENDED MLPA.", + "offset": 1606, + "length": 4, + "type": "address" + }, + { + "name": "cvtfachn", + "description": "ADDRESS OF CHAIN OF DCB FIELD AREAS (ISAM).", + "offset": 1610, + "length": 4, + "type": "address", + "pointsTo": "chain" + }, + { + "name": "cvt1r004", + "description": "RESERVED", + "offset": 1614, + "length": 8, + "type": "hex" + }, + { + "name": "cvt2r000", + "description": "RESERVED", + "offset": 1622, + "length": 4, + "type": "hex" + }, + { + "name": "cvtnucls", + "description": "IDENTIFICATION OF THE NUCLEUS MEMBER NAME", + "offset": 1626, + "length": 1, + "type": "string" + }, + { + "name": "cvtflgbt", + "description": "Flag byte. This byte is an interface only for bits CVTUNDzVM (CVTUNDVM), CVTzPDT CVTUNDAltVM, CVTzPDT & CVTVMENV", + "offset": 1627, + "length": 1, + "type": "bitstring", + "bitmasks": { + "cvtnpe": { + "description": "INDICATES NON-PAGING ENVIRONMENT (VM HANDSHAKING) (OS/VS1)", + "offset": 0, + "length": 1 + }, + "cvtvme": { + "description": "INDICATES MACHINE IS OPERATING IN VM ENVIRONMENT (OS/VS1)", + "offset": 1, + "length": 1 + }, + "cvtbah": { + "description": "INDICATES THAT THE VM/370 - OS/VS1 BTAM AUTOPOLL HANDSHAKE IS OPERATIONAL (OS/VS1)", + "offset": 2, + "length": 1 + }, + "cvtundzvm": { + "description": "Running under z/VM (this is not the same as running under VICOM) Bit is set to 0 when CVTUNDAltVM is 1.", + "offset": 3, + "length": 1 + }, + "cvtundvm": { + "description": "Same as CVTUNDzVM", + "offset": 3, + "length": 1 + }, + "cvtvicom": { + "description": "Running under VICOM", + "offset": 4, + "length": 1 + }, + "cvtzpdt": { + "description": "Running on zPDT (includes running on zD&T)", + "offset": 5, + "length": 1 + }, + "cvtundaltvm": { + "description": "Running under an alternate virtual machine environment. To determine which alternate virtual machine, the STSI output will list the control program identifier in field SI22V3DBCPIdentifier mapped by CSRSIIDF and can be obtained by the CSRSI service. Bit is set to 0 when CVTUNDzVM is 1", + "offset": 6, + "length": 1 + }, + "cvtvmenv": { + "description": "Running as a virtual machine environment. Bit is set to 1 when CVTUNDzVM or CVTUNDAltVM is set to 1", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "cvtiocid", + "description": "EBCDIC IDENTIFIER OF THE ACTIVE I/O CONFIGURATION SPECIFIED BY THE OPERATOR", + "offset": 1628, + "length": 2, + "type": "hex" + }, + { + "name": "cvtdebvr", + "description": "ADDRESS OF BRANCH ENTRY POINT OF DEB VALIDITY CHECK ROUTINE (ICB380)", + "offset": 1630, + "length": 4, + "type": "address", + "pointsTo": "branch" + }, + { + "name": "cvtcvaf", + "description": "POINTER TO THE CVAF TABLE, WHICH CONTAINS THE CVAF BRANCH ENTRY ADDRESS AND NEXT VIB ADDRESS.", + "offset": 1634, + "length": 4, + "type": "address", + "pointsTo": "csa" + }, + { + "name": "cvtmmvt", + "description": "ADDRESS OF THE MEDIA MANAGER VECTOR TABLE", + "offset": 1638, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "cvtncvp", + "description": "ADDRESS OF CSA BUFFER POOL - USED BY NETWORK MANAGEMENT FACILITY (NMF)", + "offset": 1642, + "length": 4, + "type": "address", + "pointsTo": "csa" + }, + { + "name": "cvtqid", + "description": "SAME AS CVTQIDA BELOW", + "offset": 1646, + "length": 4, + "type": "address" + }, + { + "name": "cvtqida", + "description": "ADDRESS OF QUEUE IDENTIFICATION (QID) TABLE PREFIX", + "offset": 1647, + "length": 3, + "type": "hex" + }, + { + "name": "cvtoltep", + "description": "POINTER TO CONTROL BLOCK CREATED BY SVC 59 TO POINT TO PSEUDO-DEB'S", + "offset": 1650, + "length": 4, + "type": "address", + "pointsTo": "control" + }, + { + "name": "cvt2r020", + "description": "RESERVED", + "offset": 1654, + "length": 4, + "type": "bitstring", + "bitmasks": { + "cvtavin": { + "description": "INDICATES AVM INSTALLED", + "offset": 24, + "length": 1 + } + } + }, + { + "name": "cvtavvt", + "description": "ADDRESS OF AVM CONTROL BLOCK OWNERSHIP: AVM SERIALIZATION: CS", + "offset": 1658, + "length": 4, + "type": "address" + }, + { + "name": "cvtccvt", + "description": "ADDRESS OF CRYPTOGRAPHIC FACILITY CVT", + "offset": 1659, + "length": 4, + "type": "address" + }, + { + "name": "cvtskta", + "description": "ADDRESS OF STORAGE KEY TABLE (VM HANDSHAKING) (OS/VS1)", + "offset": 1662, + "length": 4, + "type": "address", + "pointsTo": "storage" + }, + { + "name": "cvticb", + "description": "ADDRESS OF MASS STORAGE SYSTEM (MSS) CONTROL BLOCK", + "offset": 1666, + "length": 4, + "type": "address", + "pointsTo": "mass" + }, + { + "name": "cvtfbyt1", + "description": "FLAG BYTE", + "offset": 1670, + "length": 1, + "type": "bitstring", + "bitmasks": { + "cvtrde": { + "description": "RELIABILITY DATA EXTRACTOR INDICATOR OWNERSHIP: DFP. SERIALIZATION: NONE.", + "offset": 0, + "length": 1 + } + } + }, + { + "name": "cvt2r035", + "description": "RESERVED CVTLDTO contains the offset value needed to adjust the TOD value to the local date and time of day. It is similar to CVTTZ except that CVTLDTO is a doubleword value. CVTLDTOL and CVTTZ contain the same value.", + "offset": 1671, + "length": 3, + "type": "bitstring", + "bitmasks": { + "cvtatact": { + "description": "IF ON, VTAM IS ACTIVE", + "offset": 16, + "length": 1 + } + } + }, + { + "name": "cvtldto", + "description": "LOCAL TIME/DATE OFFSET", + "offset": 1674, + "length": 8, + "type": "hex" + }, + { + "name": "cvtldtol", + "description": "HIGH WORD", + "offset": 1674, + "length": 4, + "type": "hex", + "pointsTo": "vtam" + }, + { + "name": "cvtldtor", + "description": "LOW WORD", + "offset": 1678, + "length": 4, + "type": "hex", + "pointsTo": "vtam" + }, + { + "name": "cvtatcvt", + "description": "POINTER TO VTAM'S CVT", + "offset": 1682, + "length": 4, + "type": "address", + "pointsTo": "vtam" + }, + { + "name": "cvt2r044", + "description": "RESERVED", + "offset": 1686, + "length": 4, + "type": "hex" + }, + { + "name": "cvtbclmt", + "description": "NUMBER OF 130-BYTE RECORDS SET ASIDE FOR BROADCAST MESSAGES", + "offset": 1690, + "length": 4, + "type": "signed-integer" + }, + { + "name": "cvt2r04c", + "description": "RESERVED", + "offset": 1694, + "length": 4, + "type": "signed-integer" + }, + { + "name": "cvtlso", + "description": "LEAP SECOND OFFSET IN TOD FORMAT", + "offset": 1698, + "length": 8, + "type": "hex" + }, + { + "name": "cvtlsoh", + "description": "HIGH WORD", + "offset": 1698, + "length": 4, + "type": "hex" + }, + { + "name": "cvtlsol", + "description": "LOW WORD", + "offset": 1702, + "length": 4, + "type": "hex" + }, + { + "name": "cvt2r058", + "description": "RESERVED", + "offset": 1706, + "length": 44, + "type": "hex" + } + ] +} \ No newline at end of file diff --git a/cbxp/mappings/ecvt.json b/cbxp/mappings/ecvt.json new file mode 100644 index 0000000..90978c8 --- /dev/null +++ b/cbxp/mappings/ecvt.json @@ -0,0 +1,2266 @@ +{ + "version": 1, + "name": "ecvt", + "commonName": "Extended Communications Vector Table", + "macroId": "ihaecvt", + "description": "", + "aliases": [], + "pointedToBy": [ + "cvt" + ], + "storageAttributes": { + "subpools": [], + "key": 0, + "residency": "EXTENDED NUCLEUS, Above 16M line" + }, + "controlBlock": [ + { + "name": "ecvtecvt", + "description": "ECVT ACRONYM", + "offset": 0, + "length": 4, + "type": "string" + }, + { + "name": "ecvtcplx", + "description": "ADDRESS OF IXCCPLX CONTROL BLOCK. OWNERSHIP: XCF. SERIALIZATION: N/A.", + "offset": 4, + "length": 4, + "type": "address", + "pointsTo": "ixccplx" + }, + { + "name": "ecvtsplx", + "description": "SYSPLEX NAME USED FOR DEBUGGING. OWNERSHIP: XCF. SERIALIZATION: N/A.", + "offset": 8, + "length": 8, + "type": "string" + }, + { + "name": "ecvtsple", + "description": "SYSPLEX PARTITIONING ECB THAT IS POSTED TO WAKE UP THE SYSPLEX PARTITIONING MANAGER. OWNERSHIP: XCF. SERIALIZATION: SYSPLEX PARTITIONING TASK.", + "offset": 16, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ecvtsplq", + "description": "SYSPLEX PARTITIONING QUEUE. CONTAINS SYSPLEX PARTITIONING WORK ELEMENTS. OWNERSHIP: XCF. SERIALIZATION: COMPARE AND SWAP.", + "offset": 20, + "length": 4, + "type": "address", + "pointsTo": "tstc" + }, + { + "name": "ecvtstc1", + "description": "STCKSYNC, NON-AR MODE, NO ETRID REQUESTED. OWNERSHIP: TIMER. SERIALIZATION: NONE.", + "offset": 24, + "length": 4, + "type": "address", + "pointsTo": "tstc" + }, + { + "name": "ecvtstc2", + "description": "STCKSYNC, NON-AR MODE, ETRID REQUESTED. OWNERSHIP: TIMER. SERIALIZATION: NONE.", + "offset": 28, + "length": 4, + "type": "address", + "pointsTo": "tstc" + }, + { + "name": "ecvtstc3", + "description": "STCKSYNC, AR MODE, NO ETRID REQUESTED. OWNERSHIP: TIMER. SERIALIZATION: NONE.", + "offset": 32, + "length": 4, + "type": "address", + "pointsTo": "tstc" + }, + { + "name": "ecvtstc4", + "description": "STCKSYNC, AR MODE, ETRID REQUESTED. OWNERSHIP: TIMER. SERIALIZATION: NONE.", + "offset": 36, + "length": 4, + "type": "address", + "pointsTo": "tstc" + }, + { + "name": "ecvtappc", + "description": "ANCHOR FOR APPC DATA STRUCTURES OWNERSHIP: MVS/APPC SERIALIZATION: NONE", + "offset": 40, + "length": 4, + "type": "address" + }, + { + "name": "ecvtsch", + "description": "ANCHOR FOR APPC SCHEDULER DATA STRUCTURES OWNERSHIP: MVS/APPC SERIALIZATION: NONE", + "offset": 44, + "length": 4, + "type": "address" + }, + { + "name": "ecvtiosf", + "description": "IOS FLAGS OWNERSHIP: IOS", + "offset": 48, + "length": 4, + "type": "hex" + }, + { + "name": "ecvtios1", + "description": "IOS FLAGS BYTE 1 SERIALIZATION: NONE", + "offset": 48, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ecvtchsc": { + "description": "RESERVED FOR IBM USE", + "offset": 0, + "length": 1 + } + } + }, + { + "name": "ecvtios2", + "description": "RESERVED.", + "offset": 49, + "length": 1, + "type": "hex" + }, + { + "name": "ecvtios3", + "description": "RESERVED.", + "offset": 50, + "length": 1, + "type": "hex" + }, + { + "name": "ecvtios4", + "description": "RESERVED.", + "offset": 51, + "length": 1, + "type": "hex" + }, + { + "name": "ecvtomda", + "description": "ADDRESS OF THE OPERATIONS MEASUREMENT DATA GATHERER IEAVG708. OWNERSHIP: CONSOLE SERVICES. SERIALIZATION: NONE.", + "offset": 52, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "ecvtcsvn", + "description": "Counter Second Version Number for CPU counter facility", + "offset": 56, + "length": 2, + "type": "hex" + }, + { + "name": "ecvtcnz", + "description": "Ownership: Consoles Serialization: CS", + "offset": 58, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ecvtwtov": { + "description": "Allow Verbose messages", + "offset": 0, + "length": 1 + } + } + }, + { + "name": "ecvtaloc", + "description": "Ownership: Allocation Serialization: None (Set during NIP)", + "offset": 59, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ecvtwarn": { + "description": "Warn about allocations that specify 2-digit expiration years", + "offset": 0, + "length": 1 + }, + "ecvtfail": { + "description": "Fail allocations that specify 2-digit expiration years", + "offset": 1, + "length": 1 + } + } + }, + { + "name": "ecvtbpms", + "description": "BELOW 16M, PAGEABLE DEVICE SUPPORT MODULES, STARTING ADDRESS. OWNERSHIP: CONTENTS SUPERVISION. SERIALIZATION: NONE.", + "offset": 60, + "length": 4, + "type": "address" + }, + { + "name": "ecvtbpme", + "description": "BELOW 16M, PAGEABLE DEVICE SUPPORT MODULES, ENDING ADDRESS. OWNERSHIP: CONTENTS SUPERVISION. SERIALIZATION: NONE.", + "offset": 64, + "length": 4, + "type": "address" + }, + { + "name": "ecvtapms", + "description": "ABOVE 16M, PAGEABLE DEVICE SUPPORT MODULES, STARTING ADDRESS. OWNERSHIP: CONTENTS SUPERVISION. SERIALIZATION: NONE.", + "offset": 68, + "length": 4, + "type": "address" + }, + { + "name": "ecvtapme", + "description": "ABOVE 16M, PAGEABLE DEVICE SUPPORT MODULES, ENDING ADDRESS. OWNERSHIP: CONTENTS SUPERVISION. SERIALIZATION: NONE.", + "offset": 72, + "length": 4, + "type": "address" + }, + { + "name": "ecvtqucb", + "description": "XCF DATA AREA (IXCYQUCB) ANCHOR. OWNERSHIP: XCF. SERIALIZATION: N/A.", + "offset": 76, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "ecvtssdd", + "description": "DOUBLE WORD USED TO COMPARE DOUBLE AND SWAP ECVTSSDF AND ECVTSSDS. SERIALIZATION: CDS. OWNERSHIP: SUPERVISOR CONTROL.", + "offset": 80, + "length": 8, + "type": "hex" + }, + { + "name": "ecvtssdf", + "description": "THE ADDRESS OF THE FREE SSD QUEUE. SERIALIZATION: CS WHEN ADDING AN SSD TO THE FREE QUEUE. CDS ON ECVTSSDD WHEN REMOVING AN SSD FROM THE FREE QUEUE. OWNERSHIP: SUPERVISOR CONTROL.", + "offset": 80, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "ecvtssds", + "description": "F'0' - SEQUENCE NUMBER INCREMENTED WHEN SSDS ARE REMOVED FROM THE FREE SSD QUEUE. USED TO SERIALIZE THE FREE SSD QUEUE. OWNERSHIP: SUPERVISOR CONTROL.", + "offset": 84, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ecvt_customer_area_addr", + "description": "Customer Area Address. -", + "offset": 88, + "length": 4, + "type": "address", + "pointsTo": "vecaa" + }, + { + "name": "ecvtsrbt", + "description": "THE ADDRESS OF THE SSD RESOURCE MANAGER. OWNERSHIP: SUPERVISOR CONTROL.", + "offset": 92, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "ecvtdpqh", + "description": "Queue of DU-AL Pools (DPHs) Ownership: PC Auth Serialization: Disp lock", + "offset": 96, + "length": 4, + "type": "address" + }, + { + "name": "ecvttcre", + "description": "IEAVTCRE ENTRY POINT ADDRESS. OWNERSHIP: ACR. SERIALIZATION: NONE.", + "offset": 100, + "length": 4, + "type": "address" + }, + { + "name": "ecvtxcfg", + "description": "SYSPLEX CONFIGURATION REQUIREMENTS. OWNERSHIP: XCF. SERIALIZATION: SYSTEM INITIALIZATION.", + "offset": 104, + "length": 16, + "type": "hex" + }, + { + "name": "ecvtr078", + "description": "RESERVED. DO NOT USE.", + "offset": 120, + "length": 4, + "type": "address", + "pointsTo": "vscha" + }, + { + "name": "ecvtr07c", + "description": "RESERVED. DO NOT USE.", + "offset": 124, + "length": 4, + "type": "address", + "pointsTo": "vscha" + }, + { + "name": "ecvtscha", + "description": "THE ADDRESS OF IEAVSCHA. SCHEDULE WITH ADDRESSABILITY. OWNERSHIP: SUPERVISOR CONTROL. SERIALIZATION: NONE.", + "offset": 128, + "length": 4, + "type": "address", + "pointsTo": "vscha" + }, + { + "name": "ecvthfxs", + "description": "Address of IEAHFSXV", + "offset": 132, + "length": 4, + "type": "address", + "pointsTo": "hfxsv" + }, + { + "name": "ecvtdlcb", + "description": "Address of DLCB (CSVDLCB) for the current LNKLST set. Serialization: ENQ Ownership: CSV", + "offset": 136, + "length": 4, + "type": "address", + "pointsTo": "dlcb" + }, + { + "name": "ecvtnttp", + "description": "ADDRESS OF SYSTEM LEVEL NAME/TOKEN HEADER. OWNERSHIP: SUPERVISOR CONTROL. SERIALIZATION: CMS LOCK.", + "offset": 140, + "length": 4, + "type": "address", + "pointsTo": "vjoin" + }, + { + "name": "ecvtsrbj", + "description": "SRB-mode enclave join - A value of 0 in ECVTSRBJ means that the function is not available - Caller must be AMODE 31 or 64, key 0, supervisor state, enabled for I/O and external interrupts, holding no locks - SRB mode (preemptible non-Client SRB only) - Primary ASC mode - Any P, Any S, Any H - Set GR 1 to the below-2G address of the 8-byte enclave token. Bits 0-31 of 64-bit", + "offset": 144, + "length": 4, + "type": "address", + "pointsTo": "vjoin" + }, + { + "name": "ecvtsrbl", + "description": "SRB-mode enclave leave - A value of 0 in ECVTSRBL means that the function is not available - Caller must be AMODE 31 or 64, key 0, supervisor state, enabled for I/O and external interrupts, holding no locks - SRB mode - Primary ASC mode - Any P, Any S, Any H - Set GR 1 to the below-2G address of the 8-byte enclave token. Bits 0-31 of 64-bit", + "offset": 148, + "length": 4, + "type": "address", + "pointsTo": "vleav" + }, + { + "name": "ecvtmsch", + "description": "THE ADDRESS OF SLM MESSAGE SUBCHANNEL LIST. OWNERSHIP: SYSTEM LOCK MANAGER SERIALIZATION: NIP.", + "offset": 152, + "length": 4, + "type": "address", + "pointsTo": "slm" + }, + { + "name": "ecvtcal", + "description": "THE ADDRESS OF SLM COMMON AREA LIST. OWNERSHIP: SYSTEM LOCK MANAGER SERIALIZATION: NIP.", + "offset": 156, + "length": 4, + "type": "address", + "pointsTo": "slm" + }, + { + "name": "ecvtload", + "description": "EDITED MVS LOAD PARAMETER OWNERSHIP: IPL. SERIALIZATION: NONE.", + "offset": 160, + "length": 8, + "type": "bitstring", + "bitmasks": { + "ecvtomvs": { + "description": "If on, OpenMVS is up and available.", + "offset": 56, + "length": 1 + } + } + }, + { + "name": "ecvtmlpr", + "description": "LOAD parameter used for this IPL. OWNERSHIP: IPL. SERIALIZATION: NONE.", + "offset": 168, + "length": 8, + "type": "hex", + "pointsTo": "block" + }, + { + "name": "ecvttcp", + "description": "Token used by TCP/IP OWNERSHIP: TCPIP SERIALIZATION: Compare and Swap during TCPIP initialization", + "offset": 176, + "length": 4, + "type": "address", + "pointsTo": "block" + }, + { + "name": "ecvthisnmt", + "description": "HISMT Service", + "offset": 180, + "length": 4, + "type": "address", + "pointsTo": "block" + }, + { + "name": "ecvtnvdm", + "description": "NETVIEW DM TCP ID BLOCK POINTER OWNERSHIP: NETVIEW DISTRIBUTION MANAGER. SERIALIZATION: NONE.", + "offset": 184, + "length": 4, + "type": "address", + "pointsTo": "block" + }, + { + "name": "ecvtr0bc", + "description": "RESERVED. DO NOT USE.", + "offset": 188, + "length": 4, + "type": "hex", + "pointsTo": "block" + }, + { + "name": "ecvtgrmp", + "description": "GRM DATA BLOCK POINTER OWNERSHIP: GRAPHICS RESOURCE MONITOR SERIALIZATION: TEST AND SET ON THE HIGH ORDER BYTE.", + "offset": 192, + "length": 4, + "type": "address", + "pointsTo": "block" + }, + { + "name": "ecvtwlm", + "description": "WLM VECTOR TABLE POINTER OWNERSHIP: WLM. SERIALIZATION: NONE.", + "offset": 196, + "length": 4, + "type": "address", + "pointsTo": "table" + }, + { + "name": "ecvtcsm", + "description": "Pointer to Communication Storage Manager control structure OWNERSHIP: VTAM (Communications Storage Manager(CSM)) SERIALIZATION: ENQUEUE/DEQUEUE", + "offset": 200, + "length": 4, + "type": "address" + }, + { + "name": "ecvtctbl", + "description": "Customer anchor table. Slots assigned by IBM. Ownership: Callable Services. Serialization: None", + "offset": 204, + "length": 4, + "type": "address" + }, + { + "name": "ecvtpmcs", + "description": "STATUS SET,MC,PROCESS SERVICE ROUTINE ADDRESS. OWNERSHIP: SUPERVISOR CONTROL. SERIALIZATION: NONE.", + "offset": 208, + "length": 4, + "type": "address", + "pointsTo": "vpmcs" + }, + { + "name": "ecvtpmcr", + "description": "STATUS RESET,MC,PROCESS SERVICE ROUTINE ADDRESS WITHIN MODULE IEAVFMCS. OWNERSHIP: SUPERVISOR CONTROL. SERIALIZATION: NONE.", + "offset": 212, + "length": 4, + "type": "address", + "pointsTo": "vpmcr" + }, + { + "name": "ecvtstx1", + "description": "STAX DEFER=YES,LINKAGE=BRANCH SERVICE ROUTINE ADDRESS. OWNERSHIP: RCT. SERIALIZATION: NONE.", + "offset": 216, + "length": 4, + "type": "address", + "pointsTo": "vax" + }, + { + "name": "ecvtstx2", + "description": "STAX DEFER=NO,LINKAGE=BRANCH SERVICE ROUTINE ADDRESS WITHIN MODULE IEAVAX01. OWNERSHIP: RCT. SERIALIZATION: NONE.", + "offset": 220, + "length": 4, + "type": "address", + "pointsTo": "vax" + }, + { + "name": "ecvtslid", + "description": "CONTAINS THE SLIP PER TRAP ID OR BINARY ZEROS. OWNERSHIP: SLIP SERIALIZATION: NONE.", + "offset": 224, + "length": 4, + "type": "hex", + "pointsTo": "vexpm" + }, + { + "name": "ecvtcsvt", + "description": "CSV TABLE. OWNERSHIP: CSV SERIALIZATION: SET DURING NIP", + "offset": 228, + "length": 4, + "type": "address", + "pointsTo": "vexpm" + }, + { + "name": "ecvtasa", + "description": "ASA TABLE. OWNERSHIP: ASA SERIALIZATION: SET DURING NIP", + "offset": 232, + "length": 4, + "type": "address", + "pointsTo": "vexpm" + }, + { + "name": "ecvtexpm", + "description": "GETXSB SERVICE ROUTINE. OWNERSHIP: SUPERVISOR CONTROL. SERIALIZATION: NONE.", + "offset": 236, + "length": 4, + "type": "address", + "pointsTo": "vexpm" + }, + { + "name": "ecvtocvt", + "description": "ANCHOR FOR OpenMVS COMMUNICATION VECTOR TABLE. OWNERSHIP: OpenMVS. SERIALIZATION: COMPARE AND SWAP DURING OpenMVS INITIALIZATION.", + "offset": 240, + "length": 4, + "type": "address" + }, + { + "name": "ecvtoext", + "description": "ANCHOR FOR OpenMVS EXTERNAL DATA THAT NEEDS TO BE ACCESSED BY NON-MVS CODE. OWNERSHIP: OpenMVS. SERIALIZATION: COMPARE AND SWAP DURING OpenMVS INITIALIZATION. (NEVER CHANGED AFTER INITIALIZATION)", + "offset": 244, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "ecvtcmps", + "description": "Address of the Compression Service routine. OWNERSHIP: Callable Services. SERIALIZATION: None.", + "offset": 248, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "ecvtnucp", + "description": "Pointer to nucleus dataset name, VOL=SER, and its UCB. OWNERSHIP: NIP SERIALIZATION: None.", + "offset": 252, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "ecvtxrat", + "description": "XES anchor table for branch entry routine addresses. OWNERSHIP: XES. SERIALIZATION: None.", + "offset": 256, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "ecvtpwvt", + "description": "Address of the Processor Workunit Queue Vector Table (PWVT). SERIALIZATION: None. OWNERSHIP: Supervisor Control", + "offset": 260, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "ecvtclon", + "description": "1 or 2 character value used to identify a system within a sysplex. Valid values are A-Z, 0-9, $, @, #. Not valid if blank. Serialization: None. Ownership: Supervisor Control.", + "offset": 264, + "length": 2, + "type": "string" + }, + { + "name": "ecvtgmod", + "description": "GRS mode of operation OWNERSHIP: GRS. SERIALIZATION: None.", + "offset": 266, + "length": 1, + "type": "hex" + }, + { + "name": "ecvtlpdelen", + "description": "Length of LPDE", + "offset": 267, + "length": 1, + "type": "hex" + }, + { + "name": "ecvtducu", + "description": "DUCT update", + "offset": 268, + "length": 4, + "type": "address", + "pointsTo": "vducu" + }, + { + "name": "ecvtalck", + "description": "ALIAS check", + "offset": 272, + "length": 4, + "type": "address", + "pointsTo": "valck" + }, + { + "name": "ecvtsxmp", + "description": "IEAMSXMP target. This field is an interface only for determining if IEAMSXMP may be used. When this field is 0, IEAMSXMP may not be used, otherwise it may be.", + "offset": 276, + "length": 4, + "type": "address", + "pointsTo": "vsxmp" + }, + { + "name": "ecvtr118", + "description": "RESERVED.", + "offset": 280, + "length": 2, + "type": "hex" + }, + { + "name": "ecvtptim", + "description": "Time value for Parallel Detach processing OWNERSHIP: RTM SERIALIZATION: None", + "offset": 282, + "length": 2, + "type": "signed-integer" + }, + { + "name": "ecvtjcct", + "description": "Address of the JES communication control table. OWNERSHIP: JES. SERIALIZATION: None.", + "offset": 284, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "ecvtlsab", + "description": "Pointer to Logger Services Anchor Block. Mapped by IXGPLSAB macro. OWNERSHIP: IXG. SERIALIZATION: None.", + "offset": 288, + "length": 4, + "type": "address", + "pointsTo": "logger" + }, + { + "name": "ecvtetpe", + "description": "Addr of routine IEAVETPE. Serialization: None. Ownership: Supervisor Control", + "offset": 292, + "length": 4, + "type": "address", + "pointsTo": "vetpe" + }, + { + "name": "ecvtsymt", + "description": "Address of the system static symbol table. The system static symbol table is mapped by dsect SYMBT within ASASYMBP. The table is preceded by an area mapped by dsect SYMBTH within ASASYMBP. Serialization: None. Ownership: NIP", + "offset": 296, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "ecvtesym", + "description": "Address of IEAVESYM routine. Serialization: None. Ownership: NIP", + "offset": 300, + "length": 4, + "type": "address", + "pointsTo": "vesym" + }, + { + "name": "ecvtflgs", + "description": "Miscellaneous Flags Serialization: None. Ownership: NIP", + "offset": 304, + "length": 4, + "type": "hex" + }, + { + "name": "ecvtflg1", + "description": "First miscellaneous flag Serialization: None. Ownership: NIP", + "offset": 304, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ecvtclnu": { + "description": "When set, this flag indicates that the system static symbol &SYSCLONE value defined in an IEASYMxx member used for this IPL must be unique in the SYSPLEX. Serialization: None. Ownership: NIP", + "offset": 0, + "length": 1 + }, + "ecvtpmac": { + "description": "Serialization: None. Ownership: NIP", + "offset": 1, + "length": 1 + } + } + }, + { + "name": "ecvtesy1", + "description": "Address of routine IEAVESY1. Serialization: None. Ownership: NIP", + "offset": 308, + "length": 4, + "type": "address", + "pointsTo": "vesy" + }, + { + "name": "ecvtpetm", + "description": "Addr of routine IEAVPETM Serialization: None Ownership: Supervisor Control", + "offset": 312, + "length": 4, + "type": "address", + "pointsTo": "vpetm" + }, + { + "name": "ecvtetpt", + "description": "Addr of routine IEAVETPT Serialization: None Ownership: Supervisor Control", + "offset": 316, + "length": 4, + "type": "address", + "pointsTo": "vetpt" + }, + { + "name": "ecvtenvt", + "description": "Pointer to Enclave Vector Table (ENVT). OWNERSHIP: SRM SERIALIZATION: SRM lock, if updated after NIP", + "offset": 320, + "length": 4, + "type": "address", + "pointsTo": "enclave" + }, + { + "name": "ecvtvser", + "description": "Reserved for use by VSE Ownership: VSE Serialization: none", + "offset": 324, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ecvtlsen", + "description": "Address of module IEAVLSEN", + "offset": 328, + "length": 4, + "type": "address", + "pointsTo": "vlsen" + }, + { + "name": "ecvtdgnb", + "description": "Address of DGNB Serialization: None. Ownership: VSM", + "offset": 332, + "length": 4, + "type": "address", + "pointsTo": "dgnb" + }, + { + "name": "ecvthdnm", + "description": "Hardware name of the processor configuration. Serialization: None. Ownership: NIP", + "offset": 336, + "length": 8, + "type": "string" + }, + { + "name": "ecvtlpnm", + "description": "LPAR name of the processor configuration. This field is blanks if processor is not in LPAR mode. Serialization: None. Ownership: NIP", + "offset": 344, + "length": 8, + "type": "string" + }, + { + "name": "ecvtvmnm", + "description": "z/VM user id of the virtual machine, of which this z/OS image is a guest. This field is blanks if the processor is not a guest under z/VM (such as running under PR/SM or an alternate VM). Serialization: None. Ownership: NIP", + "offset": 352, + "length": 8, + "type": "string" + }, + { + "name": "ecvtgrm", + "description": "Address of routine CRG52GRM Serialization: None. Ownership: Context Services", + "offset": 360, + "length": 4, + "type": "address", + "pointsTo": "routine" + }, + { + "name": "ecvtseif", + "description": "Address of routine CRG52SEI. Serialization: None. Ownership: Context Services", + "offset": 364, + "length": 4, + "type": "address", + "pointsTo": "routine" + }, + { + "name": "ecvtaes", + "description": "Address of routine IEAVEAES. Serialization: None. Ownership: Supervisor Control", + "offset": 368, + "length": 4, + "type": "address", + "pointsTo": "veaes" + }, + { + "name": "ecvtrsmt", + "description": "Address of registration services management table. Serialization: None. Ownership: Context Services", + "offset": 372, + "length": 4, + "type": "address" + }, + { + "name": "ecvtmmem", + "description": "Exit manager name of the mvs miscellaneous event exit manager Serialization: None. Ownership: Supervisor Control", + "offset": 376, + "length": 16, + "type": "string" + }, + { + "name": "ecvtipa", + "description": "Address of the Initialization Parameter Area Serialization: None. Ownership: NIP", + "offset": 392, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "ecvtmmet", + "description": "Exit Manager Token of the MVS Miscellaneous Event Exit Manager Serialization: None. Ownership: Supervisor Control", + "offset": 396, + "length": 16, + "type": "hex" + }, + { + "name": "ecvtmmeq", + "description": "MVS Miscellaneous Event Exit Manager RM_TOKEN Queue Serialization: REGSRV EXCL lock. Ownership: Supervisor Control", + "offset": 412, + "length": 4, + "type": "address" + }, + { + "name": "ecvtmmea", + "description": "Address of the MVS Miscellaneous Event Exit Manager Resource Manager Token Array. Serialization: REGSRV EXCL lock. Ownership: Supervisor Control.", + "offset": 416, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "ecvteaex", + "description": "Address of routine IEAVEAEX. Serialization: None. Ownership: Supervisor Control", + "offset": 420, + "length": 4, + "type": "address", + "pointsTo": "veaex" + }, + { + "name": "ecvteaux", + "description": "Address of routine IEAVEAUX. Serialization: None. Ownership: Supervisor Control", + "offset": 424, + "length": 4, + "type": "address", + "pointsTo": "veaux" + }, + { + "name": "ecvtmmec", + "description": "Count of RMs registered with MVS Miscellaneous Event Exit Manager Serialization: REGSRV EXCL Lock. Ownership: Supervisor Control", + "offset": 428, + "length": 4, + "type": "address" + }, + { + "name": "ecvtipst", + "description": "Address of IPST Serialization: None. Ownership: NIP", + "offset": 432, + "length": 4, + "type": "address", + "pointsTo": "ipst" + }, + { + "name": "ecvtrrsw", + "description": "Address of the RRS world object Serialization: None. Ownership: RRS", + "offset": 436, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "ecvtrrtt", + "description": "RRS EOT Resmgr address with Amode indicator set on Serialization: None Ownership: RRS", + "offset": 440, + "length": 4, + "type": "address" + }, + { + "name": "ecvtrrmt", + "description": "RRS EOM Resmgr Address with Amode indicator set on Serialization: None Ownership: RRS", + "offset": 444, + "length": 4, + "type": "address" + }, + { + "name": "ecvtpred", + "description": "Product Enable/Disable block Serialization: None. Ownership: SMF", + "offset": 448, + "length": 4, + "type": "address" + }, + { + "name": "ecvtcemt", + "description": "Exit Manager Token of the Context Services Exit Manager. Serialization: None Ownership: Context Services", + "offset": 452, + "length": 16, + "type": "hex" + }, + { + "name": "ecvtceme", + "description": "Address of routine CTXEMGRE. Serialization: None. Ownership: Context Services", + "offset": 468, + "length": 4, + "type": "address", + "pointsTo": "routine" + }, + { + "name": "ecvtcemr", + "description": "Address of routine CTXCEMGR. Serialization: None. Ownership: Context Services Serialization: None.", + "offset": 472, + "length": 4, + "type": "address", + "pointsTo": "routine" + }, + { + "name": "ecvtpseq", + "description": "Product sequence number. This field will be changed when any new version, release, or modification level is provided. It can be used to determine if the operating system is at a suitable level for a desired function. Its value will always increase from one release/mod level to the next. For z/OS 3.2 (HBB77F0), the value is For z/OS 3.1 (HBB77E0), the value is For z/OS 2.5 (HBB77D0), the value is", + "offset": 476, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ecvtpown", + "description": "Product owner", + "offset": 480, + "length": 16, + "type": "string" + }, + { + "name": "ecvtpnam", + "description": "Product name.", + "offset": 496, + "length": 16, + "type": "string" + }, + { + "name": "ecvtpver", + "description": "Product version", + "offset": 512, + "length": 2, + "type": "string" + }, + { + "name": "ecvtprel", + "description": "Product release", + "offset": 514, + "length": 2, + "type": "string" + }, + { + "name": "ecvtpmod", + "description": "Product mod level", + "offset": 516, + "length": 2, + "type": "string" + }, + { + "name": "ecvtpdvl", + "description": "Product development level. Note: This field is used for web deliverable for which the Product Modification Level is not changed.", + "offset": 518, + "length": 1, + "type": "string" + }, + { + "name": "ecvtttfl", + "description": "Transaction Trace flags. Serialization: None Ownership: Transaction Trace", + "offset": 519, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ecvtttrc": { + "description": "Transaction Trace has been 'turned on'.", + "offset": 0, + "length": 1 + }, + "ecvttatf": { + "description": "If set on, TTrace is not active due to ATTACHX failure.", + "offset": 1, + "length": 1 + }, + "ecvttesf": { + "description": "If set on, TTrace is not active due to ESTAE failure.", + "offset": 2, + "length": 1 + }, + "ecvttgmf": { + "description": "If set on, TTrace is not active due to GETMAIN failure.", + "offset": 3, + "length": 1 + }, + "ecvttabt": { + "description": "If set on, TTrace is not active due to abnormal termination.", + "offset": 4, + "length": 1 + } + } + }, + { + "name": "ecvtcurx", + "description": "Address of routine CTXCSURX. Serialization: None. Ownership: Context Services", + "offset": 520, + "length": 4, + "type": "address", + "pointsTo": "routine" + }, + { + "name": "ecvtctxr", + "description": "Addr of routine CTXRSMGR. Serialization: None. Ownership: Context Services", + "offset": 524, + "length": 4, + "type": "address", + "pointsTo": "routine" + }, + { + "name": "ecvtcrgr", + "description": "Addr of routine CRGRSMGR. Serialization: None. Ownership: Context Services", + "offset": 528, + "length": 4, + "type": "address", + "pointsTo": "routine" + }, + { + "name": "ecvtcsrb", + "description": "Addr of routine CTXSRB. Serialization: None Ownership: Context Services", + "offset": 532, + "length": 4, + "type": "address", + "pointsTo": "routine" + }, + { + "name": "ecvtrem1", + "description": "Addr of routine CRGRREM1 entry point in module CRGRREMD. Serialization: None. Ownership: Context Services", + "offset": 536, + "length": 4, + "type": "address", + "pointsTo": "routine" + }, + { + "name": "ecvtrem2", + "description": "Addr of routine CRGRREM2 entry point in module CRGRREMD. Serialization: None. Ownership: Context Services", + "offset": 540, + "length": 4, + "type": "address", + "pointsTo": "routine" + }, + { + "name": "ecvtxfr3", + "description": "Addr of routine IEAVXFR3 entry point Serialization: None. Ownership: PC Auth", + "offset": 544, + "length": 4, + "type": "address", + "pointsTo": "vxfr" + }, + { + "name": "ecvtcicb", + "description": "", + "offset": 548, + "length": 4, + "type": "address" + }, + { + "name": "ecvtdlpf", + "description": "Address of first CDE on dynamic LPA queue. Ownership: CSV Only CSV is allowed to change this. Serialization: CMS Lock", + "offset": 552, + "length": 4, + "type": "address" + }, + { + "name": "ecvtdlpl", + "description": "Address of last CDE on dynamic LPA queue. It is intended that the CDHAIN field of this CDE point to the CDE pointed to by the word pointed to by CVTQLPAQ Ownership: CSV Only CSV is allowed to change this. Serialization: CMS Lock", + "offset": 556, + "length": 4, + "type": "address" + }, + { + "name": "ecvtsrbr", + "description": "Return for T6EXIT RETURN=SRBSUSP Serialization: None. Ownership: Supervisor control", + "offset": 560, + "length": 4, + "type": "address", + "pointsTo": "vsyn" + }, + { + "name": "ecvtbcba", + "description": "Address of SOMObjects data structure Ownership: SOMObjects for OS/390 Serialization: CS", + "offset": 564, + "length": 4, + "type": "address" + }, + { + "name": "ecvtpidn", + "description": "PID number", + "offset": 568, + "length": 8, + "type": "string" + }, + { + "name": "ecvtrmd", + "description": "Double word for the CRGREMD Parameter List Free Pool.", + "offset": 576, + "length": 8, + "type": "hex" + }, + { + "name": "ecvtrmdp", + "description": "CRGREMD Parameter List Free Pool Ptr Ownership: Registration Services. Serialization: CDS on ECVTRMD", + "offset": 576, + "length": 4, + "type": "address" + }, + { + "name": "ecvtrmds", + "description": "F'0' CRGREMD Parameter List Free Pool Sequence Number. Ownership: Registration Services. Serialization: CDS on ECVTRMD", + "offset": 580, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ecvtrsu1", + "description": "Addr of routine IEAVRSU1 (Resume with sequence number. Serialization: None. Ownership: Supervisor Control.", + "offset": 584, + "length": 4, + "type": "address", + "pointsTo": "vrsu" + }, + { + "name": "ecvtpest", + "description": "Address of the Pause Element Segment Table. Serialization: Dispatcher lock Ownership: Supervisor Control.", + "offset": 588, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "ecvtcdyn", + "description": "Context Services Dynamic Area Cell Pool ID. Ownership: Context Services.", + "offset": 592, + "length": 4, + "type": "address" + }, + { + "name": "ecvtfcda", + "description": "", + "offset": 596, + "length": 4, + "type": "address" + }, + { + "name": "ecvteorm", + "description": "Potential real high storage address", + "offset": 600, + "length": 8, + "type": "hex" + }, + { + "name": "ecvtcbls", + "description": "Addr of IEAVCBLS (see IHACBLS)", + "offset": 608, + "length": 4, + "type": "address", + "pointsTo": "vcbls" + }, + { + "name": "ecvtrins", + "description": "Address of RRS installed function block (ATRRINST) Ownership: RRS", + "offset": 612, + "length": 4, + "type": "address", + "pointsTo": "rrs" + }, + { + "name": "ecvtttca", + "description": "Address of Transaction Trace Communications Area. Serialization: None Ownership: Transaction Trace", + "offset": 616, + "length": 4, + "type": "address" + }, + { + "name": "ecvtlcxt", + "description": "Address of LCCXVT", + "offset": 620, + "length": 4, + "type": "address", + "pointsTo": "lccxvt" + }, + { + "name": "ecvtoesi", + "description": "When non-zero, orig SCCBMESI", + "offset": 624, + "length": 4, + "type": "hex" + }, + { + "name": "ecvtoxsb", + "description": "When non-zero, orig SCCBNXSB", + "offset": 628, + "length": 4, + "type": "hex" + }, + { + "name": "ecvtestu", + "description": "SVC update service", + "offset": 632, + "length": 4, + "type": "address", + "pointsTo": "vestu" + }, + { + "name": "ecvtrbup", + "description": "IEARBUP service", + "offset": 636, + "length": 4, + "type": "address", + "pointsTo": "pfa" + }, + { + "name": "ecvtosai", + "description": "When non-zero, orig SCCBSAIX", + "offset": 640, + "length": 4, + "type": "hex", + "pointsTo": "pfa" + }, + { + "name": "ecvtpfa", + "description": "Address of PFA block. -", + "offset": 644, + "length": 4, + "type": "address", + "pointsTo": "pfa" + }, + { + "name": "ecvtcrdt", + "description": "Entry for RACF to get CDRACDTY bits set", + "offset": 648, + "length": 4, + "type": "address" + }, + { + "name": "ecvtctb2", + "description": "Customer anchor table 2 (8-byte slots) Slots assigned by IBM. Ownership: Callable Services. Serialization: None", + "offset": 652, + "length": 4, + "type": "address" + }, + { + "name": "ecvtjaof", + "description": "Address of IEAVJAOF when not 0. Use this when you must turn off JSCBAUTH. The system might have additional functions to perform when this is done. The JSCBAUTH bit in the JSCB pointed to by the current task's jobstep task's JSCB will be turned off. For system integrity reasons you should not turn JSCBAUTH back on once it has been turned off. - Caller must be AMODE 31 or AMODE 64. - Caller must be supervisor state and key 0", + "offset": 656, + "length": 4, + "type": "address", + "pointsTo": "vjaof" + }, + { + "name": "ecvtxpcb", + "description": "", + "offset": 660, + "length": 4, + "type": "address", + "pointsTo": "ibm" + }, + { + "name": "ecvtlpub", + "description": "IBM Publisher ID for ILM", + "offset": 664, + "length": 16, + "type": "hex" + }, + { + "name": "ecvtlpid", + "description": "IBM Product ID for ILM", + "offset": 680, + "length": 8, + "type": "hex", + "pointsTo": "ibm" + }, + { + "name": "ecvtlvid", + "description": "IBM Version ID for ILM", + "offset": 688, + "length": 8, + "type": "hex", + "pointsTo": "ibm" + }, + { + "name": "ecvtlkln", + "description": "Length of IBM Key for ILM", + "offset": 696, + "length": 4, + "type": "hex", + "pointsTo": "ibm" + }, + { + "name": "ecvtlkad", + "description": "Address of IBM Key for ILM", + "offset": 700, + "length": 4, + "type": "address", + "pointsTo": "ibm" + }, + { + "name": "ecvtcachelinesize", + "description": "CPU Cache Line Size", + "offset": 704, + "length": 2, + "type": "hex" + }, + { + "name": "ecvtcachelinestartbdy", + "description": "CPU Cache Line Start Boundary", + "offset": 706, + "length": 1, + "type": "hex" + }, + { + "name": "ecvt_osprotect", + "description": "- OSPROTECT system parameter in effect. X'00' indicates OSPROTECT=SYSTEM. See ECVT_OSProtect_WhenSystem. X'01' indicates OSPROTECT=1. X'FF' indicates OSPROTECT=MIN. A value in the range x'01'-x'FE' indicates \"more than minimum\"", + "offset": 707, + "length": 1, + "type": "hex" + }, + { + "name": "ecvtrfpt", + "description": "Address of routine to update REFRPROT option for this task. Place the address in reg 15. Place 1 in reg 0 if you want to override the system REFRPROT option and not allow REFRPROT for this task for subsequent LOADs. Place 0 in reg 0 if you no longer want to override the", + "offset": 708, + "length": 4, + "type": "address", + "pointsTo": "routine" + }, + { + "name": "ecvt_installed_cpu_hwm", + "description": "The highest CPU number currently installed within this IPL. Could increase upon dynamic CPU addition", + "offset": 712, + "length": 2, + "type": "signed-integer" + }, + { + "name": "ecvt_installed_cpu_at_ipl", + "description": "The highest CPU number installed at the time of IPL.", + "offset": 714, + "length": 2, + "type": "signed-integer" + }, + { + "name": "ecvtcrit", + "description": "Address of Common Resource Information Table Owner: IQP Serialization: None. Set during initialization", + "offset": 716, + "length": 4, + "type": "address", + "pointsTo": "common" + }, + { + "name": "ecvttedvectortableaddr", + "description": "Pointer to the Timed Event Data vector table", + "offset": 720, + "length": 8, + "type": "hex", + "pointsTo": "timed" + }, + { + "name": "ecvttedstoragebytesallocated", + "description": "Amount of storage used for all TED Tables", + "offset": 728, + "length": 8, + "type": "hex" + }, + { + "name": "ecvtteds", + "description": "V(IEAVTEDS) Pointer to the Timed Event Data Service Module", + "offset": 736, + "length": 4, + "type": "address", + "pointsTo": "vteds" + }, + { + "name": "ecvtmmig", + "description": "Machine Migration", + "offset": 740, + "length": 12, + "type": "hex" + }, + { + "name": "ecvtmmig_byte0", + "description": "Machine Migration Byte 0", + "offset": 740, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ecvtmmig_edat2": { + "description": "", + "offset": 0, + "length": 1 + }, + "ecvtmmig_tx": { + "description": "Never on as of z/OS 2.4", + "offset": 1, + "length": 1 + }, + "ecvtmmig_ri": { + "description": "", + "offset": 2, + "length": 1 + }, + "ecvtmmig_vef": { + "description": "Vector Extension Facility", + "offset": 3, + "length": 1 + }, + "ecvtmmig_gsf": { + "description": "", + "offset": 4, + "length": 1 + }, + "ecvtmmig_diag1": { + "description": "Diagnostic for IBM use only", + "offset": 5, + "length": 1 + }, + "ecvtmmig_diag2": { + "description": "Diagnostic for IBM use only", + "offset": 6, + "length": 1 + }, + "ecvtmmig_diag3": { + "description": "Diagnostic for IBM use only", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "ecvtmmig_byte1", + "description": "Machine Migration Byte 1", + "offset": 741, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ecvtmmig_crypctrs": { + "description": "Crypto Counters", + "offset": 0, + "length": 1 + }, + "ecvtmmig_nnpictrs": { + "description": "NNPI Counters", + "offset": 1, + "length": 1 + }, + "ecvtmmig_diagse": { + "description": "Diagnostic for IBM use only", + "offset": 2, + "length": 1 + } + } + }, + { + "name": "ecvtosarx", + "description": "When non-zero, orig SCCBSARX", + "offset": 752, + "length": 8, + "type": "hex" + }, + { + "name": "ecvtosarxh", + "description": "SCCBSARX - High Half", + "offset": 752, + "length": 4, + "type": "hex" + }, + { + "name": "ecvtosarxl", + "description": "SCCBSARX - Low Half", + "offset": 756, + "length": 4, + "type": "hex" + }, + { + "name": "ecvt_hcwa", + "description": "HCW", + "offset": 760, + "length": 8, + "type": "bitstring", + "bitmasks": { + "ecvtceat": { + "description": "CEA has terminated", + "offset": 56, + "length": 1 + }, + "ecvtaxrt": { + "description": "AXR has terminated", + "offset": 56, + "length": 1 + } + } + }, + { + "name": "ecvtslca", + "description": "Owner: LE", + "offset": 768, + "length": 4, + "type": "address" + }, + { + "name": "ecvtcpgum", + "description": "IGVCPGUM", + "offset": 772, + "length": 4, + "type": "address" + }, + { + "name": "ecvtcpfrm", + "description": "IGVCPFRM", + "offset": 776, + "length": 4, + "type": "address" + }, + { + "name": "ecvtcpgcm", + "description": "IGVCPGCM", + "offset": 780, + "length": 4, + "type": "address" + }, + { + "name": "ecvt4qv1", + "description": "IEAV4QV1", + "offset": 784, + "length": 4, + "type": "address", + "pointsTo": "v4qv" + }, + { + "name": "ecvt4qv2", + "description": "IEAV4QV2", + "offset": 788, + "length": 4, + "type": "address", + "pointsTo": "v4qv" + }, + { + "name": "ecvt4qv3", + "description": "IEAV4QV3", + "offset": 792, + "length": 4, + "type": "address", + "pointsTo": "v4qv" + }, + { + "name": "ecvt4qv4", + "description": "IEAV4QV4", + "offset": 796, + "length": 4, + "type": "address", + "pointsTo": "v4qv" + }, + { + "name": "ecvt4qv5", + "description": "IEAV4QV5", + "offset": 800, + "length": 4, + "type": "address", + "pointsTo": "v4qv" + }, + { + "name": "ecvt4qv6", + "description": "IEAV4QV6", + "offset": 804, + "length": 4, + "type": "address", + "pointsTo": "v4qv" + }, + { + "name": "ecvt4qv7", + "description": "IEAV4QV7", + "offset": 808, + "length": 4, + "type": "address", + "pointsTo": "v4qv" + }, + { + "name": "ecvttenc", + "description": "Timeused Enclave", + "offset": 812, + "length": 4, + "type": "address", + "pointsTo": "vrt5s" + }, + { + "name": "ecvtscf", + "description": "IEAVSCAF", + "offset": 816, + "length": 4, + "type": "address", + "pointsTo": "vscaf" + }, + { + "name": "ecvttsth", + "description": "IEAVTSTH", + "offset": 820, + "length": 4, + "type": "address", + "pointsTo": "vtsth" + }, + { + "name": "ecvtstc5", + "description": "STCKSYNC, AR MODE, CTNID REQUESTED. OWNERSHIP: TIMER. SERIALIZATION: NONE.", + "offset": 824, + "length": 4, + "type": "address", + "pointsTo": "tstc" + }, + { + "name": "ecvtstc6", + "description": "STCKSYNC, NON-AR MODE, CTNID REQUESTED. OWNERSHIP: TIMER. SERIALIZATION: NONE.", + "offset": 828, + "length": 4, + "type": "address", + "pointsTo": "tstc" + }, + { + "name": "ecvtch1", + "description": "IEAVECH1 Storage Check Service for AMODE(31) callers", + "offset": 832, + "length": 4, + "type": "address", + "pointsTo": "vech" + }, + { + "name": "ecvtch2", + "description": "IEAVECH2 Storage Check Service for AMODE(64) callers", + "offset": 836, + "length": 4, + "type": "address", + "pointsTo": "vech" + }, + { + "name": "ecvtceab", + "description": "CEAB", + "offset": 840, + "length": 4, + "type": "address", + "pointsTo": "vfacl" + }, + { + "name": "ecvtaxrb", + "description": "AXRB", + "offset": 844, + "length": 4, + "type": "address", + "pointsTo": "vfacl" + }, + { + "name": "ecvtect", + "description": "IEAVEECT service", + "offset": 848, + "length": 4, + "type": "address", + "pointsTo": "veect" + }, + { + "name": "ecvtfacl", + "description": "Address of 2048-byte facility area mapped by IHAFACL.", + "offset": 852, + "length": 4, + "type": "address", + "pointsTo": "vfacl" + }, + { + "name": "ecvtmaxcoreid", + "description": "When CvtProcAsCore is on, the maximum CPU Core Id allowed in the system for this IPL. When CvtProcAsCore is off, this will be set to CVTMAXMP.", + "offset": 856, + "length": 2, + "type": "signed-integer" + }, + { + "name": "ecvtnumcpuidsincore", + "description": "The maximum number of CPUs that can \"fit\" on a CPU Core. This doesn't mean all of them can be active. This can be looked at as how many IDs exist between thread 0 of two contiguous cores. When CvtProcAsCore is off, this will be set to 1.", + "offset": 858, + "length": 2, + "type": "signed-integer" + }, + { + "name": "ecvtntrm", + "description": "Name/Token resource manager @", + "offset": 860, + "length": 4, + "type": "address", + "pointsTo": "ntrtm" + }, + { + "name": "ecvtsdc", + "description": "A(0) Owner: SDC", + "offset": 864, + "length": 4, + "type": "address" + }, + { + "name": "ecvthiab", + "description": "Anchor for Hardware -", + "offset": 868, + "length": 4, + "type": "address" + }, + { + "name": "ecvthwip", + "description": "Anchor Block for BCPii AS -", + "offset": 872, + "length": 4, + "type": "address" + }, + { + "name": "ecvtscpin", + "description": "Address of current SCPINFO data block, unlike CVTSCPIN which is the IPL-time SCPINFO data block. Mapped by IHASCCB.", + "offset": 876, + "length": 4, + "type": "address", + "pointsTo": "current" + }, + { + "name": "ecvthp1", + "description": "Pointer to Heap Pool 1 structure supporting macro IARST64 for common storage. Ownership: RSM. Serialization: CSG", + "offset": 880, + "length": 8, + "type": "hex", + "pointsTo": "heap" + }, + { + "name": "ecvtmaxmpnumbytesinmask", + "description": "Maximum number of bytes a bitmask of CVTMAXMP bits would take up, rounded to a multiple of 8", + "offset": 888, + "length": 2, + "type": "signed-integer" + }, + { + "name": "ecvtphysicaltologicalmask", + "description": "\"OR\" this value with a CPUs physical ID to obtain its logical ID", + "offset": 890, + "length": 2, + "type": "signed-integer" + }, + { + "name": "ecvtlogicaltophysicalmask", + "description": "\"AND\" this value with a CPUs logical ID to obtain its physical ID", + "offset": 892, + "length": 2, + "type": "signed-integer" + }, + { + "name": "ecvtappflags", + "description": "Application-set flags Serialization: CS", + "offset": 894, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ecvtstcksyncreplaced": { + "description": "A product has replaced system control block fields that contain the entry point addresses for STCKSYNC services. The system is not to reset these fields to their IPL-time values.", + "offset": 0, + "length": 1 + } + } + }, + { + "name": "ecvt_osprotect_whensystem", + "description": "As of z/OS 3.1, the OSPROTECT level you get when OSPROTECT=SYSTEM is in effect. Valid only when OSPROTECT=SYSTEM is in effect. Current possible values are: X'01' indicating OSPROTECT=1 (not on zPDT), X'FF' indicating OSPROTECT=MIN (on zPDT) A value in the range x'01'-x'FE' indicates \"more than minimum\"", + "offset": 895, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ecvthzrt": { + "description": "RTD has terminated", + "offset": 0, + "length": 1 + } + } + }, + { + "name": "ecvt_getsrbidtoken", + "description": "Address of the routine to return the SrbIdToken of the current preemptible- class SRB - Caller must be running under the preemptible- class SRB for which the SrbIdToken is to be returned. - Caller may be AMODE 31 or 64, must be key 0 Supervisor state. - Caller may hold any locks, none are required. - Primary ASC mode. - Any P, Any S, Any H.", + "offset": 896, + "length": 4, + "type": "address", + "pointsTo": "vschy" + }, + { + "name": "ecvtxtsw", + "description": "Address of \"Cross-memory TCB or SRB wait\" routine. - Caller must be AMODE 31, key 0, supervisor state, enabled for I/O and external interrupts, holding no locks. - SRB or task mode. - Primary ASC mode. - Any P, Any S, Any H. - Load this address into GR 15, - Issue BASR 14,15 - 31-bit GRs 2-13, high halves 2-14, and", + "offset": 900, + "length": 4, + "type": "address" + }, + { + "name": "ecvt_smf_cms_lockinst_addr", + "description": "Address of the SMF CMS instrumentation data for the system", + "offset": 904, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "ecvt_enqdeq_cms_lockinst_addr", + "description": "Address of the ENQ/DEQ CMS instrumentation data for the system", + "offset": 908, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "ecvt_latch_cms_lockinst_addr", + "description": "Address of the Latch CMS instrumentation data for the system", + "offset": 912, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "ecvt_cms_lockinst_addr", + "description": "Address of the CMS instrumentation data for the system", + "offset": 916, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "ecvthzrb", + "description": "Address of the HZRB Ownership: Runtime Diagnostics", + "offset": 920, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "ecvtgtz", + "description": "Address of GTZ block Ownership: Generalized Tracker", + "offset": 924, + "length": 4, + "type": "address", + "pointsTo": "gtz" + }, + { + "name": "ecvtcpguc", + "description": "IGVCPGUC", + "offset": 928, + "length": 4, + "type": "address" + }, + { + "name": "ecvtcpfrc", + "description": "IGVCPFRC", + "offset": 932, + "length": 4, + "type": "address" + }, + { + "name": "ecvtcpgcc", + "description": "IGVCPGCC", + "offset": 936, + "length": 4, + "type": "address" + }, + { + "name": "ecvt_installed_core_hwm", + "description": "The highest core number currently installed. Could increase upon dynamic core/CPU addition.", + "offset": 940, + "length": 2, + "type": "signed-integer" + }, + { + "name": "ecvt_installed_core_at_ipl", + "description": "The highest core number installed at the time of IPL.", + "offset": 942, + "length": 2, + "type": "signed-integer" + }, + { + "name": "ecvtlso", + "description": "Leap second value in STCKE format. Bytes 1-8 (0 origin) have same value as CVTLSO", + "offset": 944, + "length": 16, + "type": "hex" + }, + { + "name": "ecvtldto", + "description": "Local time/date offset in STCKE format. Bytes 1-8 (0-origin) have same value as CVTLDTO. Byte 0 is sign extended from bit 0 of byte 1", + "offset": 960, + "length": 16, + "type": "hex" + }, + { + "name": "ecvtizugsp", + "description": "Address of z/OSMF Global Storage Pointers area. Could be 0.", + "offset": 976, + "length": 4, + "type": "address" + }, + { + "name": "ecvtsvtx", + "description": "Address of SVTX", + "offset": 980, + "length": 4, + "type": "address", + "pointsTo": "vsvtx" + }, + { + "name": "ecvtr3d8", + "description": "Reserved", + "offset": 984, + "length": 8, + "type": "hex" + }, + { + "name": "ecvt_boostinfo", + "description": "Valid only when CVTBoost is on", + "offset": 992, + "length": 24, + "type": "hex" + }, + { + "name": "ecvt_boostinfo_flags0", + "description": "", + "offset": 992, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ecvt_ziipboost_active": { + "description": "", + "offset": 0, + "length": 1 + }, + "ecvt_speedboost_active": { + "description": "", + "offset": 1, + "length": 1 + }, + "ecvt_iplboosts_activated": { + "description": "All IPL boosts to be activated have been activated.", + "offset": 2, + "length": 1 + }, + "ecvt_sdboosts_activated": { + "description": "All Shutdown boosts to be activated have been activated.", + "offset": 3, + "length": 1 + }, + "ecvt_rpboosts_activated": { + "description": "All RP boosts to be activated have been activated. This bit will be turned off once the boost ends.", + "offset": 4, + "length": 1 + }, + "ecvt_boostclass": { + "description": "See Ecvt_BoostClass_xxx equates. Valid only when one of the boosts is active", + "offset": 5, + "length": 3 + } + } + }, + { + "name": "ecvt_boostinfo_sysparm_flags", + "description": "", + "offset": 993, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ecvt_sysparm_ziipboost": { + "description": "According to the availability and the BOOST system parameter, we want to do zIIP boost. This gets turned off if it could never be right to activate, such as for the case of a non-dedicated partition", + "offset": 0, + "length": 1 + }, + "ecvt_sysparm_speedboost": { + "description": "According to the availability and the BOOST system parameter, we want to do speed boost.", + "offset": 1, + "length": 1 + } + } + }, + { + "name": "ecvt_boostinfo_flags1", + "description": "", + "offset": 994, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ecvt_iplziipboost_endedbyerror": { + "description": "", + "offset": 0, + "length": 1 + }, + "ecvt_iplspeedboost_endedbyerror": { + "description": "", + "offset": 1, + "length": 1 + }, + "ecvt_iplboosts_endedbytimer": { + "description": "", + "offset": 4, + "length": 1 + }, + "ecvt_iplboosts_endedbypgm": { + "description": "", + "offset": 5, + "length": 1 + }, + "ecvt_iplboosts_endedbyshutdown": { + "description": "", + "offset": 6, + "length": 1 + }, + "ecvt_iplboosts_endedbyerror": { + "description": "", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "ecvt_boostinfo_sd_flags1", + "description": "", + "offset": 995, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ecvt_sdziipboost_endedbyerror": { + "description": "", + "offset": 0, + "length": 1 + }, + "ecvt_sdspeedboost_endedbyerror": { + "description": "", + "offset": 1, + "length": 1 + }, + "ecvt_sdboosts_endedbytimer": { + "description": "", + "offset": 4, + "length": 1 + }, + "ecvt_sdboosts_endedbypgm": { + "description": "", + "offset": 5, + "length": 1 + }, + "ecvt_sdboosts_endedbyerror": { + "description": "", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "ecvt_boostinfo_transientziipcores", + "description": "Number of zIIP cores configured online for the zIIP boost. Those cores will be configured offline at the end of the zIIP boost. Valid only when the zIIP boost active bit is on.", + "offset": 996, + "length": 2, + "type": "signed-integer" + }, + { + "name": "ecvt_boostinfo_flags2", + "description": "", + "offset": 998, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ecvt_rpb_disabled": { + "description": "When on, RP boosts are disabled When off, RP boosts are enabled", + "offset": 0, + "length": 1 + } + } + }, + { + "name": "ecvt_boostlevel", + "description": "0: initial deliverable >0: In addition to initial deliverable data,", + "offset": 999, + "length": 1, + "type": "hex" + }, + { + "name": "ecvt_boostinfo_expected_endetod", + "description": "Time (STCKE format) when boost(s) will end. It is valid when the following is true: -- one of the \"Boost Active\" bits is on, and -- if the boost class is IPL, bit Ecvt_IplBoosts_Activated is on, and -- if the boost class is shutdown, bit Ecvt_SDBoosts_Activated is on, and -- if the boost class is RP, bit Ecvt_RPBoosts_Activated is on. End time can be extended if there are", + "offset": 1000, + "length": 16, + "type": "hex" + }, + { + "name": "ecvt_boostinfo_v1", + "description": "Recovery process boost support. Valid when Ecvt_BoostLevel is at least Ecvt_BoostLevel_V1", + "offset": 1016, + "length": 32, + "type": "hex" + }, + { + "name": "ecvt_rpboosts_num", + "description": "Number of recovery-process boost start requests received across the life of the IPL that were not during IPL boost or shutdown boost", + "offset": 1016, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ecvt_rpboosts_num_ignored", + "description": "Number of recovery-process boost start requests received across the life of the IPL that were ignored because the duration limit had been exceeded", + "offset": 1020, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ecvt_rpb_duration", + "description": "Total duration for the life of the IPL of recovery process boosts. Updated when RP boost is extended or ends. In STCK format.", + "offset": 1024, + "length": 8, + "type": "hex" + }, + { + "name": "ecvt_rp_duration", + "description": "Same as Ecvt_RPB_Duration", + "offset": 1024, + "length": 8, + "type": "hex" + }, + { + "name": "ecvt_rpb_boostinfo_flags1", + "description": "", + "offset": 1032, + "length": 1, + "type": "hex" + }, + { + "name": "ecvt_rp_boostinfo_flags1", + "description": "Same as Ecvt_RPB_BoostInfo_Flags1", + "offset": 1032, + "length": 1, + "type": "bitstring", + "bitmasks": { + "ecvt_rpboosts_last_endedbytimer": { + "description": "The last RPBoost(s) ended by timer. Valid only when RPBoost inactive.", + "offset": 4, + "length": 1 + }, + "ecvt_rpboosts_last_endedbyshutdown": { + "description": "The last RPBoost(s) ended due to shutdown. Valid only when RPBoost inactive.", + "offset": 6, + "length": 1 + }, + "ecvt_rpboosts_last_endedbyerror": { + "description": "The last RPBoost(s) ended due to error. Valid only when RPBoost inactive.", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "ecvt_rpboosts_requestor_id", + "description": "The requestor ID associated with the start or extend. Updated when the boost is extended. Valid only when RP boost(s) are active. See equates ECVT_RPBReq_xxx", + "offset": 1033, + "length": 1, + "type": "hex" + }, + { + "name": "ecvtr40a", + "description": "", + "offset": 1034, + "length": 2, + "type": "hex" + }, + { + "name": "ecvt_rpboosts_numbyrequestor_addr", + "description": "Address of an area that has the number of RP boost requests by each requestor. The format of the area is: 1st word - number of entries. 2nd word - number of requests by unidentified requestors. Nth word when N > 2 - number of requests by requestor N-2. The requestors are described by ID (the \"N-2\" value).", + "offset": 1036, + "length": 4, + "type": "address" + }, + { + "name": "ecvt_rpboosts_num_whiledis", + "description": "Number of recovery-process boost start requests received across the life of the IPL while RP boosts were disabled", + "offset": 1040, + "length": 4, + "type": "signed-integer" + }, + { + "name": "ecvtr414", + "description": "", + "offset": 1044, + "length": 4, + "type": "hex" + }, + { + "name": "ecvt_boostinfo_v2", + "description": "", + "offset": 1048, + "length": 8, + "type": "hex" + }, + { + "name": "ecvt_rpb_duration_potential", + "description": "Total duration for the life of the IPL of recovery process boosts. Includes time that would have been boosted except for having reached the duration limit. Includes time regardless of whether or not RP boosts were enabled. Updated when RP boost would be extended or end. In STCK format.", + "offset": 1048, + "length": 8, + "type": "hex" + }, + { + "name": "ecvt_rpb_duration_potential_e", + "description": "Same as preceding field, but only while RP Boosts are enabled", + "offset": 1056, + "length": 8, + "type": "hex" + }, + { + "name": "ecvt_rpb_en_dis_local_timestamp", + "description": "Local time when RP boosts were last enabled or disabled. In STCK format.", + "offset": 1064, + "length": 8, + "type": "hex" + }, + { + "name": "ecvtr430", + "description": "Reserved", + "offset": 1072, + "length": 4, + "type": "hex" + }, + { + "name": "ecvt_ziipboostcoresaddr", + "description": "When not 0, the address of an area that is a bit string of which cores were config'd online for a boost. Each bit corresponds to a core (bit 0 is core 0, bit 1 is core 1, etc). When bit n is on, core n is considered a zIIP boost core", + "offset": 1076, + "length": 4, + "type": "address" + }, + { + "name": "ecvt_ifunc_addr", + "description": "Address of area mapped by IHAIFUNC indicating which function codes of such instructions as PRNO, KIMD, KLMD are available.", + "offset": 1080, + "length": 4, + "type": "address" + }, + { + "name": "ecvtr43c", + "description": "Reserved", + "offset": 1084, + "length": 4, + "type": "hex" + }, + { + "name": "ecvt_maxtod", + "description": "A value that will not be reached by the clock comparator for this IPL. That is x'FFFFFFFF_FFFFFFFF' when a signed CC is not used, x'7FFFFFFF_FFFFFFFF' when a signed CC is used", + "offset": 1088, + "length": 8, + "type": "bitstring", + "bitmasks": { + "ecvt_boostclass_mask": { + "description": "", + "offset": 61, + "length": 3 + }, + "ecvt_boostclass_ipl": { + "description": "", + "offset": 63, + "length": 1 + }, + "ecvt_boostclass_shutdown": { + "description": "", + "offset": 62, + "length": 1 + }, + "ecvt_boostclass_rp": { + "description": "", + "offset": 62, + "length": 2 + } + } + } + ] +} \ No newline at end of file diff --git a/cbxp/mappings/psa.json b/cbxp/mappings/psa.json new file mode 100644 index 0000000..abce05c --- /dev/null +++ b/cbxp/mappings/psa.json @@ -0,0 +1,4198 @@ +{ + "version": 1, + "name": "psa", + "commonName": "Prefixed Save Area", + "macroId": "ihapsa", + "description": "= PROVIDE DATA MAPPING OF THE PSA. */ %GOTO PSAL2; /*", + "aliases": [], + "pointedToBy": [], + "storageAttributes": { + "subpools": [ + 239 + ], + "key": 0, + "residency": "Below 16 MB line" + }, + "controlBlock": [ + { + "name": "flcippsw", + "description": "IPL PSW", + "offset": 0, + "length": 8, + "type": "hex", + "aliases": [ + "iplpsw" + ] + }, + { + "name": "flcrnpsw", + "description": "RESTART NEW PSW (AFTER IPL)", + "offset": 0, + "length": 8, + "type": "hex", + "pointsTo": "vrstr" + }, + { + "name": "flciccw1", + "description": "IPL CCW1", + "offset": 8, + "length": 8, + "type": "hex" + }, + { + "name": "flcropsw", + "description": "RESTART OLD PSW (AFTER IPL)", + "offset": 8, + "length": 8, + "type": "hex", + "pointsTo": "cvt" + }, + { + "name": "flciccw2", + "description": "IPL CCW2", + "offset": 16, + "length": 8, + "type": "hex" + }, + { + "name": "flccvt", + "description": "ADDRESS OF CVT (AFTER IPL).", + "offset": 16, + "length": 4, + "type": "address", + "pointsTo": "cvt" + }, + { + "name": "flceopsw", + "description": "EXTERNAL OLD PSW", + "offset": 24, + "length": 8, + "type": "hex", + "aliases": [ + "exopsw" + ] + }, + { + "name": "flcsopsw", + "description": "SVC OLD PSW. THIS OFFSET FIXED BY ARCHITECTURE.", + "offset": 32, + "length": 8, + "type": "hex", + "aliases": [ + "svcopsw" + ] + }, + { + "name": "flcpopsw", + "description": "PROGRAM CHECK OLD PSW", + "offset": 40, + "length": 8, + "type": "hex", + "pointsTo": "cvt", + "aliases": [ + "piopsw" + ] + }, + { + "name": "flcmopsw", + "description": "MACHINE CHECK OLD PSW", + "offset": 48, + "length": 8, + "type": "hex", + "pointsTo": "cvt", + "aliases": [ + "mcopsw" + ] + }, + { + "name": "flciopsw", + "description": "INPUT/OUTPUT OLD PSW", + "offset": 56, + "length": 8, + "type": "hex", + "pointsTo": "cvt", + "aliases": [ + "ioopsw" + ] + }, + { + "name": "flccvt64", + "description": "8-byte CVT address", + "offset": 72, + "length": 8, + "type": "hex" + }, + { + "name": "flccvt2", + "description": "ADDRESS OF CVT - USED BY DUMP ROUTINES", + "offset": 76, + "length": 4, + "type": "address", + "pointsTo": "cvt" + }, + { + "name": "flcenpsw", + "description": "EXTERNAL NEW PSW", + "offset": 88, + "length": 8, + "type": "hex", + "pointsTo": "qex", + "aliases": [ + "exnpsw" + ] + }, + { + "name": "flcsnpsw", + "description": "SVC NEW PSW", + "offset": 96, + "length": 8, + "type": "hex", + "pointsTo": "qsc", + "aliases": [ + "svcnpsw" + ] + }, + { + "name": "flcpnpsw", + "description": "PROGRAM CHECK NEW PSW, DISABLED FOR MACHINE CHECKS.", + "offset": 104, + "length": 8, + "type": "hex", + "pointsTo": "qpk", + "aliases": [ + "pinpsw" + ] + }, + { + "name": "flcmnpsw", + "description": "MACHINE CHECK NEW PSW", + "offset": 112, + "length": 8, + "type": "hex", + "aliases": [ + "mcnpsw" + ] + }, + { + "name": "flcinpsw", + "description": "INPUT/OUTPUT NEW PSW", + "offset": 120, + "length": 8, + "type": "hex", + "pointsTo": "qio", + "aliases": [ + "ionpsw" + ] + }, + { + "name": "psaeparm", + "description": "EXTERNAL INTERRUPTION PARAMETER FIELD.", + "offset": 128, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psaeepsw", + "description": "EXTENDED PSW DATA STORED ON EXTERNAL INTERRUPT", + "offset": 132, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psaspad", + "description": "ISSUING PROCESSOR'S PHYSICAL ADDRESS ON MFA, EMS, OR EXTERNAL CALL INTERRUPT", + "offset": 132, + "length": 2, + "type": "signed-integer" + }, + { + "name": "flceicod", + "description": "EXTERNAL INTERRUPTION CODE", + "offset": 134, + "length": 2, + "type": "signed-integer", + "aliases": [ + "excode" + ] + }, + { + "name": "psaespsw", + "description": "EXTENDED PSW DATA STORED ON SVC INTERRUPT", + "offset": 136, + "length": 4, + "type": "signed-integer" + }, + { + "name": "flcsvilc", + "description": "SVC INSTRUCTION LENGTH COUNTER - NUMBER OF BYTES. THIS OFFSET FIXED BY ARCHITECTURE.", + "offset": 137, + "length": 1, + "type": "bitstring", + "bitmasks": { + "flcsilcb": { + "description": "SIGNIFICANT BITS IN ILC FIELD - LAST BIT IS ALWAYS ZERO", + "offset": 5, + "length": 3 + } + }, + "aliases": [ + "svcilc" + ] + }, + { + "name": "flcsvcn", + "description": "SVC INTERRUPTION CODE - SVC NUMBER. THIS OFFSET FIXED BY ARCHITECTURE.", + "offset": 138, + "length": 2, + "type": "signed-integer", + "aliases": [ + "svcnum" + ] + }, + { + "name": "psaeppsw", + "description": "EXTENDED PSW FOR PROGRAM INTERRUPT", + "offset": 140, + "length": 8, + "type": "hex" + }, + { + "name": "flcpiilc", + "description": "PROGRAM INTERRUPT LENGTH COUNTER - NUMBER OF BYTES IN INSTRUCTION CAUSING PROGRAM INTERRUPTION. THIS OFFSET FIXED BY ARCHITECTURE.", + "offset": 141, + "length": 1, + "type": "bitstring", + "bitmasks": { + "flcpilcb": { + "description": "SIGNIFICANT BITS IN ILC FIELD - LAST BIT IS ALWAYS ZERO", + "offset": 5, + "length": 3 + } + }, + "aliases": [ + "piilc" + ] + }, + { + "name": "flcpicod", + "description": "PROGRAM INTERRUPTION CODE", + "offset": 142, + "length": 2, + "type": "signed-integer", + "aliases": [ + "picode" + ] + }, + { + "name": "psaeecod", + "description": "EXCEPTION-EXTENSION CODE.", + "offset": 142, + "length": 1, + "type": "hex" + }, + { + "name": "psapicod", + "description": "8-BIT INTERRUPT CODE. THIS OFFSET FIXED BY ARCHITECTURE.", + "offset": 143, + "length": 1, + "type": "bitstring", + "bitmasks": { + "psapiper": { + "description": "PER INTERRUPT OCCURRED", + "offset": 0, + "length": 1 + }, + "psapimc": { + "description": "MONITOR CALL INTERRUPT OCCURRED", + "offset": 1, + "length": 1 + }, + "psapipc": { + "description": "AN UNSOLICITED PROGRAM CHECK HAS OCCURRED IF ANY OF THESE 6 BITS ARE ON", + "offset": 2, + "length": 6 + }, + "flcteaxm": { + "description": "IF 0 FLCTEA IS RELATIVE TO THE PRIMARY SEGMENT TABLE IF 1 FLCTEA IS RELATIVE TO THE SECONDARY SEGMENT TABLE", + "offset": 0, + "length": 1 + } + } + }, + { + "name": "flctea", + "description": "TRANSLATION EXCEPTION ADDRESS. THIS OFFSET FIXED BY ARCHITECTURE.", + "offset": 144, + "length": 4, + "type": "signed-integer" + }, + { + "name": "flcdxc", + "description": "Data exception code for PI 7", + "offset": 147, + "length": 1, + "type": "hex" + }, + { + "name": "flcteab3", + "description": "LAST BYTE OF TEA.", + "offset": 147, + "length": 1, + "type": "bitstring", + "bitmasks": { + "flcsopi": { + "description": "Suppression on protection flag", + "offset": 5, + "length": 1 + }, + "flctstda": { + "description": "IF 1, THE STD WAS AR QUALIFIED.", + "offset": 7, + "length": 1 + }, + "flctstds": { + "description": "IF 1, THE SECONDARY STD WAS USED.", + "offset": 6, + "length": 1 + }, + "flctstdh": { + "description": "IF 1, THE HOME STD WAS USED.", + "offset": 6, + "length": 2 + } + } + }, + { + "name": "flcmcnum", + "description": "MONITOR CLASS NUMBER", + "offset": 149, + "length": 1, + "type": "hex" + }, + { + "name": "flcpercd", + "description": "PROGRAM EVENT RECORDING CODE", + "offset": 150, + "length": 1, + "type": "hex" + }, + { + "name": "flcatmid", + "description": "ATM ID", + "offset": 151, + "length": 1, + "type": "bitstring", + "bitmasks": { + "flcpswb4": { + "description": "PSW.4 part of ATMID", + "offset": 0, + "length": 1 + } + } + }, + { + "name": "flcper", + "description": "PER ADDRESS - ESA/390", + "offset": 152, + "length": 4, + "type": "address" + }, + { + "name": "flcmtrcd", + "description": "MONITOR CODE (ESA/390)", + "offset": 157, + "length": 3, + "type": "hex" + }, + { + "name": "flctearn", + "description": "CONTAINS THE ACCESS REGISTER NUMBER INVOLVED IN THE TRANSLATION EXCEPTION IF BITS 30-31 OF THE TEA='01'.", + "offset": 160, + "length": 1, + "type": "hex" + }, + { + "name": "flcperrn", + "description": "CONTAINS THE PER STORAGE ACCESS REGISTER NUMBER.", + "offset": 161, + "length": 1, + "type": "hex" + }, + { + "name": "flcarch", + "description": "Architecture information", + "offset": 163, + "length": 1, + "type": "bitstring", + "bitmasks": { + "psazarch": { + "description": "z/Architecture", + "offset": 7, + "length": 1 + }, + "psaesame": { + "description": "z/Architecture", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "psampl", + "description": "Used only prior to z/Architecture", + "offset": 164, + "length": 4, + "type": "hex" + }, + { + "name": "flciocdp", + "description": "I/O INFORMATION CODE", + "offset": 184, + "length": 8, + "type": "hex" + }, + { + "name": "flcsid", + "description": "SUBSYSTEM ID", + "offset": 184, + "length": 4, + "type": "hex" + }, + { + "name": "flciofp", + "description": "I/O INTERRUPTION PARAMETER", + "offset": 188, + "length": 4, + "type": "hex" + }, + { + "name": "flcfacl", + "description": "Facilities List. See FaclBytes0To15 in IHAFACL for description", + "offset": 200, + "length": 16, + "type": "hex" + }, + { + "name": "flcfacl0", + "description": "Byte 0 of FLCFACL", + "offset": 200, + "length": 1, + "type": "bitstring", + "bitmasks": { + "flcfn3": { + "description": "N3 installed", + "offset": 0, + "length": 1 + }, + "flcfzari": { + "description": "z/Architecture installed", + "offset": 1, + "length": 1 + }, + "flcfzara": { + "description": "z/Architecture active", + "offset": 2, + "length": 1 + }, + "flcfaslx": { + "description": "ASN & LX reuse facility installed", + "offset": 6, + "length": 1 + } + } + }, + { + "name": "flcfacl1", + "description": "Byte 1 of FLCFACL", + "offset": 201, + "length": 1, + "type": "bitstring", + "bitmasks": { + "flcfedat": { + "description": "DAT features", + "offset": 0, + "length": 1 + }, + "flcfsrs": { + "description": "Sense-running-status", + "offset": 1, + "length": 1 + }, + "flcfsske": { + "description": "Cond. SSKE instruction installed", + "offset": 2, + "length": 1 + }, + "flcfctop": { + "description": "STSI-enhancement", + "offset": 3, + "length": 1 + } + } + }, + { + "name": "flcfacl2", + "description": "Byte 2 of FLCFACL", + "offset": 202, + "length": 1, + "type": "bitstring", + "bitmasks": { + "flcfetf2": { + "description": "Extended Translation facility 2", + "offset": 0, + "length": 1 + }, + "flcfcrya": { + "description": "Cryptographic assist", + "offset": 1, + "length": 1 + }, + "flcfld": { + "description": "Long Displacement facility", + "offset": 2, + "length": 1 + }, + "flcfldhp": { + "description": "Long Displacement High Performance", + "offset": 3, + "length": 1 + }, + "flcfhmas": { + "description": "HFP Multiply Add/Subtract", + "offset": 4, + "length": 1 + }, + "flcfeimm": { + "description": "Extended immediate when z/Arch", + "offset": 5, + "length": 1 + }, + "flcfetf3": { + "description": "Extended Translation Facility 3 when z/Arch", + "offset": 6, + "length": 1 + }, + "flcfhun": { + "description": "HFP unnormalized extension", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "flcfacl3", + "description": "Byte 3 of FLCFACL", + "offset": 203, + "length": 1, + "type": "bitstring", + "bitmasks": { + "flcfet2e": { + "description": "ETF2-enhancement 031215", + "offset": 0, + "length": 1 + }, + "flcfstkf": { + "description": "STCKF-enhancement", + "offset": 1, + "length": 1 + }, + "flcfet3e": { + "description": "ETF3-enhancement 040512", + "offset": 6, + "length": 1 + }, + "flcfect": { + "description": "ECT-facility", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "flcfacl4", + "description": "Byte 4 of FLCFACL", + "offset": 204, + "length": 1, + "type": "bitstring", + "bitmasks": { + "flcfcssf": { + "description": "Compare-and-swap-and-store", + "offset": 0, + "length": 1 + }, + "flcfcsf2": { + "description": "Compare-and-swap-and-store 2", + "offset": 1, + "length": 1 + }, + "flcfgief": { + "description": "General-Instructions-Extension Facility", + "offset": 2, + "length": 1 + }, + "flcfocm": { + "description": "Obsolete CPU-measurement facility. Use FLCFCMC and FLCFCMS instead.", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "flcfacl5", + "description": "Byte 5 of FLCFACL", + "offset": 205, + "length": 1, + "type": "bitstring", + "bitmasks": { + "flcffpse": { + "description": "Floating-point-support enhancement", + "offset": 1, + "length": 1 + }, + "flcfdfp": { + "description": "Decimal-floating-point", + "offset": 2, + "length": 1 + }, + "flcfdfph": { + "description": "Decimal-floating-point high performance", + "offset": 3, + "length": 1 + }, + "flcfpfpo": { + "description": "PFPO instruction 070424", + "offset": 4, + "length": 1 + } + } + }, + { + "name": "flcfacl6", + "description": "Byte 6 of FLCFACL", + "offset": 206, + "length": 1, + "type": "hex" + }, + { + "name": "flcfacl7", + "description": "Byte 7 of FLCFACL", + "offset": 207, + "length": 1, + "type": "hex" + }, + { + "name": "flcfacl8", + "description": "Byte 8 of FLCFACL", + "offset": 208, + "length": 1, + "type": "bitstring", + "bitmasks": { + "flcfcaai": { + "description": "Crypto AP-Queue adapter interruption", + "offset": 1, + "length": 1 + }, + "flcfcmc": { + "description": "CPU-measurement counter facility", + "offset": 3, + "length": 1 + }, + "flcfcms": { + "description": "CPU-measurement sampling facility", + "offset": 4, + "length": 1 + }, + "flcfsclp": { + "description": "Possible future enhancement", + "offset": 5, + "length": 1 + }, + "flcfaisi": { + "description": "AISI facility", + "offset": 6, + "length": 1 + }, + "flcfaen": { + "description": "AEN facility", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "flcfacl9", + "description": "Byte 9 of FLCFACL", + "offset": 209, + "length": 1, + "type": "bitstring", + "bitmasks": { + "flcfais": { + "description": "AIS facility IHAPSAE FLCEFacilitiesList will have any future bit definitions.", + "offset": 0, + "length": 1 + } + } + }, + { + "name": "flcfacle", + "description": "Facilities List bytes 16-31. See FaclBytes16To31 in IHAFACL for description", + "offset": 216, + "length": 16, + "type": "hex" + }, + { + "name": "flcmcic", + "description": "MACHINE-CHECK INTERRUPTION CODE", + "offset": 232, + "length": 8, + "type": "hex" + }, + { + "name": "flcfsa", + "description": "FAILING STORAGE ADDRESS", + "offset": 248, + "length": 4, + "type": "address" + }, + { + "name": "flcfla", + "description": "FIXED LOGOUT AREA. SIZE FIXED BY ARCHITECTURE.", + "offset": 256, + "length": 16, + "type": "hex" + }, + { + "name": "flcrv110", + "description": "RESERVED.", + "offset": 272, + "length": 16, + "type": "hex" + }, + { + "name": "flcarsav", + "description": "ACCESS REGISTER SAVE AREA", + "offset": 288, + "length": 64, + "type": "signed-integer" + }, + { + "name": "flcfpsav", + "description": "FLOATING POINT REGISTER SAVE AREA", + "offset": 352, + "length": 32, + "type": "hex" + }, + { + "name": "flcgrsav", + "description": "GENERAL REGISTER SAVE AREA", + "offset": 384, + "length": 64, + "type": "signed-integer" + }, + { + "name": "flccrsav", + "description": "CONTROL REGISTER SAVE AREA", + "offset": 448, + "length": 64, + "type": "signed-integer" + }, + { + "name": "flchdend", + "description": "END OF HARDWARE ASSIGNMENTS", + "offset": 512, + "length": 8, + "type": "hex" + }, + { + "name": "psapsa", + "description": "CONTROL BLOCK ACRONYM IN EBCDIC", + "offset": 512, + "length": 4, + "type": "string" + }, + { + "name": "psacpupa", + "description": "PHYSICAL CPU ADDRESS (CHANGED DURING ACR)", + "offset": 516, + "length": 2, + "type": "signed-integer" + }, + { + "name": "psacpula", + "description": "LOGICAL CPU ADDRESS", + "offset": 518, + "length": 2, + "type": "signed-integer" + }, + { + "name": "psapccav", + "description": "VIRTUAL ADDRESS OF PCCA", + "offset": 520, + "length": 4, + "type": "address", + "pointsTo": "pcca" + }, + { + "name": "psapccar", + "description": "REAL ADDRESS OF PCCA", + "offset": 524, + "length": 4, + "type": "address", + "pointsTo": "pcca" + }, + { + "name": "psalccav", + "description": "VIRTUAL ADDRESS OF LCCA", + "offset": 528, + "length": 4, + "type": "address", + "pointsTo": "lcca" + }, + { + "name": "psalccar", + "description": "REAL ADDRESS OF LCCA", + "offset": 532, + "length": 4, + "type": "address", + "pointsTo": "lcca" + }, + { + "name": "psatnew", + "description": "TCB pointer. Field maintained for code compatability with previous MVS releases. DO NOT USE.", + "offset": 536, + "length": 4, + "type": "address", + "pointsTo": "current" + }, + { + "name": "psatold", + "description": "Pointer to current TCB or zero if in SRB mode. e", + "offset": 540, + "length": 4, + "type": "address", + "pointsTo": "current" + }, + { + "name": "psaanew", + "description": "ASCB pointer. Field maintained for code compatability with previous MVS releases. DO NOT USE.", + "offset": 544, + "length": 4, + "type": "address", + "pointsTo": "mascb" + }, + { + "name": "psaaold", + "description": "Pointer to the home (current) ASCB.", + "offset": 548, + "length": 4, + "type": "address", + "pointsTo": "home" + }, + { + "name": "psasuper", + "description": "SUPERVISOR CONTROL WORD.", + "offset": 552, + "length": 4, + "type": "bitstring" + }, + { + "name": "psasup1", + "description": "FIRST BYTE OF PSASUPER", + "offset": 552, + "length": 1, + "type": "bitstring", + "bitmasks": { + "psaio": { + "description": "I/O FLIH", + "offset": 0, + "length": 1 + }, + "psasvc": { + "description": "SVC FLIH", + "offset": 1, + "length": 1 + }, + "psaext": { + "description": "EXTERNAL FLIH", + "offset": 2, + "length": 1 + }, + "psapi": { + "description": "PROGRAM CHECK FLIH", + "offset": 3, + "length": 1 + }, + "psalock": { + "description": "LOCK ROUTINE", + "offset": 4, + "length": 1 + }, + "psadisp": { + "description": "DISPATCHER", + "offset": 5, + "length": 1 + }, + "psatctl": { + "description": "TCTL RECOVERY FLAG", + "offset": 6, + "length": 1 + }, + "psatype6": { + "description": "TYPE 6 SVC IN CONTROL", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "psasup2", + "description": "SECOND BYTE OF PSASUPER", + "offset": 553, + "length": 1, + "type": "bitstring", + "bitmasks": { + "psaipcri": { + "description": "REMOTE IMMEDIATE SIGNAL SERVICE ROUTINE (IEAVERI)", + "offset": 0, + "length": 1 + }, + "psasvcr": { + "description": "SUPER FRR USES FOR SVC FLIH RECURSION TRACKING", + "offset": 1, + "length": 1 + }, + "psasvcrr": { + "description": "SVC RECOVERY RECURSION INDICATOR. OWNER: SUPERVISOR CONTROL. SERIALIZATION: DISABLEMENT.", + "offset": 2, + "length": 1 + }, + "psaacr": { + "description": "AUTOMATIC CPU RECONFIGURATION (ACR) IN CONTROL", + "offset": 5, + "length": 1 + }, + "psartm": { + "description": "RECOVERY TERMINATION MONITOR (RTM) IN CONTROL", + "offset": 6, + "length": 1 + }, + "psalcr": { + "description": "USED BY RTM TO SERIALIZE CALLS OF THE SUPERIVSOR ANALYSIS ROUTER", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "psasup3", + "description": "THIRD BYTE OF PSASUPER", + "offset": 554, + "length": 1, + "type": "bitstring", + "bitmasks": { + "psaiosup": { + "description": "IF ON, A MAINLINE IOS COMPONENT SUCH AS CHANNEL SCHEDULER HAS ENTERED A PHYSICALLY DISABLED STATE WITHOUT REGARD TO LOCKING REQUIREMENTS", + "offset": 0, + "length": 1 + }, + "psaspr": { + "description": "SUPER FRR IS ACTIVE", + "offset": 3, + "length": 1 + }, + "psaesta": { + "description": "SVC 60 RECOVERY ROUTINE ACTIVE", + "offset": 4, + "length": 1 + }, + "psarsm": { + "description": "REAL STORAGE MANAGER (RSM) ENTERED FOR PAGE FIX", + "offset": 5, + "length": 1 + }, + "psaulcms": { + "description": "LOCK MANAGER UNCONDITIONAL LOCAL OR CMS LOCK ROUTINES", + "offset": 6, + "length": 1 + }, + "psaslip": { + "description": "IEAVTSLP RECURSION CONTROL BIT", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "psasup4", + "description": "FOURTH BYTE OF PSASUPER", + "offset": 555, + "length": 1, + "type": "bitstring", + "bitmasks": { + "psaldwt": { + "description": "BLWLDWT IS IN CONTROL TO LOAD A RESTARTABLE OR NON-RESTARTABLE WAIT STATE CODE OWNERSHIP: LDWT", + "offset": 0, + "length": 1 + }, + "psasmf": { + "description": "SMF SUSPEND/RESET", + "offset": 1, + "length": 1 + }, + "psaesar": { + "description": "SUPERVISOR ANALYSIS ROUTER IS ACTIVE", + "offset": 2, + "length": 1 + }, + "psamch": { + "description": "Machine Check Handler is active.", + "offset": 3, + "length": 1 + } + } + }, + { + "name": "psarv22c", + "description": "RESERVED", + "offset": 556, + "length": 9, + "type": "hex" + }, + { + "name": "psa_workunit_cbf_atdisp", + "description": "", + "offset": 565, + "length": 2, + "type": "hex" + }, + { + "name": "psarv237", + "description": "RESERVED", + "offset": 567, + "length": 1, + "type": "hex" + }, + { + "name": "psa_workunit_procclassatdisp", + "description": "", + "offset": 568, + "length": 2, + "type": "hex" + }, + { + "name": "psa_workunit_procclassatdisp_byte0", + "description": "", + "offset": 568, + "length": 1, + "type": "hex" + }, + { + "name": "psa_workunit_procclassatdisp_byte1", + "description": "", + "offset": 569, + "length": 1, + "type": "hex" + }, + { + "name": "psaprocclass", + "description": "PROCESSOR WUQ Offset.", + "offset": 570, + "length": 2, + "type": "hex" + }, + { + "name": "psa_bylpar_procclass", + "description": "PROCESSOR WUQ Offset.", + "offset": 570, + "length": 2, + "type": "hex" + }, + { + "name": "psaprocclass_byte0", + "description": "", + "offset": 570, + "length": 1, + "type": "hex" + }, + { + "name": "psaprocclass_byte1", + "description": "This field is for IBM use only. OWNERSHIP: SUPERVISOR CONTROL SERIALIZATION: READ = NONE WRITE = NO WRITE ALLOWED See PSAProcClass_xxx constants.", + "offset": 571, + "length": 1, + "type": "hex" + }, + { + "name": "psa_bylpar_procclass_byte0", + "description": "", + "offset": 570, + "length": 1, + "type": "hex" + }, + { + "name": "psa_bylpar_procclass_byte1", + "description": "", + "offset": 571, + "length": 1, + "type": "hex" + }, + { + "name": "psaptype", + "description": "PROCESSOR TYPE INDICATOR OWNERSHIP: SUPERVISOR CONTROL SERIALIZATION: READ = NONE WRITE = DISABLEMENT.", + "offset": 572, + "length": 1, + "type": "bitstring", + "bitmasks": { + "psaifa": { + "description": "Indicates Special Processor", + "offset": 1, + "length": 1 + }, + "psa_bylpar_zcbp": { + "description": "", + "offset": 1, + "length": 1 + }, + "psa_bylpar_zaap": { + "description": "", + "offset": 1, + "length": 1 + }, + "psa_bylpar_ifa": { + "description": "", + "offset": 1, + "length": 1 + }, + "psazcbpds": { + "description": "zCBP that is different speed than CP", + "offset": 2, + "length": 1 + }, + "psaifads": { + "description": "zAAP (IFA) that is different speed than CP", + "offset": 2, + "length": 1 + }, + "psadscrp": { + "description": "Discretionary Processor", + "offset": 3, + "length": 1 + }, + "psaziip": { + "description": "zIIP", + "offset": 4, + "length": 1 + }, + "psa_bylpar_ziip": { + "description": "", + "offset": 4, + "length": 1 + }, + "psasup": { + "description": "zIIP", + "offset": 4, + "length": 1 + }, + "psa_bylpar_sup": { + "description": "", + "offset": 4, + "length": 1 + }, + "psaziipds": { + "description": "zIIP that is different speed than CP", + "offset": 5, + "length": 1 + }, + "psasupds": { + "description": "zIIP that is different speed than CP", + "offset": 5, + "length": 1 + } + } + }, + { + "name": "psails", + "description": "INTERRUPT HANDLER LINKAGE STACK INDICATORS.", + "offset": 573, + "length": 1, + "type": "bitstring", + "bitmasks": { + "psailsio": { + "description": "THE I/O FLIH IS USING THE INTERRUPT HANDLER LINKAGE STACK.", + "offset": 0, + "length": 1 + }, + "psailsex": { + "description": "THE EXTERNAL FLIH IS USING THE INTERRUPT HANDLER LINKAGE STACK.", + "offset": 1, + "length": 1 + }, + "psailspc": { + "description": "THE PROGRAM FLIH IS USING THE INTERRUPT HANDLER LINKAGE STACK.", + "offset": 2, + "length": 1 + }, + "psailsds": { + "description": "THE DISPATCHER IS USING THE INTERRUPT HANDLER LINKAGE STACK.", + "offset": 3, + "length": 1 + }, + "psailsrs": { + "description": "THE RESTART FLIH IS USING THE INTERRUPT HANDLER LINKAGE STACK.", + "offset": 4, + "length": 1 + }, + "psailsor": { + "description": "EXIT IS USING THE INTERRUPT HANDLER LINKAGE STACK.", + "offset": 5, + "length": 1 + }, + "psailst6": { + "description": "TYPE 6 SVC IS USING THE INTERRUPT HANDLER LINKAGE STACK.", + "offset": 6, + "length": 1 + }, + "psailslk": { + "description": "THE INTERRUPT HANDLER LINKAGE STACK IS ACTIVE BECAUSE THE RSM LOCK OR A LOCK HIGHER THAN THE RSM LOCK IS HELD.", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "psalsvci", + "description": "LAST SVC ISSUED ON THIS PROCESSOR PRIOR TO ENABLEMENT BY THE SVC FLIH. OWNERSHIP: SUPERVISOR CONTROL SERIALIZATION: DISABLEMENT", + "offset": 574, + "length": 2, + "type": "hex" + }, + { + "name": "psaflags", + "description": "SYSTEM FLAGS This field is PI for bits PSATX and PSATXC only OWNERSHIP: SUPERVISOR CONTROL SERIALIZATION: DISABLEMENT SERIALIZATION: None for PI bits", + "offset": 576, + "length": 1, + "type": "bitstring", + "bitmasks": { + "psaaeit": { + "description": "ADDRESSING ENVIRONMENT IS IN TRANSITION. INDICATES THAT THE SPACE TYPE (ADDRESS SPACE OR SUBSPACE) ASSOCIATED WITH PASN OR SASN IS UNKNOWN. Was PSAFPAC, PSAFPPE", + "offset": 0, + "length": 1 + }, + "psatx": { + "description": "Equivalent to CVTTX", + "offset": 4, + "length": 1 + }, + "psatxc": { + "description": "Equivalent to CVTTXC", + "offset": 5, + "length": 1 + } + } + }, + { + "name": "psarv241", + "description": "RESERVED FOR FUTURE USE - SC1C5.", + "offset": 577, + "length": 10, + "type": "hex" + }, + { + "name": "psascaff", + "description": "$$SCAFFOLD", + "offset": 587, + "length": 1, + "type": "bitstring", + "bitmasks": { + "psaemema": { + "description": "$$SCAFFOLD: z/Architecture", + "offset": 0, + "length": 1 + } + } + }, + { + "name": "psalkcrf", + "description": "LINKAGE STACK POINTER SAVE AREA. USED WHEN THE RSM OR ANY LOCK ABOVE THE RSM LOCK IS HELD.", + "offset": 588, + "length": 4, + "type": "address", + "pointsTo": "stack" + }, + { + "name": "psampsw", + "description": "SETLOCK MODEL PSW", + "offset": 592, + "length": 8, + "type": "bitstring", + "bitmasks": { + "psapiom": { + "description": "INPUT/OUTPUT INTERRUPT MASK", + "offset": 62, + "length": 1 + }, + "psapexm": { + "description": "EXTERNAL INTERRUPT MASK", + "offset": 63, + "length": 1 + } + } + }, + { + "name": "psaicnt", + "description": "Instruction count at last (re)dispatch", + "offset": 600, + "length": 8, + "type": "hex" + }, + { + "name": "psaxad", + "description": "Must be x'AD' - ISV dependency", + "offset": 608, + "length": 1, + "type": "hex" + }, + { + "name": "psaintsm", + "description": "Used by IEAVEINT. OWNERSHIP: SUPERVISOR CONTROL. SERIALIZATION: DISABLEMENT.", + "offset": 609, + "length": 1, + "type": "hex" + }, + { + "name": "psarv262", + "description": "Reserved", + "offset": 610, + "length": 14, + "type": "hex" + }, + { + "name": "psastosm", + "description": "STOSM PSASLSA,X'00' Instruction. In order to use this field, move the system mask to PSASTSSM and immediately issue EX 0,PSASTOSM. The system mask field (PSASTSSM) is not preserved across calls. Note that this technique causes a store into the instruction stream, which causes poor performance.", + "offset": 624, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psahlhis", + "description": "SAVE AREA FOR PSAHLHI", + "offset": 628, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psarecur", + "description": "RESTART FLIH RECURSION INDICATOR. IF X'00', FLIH NOT IN CONTROL. IF X'FF', FLIH IN CONTROL, ENTRY IS RECURSIVE.", + "offset": 632, + "length": 1, + "type": "hex" + }, + { + "name": "psarssm", + "description": "STNSM AREA FOR IEAVERES", + "offset": 633, + "length": 1, + "type": "hex" + }, + { + "name": "psasnsm2", + "description": "STNSM AREA FOR IEAVTRT1", + "offset": 634, + "length": 1, + "type": "hex" + }, + { + "name": "psartm1s", + "description": "Bits 0-7 of the current PSW are stored here", + "offset": 635, + "length": 1, + "type": "bitstring", + "bitmasks": { + "psarsmex": { + "description": "BIT 0 OF PSARSML. IF ON, THE RSM LOCK IS HELD EXCLUSIVE.", + "offset": 0, + "length": 1 + }, + "psatrcex": { + "description": "BIT 0 OF PSATRCEL. IF ON THE TRACE LOCK IS HELD EXCLUSIVE.", + "offset": 0, + "length": 1 + }, + "psaiosex": { + "description": "BIT 0 OF PSAIOSL. IF ON THE IOS LOCK IS HELD EXCLUSIVE.", + "offset": 0, + "length": 1 + } + } + }, + { + "name": "psalwtsa", + "description": "REAL ADDRESS OF SAVE AREA USED WHEN A RESTARTABLE WAIT STATE IS LOADED OWNERSHIP: LDWT", + "offset": 636, + "length": 4, + "type": "address", + "pointsTo": "save" + }, + { + "name": "psaclht", + "description": "CPU LOCKS TABLE", + "offset": 640, + "length": 116, + "type": "hex" + }, + { + "name": "psaclht1", + "description": "SPIN LOCKS TABLE", + "offset": 640, + "length": 80, + "type": "hex" + }, + { + "name": "psadispl", + "description": "GLOBAL DISPATCHER LOCK", + "offset": 640, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "psaasml", + "description": "AUXILIARY STORAGE MANAGEMENT (ASM) LOCK", + "offset": 644, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "psasalcl", + "description": "SPACE ALLOCATION LOCK", + "offset": 648, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "psaiossl", + "description": "IOS SYNCHRONIZATION LOCK", + "offset": 652, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "psarsmdl", + "description": "ADDRESS OF THE RSM DATA SPACE LOCK", + "offset": 656, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "psaiosul", + "description": "IOS UNIT CONTROL BLOCK LOCK", + "offset": 660, + "length": 4, + "type": "address" + }, + { + "name": "psarsmql", + "description": "RSMQ lock", + "offset": 664, + "length": 4, + "type": "address" + }, + { + "name": "psarv29c", + "description": "RESERVED FOR LOCK EXPANSION", + "offset": 668, + "length": 4, + "type": "address" + }, + { + "name": "psarv2a0", + "description": "RESERVED FOR LOCK EXPANSION", + "offset": 672, + "length": 4, + "type": "address" + }, + { + "name": "psatpacl", + "description": "TCAM'S TPACBDEB LOCK", + "offset": 676, + "length": 4, + "type": "address" + }, + { + "name": "psaoptl", + "description": "OPTIMIZER LOCK", + "offset": 680, + "length": 4, + "type": "address" + }, + { + "name": "psarsmgl", + "description": "RSM GLOBAL LOCK", + "offset": 684, + "length": 4, + "type": "address" + }, + { + "name": "psavfixl", + "description": "VSM FIXED SUBPOOLS LOCK", + "offset": 688, + "length": 4, + "type": "address" + }, + { + "name": "psaasmgl", + "description": "ASM GLOBAL LOCK", + "offset": 692, + "length": 4, + "type": "address" + }, + { + "name": "psarsmsl", + "description": "RSM STEAL LOCK", + "offset": 696, + "length": 4, + "type": "address" + }, + { + "name": "psarsmxl", + "description": "RSM CROSS MEMORY LOCK", + "offset": 700, + "length": 4, + "type": "address" + }, + { + "name": "psarsmal", + "description": "RSM ADDRESS SPACE LOCK", + "offset": 704, + "length": 4, + "type": "address" + }, + { + "name": "psavpagl", + "description": "VSM PAGEABLE SUBPOOLS LOCK", + "offset": 708, + "length": 4, + "type": "address" + }, + { + "name": "psarsmcl", + "description": "RSM COMMON LOCK", + "offset": 712, + "length": 4, + "type": "address" + }, + { + "name": "psarvlk2", + "description": "RESERVED FOR LOCK EXPANSION", + "offset": 716, + "length": 4, + "type": "address" + }, + { + "name": "psaclht2", + "description": "SHARED EXCLUSIVE LOCKS TABLE", + "offset": 720, + "length": 16, + "type": "hex" + }, + { + "name": "psarsml", + "description": "RSM GLOBAL FUNCTION/RECOVERY LOCK", + "offset": 720, + "length": 4, + "type": "address" + }, + { + "name": "psatrcel", + "description": "TRACE BUFFER MANAGEMENT LOCK", + "offset": 724, + "length": 4, + "type": "address" + }, + { + "name": "psaiosl", + "description": "IOS LOCK", + "offset": 728, + "length": 4, + "type": "address" + }, + { + "name": "psarvlk4", + "description": "RESERVED FOR LOCK EXPANSION", + "offset": 732, + "length": 4, + "type": "address" + }, + { + "name": "psaclht3", + "description": "SPECIAL LOCKS TABLE", + "offset": 736, + "length": 8, + "type": "hex" + }, + { + "name": "psacpul", + "description": "CPU TABLE LOCKS", + "offset": 736, + "length": 4, + "type": "address" + }, + { + "name": "psarvlk5", + "description": "RESERVED FOR LOCK EXPANSION", + "offset": 740, + "length": 4, + "type": "address" + }, + { + "name": "psaclht4", + "description": "SUSPEND LOCKS TABLE", + "offset": 744, + "length": 12, + "type": "hex" + }, + { + "name": "psacmsl", + "description": "CROSS MEMORY SERVICES LOCK", + "offset": 744, + "length": 4, + "type": "address" + }, + { + "name": "psalocal", + "description": "LOCAL LOCK", + "offset": 748, + "length": 4, + "type": "address" + }, + { + "name": "psarvlk6", + "description": "RESERVED FOR LOCK EXPANSION", + "offset": 752, + "length": 4, + "type": "address" + }, + { + "name": "psalcpua", + "description": "LOGICAL CPU ADDRESS FOR LOCK INSTRUCTION.", + "offset": 756, + "length": 4, + "type": "address" + }, + { + "name": "psahlhi", + "description": "HIGHEST LOCK HELD INDICATOR.", + "offset": 760, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psaclhs", + "description": "CPU LOCKS HELD STRING", + "offset": 760, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psaclhs1", + "description": "FIRST BYTE OF PSACLHS.", + "offset": 760, + "length": 1, + "type": "bitstring", + "bitmasks": { + "psacpuli": { + "description": "CPU LOCK INDICATOR", + "offset": 0, + "length": 1 + }, + "psasum": { + "description": "SUMMARY BIT. IF ON, AT LEAST ONE LOCK IN PSACLHSE IS HELD BY THIS PROCESSOR.", + "offset": 3, + "length": 1 + }, + "psarsmli": { + "description": "RSM LOCK INDICATOR", + "offset": 4, + "length": 1 + }, + "psatrcei": { + "description": "TRACE LOCK INDICATOR", + "offset": 5, + "length": 1 + }, + "psaiosi": { + "description": "IOS LOCK INDICATOR", + "offset": 6, + "length": 1 + } + } + }, + { + "name": "psaclhs2", + "description": "SECOND BYTE OF PSACLHS.", + "offset": 761, + "length": 1, + "type": "bitstring", + "bitmasks": { + "psarsmci": { + "description": "RSM COMMON LOCK INDICATOR", + "offset": 3, + "length": 1 + }, + "psarsmgi": { + "description": "RSM GLOBAL LOCK INDICATOR", + "offset": 4, + "length": 1 + }, + "psavfixi": { + "description": "VSM FIX LOCK INDICATOR", + "offset": 5, + "length": 1 + }, + "psaasmgi": { + "description": "ASM GLOBAL LOCK INDICATOR", + "offset": 6, + "length": 1 + }, + "psarsmsi": { + "description": "RSM STEAL LOCK INDICATOR", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "psaclhs3", + "description": "THIRD BYTE OF PSACLHS", + "offset": 762, + "length": 1, + "type": "bitstring", + "bitmasks": { + "psarsmxi": { + "description": "RSM CROSS MEMORY LOCK INDICATOR", + "offset": 0, + "length": 1 + }, + "psarsmai": { + "description": "RSM ADDRESS SPACE LOCK INDICATOR", + "offset": 1, + "length": 1 + }, + "psavpagi": { + "description": "VSM PAGE LOCK INDICATOR", + "offset": 2, + "length": 1 + }, + "psadspli": { + "description": "DISPATCHER LOCK INDICATOR", + "offset": 3, + "length": 1 + }, + "psaasmli": { + "description": "ASM LOCK INDICATOR", + "offset": 4, + "length": 1 + }, + "psasalli": { + "description": "SPACE ALLOCATION LOCK INDICATOR", + "offset": 5, + "length": 1 + }, + "psaiosli": { + "description": "IOS SYNCHRONIZATION LOCK INDICATOR", + "offset": 6, + "length": 1 + }, + "psarsmdi": { + "description": "RSM DATA SPACE LOCK INDICATOR", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "psaclhs4", + "description": "FOURTH BYTE OF PSACLHS", + "offset": 763, + "length": 1, + "type": "bitstring", + "bitmasks": { + "psaiouli": { + "description": "IOS UCB LOCK INDICATOR", + "offset": 0, + "length": 1 + }, + "psarsmqi": { + "description": "RSMQ lock indicator", + "offset": 1, + "length": 1 + }, + "psatpali": { + "description": "TPACBDEB LOCK INDICATOR", + "offset": 4, + "length": 1 + }, + "psasrmli": { + "description": "SYSTEM RESOURCE MANAGER (SRM) LOCK INDICATOR", + "offset": 5, + "length": 1 + }, + "psacmsli": { + "description": "CROSS MEMORY SERVICES LOCK INDICATOR (CMS, CMSSMF, CMSEQDQ, CMSLATCH)", + "offset": 6, + "length": 1 + }, + "psalclli": { + "description": "LOCAL LOCK INDICATOR", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "psalita", + "description": "ADDRESS OF LOCK INTERFACE TABLE.", + "offset": 764, + "length": 4, + "type": "address", + "pointsTo": "velt" + }, + { + "name": "psastor8", + "description": "8-BYTE value for master's STO", + "offset": 768, + "length": 8, + "type": "hex" + }, + { + "name": "psacr0", + "description": "SAVE AREA FOR CONTROL REGISTER 0", + "offset": 776, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psamchfl", + "description": "MCH RECURSION FLAGS", + "offset": 780, + "length": 1, + "type": "hex" + }, + { + "name": "psasymsk", + "description": "THIS FIELD WILL BE USED IN CONJUNCTION WITH THE STNSM INSTRUCTION TO PLACE IOS CHANNEL SCHEDULER INTO A DISABLED STATE AND SIMULTANEOUSLY SAVE THE SYSTEM MASK OF THE CALLER", + "offset": 781, + "length": 1, + "type": "hex" + }, + { + "name": "psaactcd", + "description": "ACTION CODE SUPPLIED BY OPERATOR AFTER SYSTEM HAS LOADED RESTARTABLE WAIT STATE AND BEFORE THE RESTART KEY IS DEPRESSED. VALUE DEPENDS ON RESTARTABLE WAIT STATE CODE. UNPREDICTABLE DURING NORMAL SYSTEM OPERATION. OWNERSHIP: LDWT", + "offset": 782, + "length": 1, + "type": "hex" + }, + { + "name": "psamchic", + "description": "MCH INITIALIZATION COMPLETE FLAGS", + "offset": 783, + "length": 1, + "type": "hex" + }, + { + "name": "psawkrap", + "description": "REAL ADDRESS OF VARY CPU PARAMETER LIST", + "offset": 784, + "length": 4, + "type": "address", + "pointsTo": "vary" + }, + { + "name": "psawkvap", + "description": "VIRTUAL ADDRESS OF VARY CPU PARAMETER LIST", + "offset": 788, + "length": 4, + "type": "address", + "pointsTo": "vary" + }, + { + "name": "psavstap", + "description": "WORK AREA FOR VARY CPU", + "offset": 792, + "length": 2, + "type": "signed-integer" + }, + { + "name": "psacpusa", + "description": "PHYSICAL CPU ADDRESS (STATIC)", + "offset": 794, + "length": 2, + "type": "signed-integer" + }, + { + "name": "psastor", + "description": "MASTER MEMORY'S SEGMENT TABLE ORIGIN REGISTER (STOR) VALUE", + "offset": 796, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psaidawk", + "description": "WORK SAVE AREA FOR private DEBUG TOOL.", + "offset": 800, + "length": 90, + "type": "hex" + }, + { + "name": "psaret", + "description": "BSM 0,14 BRANCH RETURN TO CALLER USED BY ROUTINES INVOKED BY IOS", + "offset": 890, + "length": 2, + "type": "signed-integer" + }, + { + "name": "psaretcd", + "description": "BSM 0,14 BRANCH RETURN TO CALLER WITH RETURN CODE IN REGISTER 15, USED BY ROUTINES INVOKED BY IOS", + "offset": 892, + "length": 2, + "type": "signed-integer" + }, + { + "name": "psaval", + "description": "Virtual Architecture Level. Bits 0-11 are the same as IHASCCB field SCCBVAL bits 20-31. Bits 12-15 are not defined.", + "offset": 894, + "length": 2, + "type": "hex" + }, + { + "name": "psaval_machine", + "description": "First byte. Sample values: 0 meant z10 or earlier but is not possible for this release. 1 meant z196 but is not possible for this release. 2 meant zEC12 but is not possible for this release. 3 meant zEC13 but is not possible for this release. 4 meant z14 but is not possible for this release.", + "offset": 894, + "length": 1, + "type": "hex" + }, + { + "name": "psarsvt", + "description": "RECOVERY STACK VECTOR TABLE", + "offset": 896, + "length": 64, + "type": "hex" + }, + { + "name": "psarsvte", + "description": "RECOVERY STACK VECTOR TABLE", + "offset": 896, + "length": 64, + "type": "hex" + }, + { + "name": "psacstk", + "description": "ADDRESS OF CURRENTLY USED FUNCTIONAL RECOVERY ROUTINE (FRR) STACK", + "offset": 896, + "length": 4, + "type": "address" + }, + { + "name": "psanstk", + "description": "ADDRESS OF NORMAL FRR STACK", + "offset": 900, + "length": 4, + "type": "address", + "pointsTo": "normal" + }, + { + "name": "psasstk", + "description": "ADDRESS OF SVC-I/O-DISPATCHER FRR STACK", + "offset": 904, + "length": 4, + "type": "address", + "pointsTo": "svc" + }, + { + "name": "psassav", + "description": "ADDRESS OF INTERRUPTED STACK SAVED BY SVC, I/O, DISPATCHER", + "offset": 908, + "length": 4, + "type": "address" + }, + { + "name": "psamstk", + "description": "ADDRESS OF MCH FRR STACK", + "offset": 912, + "length": 4, + "type": "address", + "pointsTo": "mch" + }, + { + "name": "psamsav", + "description": "ADDRESS OF INTERRUPTED STACK SAVED BY MCH", + "offset": 916, + "length": 4, + "type": "address" + }, + { + "name": "psapstk", + "description": "ADDRESS OF PROGRAM CHECK FLIH FRR STACK", + "offset": 920, + "length": 4, + "type": "address", + "pointsTo": "program" + }, + { + "name": "psapsav", + "description": "ADDRESS OF INTERRUPTED STACK SAVED BY PROGRAM CHECK FLIH", + "offset": 924, + "length": 4, + "type": "address" + }, + { + "name": "psaestk1", + "description": "ADDRESS OF EXTERNAL FLIH FRR STACK FOR NON-RECURSIVE ENTRIES", + "offset": 928, + "length": 4, + "type": "address", + "pointsTo": "external" + }, + { + "name": "psaesav1", + "description": "ADDRESS OF INTERRUPTED STACK SAVED BY EXTERNAL FLIH FOR NON-RECURSIVE ENTRIES", + "offset": 932, + "length": 4, + "type": "address" + }, + { + "name": "psaestk2", + "description": "ADDRESS OF EXTERNAL FLIH FRR STACK FOR FIRST LEVEL RECURSIONS", + "offset": 936, + "length": 4, + "type": "address", + "pointsTo": "external" + }, + { + "name": "psaesav2", + "description": "ADDRESS OF INTERRUPTED STACK SAVE BY EXTERNAL FLIH FOR FIRST LEVEL RECURSIONS", + "offset": 940, + "length": 4, + "type": "address" + }, + { + "name": "psaestk3", + "description": "ADDRESS OF EXTERNAL FLIH FRR STACK FOR SECOND LEVEL RECURSIONS AND ACR", + "offset": 944, + "length": 4, + "type": "address", + "pointsTo": "external" + }, + { + "name": "psaesav3", + "description": "ADDRESS OF INTERRUPTED STACK SAVED BY EXTERNAL FLIH FOR SECOND LEVEL RECURSIONS", + "offset": 948, + "length": 4, + "type": "address" + }, + { + "name": "psarstk", + "description": "ADDRESS OF RESTART FLIH FRR STACK", + "offset": 952, + "length": 4, + "type": "address", + "pointsTo": "restart" + }, + { + "name": "psarsav", + "description": "ADDRESS OF INTERRUPTED STACK SAVED BY RESTART FLIH", + "offset": 956, + "length": 4, + "type": "address" + }, + { + "name": "psalwpsw", + "description": "PSW OF WORK INTERRUPTED WHEN A RESTARTABLE WAIT STATE IS LOADED OWNERSHIP: LDWT", + "offset": 960, + "length": 8, + "type": "hex", + "pointsTo": "rtm" + }, + { + "name": "psarv3c8", + "description": "Reserved", + "offset": 968, + "length": 8, + "type": "hex" + }, + { + "name": "psatstk", + "description": "ADDRESS OF RTM RECOVERY STACK. SERIALIZATION: NONE - THE FIELD IS INITIALIZED AT IPL/VARY CPU ONLINE TIME ONLY. OWNER: RTM.", + "offset": 976, + "length": 4, + "type": "address", + "pointsTo": "rtm" + }, + { + "name": "psatsav", + "description": "ADDRESS OF ERROR STACK SAVED BY RTM WHEN SWITCHING TO RTM RECOVERY STACK. OWNERSHIP: RTM", + "offset": 980, + "length": 4, + "type": "address", + "pointsTo": "error" + }, + { + "name": "psaastk", + "description": "ADDRESS OF ACR FRR STACK. OWNERSHIP: ACR", + "offset": 984, + "length": 4, + "type": "address", + "pointsTo": "acr" + }, + { + "name": "psaasav", + "description": "ADDRESS OF INTERRUPT STACK SAVED BY ACR. OWNERSHIP: ACR", + "offset": 988, + "length": 4, + "type": "address" + }, + { + "name": "psartpsw", + "description": "RESUME PSW FOR RTM SETRP RETRY OPTION OWNERSHIP: RTM", + "offset": 992, + "length": 8, + "type": "hex" + }, + { + "name": "psapcr0e", + "description": "Temp for PC FLIH/Disp for CR0E", + "offset": 1000, + "length": 8, + "type": "hex" + }, + { + "name": "psasfacc", + "description": "SETFRR ABEND COMPLETION CODE USED WHEN A SETFRR ADD IS ISSUED AGAINST A FULL FRR STACK", + "offset": 1008, + "length": 4, + "type": "hex" + }, + { + "name": "psalsfcc", + "description": "L 1,PSASFACC INSTRUCTION TO LOAD REGISTER 1 WITH THE SETFRR ABEND COMPLETION CODE IN PSASFACC", + "offset": 1012, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psasvc13", + "description": "AN SVC 13 INSTRUCTION", + "offset": 1016, + "length": 2, + "type": "signed-integer" + }, + { + "name": "psafpfl", + "description": "See LCCAFPFL Interface only for PSABFP, PSAVSS", + "offset": 1018, + "length": 1, + "type": "bitstring", + "bitmasks": { + "psabfp": { + "description": "Additional FP status is being saved", + "offset": 3, + "length": 1 + }, + "psavss": { + "description": "VRs are being saved", + "offset": 4, + "length": 1 + }, + "psagsf": { + "description": "GSF controls are being saved", + "offset": 5, + "length": 1 + } + } + }, + { + "name": "psainte", + "description": "FLAGS FOR CPU TIMER", + "offset": 1019, + "length": 1, + "type": "bitstring", + "bitmasks": { + "psanuin": { + "description": "CPU TIMER CANNOT BE USED", + "offset": 0, + "length": 1 + } + } + }, + { + "name": "psarv3fc", + "description": "Reserved", + "offset": 1020, + "length": 12, + "type": "hex" + }, + { + "name": "psaatcvt", + "description": "ADDRESS OF VTAM ATCVT. INITIALIZED BY VTAM.", + "offset": 1032, + "length": 4, + "type": "address", + "pointsTo": "vtam" + }, + { + "name": "psawtcod", + "description": "WAIT STATE CODE LOADED OWNERSHIP: LDWT", + "offset": 1036, + "length": 4, + "type": "address" + }, + { + "name": "psascwa", + "description": "ADDRESS OF SUPERVISOR CONTROL CPU RELATED WORK SAVE AREA", + "offset": 1040, + "length": 4, + "type": "address" + }, + { + "name": "psarsmsa", + "description": "ADDRESS OF RSM CPU RELATED WORK SAVE AREA", + "offset": 1044, + "length": 4, + "type": "address", + "pointsTo": "rsm" + }, + { + "name": "psascpsw", + "description": "MODEL PSW OWNERSHIP: SUPERVISOR CONTROL. SERIALIZATION: DISABLED.", + "offset": 1048, + "length": 8, + "type": "hex" + }, + { + "name": "psasmpsw", + "description": "SRB DISPATCH PSW", + "offset": 1056, + "length": 4, + "type": "hex" + }, + { + "name": "psapcpsw", + "description": "= TEMPORARY OLD PSW STORAGE FOR PROGRAM FLIH", + "offset": 1064, + "length": 16, + "type": "hex" + }, + { + "name": "psarv438", + "description": "= Reserved", + "offset": 1080, + "length": 8, + "type": "hex" + }, + { + "name": "psamcx16", + "description": "MCH exit PSW16", + "offset": 1088, + "length": 16, + "type": "hex" + }, + { + "name": "psarsp16", + "description": "Resume PSW field for restart interrupt -", + "offset": 1104, + "length": 16, + "type": "hex" + }, + { + "name": "psapswsv16", + "description": "PSW SAVE AREA FOR DISPATCHER AND ACR", + "offset": 1120, + "length": 16, + "type": "hex" + }, + { + "name": "psapswsv", + "description": "PSW SAVE AREA FOR DISPATCHER AND ACR", + "offset": 1128, + "length": 8, + "type": "hex" + }, + { + "name": "psacput", + "description": "SUPERVISOR CPU TIMER SAVE AREA", + "offset": 1136, + "length": 8, + "type": "hex" + }, + { + "name": "psapcfun", + "description": "PROGRAM FLIH RECURSION FLAGS", + "offset": 1144, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psapcfb1", + "description": "FUNCTION VALUE", + "offset": 1144, + "length": 1, + "type": "bitstring", + "bitmasks": { + "psapcmc": { + "description": "MC INTERRUPT", + "offset": 7, + "length": 1 + }, + "psapcpf": { + "description": "PAGE FAULT", + "offset": 6, + "length": 1 + }, + "psapcps": { + "description": "PER/SPACE SWITCH INTERRUPT", + "offset": 6, + "length": 2 + }, + "psapcad": { + "description": "ADDRESSING EXCEPTION", + "offset": 5, + "length": 1 + }, + "psapcpc": { + "description": "PROGRAM CHECK", + "offset": 5, + "length": 2 + }, + "psapctrc": { + "description": "TRACE INTERRUPT", + "offset": 5, + "length": 3 + }, + "psapcaf": { + "description": "NEW VALUE FOR PROGRAM INTERRUPT FLAG. ASYMMETRIC FEATURE OPERATION EXCEPTION.", + "offset": 4, + "length": 1 + }, + "psapcdar": { + "description": "DISABLED ART PIC X'2B' FUNCTION VALUE FOR PROGRAM FLIH.", + "offset": 4, + "length": 2 + } + } + }, + { + "name": "psapcfb2", + "description": "FUNCTION FLAGS", + "offset": 1145, + "length": 1, + "type": "bitstring", + "bitmasks": { + "psapctrr": { + "description": "TRACE INTERRUPT RECURSION HANDLER FLAG.", + "offset": 0, + "length": 1 + }, + "psapcmt": { + "description": "TRACE RECURSION FLAG", + "offset": 1, + "length": 1 + } + } + }, + { + "name": "psapcfb3", + "description": "RECURSION FLAGS", + "offset": 1146, + "length": 1, + "type": "bitstring", + "bitmasks": { + "psapcp1": { + "description": "FIRST LEVEL PROGRAM CHECK", + "offset": 0, + "length": 1 + }, + "psapcp2": { + "description": "SECOND LEVEL PROGRAM CHECK", + "offset": 1, + "length": 1 + }, + "psapcde": { + "description": "DAT ERROR CONDITION", + "offset": 2, + "length": 1 + }, + "psapclv": { + "description": "0=REGISTERS IN LCCA, 1=REGISTERS NOT IN LCCA.", + "offset": 3, + "length": 1 + }, + "psapcp3": { + "description": "THIRD LEVEL PROGRAM CHECK", + "offset": 4, + "length": 1 + }, + "psapcp4": { + "description": "FOURTH LEVEL PROGRAM CHECK", + "offset": 5, + "length": 1 + }, + "psapcpfr": { + "description": "RECURSIVE PAGE FAULT INDICATOR", + "offset": 6, + "length": 1 + }, + "psapcavr": { + "description": "RECURSIVE ASTE VALIDITY INDICATOR", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "psapcfb4", + "description": "RECURSION FLAGS", + "offset": 1147, + "length": 1, + "type": "bitstring", + "bitmasks": { + "psapcdnv": { + "description": "DUCT validity indicator", + "offset": 0, + "length": 1 + }, + "psapclsr": { + "description": "IEAVLSIH has invoked IARPTEPR and recursion into RSM is not permitted.", + "offset": 1, + "length": 1 + } + } + }, + { + "name": "psapcps2", + "description": "PASID AT TIME OF SECOND LEVEL INTERRUPT", + "offset": 1148, + "length": 2, + "type": "signed-integer" + }, + { + "name": "psarv47e", + "description": "RESERVED", + "offset": 1150, + "length": 2, + "type": "hex" + }, + { + "name": "psapcwka", + "description": "Work area for PC FLIH. Must be qword-aligned", + "offset": 1152, + "length": 24, + "type": "hex" + }, + { + "name": "psapcps3", + "description": "PASID AT TIME OF THIRD LEVEL INTERRUPT", + "offset": 1176, + "length": 2, + "type": "signed-integer" + }, + { + "name": "psapcps4", + "description": "PASID AT TIME OF FOURTH LEVEL INTERRUPT", + "offset": 1178, + "length": 2, + "type": "signed-integer" + }, + { + "name": "psamodew", + "description": "Word label to address PSAMODE.", + "offset": 1180, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psamflgs", + "description": "SECOND BYTE OF PSAMODEW", + "offset": 1181, + "length": 1, + "type": "bitstring", + "bitmasks": { + "psanss": { + "description": "ENABLED UNLOCKED TASK WITH FRR", + "offset": 0, + "length": 1 + }, + "psaprsrb": { + "description": "Preemptable-class SRB", + "offset": 1, + "length": 1 + } + } + }, + { + "name": "psamodeh", + "description": "SECOND HALFWORD OF PSAMODEW. FIRST BYTE MUST BE ZERO FOR I/O AND EXTERNAL FLIHS.", + "offset": 1182, + "length": 1, + "type": "hex" + }, + { + "name": "psamode", + "description": "SYSTEM MODE INDICATOR AND DISPLACEMENT INTO TABLES FOR EXTERNAL AND I/O FLIHS", + "offset": 1183, + "length": 1, + "type": "bitstring", + "bitmasks": { + "psasrbm": { + "description": "SRB MODE VALUE", + "offset": 5, + "length": 1 + }, + "psawaitm": { + "description": "WAIT MODE VALUE", + "offset": 4, + "length": 1 + }, + "psadispm": { + "description": "DISPATCHER MODE VALUE", + "offset": 3, + "length": 1 + }, + "psapsrbm": { + "description": "PSEUDO SRB MODE FLAG BIT. THIS BIT MAY BE ON WITH ANY OF ABOVE MODE VALUES.", + "offset": 2, + "length": 1 + } + } + }, + { + "name": "psastnsm", + "description": "STNSM TARGET USED BY EXIT PROLOGUE", + "offset": 1187, + "length": 1, + "type": "hex" + }, + { + "name": "psalkjw", + "description": "LOCAL LOCK RELEASE SRB JOURNAL WORD", + "offset": 1188, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psadzero", + "description": "DOUBLEWORD OF ZERO", + "offset": 1192, + "length": 8, + "type": "hex" + }, + { + "name": "psafzero", + "description": "FULLWORD OF ZERO", + "offset": 1192, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psalkjw2", + "description": "CMS LOCK RELEASE JOURNAL WORD.", + "offset": 1200, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psalkpt", + "description": "SETLOCK TEST,TYPE=HIER PARAMETER LIST TABLE. OWNERSHIP: LOCK MANAGER. SERIALIZATION: NONE.", + "offset": 1204, + "length": 4, + "type": "address", + "pointsTo": "lkpt" + }, + { + "name": "psalaa", + "description": "LE Anchor Area. Owner: LE", + "offset": 1208, + "length": 4, + "type": "address" + }, + { + "name": "psalit2", + "description": "POINTER TO THE EXTENDED LOCK INTERFACE TABLE.", + "offset": 1212, + "length": 4, + "type": "address", + "pointsTo": "velt" + }, + { + "name": "psaecltp", + "description": "POINTER TO THE EXTENDED CURRENT LOCKS HELD TABLE.", + "offset": 1216, + "length": 4, + "type": "address", + "pointsTo": "clte" + }, + { + "name": "psaclhse", + "description": "CURRENT LOCKS HELD STRING EXTENSION", + "offset": 1220, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psalheb0", + "description": "BYTE 0 OF THE CURRENT LOCK HELD STRING EXTENSION.", + "offset": 1220, + "length": 1, + "type": "bitstring", + "bitmasks": { + "psablsdi": { + "description": "BMFLSD LOCK INDICATOR.", + "offset": 0, + "length": 1 + }, + "psaxdsi": { + "description": "XCFDS LOCK INDICATOR.", + "offset": 1, + "length": 1 + }, + "psaxresi": { + "description": "XCFRES LOCK INDICATOR.", + "offset": 2, + "length": 1 + }, + "psaxqi": { + "description": "XCFQ LOCK INDICATOR.", + "offset": 3, + "length": 1 + }, + "psaeseti": { + "description": "ETRSET LOCK INDICATOR.", + "offset": 4, + "length": 1 + }, + "psaixsci": { + "description": "IXLSCH LOCK INDICATOR.", + "offset": 5, + "length": 1 + }, + "psaixshi": { + "description": "IXLSHR LOCK INDICATOR.", + "offset": 6, + "length": 1 + }, + "psaixdsi": { + "description": "IXLDS LOCK INDICATOR.", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "psalheb1", + "description": "BYTE 1 OF THE CURRENT LOCK HELD STRING EXTENSION.", + "offset": 1221, + "length": 1, + "type": "bitstring", + "bitmasks": { + "psaixlli": { + "description": "IXLSHELL LOCK INDICATOR.", + "offset": 0, + "length": 1 + }, + "psauluti": { + "description": "IOSULUT LOCK INDICATOR.", + "offset": 1, + "length": 1 + }, + "psaixlri": { + "description": "IXLREQST LOCK INDICATOR.", + "offset": 2, + "length": 1 + }, + "psawlmri": { + "description": "WLMRES LOCK INDICATOR", + "offset": 3, + "length": 1 + }, + "psawlmqi": { + "description": "WLMQ LOCK INDICATOR.", + "offset": 4, + "length": 1 + }, + "psacntxi": { + "description": "CONTEXT LOCK INDICATOR", + "offset": 5, + "length": 1 + }, + "psaregsi": { + "description": "REGSRV LOCK INDICATOR.", + "offset": 6, + "length": 1 + }, + "psassdli": { + "description": "SSD LOCK INDICATOR.", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "psalheb2", + "description": "BYTE 2 OF THE CURRENT LOCK HELD STRING EXTENSION.", + "offset": 1222, + "length": 1, + "type": "bitstring", + "bitmasks": { + "psagrsli": { + "description": "GRSINT lock indicator", + "offset": 0, + "length": 1 + }, + "psamisli": { + "description": "MISC lock indicator", + "offset": 1, + "length": 1 + }, + "psapslk1": { + "description": "n/a", + "offset": 1, + "length": 1 + }, + "psadnu2": { + "description": "n/a", + "offset": 2, + "length": 1 + }, + "psapnlk1": { + "description": "n/a", + "offset": 2, + "length": 1 + }, + "psadnu3": { + "description": "n/a", + "offset": 3, + "length": 1 + }, + "psaiolk1": { + "description": "n/a", + "offset": 3, + "length": 1 + }, + "psadnu4": { + "description": "n/a", + "offset": 4, + "length": 1 + }, + "psapxlk1": { + "description": "n/a", + "offset": 4, + "length": 1 + }, + "psadnu5": { + "description": "n/a", + "offset": 5, + "length": 1 + }, + "psadrlk3": { + "description": "n/a", + "offset": 5, + "length": 1 + }, + "psadrlk2": { + "description": "HCWDRLK2 lock indicator", + "offset": 6, + "length": 1 + }, + "psadrlk1": { + "description": "HCWDRLK1 lock indicator", + "offset": 7, + "length": 1 + } + } + }, + { + "name": "psalheb3", + "description": "BYTE 3 OF THE CURRENT LOCK HELD STRING EXTENSION.", + "offset": 1223, + "length": 1, + "type": "bitstring", + "bitmasks": { + "psasrmei": { + "description": "SRMENQ lock indicator", + "offset": 0, + "length": 1 + }, + "psassdgi": { + "description": "SSDGROUP lock indicator", + "offset": 1, + "length": 1 + } + } + }, + { + "name": "psarv4c8", + "description": "RESERVED FOR FUTURE LOCK EXPANSION.", + "offset": 1224, + "length": 8, + "type": "hex" + }, + { + "name": "psarv4d0", + "description": "RESERVED.", + "offset": 1232, + "length": 144, + "type": "hex" + }, + { + "name": "psadiag560", + "description": "Diagnostic data for IBM use only", + "offset": 1376, + "length": 36, + "type": "hex" + }, + { + "name": "psarv584", + "description": "RESERVED.", + "offset": 1412, + "length": 4, + "type": "hex" + }, + { + "name": "psahwfb", + "description": "HARDWARE FLAG BYTE.", + "offset": 1416, + "length": 1, + "type": "hex" + }, + { + "name": "psacr0cb", + "description": "CR0 CONTROL BYTE USED BY PROTPSA MACRO", + "offset": 1417, + "length": 1, + "type": "bitstring", + "bitmasks": { + "psaenabl": { + "description": "TO ENABLE PSA PROTECTION", + "offset": 3, + "length": 1 + } + } + }, + { + "name": "psarv58a", + "description": "RESERVED", + "offset": 1418, + "length": 2, + "type": "bitstring", + "bitmasks": { + "psacr0en": { + "description": "IF 0, PSA PROTECT DISABLED. IF 1, PSA PROTECT ENABLED. BIT IS IN HIGH-ORDER BYTE OF PSACR0SV.", + "offset": 11, + "length": 1 + }, + "psacr0ed": { + "description": "DAT features. Bit is in PSACR0SV+1", + "offset": 8, + "length": 1 + }, + "psacr0al": { + "description": "IF 1, ASN & LX Reuse facility is enabled. Bit is in PSACR0SV+1", + "offset": 12, + "length": 1 + }, + "psacr0fp": { + "description": "IF 1, extended floating point is enabled. Bit is in PSACR0SV+1", + "offset": 13, + "length": 1 + }, + "psacr0vi": { + "description": "IF 1, vector instructions are enabled. Bit is in PSACR0SV+1", + "offset": 14, + "length": 1 + }, + "psarpen": { + "description": "IF 0, PSA PROTECT DISABLED. IF 1, PSA PROTECT ENABLED. BIT IS IN HIGH-ORDER BYTE OF PSARCR0.", + "offset": 11, + "length": 1 + } + } + }, + { + "name": "psacr0sv", + "description": "CR0 SAVE AREA USED BY PROTPSA MACRO", + "offset": 1420, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psapccr0", + "description": "PROGRAM CHECK FLIH CR0 SAVE AREA", + "offset": 1424, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psarcr0", + "description": "RESTART FLIH CR0 SAVE AREA", + "offset": 1428, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psastke", + "description": "CURRENT STACK CONTROL WORD FOR SRB'S AND TYPE 6 SVC'S.", + "offset": 1432, + "length": 8, + "type": "hex" + }, + { + "name": "psatkn", + "description": "CURRENT STACK TOKEN", + "offset": 1432, + "length": 2, + "type": "signed-integer" + }, + { + "name": "psaasd", + "description": "CURRENT STACK ADDRESS SPACE DESIGNATOR", + "offset": 1434, + "length": 2, + "type": "signed-integer" + }, + { + "name": "psasel", + "description": "CURRENT STACK ELEMENTS ADDRESS", + "offset": 1436, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psaskpsw", + "description": "PCLINK STACK/UNSTACK MODEL PSW", + "offset": 1440, + "length": 4, + "type": "hex", + "pointsTo": "the" + }, + { + "name": "psaskps2", + "description": "PCLINK PSW ADDRESS", + "offset": 1444, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "psacpcls", + "description": "PCLINK WORKAREA - CURRENT STACK HEADER ADDRESS", + "offset": 1448, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "psarv5ac", + "description": "RESERVED.", + "offset": 1452, + "length": 4, + "type": "hex", + "pointsTo": "the" + }, + { + "name": "psascfs", + "description": "ADDRESS OF THE SUPERVISOR CONTROL FLIH SAVEAREA.", + "offset": 1456, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "psapawa", + "description": "ADDRESS OF PC/AUTH WORK AREA.", + "offset": 1460, + "length": 4, + "type": "address", + "pointsTo": "pc" + }, + { + "name": "psascfb", + "description": "SUPERVISOR CONTROL FLAG BYTE.", + "offset": 1464, + "length": 1, + "type": "bitstring", + "bitmasks": { + "psaiopr": { + "description": "INDICATES IF INTERRUPTED TASK SHOULD BE PREEMPTED. USED BY THE I/O FLIH.", + "offset": 0, + "length": 1 + }, + "psaiorty": { + "description": "I/O FLIH RECOVERY FLAG. IF 1, CONTINUE RETRY PROCESSING INSTEAD OF ABENDING", + "offset": 1, + "length": 1 + }, + "psa_lockspinentered": { + "description": "Set whenever supervisor spins for a lock", + "offset": 2, + "length": 1 + } + } + }, + { + "name": "psarv5b9", + "description": "RESERVED", + "offset": 1465, + "length": 3, + "type": "hex" + }, + { + "name": "psacr0m1", + "description": "MASK OF CR0 WITH EXTERNAL MASK BITS OFF - USED BY WINDOW.", + "offset": 1468, + "length": 4, + "type": "hex" + }, + { + "name": "psacr0m2", + "description": "MASK OF CR0 WITH ONLY EXTERNAL MASK BITS ON - USED BY WINDOW.", + "offset": 1472, + "length": 4, + "type": "hex" + }, + { + "name": "psarv5c4", + "description": "RESERVED", + "offset": 1476, + "length": 4, + "type": "hex" + }, + { + "name": "psa_cr0emaskoffextint", + "description": "Mask of bits to turn off all external interrupts in grande CR0", + "offset": 1480, + "length": 8, + "type": "hex" + }, + { + "name": "psa_cr0emaskonextint", + "description": "Mask of bits to turn on all external interrupts in grande CR0", + "offset": 1488, + "length": 8, + "type": "hex" + }, + { + "name": "psa_cr0esavearea", + "description": "Save area for grande CR0", + "offset": 1496, + "length": 8, + "type": "hex" + }, + { + "name": "psa_cr0esavearea_hw", + "description": "High word save area for high word of CR0", + "offset": 1496, + "length": 4, + "type": "hex" + }, + { + "name": "psa_cr0esavearea_lw", + "description": "Low word save area for low word of CR0", + "offset": 1500, + "length": 4, + "type": "hex" + }, + { + "name": "psa_windowworkarea", + "description": "WorkArea for IEAMWIN", + "offset": 1504, + "length": 16, + "type": "hex" + }, + { + "name": "psa_windowtoddelta", + "description": "Difference in TOD values - used in IEAMWIN PL/X", + "offset": 1504, + "length": 8, + "type": "hex" + }, + { + "name": "psa_windowtoddelta_hw", + "description": "High word area for difference in TOD values", + "offset": 1504, + "length": 4, + "type": "hex" + }, + { + "name": "psa_windowtoddelta_lw", + "description": "Low word area for difference in TOD values", + "offset": 1508, + "length": 4, + "type": "hex" + }, + { + "name": "psa_windowlastopentod", + "description": "TOD when IEAMWIN last opened a window", + "offset": 1520, + "length": 8, + "type": "hex" + }, + { + "name": "psa_windowcurrenttod", + "description": "TOD when IEAMWIN last checked to open a window", + "offset": 1528, + "length": 8, + "type": "hex", + "pointsTo": "current" + }, + { + "name": "psarv600", + "description": "RESERVED", + "offset": 1536, + "length": 80, + "type": "hex" + }, + { + "name": "psa_time_on_cp", + "description": "Current SRB's accumulated CPU time on a standard CP. This field must immediately precede PSATIME This field is valid only when there is at least one zCBP/zAAP or zIIP installed.", + "offset": 1616, + "length": 8, + "type": "hex", + "pointsTo": "current" + }, + { + "name": "psatime", + "description": "CURRENT SRB'S ACCUMULATED CPU TIME", + "offset": 1624, + "length": 8, + "type": "hex", + "pointsTo": "current" + }, + { + "name": "psasrsav", + "description": "ADDRESS OF CURRENT FRR STACK SAVED BY STOP/RESET.", + "offset": 1632, + "length": 4, + "type": "address", + "pointsTo": "current" + }, + { + "name": "psaesc8", + "description": "Save area for IEAVESC8", + "offset": 1636, + "length": 12, + "type": "hex" + }, + { + "name": "psadexmw", + "description": "Work area for dispatcher CR3/4", + "offset": 1648, + "length": 8, + "type": "hex" + }, + { + "name": "psadsars", + "description": "DISPATCHER ACCESS REGISTER SAVE AREA", + "offset": 1656, + "length": 64, + "type": "hex" + }, + { + "name": "psa_pcflih_trace_interrupt_cput", + "description": "Trace interrupt CPU timer saved", + "offset": 1720, + "length": 8, + "type": "hex" + }, + { + "name": "psadtsav", + "description": "CPU TIMER VALUE AT LAST DISPATCH, SRBTIMER REQUEST, CPUTIMER EXPIRATION, OR STATUS SAVE OR RESTORE.", + "offset": 1728, + "length": 8, + "type": "hex" + }, + { + "name": "psaff6c0", + "description": "INITIALIZE FIELD PSADTSAV", + "offset": 1728, + "length": 8, + "type": "hex" + }, + { + "name": "psadexms", + "description": "DISPATCHER CONTROL REGISTER 3 AND 4 SAVE AREA", + "offset": 1736, + "length": 16, + "type": "hex" + }, + { + "name": "psadcr3", + "description": "DISPATCHER CONTROL REGISTER 3 SAVE AREA", + "offset": 1736, + "length": 8, + "type": "hex" + }, + { + "name": "psadsins", + "description": "DISPATCHER Secondary ASTE Inst# S/A", + "offset": 1736, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psadpksa", + "description": "PKM and SASID", + "offset": 1740, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psadpkm", + "description": "DISPATCHER PROGRAM KEY MASK SAVE AREA", + "offset": 1740, + "length": 2, + "type": "signed-integer" + }, + { + "name": "psadsas", + "description": "DISPATCHER SECONDARY ASID SAVE AREA", + "offset": 1742, + "length": 2, + "type": "signed-integer" + }, + { + "name": "psadcr4", + "description": "DISPATCHER CONTROL REGISTER 4 SAVE AREA", + "offset": 1744, + "length": 8, + "type": "hex" + }, + { + "name": "psadpins", + "description": "DISPATCHER Primary ASTE Inst# S/A", + "offset": 1744, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psadaxpa", + "description": "AX and PASID", + "offset": 1748, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psadax", + "description": "DISPATCHER AUTHORIZATION INDEX SAVE AREA.", + "offset": 1748, + "length": 2, + "type": "signed-integer" + }, + { + "name": "psadpas", + "description": "DISPATCHER PRIMARY ASID SAVE AREA.", + "offset": 1750, + "length": 2, + "type": "signed-integer" + }, + { + "name": "psa_time_on_zcbp_normalized", + "description": "Current SRB's accumulated CPU time on a zCBP. Normalized.", + "offset": 1752, + "length": 8, + "type": "hex", + "pointsTo": "the" + }, + { + "name": "psausend", + "description": "END FIRST SET OF ASSIGNED FIELDS SAVED BY ACR.", + "offset": 1760, + "length": 8, + "type": "hex" + }, + { + "name": "psarv6e0", + "description": "RESERVED", + "offset": 1760, + "length": 192, + "type": "hex" + }, + { + "name": "psaecvt", + "description": "Address of ECVT", + "offset": 1768, + "length": 8, + "type": "address" + }, + { + "name": "psaxcvt", + "description": "Address of XCVT", + "offset": 1776, + "length": 8, + "type": "address" + }, + { + "name": "psadatlk", + "description": "AREA FOR DAT-OFF ASSIST LINKAGE CODE", + "offset": 1784, + "length": 48, + "type": "hex" + }, + { + "name": "psadatof", + "description": "REAL STORAGE ADDRESS OF THE DAT-OFF LINKAGE TABLE WHICH IS INITIALIZED BY NIP FOR DAT-ON/DAT-OFF LINKAGE", + "offset": 1832, + "length": 4, + "type": "address", + "pointsTo": "the" + }, + { + "name": "psadatln", + "description": "LENGTH OF THE DAT-OFF INDEX TABLE (IEAVEDFT)", + "offset": 1836, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psatbvtv", + "description": "VIRTUAL ADDRESS CORRESPONDING TO PSATBVTR.", + "offset": 1840, + "length": 4, + "type": "address", + "pointsTo": "system" + }, + { + "name": "psatrace", + "description": "SYSTEM TRACE FLAGS.", + "offset": 1844, + "length": 1, + "type": "bitstring", + "bitmasks": { + "psatroff": { + "description": "IF ON, SYSTEM TRACE SUSPENDED ON THIS PROCESSOR BECAUSE WAIT TASK DISPATCHED.", + "offset": 0, + "length": 1 + } + } + }, + { + "name": "psarv7ed", + "description": "RESERVED FOR SYSTEM TRACE.", + "offset": 1845, + "length": 3, + "type": "hex" + }, + { + "name": "psatbvtr", + "description": "REAL ADDRESS OF SYSTEM TRACE BUFFER VECTOR TABLE (TBVT) REPRESENTING THE CURRENT SYSTEM TRACE BUFFER FOR THIS PROCESSOR. OWNERSHIP: SYSTEM TRACE. SERIALIZATION: DISABLEMENT FOR EXTERNAL INTERRUPTS ON THIS PROCESSOR OR THE TRACE SPIN LOCK.", + "offset": 1848, + "length": 4, + "type": "address", + "pointsTo": "vetvt" + }, + { + "name": "psatrvt", + "description": "ADDRESS OF SYSTEM TRACE VECTOR TABLE.", + "offset": 1852, + "length": 4, + "type": "address", + "pointsTo": "vetvt" + }, + { + "name": "psatot", + "description": "ADDRESS OF SYSTEM TRACE OPERAND TABLE.", + "offset": 1856, + "length": 4, + "type": "address", + "pointsTo": "vetot" + }, + { + "name": "psaus2st", + "description": "START SECOND SET OF ASSIGNED FIELDS SAVED BY ACR.", + "offset": 1860, + "length": 8, + "type": "hex" + }, + { + "name": "psacdsav", + "description": "CALLDISP REGISTER SAVE AREA FOR REGISTERS 14 - 1", + "offset": 1860, + "length": 16, + "type": "hex" + }, + { + "name": "psacdsae", + "description": "CALLDISP REGISTER 14 SAVE AREA", + "offset": 1860, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psacdsaf", + "description": "CALLDISP REGISTER 15 SAVE AREA", + "offset": 1864, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psacdsa0", + "description": "CALLDISP REGISTER 0 SAVE AREA", + "offset": 1868, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psacdsa1", + "description": "CALLDISP REGISTER 1 SAVE AREA", + "offset": 1872, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psagspsw", + "description": "GLOBAL SCHEDULE SYSTEM MASK SAVE AREA. OWNERSHIP: SUPERVISOR CONTROL. SERIALIZATION: DISABLEMENT.", + "offset": 1876, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psagsrgs", + "description": "GLOBAL SCHEDULE REGISTER SAVE AREA. OWNERSHIP: SUPERVISOR CONTROL. SERIALIZATION: DISABLEMENT.", + "offset": 1880, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psa_masterasterealaddr", + "description": "", + "offset": 1884, + "length": 4, + "type": "address" + }, + { + "name": "psasv01r", + "description": "IEAVTRG1 register 1 save area.", + "offset": 1888, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psasv14r", + "description": "IEAVTRG1 register 14 save area.", + "offset": 1892, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psaems2r", + "description": "REGISTER SAVE AREA OWNERSHIP: MEMORY SWITCH. SERIALIZATION: DISABLED.", + "offset": 1896, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psatrsav", + "description": "TRACE REGISTER SAVE AREA.", + "offset": 1900, + "length": 64, + "type": "hex" + }, + { + "name": "psatrgr0", + "description": "TRACE REGISTER 0 SAVE AREA.", + "offset": 1900, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psatrgr1", + "description": "TRACE REGISTER 1 SAVE AREA.", + "offset": 1904, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psatrgr2", + "description": "TRACE REGISTER 2 SAVE AREA.", + "offset": 1908, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psatrgr3", + "description": "TRACE REGISTER 3 SAVE AREA.", + "offset": 1912, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psatrgr4", + "description": "TRACE REGISTER 4 SAVE AREA.", + "offset": 1916, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psatrgr5", + "description": "TRACE REGISTER 5 SAVE AREA.", + "offset": 1920, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psatrgr6", + "description": "TRACE REGISTER 6 SAVE AREA.", + "offset": 1924, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psatrgr7", + "description": "TRACE REGISTER 7 SAVE AREA.", + "offset": 1928, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psatrgr8", + "description": "TRACE REGISTER 8 SAVE AREA.", + "offset": 1932, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psatrgr9", + "description": "TRACE REGISTER 9 SAVE AREA.", + "offset": 1936, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psatrgra", + "description": "TRACE REGISTER 10 SAVE AREA.", + "offset": 1940, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psatrgrb", + "description": "TRACE REGISTER 11 SAVE AREA.", + "offset": 1944, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psatrgrc", + "description": "TRACE REGISTER 12 SAVE AREA.", + "offset": 1948, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psatrgrd", + "description": "TRACE REGISTER 13 SAVE AREA.", + "offset": 1952, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psatrgre", + "description": "TRACE REGISTER 14 SAVE AREA.", + "offset": 1956, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psatrgrf", + "description": "TRACE REGISTER 15 SAVE AREA.", + "offset": 1960, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psatrsv1", + "description": "Trace Save 1", + "offset": 1964, + "length": 4, + "type": "hex" + }, + { + "name": "psatrsvs", + "description": "Trace Save for SLIP/PER", + "offset": 1968, + "length": 4, + "type": "hex" + }, + { + "name": "psatrsv2", + "description": "Trace Save 2", + "offset": 1972, + "length": 8, + "type": "hex" + }, + { + "name": "psarv878", + "description": "RESERVED.", + "offset": 1980, + "length": 40, + "type": "hex" + }, + { + "name": "psagsavh", + "description": "Register save area used by dispatcher", + "offset": 2020, + "length": 8, + "type": "hex" + }, + { + "name": "psagsav", + "description": "REGISTER SAVE AREA USED BY DISPATCHER AND SCHEDULE", + "offset": 2032, + "length": 64, + "type": "hex" + }, + { + "name": "psaff8a8", + "description": "INITIALIZE FIELD PSAGSAV", + "offset": 2032, + "length": 64, + "type": "hex" + }, + { + "name": "psascrg1", + "description": "GLOBAL SCHEDULE REGISTER SAVE AREA", + "offset": 2096, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psascrg2", + "description": "GLOBAL SCHEDULE REGISTER SAVE AREA", + "offset": 2100, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psagpreg", + "description": "REGISTER SAVE AREA FOR SVC FLIH AND SCHEDULE", + "offset": 2104, + "length": 12, + "type": "signed-integer" + }, + { + "name": "psarsreg", + "description": "RESTART FLIH REGISTER SAVE", + "offset": 2116, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psapcgr8", + "description": "PROGRAM FLIH REGISTER 8 SAVE AREA", + "offset": 2120, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psapcgr9", + "description": "PROGRAM FLIH REGISTER 9 SAVE AREA", + "offset": 2124, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psapcgab", + "description": "PROGRAM FLIH REG 10-11 SAVE AREA", + "offset": 2128, + "length": 8, + "type": "hex" + }, + { + "name": "psapcgra", + "description": "PROGRAM FLIH REGISTER 10 SAVE AREA", + "offset": 2128, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psapcgrb", + "description": "PROGRAM FLIH REGISTER 11 SAVE AREA", + "offset": 2132, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psalksa", + "description": "IEAVELK REGISTER SAVE AREA OWNERSHIP: SUPERVISOR CONTROL SERIALIZATION: DISABLEMENT", + "offset": 2136, + "length": 64, + "type": "hex" + }, + { + "name": "psalkr0", + "description": "IEAVELK REGISTER 0 SAVE AREA", + "offset": 2136, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psalkr1", + "description": "IEAVELK REGISTER 1 SAVE AREA", + "offset": 2140, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psalkr2", + "description": "IEAVELK REGISTER 2 SAVE AREA", + "offset": 2144, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psalkr3", + "description": "IEAVELK REGISTER 3 SAVE AREA", + "offset": 2148, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psalkr4", + "description": "IEAVELK REGISTER 4 SAVE AREA", + "offset": 2152, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psalkr5", + "description": "IEAVELK REGISTER 5 SAVE AREA", + "offset": 2156, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psalkr6", + "description": "IEAVELK REGISTER 6 SAVE AREA", + "offset": 2160, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psalkr7", + "description": "IEAVELK REGISTER 7 SAVE AREA", + "offset": 2164, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psalkr8", + "description": "IEAVELK REGISTER 8 SAVE AREA", + "offset": 2168, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psalkr9", + "description": "IEAVELK REGISTER 9 SAVE AREA", + "offset": 2172, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psalkr10", + "description": "IEAVELK REGISTER 10 SAVE AREA", + "offset": 2176, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psalkr11", + "description": "IEAVELK REGISTER 11 SAVE AREA", + "offset": 2180, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psalkr12", + "description": "IEAVELK REGISTER 12 SAVE AREA", + "offset": 2184, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psalkr13", + "description": "IEAVELK REGISTER 13 SAVE AREA", + "offset": 2188, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psalkr14", + "description": "IEAVELK REGISTER 14 SAVE AREA", + "offset": 2192, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psalkr15", + "description": "IEAVELK REGISTER 15 SAVE AREA", + "offset": 2196, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psaslsa", + "description": "SINGLE LEVEL SAVE AREA USED BY DISABLED ROUTINES WITH NO DEPENDENCY THAT THE SAVE AREA REMAIN INTACT ACROSS A CALL. THIS AREA IS NOT MAINTAINED BY RESTART PROCESSING THAT RESULTS IN AN ABEND OF OF THE INTERRUPTED ROUTINE.", + "offset": 2200, + "length": 72, + "type": "hex" + }, + { + "name": "psaff950", + "description": "INITIALIZE FIELD PSASLSA", + "offset": 2200, + "length": 72, + "type": "hex" + }, + { + "name": "psajstsa", + "description": "SAVE AREA FOR JOB STEP TIMING ROUTINE. OWNERSHIP: SUPERVISOR CONTROL. SERIALIZATION: DISABLEMENT.", + "offset": 2272, + "length": 64, + "type": "hex" + }, + { + "name": "psaff998", + "description": "INITIALIZE FIELD PSAJSTSA", + "offset": 2272, + "length": 64, + "type": "hex" + }, + { + "name": "psaus2nd", + "description": "END SECOND SET OF ASSIGNED FIELDS SAVED BY ACR.", + "offset": 2336, + "length": 8, + "type": "hex" + }, + { + "name": "psaslksa", + "description": "IEAVESLK REGISTER SAVE AREA OWNERSHIP: SUPERVISOR CONTROL SERIALIZATION: DISABLEMENT", + "offset": 2336, + "length": 64, + "type": "hex" + }, + { + "name": "psaslkr0", + "description": "IEAVESLK REGISTER 0 SAVE AREA", + "offset": 2336, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psaslkr1", + "description": "IEAVESLK REGISTER 1 SAVE AREA", + "offset": 2340, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psaslkr2", + "description": "IEAVESLK REGISTER 2 SAVE AREA", + "offset": 2344, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psaslkr3", + "description": "IEAVESLK REGISTER 3 SAVE AREA", + "offset": 2348, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psaslkr4", + "description": "IEAVESLK REGISTER 4 SAVE AREA", + "offset": 2352, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psaslkr5", + "description": "IEAVESLK REGISTER 5 SAVE AREA", + "offset": 2356, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psaslkr6", + "description": "IEAVESLK REGISTER 6 SAVE AREA", + "offset": 2360, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psaslkr7", + "description": "IEAVESLK REGISTER 7 SAVE AREA", + "offset": 2364, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psaslkr8", + "description": "IEAVESLK REGISTER 8 SAVE AREA", + "offset": 2368, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psaslkr9", + "description": "IEAVESLK REGISTER 9 SAVE AREA", + "offset": 2372, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psaslkra", + "description": "IEAVESLK REGISTER 10 SAVE AREA", + "offset": 2376, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psaslkrb", + "description": "IEAVESLK REGISTER 11 SAVE AREA", + "offset": 2380, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psaslkrc", + "description": "IEAVESLK REGISTER 12 SAVE AREA", + "offset": 2384, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psaslkrd", + "description": "IEAVESLK REGISTER 13 SAVE AREA", + "offset": 2388, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psaslkre", + "description": "IEAVESLK REGISTER 14 SAVE AREA", + "offset": 2392, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psaslkrf", + "description": "IEAVESLK REGISTER 15 SAVE AREA", + "offset": 2396, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psa_setlocki_savearea", + "description": "SETLOCKI Register save area", + "offset": 2400, + "length": 8, + "type": "hex" + }, + { + "name": "psa_lastlogcpuheldlock", + "description": "When waiting to obtain a spin lock, the last observed lockword content.", + "offset": 2408, + "length": 4, + "type": "signed-integer" + }, + { + "name": "psarva24", + "description": "RESERVED", + "offset": 2412, + "length": 24, + "type": "hex" + }, + { + "name": "psascsav", + "description": "IEAVESC0 save area", + "offset": 2436, + "length": 64, + "type": "hex" + }, + { + "name": "psasflgs", + "description": "Schedule flags Ownership: Supervisor Control Serialization: Disablement", + "offset": 2500, + "length": 1, + "type": "bitstring", + "bitmasks": { + "psaschda": { + "description": "Schedule is active", + "offset": 0, + "length": 1 + }, + "psamcha": { + "description": "Machine Check is active", + "offset": 1, + "length": 1 + }, + "psarsta": { + "description": "Restart is active", + "offset": 2, + "length": 1 + }, + "psaegra": { + "description": "Global Recovery is active", + "offset": 3, + "length": 1 + }, + "psartma": { + "description": "Selected RTM functions are active", + "offset": 4, + "length": 1 + }, + "psadontgetweb": { + "description": "A WEB or WEBQLOCK is held. IEAVESC0 -", + "offset": 5, + "length": 1 + } + } + }, + { + "name": "psamiscf", + "description": "Miscellaneous flags set ONLY at IPL. Ownership: Supervisor Control Serialization: None", + "offset": 2501, + "length": 1, + "type": "bitstring", + "bitmasks": { + "psaalr": { + "description": "Equivalent to CVTALR", + "offset": 0, + "length": 1 + } + } + }, + { + "name": "psarva7e", + "description": "Reserved for future use - SC1C5", + "offset": 2502, + "length": 2, + "type": "hex" + }, + { + "name": "psarva80", + "description": "RESERVED", + "offset": 2504, + "length": 188, + "type": "hex" + }, + { + "name": "psagsch7", + "description": "ENABLED GLOBAL SCHEDULE ENTRY POINT", + "offset": 2692, + "length": 4, + "type": "address", + "pointsTo": "vesc" + }, + { + "name": "psagsch8", + "description": "DISABLED GLOBAL SCHEDULE ENTRY POINT", + "offset": 2696, + "length": 4, + "type": "address", + "pointsTo": "vesc" + }, + { + "name": "psalsch1", + "description": "ENABLED SCHEDULE ENTRY POINT", + "offset": 2700, + "length": 4, + "type": "address", + "pointsTo": "vesc" + }, + { + "name": "psalsch2", + "description": "DISABLED SCHEDULE ENTRY POINT", + "offset": 2704, + "length": 4, + "type": "address", + "pointsTo": "vesc" + }, + { + "name": "psasvt", + "description": "ADDRESS OF SUPERVISOR VECTOR TABLE", + "offset": 2708, + "length": 4, + "type": "address", + "pointsTo": "vesvt" + }, + { + "name": "psasvtx", + "description": "Address of Supervisor Vector Table extension. SERIALIZATION: None OWNERSHIP: Supervisor Control", + "offset": 2712, + "length": 4, + "type": "address", + "pointsTo": "vsvtx" + }, + { + "name": "psafafrr", + "description": "Fast FRR fields. These fields are for IBM use only.", + "offset": 2716, + "length": 8, + "type": "hex" + }, + { + "name": "psaffrr", + "description": "Fast FRR address. This field is for IBM use only. Serialization: CPU Lock, PSAFFRRS must be set before PSAFFRR Ownership: RTM", + "offset": 2716, + "length": 4, + "type": "address" + }, + { + "name": "psaffrrs", + "description": "Fast FRR stack. This field is for IBM use only. Serialization: CPU Lock, PSAFFRRS must be set before PSAFFRR Ownership: RTM", + "offset": 2720, + "length": 4, + "type": "address" + }, + { + "name": "psarvb5c", + "description": "Reserved", + "offset": 2724, + "length": 36, + "type": "hex" + }, + { + "name": "psarvb80", + "description": "Reserved", + "offset": 2760, + "length": 1112, + "type": "hex" + }, + { + "name": "psastak", + "description": "Do not use.", + "offset": 2760, + "length": 1112, + "type": "hex" + }, + { + "name": "psarvfd8", + "description": "Reserved", + "offset": 3872, + "length": 40, + "type": "hex" + }, + { + "name": "psaend", + "description": "END OF PSA", + "offset": 3912, + "length": 8, + "type": "hex" + } + ] +} \ No newline at end of file diff --git a/cbxp/mappings/tcb.json b/cbxp/mappings/tcb.json new file mode 100644 index 0000000..194a5e4 --- /dev/null +++ b/cbxp/mappings/tcb.json @@ -0,0 +1,1563 @@ +{ + "version": 1, + "name": "stcb", + "commonName": "Secondary Task Control Block (TCB)", + "macroId": "ihastcb", + "description": "%GOTO PLSSTCB2; /*", + "aliases": [ + "tcb" + ], + "pointedToBy": [ + "task" + ], + "storageAttributes": { + "subpools": [ + 253 + ], + "key": 0, + "residency": "Above 16 MB line" + }, + "controlBlock": [ + { + "name": "stcbegin", + "description": "BEGINNING OF STCB", + "offset": 0, + "length": 8, + "type": "hex" + }, + { + "name": "stcbstcb", + "description": "ACRONYM IN EBCDIC -STCB-", + "offset": 0, + "length": 4, + "type": "hex" + }, + { + "name": "stcbracp", + "description": "POINTER TO RACF DATA FOR THIS TASK. OWNERSHIP: RACF. SERIALIZATION: NONE.", + "offset": 4, + "length": 4, + "type": "address", + "pointsTo": "racf" + }, + { + "name": "stcbdivf", + "description": "POINTER TO 1ST DOA (DIV OBJECT ACCESS CONTROL BLOCK) FOR TCB. OWNERSHIP: DIV. SERIALIZATION: CML LOCK.", + "offset": 8, + "length": 4, + "type": "address" + }, + { + "name": "stcbdivl", + "description": "POINTER TO LAST DOA FOR TCB. OWNERSHIP: DIV. SERIALIZATION: CML LOCK.", + "offset": 12, + "length": 4, + "type": "address" + }, + { + "name": "stcbafns", + "description": "ORIGINAL CPU AFFINITY SAVE AREA USED TO SAVE TCBAFFN", + "offset": 16, + "length": 2, + "type": "bitstring" + }, + { + "name": "stcbctsc", + "description": "Number of consecutive dispatches remaining for this task", + "offset": 18, + "length": 2, + "type": "signed-integer" + }, + { + "name": "stcbessa", + "description": "Address of ESSA", + "offset": 20, + "length": 4, + "type": "address" + }, + { + "name": "stcbr018", + "description": "Reserved", + "offset": 24, + "length": 1, + "type": "hex" + }, + { + "name": "stcbflg1", + "description": "FLAG BYTE OWNERSHIP: SUPERVISOR CONTROL SERIALIZATION: TASK MODE IS TCBACTIV SRB MODE IS LOCAL LOCK", + "offset": 25, + "length": 1, + "type": "bitstring", + "bitmasks": { + "stcbpiq": { + "description": "INDICATES TO STAGE 3 EXIT EFFECTOR THAT IRB QUEUEING IS PROHIBITED. USE ONLY FOR ASYMMETRIC FEATURE PROCESSING.", + "offset": 0, + "length": 1 + }, + "stcbsst": { + "description": "Indicates that the task is a Subspace task.", + "offset": 3, + "length": 1 + }, + "stcbclup": { + "description": "Cleanup only 991006", + "offset": 4, + "length": 1 + }, + "stcbntrm": { + "description": "Name Token cleanup complete for this CMRO task", + "offset": 5, + "length": 1 + }, + "stcbjac": { + "description": "Job action", + "offset": 6, + "length": 1 + } + } + }, + { + "name": "stcbr01a", + "description": "Reserved", + "offset": 26, + "length": 2, + "type": "hex" + }, + { + "name": "stcbcmp", + "description": "Task completion code. STCBCMP is valid ONLY after its owning TCB has terminated. It may contain different information than TCBCMP because TCBCMP may be altered to provide an Initiator-specific final jobstep status. Ownership: RTM", + "offset": 28, + "length": 4, + "type": "bitstring" + }, + { + "name": "stcbcmpf", + "description": "When TcbEndingAbnormally is off, as of HBB7780 contains byte 4 of 64-bit GPR 15 when the last program to run in this task returned normally to the system. Otherwise, 'undefined'.", + "offset": 28, + "length": 1, + "type": "bitstring" + }, + { + "name": "stcbcmpc", + "description": "When TcbEndingAbnormally is on, contains the completion code for which this task abnormally terminated. The first 12 bits contain the system completion code or the last 12 bits contain the user completion code. When TCBEndingAbnormally is off, contains bytes 5-7 of 64-bit GPR 15 when the last program to run in this task returned normally to", + "offset": 29, + "length": 3, + "type": "bitstring" + }, + { + "name": "stcbalov", + "description": "WORK UNIT ACCESS LIST VIRTUAL ADDRESS. OWNERSHIP: PC/AUTH. SERIALIZATION: TCBACTIV.", + "offset": 32, + "length": 4, + "type": "address" + }, + { + "name": "stcbald", + "description": "WORK UNIT ACCESS LIST DESIGNATOR. BITS 1-24 WITH SEVEN ZEROES APPENDED ON THE RIGHT FORM THE 31-BIT REAL ADDRESS OF THE WORKUNIT'S ACCESS LIST. BITS 25-31 REPRESENT THE NUMBER OF 128 BYTE ACCESS LISTS, MINUS ONE. OWNERSHIP: PC/AUTH. SERIALIZATION: TCBACTIV.", + "offset": 36, + "length": 4, + "type": "address" + }, + { + "name": "stcbducv", + "description": "VIRTUAL ADDRESS OF THE DUCT. OWNERSHIP: SUPERVISOR CONTROL. SERIALIZATION: TCBACTIV.", + "offset": 40, + "length": 4, + "type": "address" + }, + { + "name": "stcbr02c", + "description": "Reserved. Was STCBDUCR", + "offset": 44, + "length": 4, + "type": "address" + }, + { + "name": "stcbars", + "description": "ACCESS REGISTER SAVEAREA. OWNERSHIP: SUPERVISOR CONTROL. SERIALIZATION: DISABLEMENT.", + "offset": 48, + "length": 64, + "type": "hex" + }, + { + "name": "stcbar0", + "description": "ACCESS REGISTER 0 SAVE AREA.", + "offset": 48, + "length": 4, + "type": "signed-integer" + }, + { + "name": "stcbar1", + "description": "ACCESS REGISTER 1 SAVE AREA.", + "offset": 52, + "length": 4, + "type": "signed-integer" + }, + { + "name": "stcbar2", + "description": "ACCESS REGISTER 2 SAVE AREA.", + "offset": 56, + "length": 4, + "type": "signed-integer" + }, + { + "name": "stcbar3", + "description": "ACCESS REGISTER 3 SAVE AREA.", + "offset": 60, + "length": 4, + "type": "signed-integer" + }, + { + "name": "stcbar4", + "description": "ACCESS REGISTER 4 SAVE AREA.", + "offset": 64, + "length": 4, + "type": "signed-integer" + }, + { + "name": "stcbar5", + "description": "ACCESS REGISTER 5 SAVE AREA.", + "offset": 68, + "length": 4, + "type": "signed-integer" + }, + { + "name": "stcbar6", + "description": "ACCESS REGISTER 6 SAVE AREA.", + "offset": 72, + "length": 4, + "type": "signed-integer" + }, + { + "name": "stcbar7", + "description": "ACCESS REGISTER 7 SAVE AREA.", + "offset": 76, + "length": 4, + "type": "signed-integer" + }, + { + "name": "stcbar8", + "description": "ACCESS REGISTER 8 SAVE AREA.", + "offset": 80, + "length": 4, + "type": "signed-integer" + }, + { + "name": "stcbar9", + "description": "ACCESS REGISTER 9 SAVE AREA.", + "offset": 84, + "length": 4, + "type": "signed-integer" + }, + { + "name": "stcbar10", + "description": "ACCESS REGISTER 10 SAVE AREA.", + "offset": 88, + "length": 4, + "type": "signed-integer" + }, + { + "name": "stcbar11", + "description": "ACCESS REGISTER 11 SAVE AREA.", + "offset": 92, + "length": 4, + "type": "signed-integer" + }, + { + "name": "stcbar12", + "description": "ACCESS REGISTER 12 SAVE AREA.", + "offset": 96, + "length": 4, + "type": "signed-integer" + }, + { + "name": "stcbar13", + "description": "ACCESS REGISTER 13 SAVE AREA.", + "offset": 100, + "length": 4, + "type": "signed-integer" + }, + { + "name": "stcbar14", + "description": "ACCESS REGISTER 14 SAVE AREA.", + "offset": 104, + "length": 4, + "type": "signed-integer" + }, + { + "name": "stcbar15", + "description": "ACCESS REGISTER 15 SAVE AREA.", + "offset": 108, + "length": 4, + "type": "signed-integer" + }, + { + "name": "stcblssd", + "description": "VIRTUAL ADDRESS OF THE LSSD FOR THE TASK. OWNERSHIP: SUPERVISOR CONTROL. SERIALIZATION: LOCAL LOCK.", + "offset": 112, + "length": 4, + "type": "address" + }, + { + "name": "stcblsdp", + "description": "LINKAGE STACK ENTRY DESCRIPTOR (LSED) POINTER. OWNERSHIP: SUPERVISOR CONTROL. SERIALIZATION: DISABLEMENT.", + "offset": 116, + "length": 4, + "type": "address" + }, + { + "name": "stcbrme", + "description": "TASK RELATED RESOURCE MANAGER QUEUE POINTERS. OWNERSHIP: RTM. SERIALIZATION: LOCAL LOCK.", + "offset": 120, + "length": 8, + "type": "hex" + }, + { + "name": "stcbrmef", + "description": "POINTER TO HEAD OF TASK RELATED RESOURCE MANAGER QUEUE.", + "offset": 120, + "length": 4, + "type": "address" + }, + { + "name": "stcbrmel", + "description": "POINTER TO TAIL OF TASK RELATED RESOURCE MANAGER QUEUE.", + "offset": 124, + "length": 4, + "type": "address" + }, + { + "name": "stcbestk", + "description": "VIRTUAL ADDRESS OF THE LINKAGE STACK ENTRY DESCRIPTOR (LSED) REPRESENTING AN EMPTY LINKAGE STACK. OWNERSHIP: SUPERVISOR CONTROL. SERIALIZATION: N/A.", + "offset": 128, + "length": 4, + "type": "address" + }, + { + "name": "stcbflg2", + "description": "FLAG BYTE OWNERSHIP: RTM,CSV. SERIALIZATION: LOCAL LOCK.", + "offset": 132, + "length": 1, + "type": "bitstring", + "bitmasks": { + "stcbrmet": { + "description": "IF ON, INDICATES TASK IS IN TERMINATION AND NO FURTHER RESOURCE MANAGER REQUESTS WILL BE HONORED.", + "offset": 0, + "length": 1 + }, + "stcbinrt": { + "description": "The task is processing within RTLS. An IRB must not issue a CSVRTLS request.", + "offset": 1, + "length": 1 + }, + "stcbprop": { + "description": "ATTACH is propagating the PKM.", + "offset": 2, + "length": 1 + }, + "stcbrmat": { + "description": "Resource Manager abnormal termination has begun", + "offset": 4, + "length": 1 + }, + "stcbrmns": { + "description": "Resource Manager encountered \"no storage\" after abnormal termination has begun", + "offset": 5, + "length": 1 + } + } + }, + { + "name": "stcbflg3", + "description": "FLAG BYTE OWNERSHIP: RTM. SERIALIZATION: TCBACTIV", + "offset": 133, + "length": 1, + "type": "bitstring", + "bitmasks": { + "stcbncnl": { + "description": "TASK IS NOT SUBJECT TO CANCEL OR DETACH.", + "offset": 0, + "length": 1 + }, + "stcbnoab": { + "description": "NCNL EXTENSION", + "offset": 1, + "length": 1 + }, + "stcbrtnc": { + "description": "ABTERMS OF THIS TASK ARE TO BE DEFERRED WHILE RTM2 PROCESSING IS ACTIVE", + "offset": 2, + "length": 1 + }, + "stcbeom": { + "description": "TASK IS CALLING END OF MEMORY RESOURCE MANAGERS", + "offset": 3, + "length": 1 + }, + "stcbnuat": { + "description": "No unauthorized attaches", + "offset": 4, + "length": 1 + } + } + }, + { + "name": "stcbnstp", + "description": "COUNT OF REQUESTS TO IGNORE SRB TO TASK PERCOLATIONS OWNERSHIP: RTM. SERIALIZATION: TCBACTIV", + "offset": 134, + "length": 2, + "type": "signed-integer" + }, + { + "name": "stcbtlsd", + "description": "ADDRESS OF TASK RELATED LSSD FOR THE LINKAGE STACK FROM DREF STORAGE", + "offset": 136, + "length": 4, + "type": "address" + }, + { + "name": "stcbtlsp", + "description": "ADDRESS OF TASK RELATED INITIAL LSED FOR THE LINKAGE STACK FROM DREF STORAGE", + "offset": 140, + "length": 4, + "type": "address" + }, + { + "name": "stcbttkn", + "description": "TTOKEN FOR THIS TASK OWNERSHIP: SUPERVISOR CONTROL SERIALIZATION: LOCAL LOCK This is an interface, and does not require serialized access, for the following cases only: 1.Your task (TCB address is in PSATOLD) 2.Any ancestor task. Note that when your task is part of the jobstep program task", + "offset": 144, + "length": 16, + "type": "hex" + }, + { + "name": "stcbaloc", + "description": "POINTER TO DYNAMIC STORAGE BUFFER OWNERSHIP: ALLOCATION SERIALIZATION: NONE", + "offset": 160, + "length": 4, + "type": "address" + }, + { + "name": "stcbr0a4", + "description": "RESERVED.", + "offset": 164, + "length": 1, + "type": "hex" + }, + { + "name": "stcbcryp", + "description": "Crypto flags. Ownership: ICSF Serialization: none", + "offset": 165, + "length": 1, + "type": "bitstring", + "bitmasks": { + "stcbuics": { + "description": "This task is using ICSF Crypto services.", + "offset": 0, + "length": 1 + }, + "stcbcrnq": { + "description": "This task is using ICSF key data set serialization.", + "offset": 1, + "length": 1 + } + } + }, + { + "name": "stcbtafa", + "description": "Transient feature affinity. SERIALIZATION: TCBACTIV OWNERSHIP: SUPERVISOR CONTROL", + "offset": 166, + "length": 2, + "type": "hex" + }, + { + "name": "stcbthtn", + "description": "Task Hash Table next STCB address", + "offset": 168, + "length": 4, + "type": "address" + }, + { + "name": "stcbmioc", + "description": "Count of currently outstanding MM I/Os per TCB Ownership: Media Manager Serialization: CS", + "offset": 172, + "length": 4, + "type": "signed-integer" + }, + { + "name": "stcbmemc", + "description": "Count of XCF members under this task. OWNERSHIP: XCF. SERIALIZATION: Compare-and-Swap.", + "offset": 176, + "length": 4, + "type": "signed-integer" + }, + { + "name": "stcbxcff", + "description": "XCF FLAG. OWNERSHIP: XCF. SERIALIZATION: TCBACTIV.", + "offset": 180, + "length": 1, + "type": "bitstring", + "bitmasks": { + "stcbsusm": { + "description": "Bit flag for use by XCF.", + "offset": 0, + "length": 1 + }, + "stcbxcf_isserver": { + "description": "Bit flag for use by XCF.", + "offset": 1, + "length": 1 + }, + "stcbxcf_isreceiver": { + "description": "Bit flag for use by XCF.", + "offset": 2, + "length": 1 + }, + "stcbxcf_issender": { + "description": "Bit flag for use by XCF.", + "offset": 3, + "length": 1 + }, + "stcbxcf_isfailed": { + "description": "Bit flag for use by XCF.", + "offset": 4, + "length": 1 + } + } + }, + { + "name": "stcbflg4", + "description": "Flag byte 4.", + "offset": 181, + "length": 1, + "type": "bitstring", + "bitmasks": { + "stcbenfl": { + "description": "If on, indicates task issued ENF listen request. Ownership: ENF. Serialization: None.", + "offset": 0, + "length": 1 + }, + "stcbvsmm": { + "description": "If on, indicates task has a buffered IEA705I message Ownership: VSM. Serialization: None.", + "offset": 1, + "length": 1 + } + } + }, + { + "name": "stcbflg5", + "description": "Flag byte 5.", + "offset": 182, + "length": 1, + "type": "bitstring", + "bitmasks": { + "stcbunck": { + "description": "If on, user requests no checkpoint. Ownership: Scheduler/Allocation. Serialization: None.", + "offset": 0, + "length": 1 + }, + "stcbenck": { + "description": "If on, checkpoint not honored due to environmental constraints. Ownership: Scheduler/Allocation. Serialization: None.", + "offset": 1, + "length": 1 + }, + "stcboptc": { + "description": "If on, indicates task is running under control of the OpenMVS Ptrace debugger. Ownership: OpenMVS. Serialization: Compare-and-Swap", + "offset": 2, + "length": 1 + }, + "stcbjsst": { + "description": "If on, this is the jobstep program task of a single step started task Ownership: Scheduler. Serialization: None.", + "offset": 3, + "length": 1 + }, + "stcbnoae": { + "description": "If on, no AEs should be built for this task Ownership: Scheduler. Serialization: None.", + "offset": 4, + "length": 1 + } + } + }, + { + "name": "stcbflg6", + "description": "Flag byte 6. Serialization: None", + "offset": 183, + "length": 1, + "type": "bitstring", + "bitmasks": { + "stcbsatf": { + "description": "If on, indicates that RACF should check TCBNCTL in this TCB rather than finding the jobstep TCB when performing program protection.", + "offset": 0, + "length": 1 + }, + "stcbfcap": { + "description": "If on, this task passed the resource check Ownership: IOS Serialization: TCBACTIV", + "offset": 1, + "length": 1 + }, + "stcbfcpp": { + "description": "If on, this task performed the resource check Ownership: IOS Serialization: TCBACTIV", + "offset": 2, + "length": 1 + } + } + }, + { + "name": "stcbdfts", + "description": "ADDRESS OF THE DFP-SMSX STRUCTURE FOR THE TASK. OWNERSHIP: DFP. SERIALIZATION: NONE", + "offset": 184, + "length": 4, + "type": "address" + }, + { + "name": "stcbjsab", + "description": "ADDRESS OF JOB SCHEDULER ADDRESS SPACE BLOCK. OWNERSHIP: CONTROLLING JOB SCHEDULER. SERIALIZATION: SEE MACRO IAZXJSAB.", + "offset": 188, + "length": 4, + "type": "address" + }, + { + "name": "stcbttcb", + "description": "TCPIP STCB Extension Ownership: TCPIP Serialization: Compare and Swap when this task is activated as a TCPIP client", + "offset": 192, + "length": 4, + "type": "address" + }, + { + "name": "stcbrgsv", + "description": "Registration Services Indicators Ownership: Registration Services Serialization: RegServ Lock.", + "offset": 196, + "length": 4, + "type": "signed-integer" + }, + { + "name": "stcbrgs1", + "description": "First Byte of Indicators", + "offset": 196, + "length": 1, + "type": "bitstring", + "bitmasks": { + "stcbrgrm": { + "description": "Task has registered as one or more resource managers.", + "offset": 0, + "length": 1 + }, + "stcbrgem": { + "description": "Task has registered as one or more exit managers.", + "offset": 1, + "length": 1 + } + } + }, + { + "name": "stcbrgs2", + "description": "Unused but reserved by CRG", + "offset": 197, + "length": 3, + "type": "hex" + }, + { + "name": "stcbnttp", + "description": "Address of task level Name/Token header. Ownership: Supervisor Control. Serialization: Local lock.", + "offset": 200, + "length": 4, + "type": "address" + }, + { + "name": "stcbrcts", + "description": "REFERENCE PATTERN COUNTS. OWNERSHIP: RSM. SERIALIZATION: RSMAD LOCK FOR THE ADDRESS SPACE OF THE TASK.", + "offset": 204, + "length": 4, + "type": "signed-integer" + }, + { + "name": "stcbarct", + "description": "NUMBER OF REFERENCE PATTERNS SPECIFIED FOR ADDRESS SPACE VIRTUAL STORAGE.", + "offset": 204, + "length": 2, + "type": "signed-integer" + }, + { + "name": "stcbdrct", + "description": "NUMBER OF REFERENCE PATTERNS SPECIFIED FOR DATA SPACE VIRTUAL STORAGE.", + "offset": 206, + "length": 2, + "type": "signed-integer" + }, + { + "name": "stcbdfp", + "description": "RESERVED FOR USE BY DFP. OWNERSHIP: DFP. SERIALIZATION: LOCAL LOCK.", + "offset": 208, + "length": 4, + "type": "bitstring", + "bitmasks": { + "stcboam": { + "description": "TASK IS A USER OF OAM RESOURCES.", + "offset": 24, + "length": 1 + } + } + }, + { + "name": "stcbotcb", + "description": "Address of OpenMVS Task Control Block. Ownership: OpenMVS. Serialization: Local lock.", + "offset": 212, + "length": 4, + "type": "address" + }, + { + "name": "stcbcdxh", + "description": "ADDRESS OF THE JOB PACK QUEUE CDE EXTENSIONS HASH TABLE. OWNERSHIP: CONTENTS SUPERVISOR (CSV) SERIALIZATION: LOCAL LOCK.", + "offset": 216, + "length": 4, + "type": "address" + }, + { + "name": "stcbsjst", + "description": "ADDRESS OF THE LOCAL STORAGE OBTAINED BY THE SJF CONTROL MODULE. OWNERSHIP: SCHEDULER JCL FACILITY. SERIALIZATION: NONE.", + "offset": 220, + "length": 4, + "type": "address" + }, + { + "name": "stcbatad", + "description": "Address of the ATTACH SVC in the routine which created this task. If the low bit is on, SVC 2A was issued from a program above 2G and STCBATAD contains the low half of the address", + "offset": 224, + "length": 4, + "type": "address" + }, + { + "name": "stcbweb", + "description": "Address of task's WEB. SERIALIZATION: Disablement. OWNERSHIP: Task Management.", + "offset": 228, + "length": 4, + "type": "address" + }, + { + "name": "stcbseqn", + "description": "RB Sequence Number Counter. Ownership: Supervisor Control. Serialization: Compare-and-Swap.", + "offset": 232, + "length": 4, + "type": "signed-integer" + }, + { + "name": "stcbxcnt", + "description": "Count of currently outstanding EXCPs per TCB. Ownership: EXCP. Serialization: Local lock.", + "offset": 236, + "length": 2, + "type": "signed-integer" + }, + { + "name": "stcbcons", + "description": "Console Flag. Ownership: Consoles. Serialization: None.", + "offset": 238, + "length": 1, + "type": "bitstring", + "bitmasks": { + "stcbwto": { + "description": "Jobstep TCB issued a WTO", + "offset": 0, + "length": 1 + } + } + }, + { + "name": "stcbflg7", + "description": "Flag byte 7.", + "offset": 239, + "length": 1, + "type": "hex" + }, + { + "name": "stcbpecb", + "description": "ECB used internally by RTM processing during task termination. Ownership: RTM. Serialization: Local lock.", + "offset": 240, + "length": 4, + "type": "signed-integer" + }, + { + "name": "stcbixgl", + "description": "Pointer to SLC task related information. Ownership: System Logger. Serialization: Local lock.", + "offset": 244, + "length": 4, + "type": "address" + }, + { + "name": "stcbdeta", + "description": "Address of Task being Detached by this Task. Ownership: Detach Serialization: Local Lock", + "offset": 248, + "length": 4, + "type": "address" + }, + { + "name": "stcbpque", + "description": "Address of the next Task that requires Parallel Detach protection Ownership: RTM Serialization: Local Lock", + "offset": 252, + "length": 4, + "type": "address" + }, + { + "name": "stcbcnzl", + "description": "Count of Console resources held by this Task Ownership: Consoles Serialization: Compare and Swap", + "offset": 256, + "length": 4, + "type": "hex" + }, + { + "name": "stcbstsb", + "description": "Address of the STSB (IWMSTSB). Ownership: WLM Serialization: WLMQ lock.", + "offset": 260, + "length": 4, + "type": "address" + }, + { + "name": "stcbeutk", + "description": "Execution unit token for this task Ownership: WLM", + "offset": 264, + "length": 8, + "type": "bitstring", + "bitmasks": { + "stcbenjs": { + "description": "Join with subtasks. NOTE: This field is valid only for the root TCB when that TCB's WEBTYPE is WEBTETCB. Ownership: Supervisor Serialization: TCBACTIV (executing under task in module IEAVJOIN or IEAVLEAV.)", + "offset": 56, + "length": 1 + } + } + }, + { + "name": "stcbencr", + "description": "Address of the root task in the current attach chain. NOTE: This field is only valid if this task's WEBTYPE=WEBTETCB. Ownership: Supervisor Serialization: TCBACTIV (executing under task in module IEAVJOIN.)", + "offset": 272, + "length": 4, + "type": "address" + }, + { + "name": "stcbencc", + "description": "Count of subtasks that have joined the root task's enclave via attach. NOTE: This field is only valid for the root tcb (STCBENCR). Also, it is only valid if the root tcb's WEBTYPE is WEBTETCB. Ownership: Supervisor Serialization: Enclave queue lock.", + "offset": 276, + "length": 4, + "type": "signed-integer" + }, + { + "name": "stcbdb2", + "description": "Token used by DB/2. Serialization: TCBACTIV", + "offset": 280, + "length": 4, + "type": "address" + }, + { + "name": "stcbvfrb", + "description": "Vector facility RB", + "offset": 284, + "length": 4, + "type": "address" + }, + { + "name": "stcbpmom", + "description": "Address of purge-only Mother Task Ownership: RTM Serialization: local lock", + "offset": 288, + "length": 4, + "type": "address" + }, + { + "name": "stcboflg", + "description": "Openedition flags", + "offset": 292, + "length": 4, + "type": "hex" + }, + { + "name": "stcbbcba", + "description": "Address of SOMObjects data structure Ownership: SOMObjects for OS/390 Serialization: CS", + "offset": 296, + "length": 4, + "type": "address" + }, + { + "name": "stcbflcs", + "description": "CS-serialized flags", + "offset": 300, + "length": 4, + "type": "hex" + }, + { + "name": "stcbflc0", + "description": "Byte 0 of CS-serialized flags", + "offset": 300, + "length": 1, + "type": "bitstring", + "bitmasks": { + "stcbtrst": { + "description": "RACF program control trust", + "offset": 0, + "length": 1 + }, + "stcbntrs": { + "description": "RACF program control non-trust", + "offset": 1, + "length": 1 + }, + "stcbpsen": { + "description": "Copy of RCVTPSEN at the time the task was attached. Valid only for jobstep task", + "offset": 2, + "length": 1 + }, + "stcbpsba": { + "description": "RACF basic program security", + "offset": 3, + "length": 1 + } + } + }, + { + "name": "stcbflc1", + "description": "Byte 1 of CS-serialized flags", + "offset": 301, + "length": 1, + "type": "hex" + }, + { + "name": "stcbflc2", + "description": "Byte 2 of CS-serialized flags", + "offset": 302, + "length": 1, + "type": "hex" + }, + { + "name": "stcbflc3", + "description": "Byte 3 of CS-serialized flags", + "offset": 303, + "length": 1, + "type": "hex" + }, + { + "name": "stcbvreq", + "description": "State of outstanding VTAM requests for this task. Ownership: VTAM Serialization: Modified only by VTAM requests running under this task.", + "offset": 304, + "length": 4, + "type": "hex" + }, + { + "name": "stcbafpr", + "description": "FP save area: 1,3,5,7-15,FPCR", + "offset": 308, + "length": 100, + "type": "hex" + }, + { + "name": "stcbfpfl", + "description": "FP Flags Serialization: TCBACTIV", + "offset": 408, + "length": 1, + "type": "bitstring", + "bitmasks": { + "stcbbfp": { + "description": "Extended FP saving rqd", + "offset": 0, + "length": 1 + }, + "stcbri": { + "description": "RI authorized", + "offset": 1, + "length": 1 + }, + "stcbns64": { + "description": "Used by ESPIE processing to tell the dispatcher not to save the upper halves of the GPRs", + "offset": 2, + "length": 1 + }, + "stcbvss": { + "description": "Vector status saving is active. This bit is in the same byte as STCBBFP so that the dispatcher can check both with one test", + "offset": 3, + "length": 1 + }, + "stcbgsf": { + "description": "GSF active for this task", + "offset": 5, + "length": 1 + } + } + }, + { + "name": "stcbipkf", + "description": "Initial PKF. This is used to deal with propagating PKM. If you change TCBPKF, you should change STCBIPKF to match if you want PKM propagation.", + "offset": 409, + "length": 1, + "type": "hex" + }, + { + "name": "stcbipkm", + "description": "Initial PKM. This is used to deal with propagating PKM. If you change TCBPKF, you should change STCBIPKM to match if you want PKM propagation.", + "offset": 410, + "length": 2, + "type": "hex" + }, + { + "name": "stcbg64h", + "description": "High halves of 64-bit GPRs", + "offset": 412, + "length": 64, + "type": "hex" + }, + { + "name": "stcb_ttime", + "description": "Aligned copy of TCBTTIME", + "offset": 476, + "length": 8, + "type": "hex" + }, + { + "name": "stcb_ttime_on_zcbp", + "description": "zCBP TCB time", + "offset": 484, + "length": 8, + "type": "hex" + }, + { + "name": "stcb_ttime_on_ifa", + "description": "IFA TCB time", + "offset": 484, + "length": 8, + "type": "hex" + }, + { + "name": "stcb_ttime_on_cp", + "description": "Standard CP TCB time", + "offset": 492, + "length": 8, + "type": "hex" + }, + { + "name": "stcbalc", + "description": "Allocation field", + "offset": 500, + "length": 4, + "type": "address" + }, + { + "name": "stcbuser", + "description": "User field. Owner: target module of the ATTACH. Must be set only by that module or a module in its component", + "offset": 504, + "length": 4, + "type": "address" + }, + { + "name": "stcbotca", + "description": "Address of OTCB Alternate Anchor For Cleanup Ownership: USS Serialization: run under this task.", + "offset": 508, + "length": 4, + "type": "address" + }, + { + "name": "stcblaa", + "description": "Address of LE Library Anchor Area", + "offset": 512, + "length": 4, + "type": "address" + }, + { + "name": "stcbsca", + "description": "SPIE/ESPIE-related fields", + "offset": 516, + "length": 528, + "type": "hex" + }, + { + "name": "stcbpie", + "description": "Address of PIE control block", + "offset": 516, + "length": 4, + "type": "address" + }, + { + "name": "stcbpmsk", + "description": "Program Mask at time of SPIE initiation. Restored at SPIE nullification.", + "offset": 520, + "length": 1, + "type": "hex" + }, + { + "name": "stcbflg8", + "description": "ESPIE flags", + "offset": 521, + "length": 1, + "type": "bitstring", + "bitmasks": { + "stcbtype": { + "description": "If 1 then an ESPIE exit is in control. If 0 then a SPIE exit is in control. This bit is only meaningful if PIENOPI is set to 1", + "offset": 0, + "length": 1 + }, + "stcblesr": { + "description": "If 1 then the ESPIE SRB should call LE", + "offset": 1, + "length": 1 + } + } + }, + { + "name": "stcbspov", + "description": "Count of SPIE/ESPIE overrides Ownership: RTM Serialization: Run under this task or have it set non-dispatchable", + "offset": 522, + "length": 2, + "type": "signed-integer" + }, + { + "name": "stcbprms", + "description": "PC-FLIHs SRB parms", + "offset": 524, + "length": 16, + "type": "hex" + }, + { + "name": "stcbrbp", + "description": "Address of RB which had the program interrupt", + "offset": 524, + "length": 4, + "type": "address" + }, + { + "name": "stcbilcp", + "description": "ILC and interrupt code from the program interrupt", + "offset": 528, + "length": 4, + "type": "hex" + }, + { + "name": "stcbilc", + "description": "Instruction length code", + "offset": 528, + "length": 1, + "type": "hex" + }, + { + "name": "stcbintc", + "description": "Program Interrupt Code", + "offset": 529, + "length": 2, + "type": "hex" + }, + { + "name": "stcbppsw", + "description": "PSW at program interrupt", + "offset": 531, + "length": 8, + "type": "hex" + }, + { + "name": "stcbrpp", + "description": "Recovery PIE PICA address", + "offset": 532, + "length": 4, + "type": "address" + }, + { + "name": "stcbfrpq", + "description": "Free RPP queue header", + "offset": 536, + "length": 4, + "type": "address" + }, + { + "name": "stcblscr", + "description": "Linkage Stack control register at time of error for ESPIE", + "offset": 540, + "length": 4, + "type": "address" + }, + { + "name": "stcbsars", + "description": "Access Registers at time of error for ESPIE", + "offset": 544, + "length": 64, + "type": "hex" + }, + { + "name": "stcbwork", + "description": "Work area used during ESPIE", + "offset": 608, + "length": 4, + "type": "hex" + }, + { + "name": "stcbppie", + "description": "Address of public storage EPIE or zero.", + "offset": 612, + "length": 4, + "type": "address" + }, + { + "name": "stcbcpie", + "description": "PIE being used by the current SPIE/ESPIE exit (if any)", + "offset": 616, + "length": 4, + "type": "address" + }, + { + "name": "stcbs64h", + "description": "64-bit GPR high halves for ESPIE", + "offset": 620, + "length": 64, + "type": "hex" + }, + { + "name": "stcbs64", + "description": "Entire 64-bit GPRs for ESPIE", + "offset": 684, + "length": 128, + "type": "hex" + }, + { + "name": "stcbtpin", + "description": "UCB PIN count for this TCB. Ownership: IOS", + "offset": 812, + "length": 4, + "type": "signed-integer" + }, + { + "name": "stcbr33c", + "description": "Reserved", + "offset": 816, + "length": 4, + "type": "hex" + }, + { + "name": "stcbtimi", + "description": "Cumulative time at last SMF", + "offset": 820, + "length": 8, + "type": "hex" + }, + { + "name": "stcbtsi", + "description": "", + "offset": 828, + "length": 4, + "type": "address" + }, + { + "name": "stcbr34c", + "description": "Reserved", + "offset": 832, + "length": 4, + "type": "hex" + }, + { + "name": "stcb_ttime_on_zcbp_normalized", + "description": "zCBP TCB time normalized", + "offset": 836, + "length": 8, + "type": "hex" + }, + { + "name": "stcbdcr8", + "description": "REAL ADDRESS OF THE DUCT. OWNERSHIP: SUPERVISOR CONTROL. SERIALIZATION: TCBACTIV.", + "offset": 844, + "length": 8, + "type": "address" + }, + { + "name": "stcbdcrh", + "description": "High half", + "offset": 844, + "length": 4, + "type": "hex" + }, + { + "name": "stcbdcrl", + "description": "Low half", + "offset": 848, + "length": 4, + "type": "address" + }, + { + "name": "stcbabat", + "description": "Attach-by-address (ASAMIABA) target", + "offset": 852, + "length": 8, + "type": "hex" + }, + { + "name": "stcbr368", + "description": "Reserved", + "offset": 860, + "length": 4, + "type": "hex" + }, + { + "name": "stcbxrct", + "description": "XES request count Serialization: compare and swap Ownership: XES", + "offset": 864, + "length": 4, + "type": "signed-integer" + }, + { + "name": "stcbsbea", + "description": "Breaking Event Address for ESPIE", + "offset": 868, + "length": 8, + "type": "hex" + }, + { + "name": "stcbsc64", + "description": "Entire 64-bit Control Regs for ESPIE", + "offset": 876, + "length": 128, + "type": "hex" + }, + { + "name": "stcbptr2", + "description": "TEA AR number for ESPIE", + "offset": 1004, + "length": 1, + "type": "hex" + }, + { + "name": "stcbr3fd", + "description": "Reserved", + "offset": 1005, + "length": 3, + "type": "hex" + }, + { + "name": "stcbpvad", + "description": "TEA (32-bit) for ESPIE", + "offset": 1008, + "length": 4, + "type": "signed-integer" + }, + { + "name": "stcbdxc", + "description": "Data exception code when PIC 7", + "offset": 1008, + "length": 1, + "type": "hex" + }, + { + "name": "stcbpv64", + "description": "TEA (64-bit) for ESPIE", + "offset": 1009, + "length": 8, + "type": "hex" + }, + { + "name": "stcbolcp", + "description": "Copy of original STCBILCP", + "offset": 1012, + "length": 4, + "type": "hex" + }, + { + "name": "stcboilc", + "description": "Original ILC", + "offset": 1012, + "length": 1, + "type": "hex" + }, + { + "name": "stcbopic", + "description": "Original PIC", + "offset": 1013, + "length": 2, + "type": "bitstring", + "bitmasks": { + "stcboptx": { + "description": "PI within TX", + "offset": 14, + "length": 1 + } + } + }, + { + "name": "stcbr40c", + "description": "Reserved for SCA expansion", + "offset": 1015, + "length": 4, + "type": "hex" + }, + { + "name": "stcb_ttime_on_ziip", + "description": "zIIP TCB time", + "offset": 1016, + "length": 8, + "type": "hex" + }, + { + "name": "stcb_ttime_on_sup", + "description": "SUP TCB time", + "offset": 1016, + "length": 8, + "type": "hex" + }, + { + "name": "stcb_ttime_zcbp_on_cp", + "description": "zCBP ON CP TCB TIME", + "offset": 1024, + "length": 8, + "type": "hex" + }, + { + "name": "stcb_ttime_ifa_on_cp", + "description": "IFA ON CP TCB TIME", + "offset": 1024, + "length": 8, + "type": "hex" + }, + { + "name": "stcb_ttime_ziip_on_cp", + "description": "zIIP on CP TCB time. When zAAPzIIP=YES is in effect, zAAP-eligible work running on a CP is included.", + "offset": 1032, + "length": 8, + "type": "hex" + }, + { + "name": "stcb_ttime_sup_on_cp", + "description": "SUP on CP TCB time. When zAAPzIIP=YES is in effect, zAAP-eligible work running on a CP is included.", + "offset": 1032, + "length": 8, + "type": "hex" + }, + { + "name": "stcbgtcb", + "description": "Address of GTCB (mapped by ISGYGTCB) Ownership:GRS Serialization: Compare and swap", + "offset": 1040, + "length": 8, + "type": "address" + }, + { + "name": "stcbhp1", + "description": "Pointer to Heap Pool 1 structure supporting macro IARST64 for common storage. Ownership: RSM. Serialization: CSG", + "offset": 1048, + "length": 8, + "type": "hex" + }, + { + "name": "stcbcpha", + "description": "Pointer to authorized cell pool block supporting macros IARST64 and IARCP64 OWNERSHIP: RSM. SERIALIZATION: Local Lock", + "offset": 1056, + "length": 8, + "type": "bitstring", + "bitmasks": { + "stcb_his_is_wait": { + "description": "This bit is on when a wait has been dispatched", + "offset": 56, + "length": 1 + }, + "stcb_his_zs": { + "description": "", + "offset": 57, + "length": 1 + }, + "stcb_his_is_srb": { + "description": "This bit is on when the HIS data is for an SRB. Note this bit will never be on, but it is documented here to indicate what it means", + "offset": 56, + "length": 1 + } + } + }, + { + "name": "stcb_his_area", + "description": "HIS data", + "offset": 1064, + "length": 8, + "type": "hex" + }, + { + "name": "stcb_his_homeasid", + "description": "Home ASID where the TCB is scheduled to run", + "offset": 1064, + "length": 2, + "type": "signed-integer" + }, + { + "name": "stcb_his_token", + "description": "A token used to identify when the same TCB is being redispatched or this TCB is being reused to dispatch a different unit of work", + "offset": 1066, + "length": 2, + "type": "signed-integer" + }, + { + "name": "stcbdspc", + "description": "TCB thread dispatch count", + "offset": 1068, + "length": 4, + "type": "signed-integer" + }, + { + "name": "stcb_minintcount", + "description": "TCB minor interrupt count", + "offset": 1072, + "length": 4, + "type": "signed-integer" + }, + { + "name": "stcb_majintcount", + "description": "TCB major interrupt count", + "offset": 1076, + "length": 4, + "type": "signed-integer" + }, + { + "name": "stcb_jes_symbol_table_addr", + "description": "JES symbol table address. Owner: JES Serialization: Local Lock", + "offset": 1080, + "length": 4, + "type": "address" + }, + { + "name": "stcbppsw16", + "description": "SPIE/ESPIE 16-byte PSW", + "offset": 1084, + "length": 16, + "type": "hex" + }, + { + "name": "stcbstxg64", + "description": "When TX, this contains the 64-bit GRs that resulted from the program-interrupt-caused transaction abort", + "offset": 1100, + "length": 128, + "type": "hex" + }, + { + "name": "stcbstxpsw16", + "description": "When TX, this contains the 16-byte PSW that resulted from the program-interrupt-caused transaction abort", + "offset": 1228, + "length": 16, + "type": "hex" + }, + { + "name": "stcbriccb", + "description": "", + "offset": 1244, + "length": 64, + "type": "hex" + }, + { + "name": "stcbabaa", + "description": "Pointer-defined target address for ATTACHX with ByAddress=xxx", + "offset": 1308, + "length": 4, + "type": "hex" + }, + { + "name": "stcbualv", + "description": "", + "offset": 1312, + "length": 4, + "type": "address" + }, + { + "name": "stcbuald", + "description": "", + "offset": 1316, + "length": 4, + "type": "address" + }, + { + "name": "stcbend", + "description": "END OF STCB.", + "offset": 1320, + "length": 8, + "type": "hex" + } + ] +} \ No newline at end of file diff --git a/cbxp/schemas/control_block_v1.json b/cbxp/schemas/control_block_v1.json new file mode 100644 index 0000000..f8cc4e4 --- /dev/null +++ b/cbxp/schemas/control_block_v1.json @@ -0,0 +1,295 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "Control Block", + "description": "CBXP Control Block Schema", + "type": "object", + "properties": { + "version": { + "description": "CBXP control block schema version", + "const": 1 + }, + "name": { + "description": "Control block name", + "type": "string", + "minLength": 1, + "maxLength": 8 + }, + "commonName": { + "description": "Full control block name", + "type": "string", + "minLength": 1 + }, + "macroId": { + "description": "Macro invocation name (e.g. ihapsa for the IHAPSA macro)", + "type": "string", + "minLength": 1 + }, + "description": { + "description": "Control block description", + "type": "string" + }, + "aliases": { + "description": "Alternative names for this control block (ACRONYM, EYE-CATCHER, DSECT name, etc.)", + "type": "array", + "items": { + "type": "string", + "minLength": 1, + "maxLength": 8 + } + }, + "pointedToBy": { + "description": "List of control blocks that points to this control block", + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "storageAttributes": { + "description": "Storage attributes for this control block", + "type": "object", + "properties": { + "subpools": { + "description": "Subpool numbers this control block resides in. An empty array indicates 'ANY' or unknown subpool. String values like 'Nucleus' are represented as an empty array.", + "type": "array", + "items": { + "type": "integer", + "minimum": 0, + "maximum": 255 + } + }, + "key": { + "description": "Storage key (0-8)", + "type": "integer", + "minimum": 0, + "maximum": 8 + }, + "residency": { + "description": "Storage residency description", + "type": "string" + } + }, + "required": ["subpools", "key", "residency"], + "additionalProperties": false + }, + "controlBlock": { + "description": "List of control block fields", + "type": "array", + "items": { + "type": "object", + "oneOf": [ + { + "properties": { + "name": { + "description": "Name of the control block field", + "type": "string", + "minLength": 1 + }, + "aliases": { + "description": "Alternative names for this field", + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "description": { + "description": "Control block field description", + "type": "string" + }, + "offset": { + "description": "Decimal offset to the control block field", + "type": "integer" + }, + "length": { + "description": "Decimal length of the control block field", + "type": "integer" + }, + "type": { + "description": "Control block field type", + "enum": ["string", "signed-integer", "unsigned-integer", "hex", "address"] + } + }, + "required": [ + "name", + "offset", + "length", + "type" + ], + "additionalProperties": false + }, + { + "properties": { + "name": { + "description": "Name of the control block field", + "type": "string", + "minLength": 1 + }, + "aliases": { + "description": "Alternative names for this field", + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "description": { + "description": "Control block field description", + "type": "string" + }, + "offset": { + "description": "Decimal offset to the control block field", + "type": "integer" + }, + "length": { + "description": "Decimal length of the control block field", + "enum": [4, 8] + }, + "type": { + "description": "Control block field type", + "const": "hex" + }, + "pointsTo": { + "description": "Control block field that this control block points to", + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "offset", + "length", + "type", + "pointsTo" + ], + "additionalProperties": false + }, + { + "properties": { + "name": { + "description": "Name of the control block field", + "type": "string", + "minLength": 1 + }, + "aliases": { + "description": "Alternative names for this field", + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "description": { + "description": "Control block field description", + "type": "string" + }, + "offset": { + "description": "Decimal offset to the control block field", + "type": "integer" + }, + "length": { + "description": "Decimal length of the control block field", + "enum": [4, 8] + }, + "type": { + "description": "Control block field type", + "const": "address" + }, + "pointsTo": { + "description": "Control block field that this control block points to", + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "offset", + "length", + "type", + "pointsTo" + ], + "additionalProperties": false + }, + { + "properties": { + "name": { + "description": "Name of the control block field", + "type": "string", + "minLength": 1 + }, + "aliases": { + "description": "Alternative names for this field", + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "description": { + "description": "Control block field description", + "type": "string" + }, + "offset": { + "description": "Decimal offset to the control block field", + "type": "integer" + }, + "length": { + "description": "Decimal length of the control block field", + "type": "integer" + }, + "type": { + "description": "Control block field type", + "const": "bitstring" + }, + "bitmasks": { + "description": "Bit definitions within this bitstring field (optional)", + "type": "object", + "patternProperties": { + "^[a-zA-Z][a-zA-Z0-9_]*$": { + "type": "object", + "properties": { + "description": { + "description": "Description of what this bit or bit field represents", + "type": "string" + }, + "offset": { + "description": "Bit offset within the field (0-based from MSB/leftmost bit)", + "type": "integer", + "minimum": 0 + }, + "length": { + "description": "Number of bits (typically 1 for single bit flags)", + "type": "integer", + "minimum": 1 + } + }, + "required": ["description", "offset", "length"], + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + "required": [ + "name", + "offset", + "length", + "type" + ], + "additionalProperties": false + } + ] + } + } + }, + "required": [ + "version", + "name", + "commonName", + "macroId", + "pointedToBy", + "storageAttributes", + "controlBlock" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/externals/json-schema-validator/LICENSE b/externals/json-schema-validator/LICENSE new file mode 100644 index 0000000..f660b34 --- /dev/null +++ b/externals/json-schema-validator/LICENSE @@ -0,0 +1,22 @@ +Modern C++ JSON schema validator is licensed under the MIT License +: + +Copyright (c) 2016 Patrick Boettcher + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/externals/json-schema-validator/json-patch.cpp b/externals/json-schema-validator/json-patch.cpp new file mode 100644 index 0000000..3203543 --- /dev/null +++ b/externals/json-schema-validator/json-patch.cpp @@ -0,0 +1,115 @@ +#include "json-patch.hpp" + +#include + +namespace +{ + +// originally from http://jsonpatch.com/, http://json.schemastore.org/json-patch +// with fixes +const nlohmann::json patch_schema = R"patch({ + "title": "JSON schema for JSONPatch files", + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "array", + + "items": { + "oneOf": [ + { + "additionalProperties": false, + "required": [ "value", "op", "path"], + "properties": { + "path" : { "$ref": "#/definitions/path" }, + "op": { + "description": "The operation to perform.", + "type": "string", + "enum": [ "add", "replace", "test" ] + }, + "value": { + "description": "The value to add, replace or test." + } + } + }, + { + "additionalProperties": false, + "required": [ "op", "path"], + "properties": { + "path" : { "$ref": "#/definitions/path" }, + "op": { + "description": "The operation to perform.", + "type": "string", + "enum": [ "remove" ] + } + } + }, + { + "additionalProperties": false, + "required": [ "from", "op", "path" ], + "properties": { + "path" : { "$ref": "#/definitions/path" }, + "op": { + "description": "The operation to perform.", + "type": "string", + "enum": [ "move", "copy" ] + }, + "from": { + "$ref": "#/definitions/path", + "description": "A JSON Pointer path pointing to the location to move/copy from." + } + } + } + ] + }, + "definitions": { + "path": { + "description": "A JSON Pointer path.", + "type": "string" + } + } +})patch"_json; +} // namespace + +namespace nlohmann +{ + +json_patch::json_patch(json &&patch) + : j_(std::move(patch)) +{ + validateJsonPatch(j_); +} + +json_patch::json_patch(const json &patch) + : j_(std::move(patch)) +{ + validateJsonPatch(j_); +} + +json_patch &json_patch::add(const json::json_pointer &ptr, json value) +{ + j_.push_back(json{{"op", "add"}, {"path", ptr.to_string()}, {"value", std::move(value)}}); + return *this; +} + +json_patch &json_patch::replace(const json::json_pointer &ptr, json value) +{ + j_.push_back(json{{"op", "replace"}, {"path", ptr.to_string()}, {"value", std::move(value)}}); + return *this; +} + +json_patch &json_patch::remove(const json::json_pointer &ptr) +{ + j_.push_back(json{{"op", "remove"}, {"path", ptr.to_string()}}); + return *this; +} + +void json_patch::validateJsonPatch(json const &patch) +{ + // static put here to have it created at the first usage of validateJsonPatch + static nlohmann::json_schema::json_validator patch_validator(patch_schema); + + patch_validator.validate(patch); + + for (auto const &op : patch) + json::json_pointer(op["path"].get()); +} + +} // namespace nlohmann diff --git a/externals/json-schema-validator/json-patch.hpp b/externals/json-schema-validator/json-patch.hpp new file mode 100644 index 0000000..39a579b --- /dev/null +++ b/externals/json-schema-validator/json-patch.hpp @@ -0,0 +1,41 @@ +#pragma once + +#include +#include + +namespace nlohmann +{ +class JsonPatchFormatException : public std::exception +{ +public: + explicit JsonPatchFormatException(std::string msg) + : ex_{std::move(msg)} {} + + inline const char *what() const noexcept override final { return ex_.c_str(); } + +private: + std::string ex_; +}; + +class json_patch +{ +public: + json_patch() = default; + json_patch(json &&patch); + json_patch(const json &patch); + + json_patch &add(const json::json_pointer &, json value); + json_patch &replace(const json::json_pointer &, json value); + json_patch &remove(const json::json_pointer &); + + json &get_json() { return j_; } + const json &get_json() const { return j_; } + + operator json() const { return j_; } + +private: + json j_ = nlohmann::json::array(); + + static void validateJsonPatch(json const &patch); +}; +} // namespace nlohmann diff --git a/externals/json-schema-validator/json-schema-draft7.json.cpp b/externals/json-schema-validator/json-schema-draft7.json.cpp new file mode 100644 index 0000000..b680e2c --- /dev/null +++ b/externals/json-schema-validator/json-schema-draft7.json.cpp @@ -0,0 +1,185 @@ +/* + * JSON schema validator for JSON for modern C++ + * + * Copyright (c) 2016-2019 Patrick Boettcher . + * + * SPDX-License-Identifier: MIT + * + */ +#include + +namespace nlohmann +{ +namespace json_schema +{ + +json draft7_schema_builtin = R"( { + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "http://json-schema.org/draft-07/schema#", + "title": "Core schema meta-schema", + "definitions": { + "schemaArray": { + "type": "array", + "minItems": 1, + "items": { "$ref": "#" } + }, + "nonNegativeInteger": { + "type": "integer", + "minimum": 0 + }, + "nonNegativeIntegerDefault0": { + "allOf": [ + { "$ref": "#/definitions/nonNegativeInteger" }, + { "default": 0 } + ] + }, + "simpleTypes": { + "enum": [ + "array", + "boolean", + "integer", + "null", + "number", + "object", + "string" + ] + }, + "stringArray": { + "type": "array", + "items": { "type": "string" }, + "uniqueItems": true, + "default": [] + } + }, + "type": ["object", "boolean"], + "properties": { + "$id": { + "type": "string", + "format": "uri-reference" + }, + "$schema": { + "type": "string", + "format": "uri" + }, + "$ref": { + "type": "string", + "format": "uri-reference" + }, + "$comment": { + "type": "string" + }, + "title": { + "type": "string" + }, + "description": { + "type": "string" + }, + "default": true, + "readOnly": { + "type": "boolean", + "default": false + }, + "examples": { + "type": "array", + "items": true + }, + "multipleOf": { + "type": "number", + "exclusiveMinimum": 0 + }, + "maximum": { + "type": "number" + }, + "exclusiveMaximum": { + "type": "number" + }, + "minimum": { + "type": "number" + }, + "exclusiveMinimum": { + "type": "number" + }, + "maxLength": { "$ref": "#/definitions/nonNegativeInteger" }, + "minLength": { "$ref": "#/definitions/nonNegativeIntegerDefault0" }, + "pattern": { + "type": "string", + "format": "regex" + }, + "additionalItems": { "$ref": "#" }, + "items": { + "anyOf": [ + { "$ref": "#" }, + { "$ref": "#/definitions/schemaArray" } + ], + "default": true + }, + "maxItems": { "$ref": "#/definitions/nonNegativeInteger" }, + "minItems": { "$ref": "#/definitions/nonNegativeIntegerDefault0" }, + "uniqueItems": { + "type": "boolean", + "default": false + }, + "contains": { "$ref": "#" }, + "maxProperties": { "$ref": "#/definitions/nonNegativeInteger" }, + "minProperties": { "$ref": "#/definitions/nonNegativeIntegerDefault0" }, + "required": { "$ref": "#/definitions/stringArray" }, + "additionalProperties": { "$ref": "#" }, + "definitions": { + "type": "object", + "additionalProperties": { "$ref": "#" }, + "default": {} + }, + "properties": { + "type": "object", + "additionalProperties": { "$ref": "#" }, + "default": {} + }, + "patternProperties": { + "type": "object", + "additionalProperties": { "$ref": "#" }, + "propertyNames": { "format": "regex" }, + "default": {} + }, + "dependencies": { + "type": "object", + "additionalProperties": { + "anyOf": [ + { "$ref": "#" }, + { "$ref": "#/definitions/stringArray" } + ] + } + }, + "propertyNames": { "$ref": "#" }, + "const": true, + "enum": { + "type": "array", + "items": true, + "minItems": 1, + "uniqueItems": true + }, + "type": { + "anyOf": [ + { "$ref": "#/definitions/simpleTypes" }, + { + "type": "array", + "items": { "$ref": "#/definitions/simpleTypes" }, + "minItems": 1, + "uniqueItems": true + } + ] + }, + "format": { "type": "string" }, + "contentMediaType": { "type": "string" }, + "contentEncoding": { "type": "string" }, + "if": { "$ref": "#" }, + "then": { "$ref": "#" }, + "else": { "$ref": "#" }, + "allOf": { "$ref": "#/definitions/schemaArray" }, + "anyOf": { "$ref": "#/definitions/schemaArray" }, + "oneOf": { "$ref": "#/definitions/schemaArray" }, + "not": { "$ref": "#" } + }, + "default": true +} )"_json; +} +} // namespace nlohmann diff --git a/externals/json-schema-validator/json-uri.cpp b/externals/json-schema-validator/json-uri.cpp new file mode 100644 index 0000000..2602556 --- /dev/null +++ b/externals/json-schema-validator/json-uri.cpp @@ -0,0 +1,159 @@ +/* + * JSON schema validator for JSON for modern C++ + * + * Copyright (c) 2016-2019 Patrick Boettcher . + * + * SPDX-License-Identifier: MIT + * + */ +#include + +#include + +namespace nlohmann +{ + +void json_uri::update(const std::string &uri) +{ + std::string pointer = ""; // default pointer is document-root + + // first split the URI into location and pointer + auto pointer_separator = uri.find('#'); + if (pointer_separator != std::string::npos) { // and extract the pointer-string if found + pointer = uri.substr(pointer_separator + 1); // remove # + + // unescape %-values IOW, decode JSON-URI-formatted JSON-pointer + std::size_t pos = pointer.size() - 1; + do { + pos = pointer.rfind('%', pos); + if (pos == std::string::npos) + break; + + if (pos >= pointer.size() - 2) { + pos--; + continue; + } + + std::string hex = pointer.substr(pos + 1, 2); + char ascii = static_cast(std::strtoul(hex.c_str(), nullptr, 16)); + pointer.replace(pos, 3, 1, ascii); + + pos--; + } while (1); + } + + auto location = uri.substr(0, pointer_separator); + + if (location.size()) { // a location part has been found + + // if it is an URN take it as it is + if (location.find("urn:") == 0) { + urn_ = location; + + // and clear URL members + scheme_ = ""; + authority_ = ""; + path_ = ""; + + } else { // it is an URL + + // split URL in protocol, hostname and path + std::size_t pos = 0; + auto proto = location.find("://", pos); + if (proto != std::string::npos) { // extract the protocol + + urn_ = ""; // clear URN-member if URL is parsed + + scheme_ = location.substr(pos, proto - pos); + pos = 3 + proto; // 3 == "://" + + auto authority = location.find("/", pos); + if (authority != std::string::npos) { // and the hostname (no proto without hostname) + authority_ = location.substr(pos, authority - pos); + pos = authority; + } + } + + auto path = location.substr(pos); + + // URNs cannot of have paths + if (urn_.size() && path.size()) + throw std::invalid_argument("Cannot add a path (" + path + ") to an URN URI (" + urn_ + ")"); + + if (path[0] == '/') // if it starts with a / it is root-path + path_ = path; + else if (pos == 0) { // the URL contained only a path and the current path has no / at the end, strip last element until / and append + auto last_slash = path_.rfind('/'); + path_ = path_.substr(0, last_slash) + '/' + path; + } else // otherwise it is a subfolder + path_.append(path); + } + } + + pointer_ = ""_json_pointer; + identifier_ = ""; + + if (pointer[0] == '/') + pointer_ = json::json_pointer(pointer); + else + identifier_ = pointer; +} + +std::string json_uri::location() const +{ + if (urn_.size()) + return urn_; + + std::stringstream s; + + if (scheme_.size() > 0) + s << scheme_ << "://"; + + s << authority_ + << path_; + + return s.str(); +} + +std::string json_uri::to_string() const +{ + std::stringstream s; + + s << location() << " # "; + + if (identifier_ == "") + s << pointer_.to_string(); + else + s << identifier_; + + return s.str(); +} + +std::ostream &operator<<(std::ostream &os, const json_uri &u) +{ + return os << u.to_string(); +} + +std::string json_uri::escape(const std::string &src) +{ + std::vector> chars = { + {"~", "~0"}, + {"/", "~1"}}; + + std::string l = src; + + for (const auto &c : chars) { + std::size_t pos = 0; + do { + pos = l.find(c.first, pos); + if (pos == std::string::npos) + break; + l.replace(pos, 1, c.second); + pos += c.second.size(); + } while (1); + } + + return l; +} + +} // namespace nlohmann diff --git a/externals/json-schema-validator/json-validator.cpp b/externals/json-schema-validator/json-validator.cpp new file mode 100644 index 0000000..1fd0de1 --- /dev/null +++ b/externals/json-schema-validator/json-validator.cpp @@ -0,0 +1,1472 @@ +/* + * JSON schema validator for JSON for modern C++ + * + * Copyright (c) 2016-2019 Patrick Boettcher . + * + * SPDX-License-Identifier: MIT + * + */ +#include + +#include "json-patch.hpp" + +#include +#include +#include +#include +#include + +using nlohmann::json; +using nlohmann::json_patch; +using nlohmann::json_uri; +using nlohmann::json_schema::root_schema; +using namespace nlohmann::json_schema; + +#ifdef JSON_SCHEMA_BOOST_REGEX +# include +# define REGEX_NAMESPACE boost +#elif defined(JSON_SCHEMA_NO_REGEX) +# define NO_STD_REGEX +#else +# include +# define REGEX_NAMESPACE std +#endif + +namespace +{ + +class schema +{ +protected: + root_schema *root_; + json default_value_ = nullptr; + +protected: + virtual std::shared_ptr make_for_default_( + std::shared_ptr<::schema> & /* sch */, + root_schema * /* root */, + std::vector & /* uris */, + nlohmann::json & /* default_value */) const + { + return nullptr; + }; + +public: + virtual ~schema() = default; + + schema(root_schema *root) + : root_(root) {} + + virtual void validate(const json::json_pointer &ptr, const json &instance, json_patch &patch, error_handler &e) const = 0; + + virtual const json &default_value(const json::json_pointer &, const json &, error_handler &) const + { + return default_value_; + } + + void set_default_value(const json &v) { default_value_ = v; } + + static std::shared_ptr make(json &schema, + root_schema *root, + const std::vector &key, + std::vector uris); +}; + +class schema_ref : public schema +{ + const std::string id_; + std::weak_ptr target_; + std::shared_ptr target_strong_; // for references to references keep also the shared_ptr because + // no one else might use it after resolving + + void validate(const json::json_pointer &ptr, const json &instance, json_patch &patch, error_handler &e) const final + { + auto target = target_.lock(); + + if (target) + target->validate(ptr, instance, patch, e); + else + e.error(ptr, instance, "unresolved or freed schema-reference " + id_); + } + + const json &default_value(const json::json_pointer &ptr, const json &instance, error_handler &e) const override final + { + if (!default_value_.is_null()) + return default_value_; + + auto target = target_.lock(); + if (target) + return target->default_value(ptr, instance, e); + + e.error(ptr, instance, "unresolved or freed schema-reference " + id_); + + return default_value_; + } + +protected: + virtual std::shared_ptr make_for_default_( + std::shared_ptr<::schema> &sch, + root_schema *root, + std::vector &uris, + nlohmann::json &default_value) const override + { + // create a new reference schema using the original reference (which will be resolved later) + // to store this overloaded default value #209 + auto result = std::make_shared(uris[0].to_string(), root); + result->set_target(sch, true); + result->set_default_value(default_value); + return result; + }; + +public: + schema_ref(const std::string &id, root_schema *root) + : schema(root), id_(id) {} + + const std::string &id() const { return id_; } + + void set_target(const std::shared_ptr &target, bool strong = false) + { + target_ = target; + if (strong) + target_strong_ = target; + } +}; + +} // namespace + +namespace nlohmann +{ +namespace json_schema +{ + +class root_schema +{ + schema_loader loader_; + format_checker format_check_; + content_checker content_check_; + + std::shared_ptr root_; + + struct schema_file { + std::map> schemas; + std::map> unresolved; // contains all unresolved references from any other file seen during parsing + json unknown_keywords; + }; + + // location as key + std::map files_; + + schema_file &get_or_create_file(const std::string &loc) + { + auto file = files_.lower_bound(loc); + if (file != files_.end() && !(files_.key_comp()(loc, file->first))) + return file->second; + else + return files_.insert(file, {loc, {}})->second; + } + +public: + root_schema(schema_loader &&loader, + format_checker &&format, + content_checker &&content) + + : loader_(std::move(loader)), + format_check_(std::move(format)), + content_check_(std::move(content)) + { + } + + format_checker &format_check() { return format_check_; } + content_checker &content_check() { return content_check_; } + + void insert(const json_uri &uri, const std::shared_ptr &s) + { + auto &file = get_or_create_file(uri.location()); + auto sch = file.schemas.lower_bound(uri.fragment()); + if (sch != file.schemas.end() && !(file.schemas.key_comp()(uri.fragment(), sch->first))) { + throw std::invalid_argument("schema with " + uri.to_string() + " already inserted"); + return; + } + + file.schemas.insert({uri.fragment(), s}); + + // was someone referencing this newly inserted schema? + auto unresolved = file.unresolved.find(uri.fragment()); + if (unresolved != file.unresolved.end()) { + unresolved->second->set_target(s); + file.unresolved.erase(unresolved); + } + } + + void insert_unknown_keyword(const json_uri &uri, const std::string &key, json &value) + { + auto &file = get_or_create_file(uri.location()); + auto new_uri = uri.append(key); + auto fragment = new_uri.pointer(); + + // is there a reference looking for this unknown-keyword, which is thus no longer a unknown keyword but a schema + auto unresolved = file.unresolved.find(fragment.to_string()); + if (unresolved != file.unresolved.end()) + schema::make(value, this, {}, {{new_uri}}); + else { // no, nothing ref'd it, keep for later + + // need to create an object for each reference-token in the + // JSON-Pointer When not existing, a stringified integer reference + // token (e.g. "123") in the middle of the pointer will be + // interpreted a an array-index and an array will be created. + + // json_pointer's reference_tokens is private - get them + std::deque ref_tokens; + auto uri_pointer = uri.pointer(); + while (!uri_pointer.empty()) { + ref_tokens.push_front(uri_pointer.back()); + uri_pointer.pop_back(); + } + + // for each token create an object, if not already existing + auto unk_kw = &file.unknown_keywords; + for (auto &rt : ref_tokens) { + auto existing_object = unk_kw->find(rt); + if (existing_object == unk_kw->end()) + (*unk_kw)[rt] = json::object(); + unk_kw = &(*unk_kw)[rt]; + } + (*unk_kw)[key] = value; + } + + // recursively add possible subschemas of unknown keywords + if (value.type() == json::value_t::object) + for (auto &subsch : value.items()) + insert_unknown_keyword(new_uri, subsch.key(), subsch.value()); + } + + std::shared_ptr get_or_create_ref(const json_uri &uri) + { + auto &file = get_or_create_file(uri.location()); + + // existing schema + auto sch = file.schemas.find(uri.fragment()); + if (sch != file.schemas.end()) + return sch->second; + + // referencing an unknown keyword, turn it into schema + // + // an unknown keyword can only be referenced by a json-pointer, + // not by a plain name fragment + if (uri.pointer().to_string() != "") { + try { + auto &subschema = file.unknown_keywords.at(uri.pointer()); // null is returned if not existing + auto s = schema::make(subschema, this, {}, {{uri}}); // A JSON Schema MUST be an object or a boolean. + if (s) { // nullptr if invalid schema, e.g. null + file.unknown_keywords.erase(uri.fragment()); + return s; + } + } catch (nlohmann::detail::out_of_range &) { // at() did not find it + } + } + + // get or create a schema_ref + auto r = file.unresolved.lower_bound(uri.fragment()); + if (r != file.unresolved.end() && !(file.unresolved.key_comp()(uri.fragment(), r->first))) { + return r->second; // unresolved, already seen previously - use existing reference + } else { + return file.unresolved.insert(r, + {uri.fragment(), std::make_shared(uri.to_string(), this)}) + ->second; // unresolved, create reference + } + } + + void set_root_schema(json sch) + { + files_.clear(); + root_ = schema::make(sch, this, {}, {{"#"}}); + + // load all files which have not yet been loaded + do { + bool new_schema_loaded = false; + + // files_ is modified during parsing, iterators are invalidated + std::vector locations; + for (auto &file : files_) + locations.push_back(file.first); + + for (auto &loc : locations) { + if (files_[loc].schemas.size() == 0) { // nothing has been loaded for this file + if (loader_) { + json loaded_schema; + + loader_(loc, loaded_schema); + + schema::make(loaded_schema, this, {}, {{loc}}); + new_schema_loaded = true; + } else { + throw std::invalid_argument("external schema reference '" + loc + "' needs loading, but no loader callback given"); + } + } + } + + if (!new_schema_loaded) // if no new schema loaded, no need to try again + break; + } while (1); + + for (const auto &file : files_) { + if (file.second.unresolved.size() != 0) { + // Build a representation of the undefined + // references as a list of comma-separated strings. + auto n_urefs = file.second.unresolved.size(); + std::string urefs = "["; + + decltype(n_urefs) counter = 0; + for (const auto &p : file.second.unresolved) { + urefs += p.first; + + if (counter != n_urefs - 1u) { + urefs += ", "; + } + + ++counter; + } + + urefs += "]"; + + throw std::invalid_argument("after all files have been parsed, '" + + (file.first == "" ? "" : file.first) + + "' has still the following undefined references: " + urefs); + } + } + } + + void validate(const json::json_pointer &ptr, + const json &instance, + json_patch &patch, + error_handler &e, + const json_uri &initial) const + { + if (!root_) { + e.error(ptr, "", "no root schema has yet been set for validating an instance"); + return; + } + + auto file_entry = files_.find(initial.location()); + if (file_entry == files_.end()) { + e.error(ptr, "", "no file found serving requested root-URI. " + initial.location()); + return; + } + + auto &file = file_entry->second; + auto sch = file.schemas.find(initial.fragment()); + if (sch == file.schemas.end()) { + e.error(ptr, "", "no schema find for request initial URI: " + initial.to_string()); + return; + } + + sch->second->validate(ptr, instance, patch, e); + } +}; + +} // namespace json_schema +} // namespace nlohmann + +namespace +{ + +class first_error_handler : public error_handler +{ +public: + bool error_{false}; + json::json_pointer ptr_; + json instance_; + std::string message_; + + void error(const json::json_pointer &ptr, const json &instance, const std::string &message) override + { + if (*this) + return; + error_ = true; + ptr_ = ptr; + instance_ = instance; + message_ = message; + } + + operator bool() const { return error_; } +}; + +class logical_not : public schema +{ + std::shared_ptr subschema_; + + void validate(const json::json_pointer &ptr, const json &instance, json_patch &patch, error_handler &e) const final + { + first_error_handler esub; + subschema_->validate(ptr, instance, patch, esub); + + if (!esub) + e.error(ptr, instance, "the subschema has succeeded, but it is required to not validate"); + } + + const json &default_value(const json::json_pointer &ptr, const json &instance, error_handler &e) const override + { + return subschema_->default_value(ptr, instance, e); + } + +public: + logical_not(json &sch, + root_schema *root, + const std::vector &uris) + : schema(root) + { + subschema_ = schema::make(sch, root, {"not"}, uris); + } +}; + +enum logical_combination_types { + allOf, + anyOf, + oneOf +}; + +template +class logical_combination : public schema +{ + std::vector> subschemata_; + + void validate(const json::json_pointer &ptr, const json &instance, json_patch &patch, error_handler &e) const final + { + size_t count = 0; + + for (auto &s : subschemata_) { + first_error_handler esub; + auto oldPatchSize = patch.get_json().size(); + s->validate(ptr, instance, patch, esub); + if (!esub) + count++; + else + patch.get_json().get_ref().resize(oldPatchSize); + + if (is_validate_complete(instance, ptr, e, esub, count)) + return; + } + + // could accumulate esub details for anyOf and oneOf, but not clear how to select which subschema failure to report + // or how to report multiple such failures + if (count == 0) + e.error(ptr, instance, "no subschema has succeeded, but one of them is required to validate"); + } + + // specialized for each of the logical_combination_types + static const std::string key; + static bool is_validate_complete(const json &, const json::json_pointer &, error_handler &, const first_error_handler &, size_t); + +public: + logical_combination(json &sch, + root_schema *root, + const std::vector &uris) + : schema(root) + { + size_t c = 0; + for (auto &subschema : sch) + subschemata_.push_back(schema::make(subschema, root, {key, std::to_string(c++)}, uris)); + + // value of allOf, anyOf, and oneOf "MUST be a non-empty array" + // TODO error/throw? when subschemata_.empty() + } +}; + +template <> +const std::string logical_combination::key = "allOf"; +template <> +const std::string logical_combination::key = "anyOf"; +template <> +const std::string logical_combination::key = "oneOf"; + +template <> +bool logical_combination::is_validate_complete(const json &, const json::json_pointer &, error_handler &e, const first_error_handler &esub, size_t) +{ + if (esub) + e.error(esub.ptr_, esub.instance_, "at least one subschema has failed, but all of them are required to validate - " + esub.message_); + return esub; +} + +template <> +bool logical_combination::is_validate_complete(const json &, const json::json_pointer &, error_handler &, const first_error_handler &, size_t count) +{ + return count == 1; +} + +template <> +bool logical_combination::is_validate_complete(const json &instance, const json::json_pointer &ptr, error_handler &e, const first_error_handler &, size_t count) +{ + if (count > 1) + e.error(ptr, instance, "more than one subschema has succeeded, but exactly one of them is required to validate"); + return count > 1; +} + +class type_schema : public schema +{ + std::vector> type_; + std::pair enum_, const_; + std::vector> logic_; + + static std::shared_ptr make(json &schema, + json::value_t type, + root_schema *, + const std::vector &, + std::set &); + + std::shared_ptr if_, then_, else_; + + void validate(const json::json_pointer &ptr, const json &instance, json_patch &patch, error_handler &e) const override final + { + // depending on the type of instance run the type specific validator - if present + auto type = type_[static_cast(instance.type())]; + + if (type) + type->validate(ptr, instance, patch, e); + else + e.error(ptr, instance, "unexpected instance type"); + + if (enum_.first) { + bool seen_in_enum = false; + for (auto &v : enum_.second) + if (instance == v) { + seen_in_enum = true; + break; + } + + if (!seen_in_enum) + e.error(ptr, instance, "instance not found in required enum"); + } + + if (const_.first && + const_.second != instance) + e.error(ptr, instance, "instance not const"); + + for (auto l : logic_) + l->validate(ptr, instance, patch, e); + + if (if_) { + first_error_handler err; + + if_->validate(ptr, instance, patch, err); + if (!err) { + if (then_) + then_->validate(ptr, instance, patch, e); + } else { + if (else_) + else_->validate(ptr, instance, patch, e); + } + } + if (instance.is_null()) { + patch.add(nlohmann::json::json_pointer{}, default_value_); + } + } + +protected: + virtual std::shared_ptr make_for_default_( + std::shared_ptr<::schema> & /* sch */, + root_schema * /* root */, + std::vector & /* uris */, + nlohmann::json &default_value) const override + { + auto result = std::make_shared(*this); + result->set_default_value(default_value); + return result; + }; + +public: + type_schema(json &sch, + root_schema *root, + const std::vector &uris) + : schema(root), type_(static_cast(json::value_t::discarded) + 1) + { + // association between JSON-schema-type and NLohmann-types + static const std::vector> schema_types = { + {"null", json::value_t::null}, + {"object", json::value_t::object}, + {"array", json::value_t::array}, + {"string", json::value_t::string}, + {"boolean", json::value_t::boolean}, + {"integer", json::value_t::number_integer}, + {"number", json::value_t::number_float}, + }; + + std::set known_keywords; + + auto attr = sch.find("type"); + if (attr == sch.end()) // no type field means all sub-types possible + for (auto &t : schema_types) + type_[static_cast(t.second)] = type_schema::make(sch, t.second, root, uris, known_keywords); + else { + switch (attr.value().type()) { // "type": "type" + + case json::value_t::string: { + auto schema_type = attr.value().get(); + for (auto &t : schema_types) + if (t.first == schema_type) + type_[static_cast(t.second)] = type_schema::make(sch, t.second, root, uris, known_keywords); + } break; + + case json::value_t::array: // "type": ["type1", "type2"] + for (auto &array_value : attr.value()) { + auto schema_type = array_value.get(); + for (auto &t : schema_types) + if (t.first == schema_type) + type_[static_cast(t.second)] = type_schema::make(sch, t.second, root, uris, known_keywords); + } + break; + + default: + break; + } + + sch.erase(attr); + } + + attr = sch.find("default"); + if (attr != sch.end()) { + set_default_value(attr.value()); + sch.erase(attr); + } + + for (auto &key : known_keywords) + sch.erase(key); + + // with nlohmann::json float instance (but number in schema-definition) can be seen as unsigned or integer - + // reuse the number-validator for integer values as well, if they have not been specified explicitly + if (type_[static_cast(json::value_t::number_float)] && !type_[static_cast(json::value_t::number_integer)]) + type_[static_cast(json::value_t::number_integer)] = type_[static_cast(json::value_t::number_float)]; + + // #54: JSON-schema does not differentiate between unsigned and signed integer - nlohmann::json does + // we stick with JSON-schema: use the integer-validator if instance-value is unsigned + type_[static_cast(json::value_t::number_unsigned)] = type_[static_cast(json::value_t::number_integer)]; + + // special for binary types + if (type_[static_cast(json::value_t::string)]) { + type_[static_cast(json::value_t::binary)] = type_[static_cast(json::value_t::string)]; + } + + attr = sch.find("enum"); + if (attr != sch.end()) { + enum_ = {true, attr.value()}; + sch.erase(attr); + } + + attr = sch.find("const"); + if (attr != sch.end()) { + const_ = {true, attr.value()}; + sch.erase(attr); + } + + attr = sch.find("not"); + if (attr != sch.end()) { + logic_.push_back(std::make_shared(attr.value(), root, uris)); + sch.erase(attr); + } + + attr = sch.find("allOf"); + if (attr != sch.end()) { + logic_.push_back(std::make_shared>(attr.value(), root, uris)); + sch.erase(attr); + } + + attr = sch.find("anyOf"); + if (attr != sch.end()) { + logic_.push_back(std::make_shared>(attr.value(), root, uris)); + sch.erase(attr); + } + + attr = sch.find("oneOf"); + if (attr != sch.end()) { + logic_.push_back(std::make_shared>(attr.value(), root, uris)); + sch.erase(attr); + } + + attr = sch.find("if"); + if (attr != sch.end()) { + auto attr_then = sch.find("then"); + auto attr_else = sch.find("else"); + + if (attr_then != sch.end() || attr_else != sch.end()) { + if_ = schema::make(attr.value(), root, {"if"}, uris); + + if (attr_then != sch.end()) { + then_ = schema::make(attr_then.value(), root, {"then"}, uris); + sch.erase(attr_then); + } + + if (attr_else != sch.end()) { + else_ = schema::make(attr_else.value(), root, {"else"}, uris); + sch.erase(attr_else); + } + } + sch.erase(attr); + } + } +}; + +class string : public schema +{ + std::pair maxLength_{false, 0}; + std::pair minLength_{false, 0}; + +#ifndef NO_STD_REGEX + std::pair pattern_{false, REGEX_NAMESPACE::regex()}; + std::string patternString_; +#endif + + std::pair format_; + std::tuple content_{false, "", ""}; + + std::size_t utf8_length(const std::string &s) const + { + size_t len = 0; + for (auto c : s) + if ((c & 0xc0) != 0x80) + len++; + return len; + } + + void validate(const json::json_pointer &ptr, const json &instance, json_patch &, error_handler &e) const override + { + if (minLength_.first) { + if (utf8_length(instance.get()) < minLength_.second) { + std::ostringstream s; + s << "instance is too short as per minLength:" << minLength_.second; + e.error(ptr, instance, s.str()); + } + } + + if (maxLength_.first) { + if (utf8_length(instance.get()) > maxLength_.second) { + std::ostringstream s; + s << "instance is too long as per maxLength: " << maxLength_.second; + e.error(ptr, instance, s.str()); + } + } + + if (std::get<0>(content_)) { + if (root_->content_check() == nullptr) + e.error(ptr, instance, std::string("a content checker was not provided but a contentEncoding or contentMediaType for this string have been present: '") + std::get<1>(content_) + "' '" + std::get<2>(content_) + "'"); + else { + try { + root_->content_check()(std::get<1>(content_), std::get<2>(content_), instance); + } catch (const std::exception &ex) { + e.error(ptr, instance, std::string("content-checking failed: ") + ex.what()); + } + } + } else if (instance.type() == json::value_t::binary) { + e.error(ptr, instance, "expected string, but get binary data"); + } + + if (instance.type() != json::value_t::string) { + return; // next checks only for strings + } + +#ifndef NO_STD_REGEX + if (pattern_.first && + !REGEX_NAMESPACE::regex_search(instance.get(), pattern_.second)) + e.error(ptr, instance, "instance does not match regex pattern: " + patternString_); +#endif + + if (format_.first) { + if (root_->format_check() == nullptr) + e.error(ptr, instance, std::string("a format checker was not provided but a format keyword for this string is present: ") + format_.second); + else { + try { + root_->format_check()(format_.second, instance.get()); + } catch (const std::exception &ex) { + e.error(ptr, instance, std::string("format-checking failed: ") + ex.what()); + } + } + } + } + +public: + string(json &sch, root_schema *root) + : schema(root) + { + auto attr = sch.find("maxLength"); + if (attr != sch.end()) { + maxLength_ = {true, attr.value().get()}; + sch.erase(attr); + } + + attr = sch.find("minLength"); + if (attr != sch.end()) { + minLength_ = {true, attr.value().get()}; + sch.erase(attr); + } + + attr = sch.find("contentEncoding"); + if (attr != sch.end()) { + std::get<0>(content_) = true; + std::get<1>(content_) = attr.value().get(); + + // special case for nlohmann::json-binary-types + // + // https://github.com/pboettch/json-schema-validator/pull/114 + // + // We cannot use explicitly in a schema: {"type": "binary"} or + // "type": ["binary", "number"] we have to be implicit. For a + // schema where "contentEncoding" is set to "binary", an instance + // of type json::value_t::binary is accepted. If a + // contentEncoding-callback has to be provided and is called + // accordingly. For encoding=binary, no other type validations are done + + sch.erase(attr); + } + + attr = sch.find("contentMediaType"); + if (attr != sch.end()) { + std::get<0>(content_) = true; + std::get<2>(content_) = attr.value().get(); + + sch.erase(attr); + } + + if (std::get<0>(content_) == true && root_->content_check() == nullptr) { + throw std::invalid_argument{"schema contains contentEncoding/contentMediaType but content checker was not set"}; + } + +#ifndef NO_STD_REGEX + attr = sch.find("pattern"); + if (attr != sch.end()) { + patternString_ = attr.value().get(); + pattern_ = {true, REGEX_NAMESPACE::regex(attr.value().get(), + REGEX_NAMESPACE::regex::ECMAScript)}; + sch.erase(attr); + } +#endif + + attr = sch.find("format"); + if (attr != sch.end()) { + if (root_->format_check() == nullptr) + throw std::invalid_argument{"a format checker was not provided but a format keyword for this string is present: " + format_.second}; + + format_ = {true, attr.value().get()}; + sch.erase(attr); + } + } +}; + +template +class numeric : public schema +{ + std::pair maximum_{false, 0}; + std::pair minimum_{false, 0}; + + bool exclusiveMaximum_ = false; + bool exclusiveMinimum_ = false; + + std::pair multipleOf_{false, 0}; + + // multipleOf - if the remainder of the division is 0 -> OK + bool violates_multiple_of(T x) const + { + double res = std::remainder(x, multipleOf_.second); + double multiple = std::fabs(x / multipleOf_.second); + if (multiple > 1) { + res = res / multiple; + } + double eps = std::nextafter(x, 0) - static_cast(x); + + return std::fabs(res) > std::fabs(eps); + } + + void validate(const json::json_pointer &ptr, const json &instance, json_patch &, error_handler &e) const override + { + T value = instance; // conversion of json to value_type + + if (multipleOf_.first && value != 0) // zero is multiple of everything + if (violates_multiple_of(value)) + e.error(ptr, instance, "instance is not a multiple of " + std::to_string(multipleOf_.second)); + + if (maximum_.first) { + if (exclusiveMaximum_ && value >= maximum_.second) + e.error(ptr, instance, "instance exceeds or equals maximum of " + std::to_string(maximum_.second)); + else if (value > maximum_.second) + e.error(ptr, instance, "instance exceeds maximum of " + std::to_string(maximum_.second)); + } + + if (minimum_.first) { + if (exclusiveMinimum_ && value <= minimum_.second) + e.error(ptr, instance, "instance is below or equals minimum of " + std::to_string(minimum_.second)); + else if (value < minimum_.second) + e.error(ptr, instance, "instance is below minimum of " + std::to_string(minimum_.second)); + } + } + +public: + numeric(const json &sch, root_schema *root, std::set &kw) + : schema(root) + { + auto attr = sch.find("maximum"); + if (attr != sch.end()) { + maximum_ = {true, attr.value().get()}; + kw.insert("maximum"); + } + + attr = sch.find("minimum"); + if (attr != sch.end()) { + minimum_ = {true, attr.value().get()}; + kw.insert("minimum"); + } + + attr = sch.find("exclusiveMaximum"); + if (attr != sch.end()) { + exclusiveMaximum_ = true; + maximum_ = {true, attr.value().get()}; + kw.insert("exclusiveMaximum"); + } + + attr = sch.find("exclusiveMinimum"); + if (attr != sch.end()) { + exclusiveMinimum_ = true; + minimum_ = {true, attr.value().get()}; + kw.insert("exclusiveMinimum"); + } + + attr = sch.find("multipleOf"); + if (attr != sch.end()) { + multipleOf_ = {true, attr.value().get()}; + kw.insert("multipleOf"); + } + } +}; + +class null : public schema +{ + void validate(const json::json_pointer &ptr, const json &instance, json_patch &, error_handler &e) const override + { + if (!instance.is_null()) + e.error(ptr, instance, "expected to be null"); + } + +public: + null(json &, root_schema *root) + : schema(root) {} +}; + +class boolean_type : public schema +{ + void validate(const json::json_pointer &, const json &, json_patch &, error_handler &) const override {} + +public: + boolean_type(json &, root_schema *root) + : schema(root) {} +}; + +class boolean : public schema +{ + bool true_; + void validate(const json::json_pointer &ptr, const json &instance, json_patch &, error_handler &e) const override + { + if (!true_) { // false schema + // empty array + // switch (instance.type()) { + // case json::value_t::array: + // if (instance.size() != 0) // valid false-schema + // e.error(ptr, instance, "false-schema required empty array"); + // return; + //} + + e.error(ptr, instance, "instance invalid as per false-schema"); + } + } + +public: + boolean(json &sch, root_schema *root) + : schema(root), true_(sch) {} +}; + +class required : public schema +{ + const std::vector required_; + + void validate(const json::json_pointer &ptr, const json &instance, json_patch &, error_handler &e) const override final + { + for (auto &r : required_) + if (instance.find(r) == instance.end()) + e.error(ptr, instance, "required property '" + r + "' not found in object as a dependency"); + } + +public: + required(const std::vector &r, root_schema *root) + : schema(root), required_(r) {} +}; + +class object : public schema +{ + std::pair maxProperties_{false, 0}; + std::pair minProperties_{false, 0}; + std::vector required_; + + std::map> properties_; +#ifndef NO_STD_REGEX + std::vector>> patternProperties_; +#endif + std::shared_ptr additionalProperties_; + + std::map> dependencies_; + + std::shared_ptr propertyNames_; + + void validate(const json::json_pointer &ptr, const json &instance, json_patch &patch, error_handler &e) const override + { + if (maxProperties_.first && instance.size() > maxProperties_.second) + e.error(ptr, instance, "too many properties"); + + if (minProperties_.first && instance.size() < minProperties_.second) + e.error(ptr, instance, "too few properties"); + + for (auto &r : required_) + if (instance.find(r) == instance.end()) + e.error(ptr, instance, "required property '" + r + "' not found in object"); + + // for each property in instance + for (auto &p : instance.items()) { + if (propertyNames_) + propertyNames_->validate(ptr, p.key(), patch, e); + + bool a_prop_or_pattern_matched = false; + auto schema_p = properties_.find(p.key()); + // check if it is in "properties" + if (schema_p != properties_.end()) { + a_prop_or_pattern_matched = true; + schema_p->second->validate(ptr / p.key(), p.value(), patch, e); + } + +#ifndef NO_STD_REGEX + // check all matching patternProperties + for (auto &schema_pp : patternProperties_) + if (REGEX_NAMESPACE::regex_search(p.key(), schema_pp.first)) { + a_prop_or_pattern_matched = true; + schema_pp.second->validate(ptr / p.key(), p.value(), patch, e); + } +#endif + + // check additionalProperties as a last resort + if (!a_prop_or_pattern_matched && additionalProperties_) { + first_error_handler additional_prop_err; + additionalProperties_->validate(ptr / p.key(), p.value(), patch, additional_prop_err); + if (additional_prop_err) + e.error(ptr, instance, "validation failed for additional property '" + p.key() + "': " + additional_prop_err.message_); + } + } + + // reverse search + for (auto const &prop : properties_) { + const auto finding = instance.find(prop.first); + if (instance.end() == finding) { // if the prop is not in the instance + const auto &default_value = prop.second->default_value(ptr, instance, e); + if (!default_value.is_null()) { // if default value is available + patch.add((ptr / prop.first), default_value); + } + } + } + + for (auto &dep : dependencies_) { + auto prop = instance.find(dep.first); + if (prop != instance.end()) // if dependency-property is present in instance + dep.second->validate(ptr / dep.first, instance, patch, e); // validate + } + } + +public: + object(json &sch, + root_schema *root, + const std::vector &uris) + : schema(root) + { + auto attr = sch.find("maxProperties"); + if (attr != sch.end()) { + maxProperties_ = {true, attr.value().get()}; + sch.erase(attr); + } + + attr = sch.find("minProperties"); + if (attr != sch.end()) { + minProperties_ = {true, attr.value().get()}; + sch.erase(attr); + } + + attr = sch.find("required"); + if (attr != sch.end()) { + required_ = attr.value().get>(); + sch.erase(attr); + } + + attr = sch.find("properties"); + if (attr != sch.end()) { + for (auto prop : attr.value().items()) + properties_.insert( + std::make_pair( + prop.key(), + schema::make(prop.value(), root, {"properties", prop.key()}, uris))); + sch.erase(attr); + } + +#ifndef NO_STD_REGEX + attr = sch.find("patternProperties"); + if (attr != sch.end()) { + for (auto prop : attr.value().items()) + patternProperties_.push_back( + std::make_pair( + REGEX_NAMESPACE::regex(prop.key(), REGEX_NAMESPACE::regex::ECMAScript), + schema::make(prop.value(), root, {prop.key()}, uris))); + sch.erase(attr); + } +#endif + + attr = sch.find("additionalProperties"); + if (attr != sch.end()) { + additionalProperties_ = schema::make(attr.value(), root, {"additionalProperties"}, uris); + sch.erase(attr); + } + + attr = sch.find("dependencies"); + if (attr != sch.end()) { + for (auto &dep : attr.value().items()) + switch (dep.value().type()) { + case json::value_t::array: + dependencies_.emplace(dep.key(), + std::make_shared( + dep.value().get>(), root)); + break; + + default: + dependencies_.emplace(dep.key(), + schema::make(dep.value(), root, {"dependencies", dep.key()}, uris)); + break; + } + sch.erase(attr); + } + + attr = sch.find("propertyNames"); + if (attr != sch.end()) { + propertyNames_ = schema::make(attr.value(), root, {"propertyNames"}, uris); + sch.erase(attr); + } + + attr = sch.find("default"); + if (attr != sch.end()) { + set_default_value(*attr); + } + } +}; + +class array : public schema +{ + std::pair maxItems_{false, 0}; + std::pair minItems_{false, 0}; + bool uniqueItems_ = false; + + std::shared_ptr items_schema_; + + std::vector> items_; + std::shared_ptr additionalItems_; + + std::shared_ptr contains_; + + void validate(const json::json_pointer &ptr, const json &instance, json_patch &patch, error_handler &e) const override + { + if (maxItems_.first && instance.size() > maxItems_.second) + e.error(ptr, instance, "array has too many items"); + + if (minItems_.first && instance.size() < minItems_.second) + e.error(ptr, instance, "array has too few items"); + + if (uniqueItems_) { + for (auto it = instance.cbegin(); it != instance.cend(); ++it) { + auto v = std::find(it + 1, instance.end(), *it); + if (v != instance.end()) + e.error(ptr, instance, "items have to be unique for this array"); + } + } + + size_t index = 0; + if (items_schema_) + for (auto &i : instance) { + items_schema_->validate(ptr / index, i, patch, e); + index++; + } + else { + auto item = items_.cbegin(); + for (auto &i : instance) { + std::shared_ptr item_validator; + if (item == items_.cend()) + item_validator = additionalItems_; + else { + item_validator = *item; + item++; + } + + if (!item_validator) + break; + + item_validator->validate(ptr / index, i, patch, e); + } + } + + if (contains_) { + bool contained = false; + for (auto &item : instance) { + first_error_handler local_e; + contains_->validate(ptr, item, patch, local_e); + if (!local_e) { + contained = true; + break; + } + } + if (!contained) + e.error(ptr, instance, "array does not contain required element as per 'contains'"); + } + } + +public: + array(json &sch, root_schema *root, const std::vector &uris) + : schema(root) + { + auto attr = sch.find("maxItems"); + if (attr != sch.end()) { + maxItems_ = {true, attr.value().get()}; + sch.erase(attr); + } + + attr = sch.find("minItems"); + if (attr != sch.end()) { + minItems_ = {true, attr.value().get()}; + sch.erase(attr); + } + + attr = sch.find("uniqueItems"); + if (attr != sch.end()) { + uniqueItems_ = attr.value().get(); + sch.erase(attr); + } + + attr = sch.find("items"); + if (attr != sch.end()) { + + if (attr.value().type() == json::value_t::array) { + size_t c = 0; + for (auto &subsch : attr.value()) + items_.push_back(schema::make(subsch, root, {"items", std::to_string(c++)}, uris)); + + auto attr_add = sch.find("additionalItems"); + if (attr_add != sch.end()) { + additionalItems_ = schema::make(attr_add.value(), root, {"additionalItems"}, uris); + sch.erase(attr_add); + } + + } else if (attr.value().type() == json::value_t::object || + attr.value().type() == json::value_t::boolean) + items_schema_ = schema::make(attr.value(), root, {"items"}, uris); + + sch.erase(attr); + } + + attr = sch.find("contains"); + if (attr != sch.end()) { + contains_ = schema::make(attr.value(), root, {"contains"}, uris); + sch.erase(attr); + } + } +}; + +std::shared_ptr type_schema::make(json &schema, + json::value_t type, + root_schema *root, + const std::vector &uris, + std::set &kw) +{ + switch (type) { + case json::value_t::null: + return std::make_shared(schema, root); + + case json::value_t::number_unsigned: + case json::value_t::number_integer: + return std::make_shared>(schema, root, kw); + case json::value_t::number_float: + return std::make_shared>(schema, root, kw); + case json::value_t::string: + return std::make_shared(schema, root); + case json::value_t::boolean: + return std::make_shared(schema, root); + case json::value_t::object: + return std::make_shared(schema, root, uris); + case json::value_t::array: + return std::make_shared(schema, root, uris); + + case json::value_t::discarded: // not a real type - silence please + break; + + case json::value_t::binary: + break; + } + return nullptr; +} +} // namespace + +namespace +{ + +std::shared_ptr schema::make(json &schema, + root_schema *root, + const std::vector &keys, + std::vector uris) +{ + // remove URIs which contain plain name identifiers, as sub-schemas cannot be referenced + for (auto uri = uris.begin(); uri != uris.end();) + if (uri->identifier() != "") + uri = uris.erase(uri); + else + uri++; + + // append to all URIs the keys for this sub-schema + for (auto &key : keys) + for (auto &uri : uris) + uri = uri.append(key); + + std::shared_ptr<::schema> sch; + + // boolean schema + if (schema.type() == json::value_t::boolean) + sch = std::make_shared(schema, root); + else if (schema.type() == json::value_t::object) { + + auto attr = schema.find("$id"); // if $id is present, this schema can be referenced by this ID + // as an additional URI + if (attr != schema.end()) { + if (std::find(uris.begin(), + uris.end(), + attr.value().get()) == uris.end()) + uris.push_back(uris.back().derive(attr.value().get())); // so add it to the list if it is not there already + schema.erase(attr); + } + + attr = schema.find("definitions"); + if (attr != schema.end()) { + for (auto &def : attr.value().items()) + schema::make(def.value(), root, {"definitions", def.key()}, uris); + schema.erase(attr); + } + + attr = schema.find("$ref"); + if (attr != schema.end()) { // this schema is a reference + // the last one on the uri-stack is the last id seen before coming here, + // so this is the origial URI for this reference, the $ref-value has thus be resolved from it + auto id = uris.back().derive(attr.value().get()); + sch = root->get_or_create_ref(id); + + schema.erase(attr); + + // special case where we break draft-7 and allow overriding of properties when a $ref is used + attr = schema.find("default"); + if (attr != schema.end()) { + // copy the referenced schema depending on the underlying type and modify the default value + if (auto new_sch = sch->make_for_default_(sch, root, uris, attr.value())) { + sch = new_sch; + } + schema.erase(attr); + } + } else { + sch = std::make_shared(schema, root, uris); + } + + schema.erase("$schema"); + schema.erase("title"); + schema.erase("description"); + } else { + throw std::invalid_argument("invalid JSON-type for a schema for " + uris[0].to_string() + ", expected: boolean or object"); + } + + for (auto &uri : uris) { // for all URIs this schema is referenced by + root->insert(uri, sch); + + if (schema.type() == json::value_t::object) + for (auto &u : schema.items()) + root->insert_unknown_keyword(uri, u.key(), u.value()); // insert unknown keywords for later reference + } + return sch; +} + +class throwing_error_handler : public error_handler +{ + void error(const json::json_pointer &ptr, const json &instance, const std::string &message) override + { + throw std::invalid_argument(std::string("At ") + ptr.to_string() + " of " + instance.dump() + " - " + message + "\n"); + } +}; + +} // namespace + +namespace nlohmann +{ +namespace json_schema +{ + +json_validator::json_validator(schema_loader loader, + format_checker format, + content_checker content) + : root_(std::unique_ptr(new root_schema(std::move(loader), + std::move(format), + std::move(content)))) +{ +} + +json_validator::json_validator(const json &schema, + schema_loader loader, + format_checker format, + content_checker content) + : json_validator(std::move(loader), + std::move(format), + std::move(content)) +{ + set_root_schema(schema); +} + +json_validator::json_validator(json &&schema, + schema_loader loader, + format_checker format, + content_checker content) + + : json_validator(std::move(loader), + std::move(format), + std::move(content)) +{ + set_root_schema(std::move(schema)); +} + +// move constructor, destructor and move assignment operator can be defaulted here +// where root_schema is a complete type +json_validator::json_validator(json_validator &&) = default; +json_validator::~json_validator() = default; +json_validator &json_validator::operator=(json_validator &&) = default; + +void json_validator::set_root_schema(const json &schema) +{ + root_->set_root_schema(schema); +} + +void json_validator::set_root_schema(json &&schema) +{ + root_->set_root_schema(std::move(schema)); +} + +json json_validator::validate(const json &instance) const +{ + throwing_error_handler err; + return validate(instance, err); +} + +json json_validator::validate(const json &instance, error_handler &err, const json_uri &initial_uri) const +{ + json::json_pointer ptr; + json_patch patch; + root_->validate(ptr, instance, patch, err, initial_uri); + return patch; +} + +} // namespace json_schema +} // namespace nlohmann diff --git a/externals/json-schema-validator/nlohmann/json-schema.hpp b/externals/json-schema-validator/nlohmann/json-schema.hpp new file mode 100644 index 0000000..07befd3 --- /dev/null +++ b/externals/json-schema-validator/nlohmann/json-schema.hpp @@ -0,0 +1,198 @@ +/* + * JSON schema validator for JSON for modern C++ + * + * Copyright (c) 2016-2019 Patrick Boettcher . + * + * SPDX-License-Identifier: MIT + * + */ +#ifndef NLOHMANN_JSON_SCHEMA_HPP__ +#define NLOHMANN_JSON_SCHEMA_HPP__ + +#ifdef _WIN32 +# if defined(JSON_SCHEMA_VALIDATOR_EXPORTS) +# define JSON_SCHEMA_VALIDATOR_API __declspec(dllexport) +# elif defined(JSON_SCHEMA_VALIDATOR_IMPORTS) +# define JSON_SCHEMA_VALIDATOR_API __declspec(dllimport) +# else +# define JSON_SCHEMA_VALIDATOR_API +# endif +#else +# define JSON_SCHEMA_VALIDATOR_API +#endif + +#include + +#ifdef NLOHMANN_JSON_VERSION_MAJOR +# if (NLOHMANN_JSON_VERSION_MAJOR * 10000 + NLOHMANN_JSON_VERSION_MINOR * 100 + NLOHMANN_JSON_VERSION_PATCH) < 30800 +# error "Please use this library with NLohmann's JSON version 3.8.0 or higher" +# endif +#else +# error "expected existing NLOHMANN_JSON_VERSION_MAJOR preproc variable, please update to NLohmann's JSON 3.8.0" +#endif + +// make yourself a home - welcome to nlohmann's namespace +namespace nlohmann +{ + +// A class representing a JSON-URI for schemas derived from +// section 8 of JSON Schema: A Media Type for Describing JSON Documents +// draft-wright-json-schema-00 +// +// New URIs can be derived from it using the derive()-method. +// This is useful for resolving refs or subschema-IDs in json-schemas. +// +// This is done implement the requirements described in section 8.2. +// +class JSON_SCHEMA_VALIDATOR_API json_uri +{ + std::string urn_; + + std::string scheme_; + std::string authority_; + std::string path_; + + json::json_pointer pointer_; // fragment part if JSON-Pointer + std::string identifier_; // fragment part if Locatation Independent ID + +protected: + // decodes a JSON uri and replaces all or part of the currently stored values + void update(const std::string &uri); + + std::tuple as_tuple() const + { + return std::make_tuple(urn_, scheme_, authority_, path_, identifier_ != "" ? identifier_ : pointer_.to_string()); + } + +public: + json_uri(const std::string &uri) + { + update(uri); + } + + const std::string &scheme() const { return scheme_; } + const std::string &authority() const { return authority_; } + const std::string &path() const { return path_; } + + const json::json_pointer &pointer() const { return pointer_; } + const std::string &identifier() const { return identifier_; } + + std::string fragment() const + { + if (identifier_ == "") + return pointer_.to_string(); + else + return identifier_; + } + + std::string url() const { return location(); } + std::string location() const; + + static std::string escape(const std::string &); + + // create a new json_uri based in this one and the given uri + // resolves relative changes (pathes or pointers) and resets part if proto or hostname changes + json_uri derive(const std::string &uri) const + { + json_uri u = *this; + u.update(uri); + return u; + } + + // append a pointer-field to the pointer-part of this uri + json_uri append(const std::string &field) const + { + if (identifier_ != "") + return *this; + + json_uri u = *this; + u.pointer_ /= field; + return u; + } + + std::string to_string() const; + + friend bool operator<(const json_uri &l, const json_uri &r) + { + return l.as_tuple() < r.as_tuple(); + } + + friend bool operator==(const json_uri &l, const json_uri &r) + { + return l.as_tuple() == r.as_tuple(); + } + + friend std::ostream &operator<<(std::ostream &os, const json_uri &u); +}; + +namespace json_schema +{ + +extern json draft7_schema_builtin; + +typedef std::function schema_loader; +typedef std::function format_checker; +typedef std::function content_checker; + +// Interface for validation error handlers +class JSON_SCHEMA_VALIDATOR_API error_handler +{ +public: + virtual ~error_handler() {} + virtual void error(const json::json_pointer & /*ptr*/, const json & /*instance*/, const std::string & /*message*/) = 0; +}; + +class JSON_SCHEMA_VALIDATOR_API basic_error_handler : public error_handler +{ + bool error_{false}; + +public: + void error(const json::json_pointer & /*ptr*/, const json & /*instance*/, const std::string & /*message*/) override + { + error_ = true; + } + + virtual void reset() { error_ = false; } + operator bool() const { return error_; } +}; + +/** + * Checks validity of JSON schema built-in string format specifiers like 'date-time', 'ipv4', ... + */ +void JSON_SCHEMA_VALIDATOR_API default_string_format_check(const std::string &format, const std::string &value); + +class root_schema; + +class JSON_SCHEMA_VALIDATOR_API json_validator +{ + std::unique_ptr root_; + +public: + json_validator(schema_loader = nullptr, format_checker = nullptr, content_checker = nullptr); + + json_validator(const json &, schema_loader = nullptr, format_checker = nullptr, content_checker = nullptr); + json_validator(json &&, schema_loader = nullptr, format_checker = nullptr, content_checker = nullptr); + + json_validator(json_validator &&); + json_validator &operator=(json_validator &&); + + json_validator(json_validator const &) = delete; + json_validator &operator=(json_validator const &) = delete; + + ~json_validator(); + + // insert and set the root-schema + void set_root_schema(const json &); + void set_root_schema(json &&); + + // validate a json-document based on the root-schema + json validate(const json &) const; + + // validate a json-document based on the root-schema with a custom error-handler + json validate(const json &, error_handler &, const json_uri &initial_uri = json_uri("#")) const; +}; + +} // namespace json_schema +} // namespace nlohmann + +#endif /* NLOHMANN_JSON_SCHEMA_HPP__ */ diff --git a/externals/json-schema-validator/smtp-address-validator.cpp b/externals/json-schema-validator/smtp-address-validator.cpp new file mode 100644 index 0000000..5ddd811 --- /dev/null +++ b/externals/json-schema-validator/smtp-address-validator.cpp @@ -0,0 +1,792 @@ +/* + +Snarfed from + +: + +Copyright (c) 2021 Gene Hightower + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +#include "smtp-address-validator.hpp" + +static const signed char _address_actions[] = { + 0, 1, 0, 1, 1, 0}; + +static const short _address_key_offsets[] = { + 0, 0, 24, 26, 50, 52, 54, 56, + 58, 60, 62, 86, 103, 105, 107, 109, + 111, 113, 115, 117, 134, 150, 161, 168, + 176, 180, 181, 190, 195, 196, 201, 202, + 207, 210, 213, 219, 222, 225, 228, 234, + 237, 240, 243, 249, 252, 261, 270, 282, + 293, 302, 311, 320, 328, 345, 353, 360, + 367, 368, 375, 382, 389, 396, 397, 404, + 411, 418, 425, 426, 433, 440, 447, 454, + 455, 462, 469, 476, 483, 484, 491, 498, + 505, 512, 513, 523, 531, 538, 545, 546, + 552, 559, 566, 573, 581, 589, 597, 608, + 618, 626, 634, 641, 649, 657, 665, 667, + 673, 681, 689, 697, 699, 705, 713, 721, + 729, 731, 737, 745, 753, 761, 763, 769, + 777, 785, 793, 795, 802, 812, 821, 829, + 837, 839, 848, 857, 865, 873, 875, 884, + 893, 901, 909, 911, 920, 929, 937, 945, + 947, 956, 965, 974, 983, 992, 1004, 1015, + 1024, 1033, 1042, 1051, 1060, 1072, 1083, 1092, + 1101, 1109, 1118, 1127, 1136, 1148, 1159, 1168, + 1177, 1185, 1194, 1203, 1212, 1224, 1235, 1244, + 1253, 1261, 1270, 1279, 1288, 1300, 1311, 1320, + 1329, 1337, 1339, 1353, 1355, 1357, 1359, 1361, + 1363, 1365, 1367, 1368, 1370, 1388, 0}; + +static const signed char _address_trans_keys[] = { + -32, -19, -16, -12, 34, 45, 61, 63, + -62, -33, -31, -17, -15, -13, 33, 39, + 42, 43, 47, 57, 65, 90, 94, 126, + -128, -65, -32, -19, -16, -12, 33, 46, + 61, 64, -62, -33, -31, -17, -15, -13, + 35, 39, 42, 43, 45, 57, 63, 90, + 94, 126, -96, -65, -128, -65, -128, -97, + -112, -65, -128, -65, -128, -113, -32, -19, + -16, -12, 33, 45, 61, 63, -62, -33, + -31, -17, -15, -13, 35, 39, 42, 43, + 47, 57, 65, 90, 94, 126, -32, -19, + -16, -12, 91, -62, -33, -31, -17, -15, + -13, 48, 57, 65, 90, 97, 122, -128, + -65, -96, -65, -128, -65, -128, -97, -112, + -65, -128, -65, -128, -113, -32, -19, -16, + -12, 45, -62, -33, -31, -17, -15, -13, + 48, 57, 65, 90, 97, 122, -32, -19, + -16, -12, -62, -33, -31, -17, -15, -13, + 48, 57, 65, 90, 97, 122, 45, 48, + 49, 50, 73, 51, 57, 65, 90, 97, + 122, 45, 48, 57, 65, 90, 97, 122, + 45, 58, 48, 57, 65, 90, 97, 122, + 33, 90, 94, 126, 93, 45, 46, 58, + 48, 57, 65, 90, 97, 122, 48, 49, + 50, 51, 57, 46, 48, 49, 50, 51, + 57, 46, 48, 49, 50, 51, 57, 93, + 48, 57, 93, 48, 57, 53, 93, 48, + 52, 54, 57, 93, 48, 53, 46, 48, + 57, 46, 48, 57, 46, 53, 48, 52, + 54, 57, 46, 48, 53, 46, 48, 57, + 46, 48, 57, 46, 53, 48, 52, 54, + 57, 46, 48, 53, 45, 46, 58, 48, + 57, 65, 90, 97, 122, 45, 46, 58, + 48, 57, 65, 90, 97, 122, 45, 46, + 53, 58, 48, 52, 54, 57, 65, 90, + 97, 122, 45, 46, 58, 48, 53, 54, + 57, 65, 90, 97, 122, 45, 58, 80, + 48, 57, 65, 90, 97, 122, 45, 58, + 118, 48, 57, 65, 90, 97, 122, 45, + 54, 58, 48, 57, 65, 90, 97, 122, + 45, 58, 48, 57, 65, 90, 97, 122, + 58, 33, 47, 48, 57, 59, 64, 65, + 70, 71, 90, 94, 96, 97, 102, 103, + 126, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 48, 57, 65, 70, 97, 102, + 58, 48, 57, 65, 70, 97, 102, 58, + 58, 48, 57, 65, 70, 97, 102, 58, + 48, 57, 65, 70, 97, 102, 58, 48, + 57, 65, 70, 97, 102, 58, 48, 57, + 65, 70, 97, 102, 58, 58, 48, 57, + 65, 70, 97, 102, 58, 48, 57, 65, + 70, 97, 102, 58, 48, 57, 65, 70, + 97, 102, 58, 48, 57, 65, 70, 97, + 102, 58, 58, 48, 57, 65, 70, 97, + 102, 58, 48, 57, 65, 70, 97, 102, + 58, 48, 57, 65, 70, 97, 102, 58, + 48, 57, 65, 70, 97, 102, 58, 58, + 48, 57, 65, 70, 97, 102, 58, 48, + 57, 65, 70, 97, 102, 58, 48, 57, + 65, 70, 97, 102, 58, 48, 57, 65, + 70, 97, 102, 58, 58, 48, 57, 65, + 70, 97, 102, 58, 48, 57, 65, 70, + 97, 102, 58, 48, 57, 65, 70, 97, + 102, 58, 48, 57, 65, 70, 97, 102, + 58, 48, 49, 50, 58, 51, 57, 65, + 70, 97, 102, 46, 58, 48, 57, 65, + 70, 97, 102, 58, 48, 57, 65, 70, + 97, 102, 58, 48, 57, 65, 70, 97, + 102, 58, 48, 57, 65, 70, 97, 102, + 93, 48, 57, 65, 70, 97, 102, 93, + 48, 57, 65, 70, 97, 102, 93, 48, + 57, 65, 70, 97, 102, 46, 58, 48, + 57, 65, 70, 97, 102, 46, 58, 48, + 57, 65, 70, 97, 102, 46, 58, 48, + 57, 65, 70, 97, 102, 46, 53, 58, + 48, 52, 54, 57, 65, 70, 97, 102, + 46, 58, 48, 53, 54, 57, 65, 70, + 97, 102, 46, 58, 48, 57, 65, 70, + 97, 102, 46, 58, 48, 57, 65, 70, + 97, 102, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 58, 48, 57, 65, 70, + 97, 102, 48, 49, 50, 93, 51, 57, + 65, 70, 97, 102, 46, 58, 93, 48, + 57, 65, 70, 97, 102, 58, 93, 48, + 57, 65, 70, 97, 102, 58, 93, 48, + 57, 65, 70, 97, 102, 58, 93, 48, + 49, 50, 51, 57, 65, 70, 97, 102, + 46, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 49, 50, 51, 57, + 65, 70, 97, 102, 46, 58, 93, 48, + 57, 65, 70, 97, 102, 58, 93, 48, + 57, 65, 70, 97, 102, 58, 93, 48, + 57, 65, 70, 97, 102, 58, 93, 48, + 49, 50, 51, 57, 65, 70, 97, 102, + 46, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 49, 50, 51, 57, + 65, 70, 97, 102, 46, 58, 93, 48, + 57, 65, 70, 97, 102, 46, 58, 93, + 48, 57, 65, 70, 97, 102, 46, 58, + 93, 48, 57, 65, 70, 97, 102, 46, + 58, 93, 48, 57, 65, 70, 97, 102, + 46, 53, 58, 93, 48, 52, 54, 57, + 65, 70, 97, 102, 46, 58, 93, 48, + 53, 54, 57, 65, 70, 97, 102, 46, + 58, 93, 48, 57, 65, 70, 97, 102, + 46, 58, 93, 48, 57, 65, 70, 97, + 102, 46, 58, 93, 48, 57, 65, 70, + 97, 102, 46, 58, 93, 48, 57, 65, + 70, 97, 102, 46, 58, 93, 48, 57, + 65, 70, 97, 102, 46, 53, 58, 93, + 48, 52, 54, 57, 65, 70, 97, 102, + 46, 58, 93, 48, 53, 54, 57, 65, + 70, 97, 102, 46, 58, 93, 48, 57, + 65, 70, 97, 102, 46, 58, 93, 48, + 57, 65, 70, 97, 102, 58, 93, 48, + 57, 65, 70, 97, 102, 46, 58, 93, + 48, 57, 65, 70, 97, 102, 46, 58, + 93, 48, 57, 65, 70, 97, 102, 46, + 58, 93, 48, 57, 65, 70, 97, 102, + 46, 53, 58, 93, 48, 52, 54, 57, + 65, 70, 97, 102, 46, 58, 93, 48, + 53, 54, 57, 65, 70, 97, 102, 46, + 58, 93, 48, 57, 65, 70, 97, 102, + 46, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 46, 58, 93, 48, 57, 65, 70, + 97, 102, 46, 58, 93, 48, 57, 65, + 70, 97, 102, 46, 58, 93, 48, 57, + 65, 70, 97, 102, 46, 53, 58, 93, + 48, 52, 54, 57, 65, 70, 97, 102, + 46, 58, 93, 48, 53, 54, 57, 65, + 70, 97, 102, 46, 58, 93, 48, 57, + 65, 70, 97, 102, 46, 58, 93, 48, + 57, 65, 70, 97, 102, 58, 93, 48, + 57, 65, 70, 97, 102, 46, 58, 93, + 48, 57, 65, 70, 97, 102, 46, 58, + 93, 48, 57, 65, 70, 97, 102, 46, + 58, 93, 48, 57, 65, 70, 97, 102, + 46, 53, 58, 93, 48, 52, 54, 57, + 65, 70, 97, 102, 46, 58, 93, 48, + 53, 54, 57, 65, 70, 97, 102, 46, + 58, 93, 48, 57, 65, 70, 97, 102, + 46, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, 48, 57, 65, 70, 97, + 102, 58, 93, -32, -19, -16, -12, 34, + 92, -62, -33, -31, -17, -15, -13, 32, + 126, -128, -65, -96, -65, -128, -65, -128, + -97, -112, -65, -128, -65, -128, -113, 64, + 32, 126, -32, -19, -16, -12, 45, 46, + -62, -33, -31, -17, -15, -13, 48, 57, + 65, 90, 97, 122, 0}; + +static const signed char _address_single_lengths[] = { + 0, 8, 0, 8, 0, 0, 0, 0, + 0, 0, 8, 5, 0, 0, 0, 0, + 0, 0, 0, 5, 4, 5, 1, 2, + 0, 1, 3, 3, 1, 3, 1, 3, + 1, 1, 2, 1, 1, 1, 2, 1, + 1, 1, 2, 1, 3, 3, 4, 3, + 3, 3, 3, 2, 1, 2, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 4, 2, 1, 1, 1, 0, + 1, 1, 1, 2, 2, 2, 3, 2, + 2, 2, 1, 2, 2, 2, 2, 0, + 2, 2, 2, 2, 0, 2, 2, 2, + 2, 0, 2, 2, 2, 2, 0, 2, + 2, 2, 2, 1, 4, 3, 2, 2, + 2, 3, 3, 2, 2, 2, 3, 3, + 2, 2, 2, 3, 3, 2, 2, 2, + 3, 3, 3, 3, 3, 4, 3, 3, + 3, 3, 3, 3, 4, 3, 3, 3, + 2, 3, 3, 3, 4, 3, 3, 3, + 2, 3, 3, 3, 4, 3, 3, 3, + 2, 3, 3, 3, 4, 3, 3, 3, + 2, 2, 6, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 6, 0, 0}; + +static const signed char _address_range_lengths[] = { + 0, 8, 1, 8, 1, 1, 1, 1, + 1, 1, 8, 6, 1, 1, 1, 1, + 1, 1, 1, 6, 6, 3, 3, 3, + 2, 0, 3, 1, 0, 1, 0, 1, + 1, 1, 2, 1, 1, 1, 2, 1, + 1, 1, 2, 1, 3, 3, 4, 4, + 3, 3, 3, 3, 8, 3, 3, 3, + 0, 3, 3, 3, 3, 0, 3, 3, + 3, 3, 0, 3, 3, 3, 3, 0, + 3, 3, 3, 3, 0, 3, 3, 3, + 3, 0, 3, 3, 3, 3, 0, 3, + 3, 3, 3, 3, 3, 3, 4, 4, + 3, 3, 3, 3, 3, 3, 0, 3, + 3, 3, 3, 0, 3, 3, 3, 3, + 0, 3, 3, 3, 3, 0, 3, 3, + 3, 3, 0, 3, 3, 3, 3, 3, + 0, 3, 3, 3, 3, 0, 3, 3, + 3, 3, 0, 3, 3, 3, 3, 0, + 3, 3, 3, 3, 3, 4, 4, 3, + 3, 3, 3, 3, 4, 4, 3, 3, + 3, 3, 3, 3, 4, 4, 3, 3, + 3, 3, 3, 3, 4, 4, 3, 3, + 3, 3, 3, 3, 4, 4, 3, 3, + 3, 0, 4, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 6, 0, 0}; + +static const short _address_index_offsets[] = { + 0, 0, 17, 19, 36, 38, 40, 42, + 44, 46, 48, 65, 77, 79, 81, 83, + 85, 87, 89, 91, 103, 114, 123, 128, + 134, 137, 139, 146, 151, 153, 158, 160, + 165, 168, 171, 176, 179, 182, 185, 190, + 193, 196, 199, 204, 207, 214, 221, 230, + 238, 245, 252, 259, 265, 275, 281, 286, + 291, 293, 298, 303, 308, 313, 315, 320, + 325, 330, 335, 337, 342, 347, 352, 357, + 359, 364, 369, 374, 379, 381, 386, 391, + 396, 401, 403, 411, 417, 422, 427, 429, + 433, 438, 443, 448, 454, 460, 466, 474, + 481, 487, 493, 498, 504, 510, 516, 519, + 523, 529, 535, 541, 544, 548, 554, 560, + 566, 569, 573, 579, 585, 591, 594, 598, + 604, 610, 616, 619, 624, 632, 639, 645, + 651, 654, 661, 668, 674, 680, 683, 690, + 697, 703, 709, 712, 719, 726, 732, 738, + 741, 748, 755, 762, 769, 776, 785, 793, + 800, 807, 814, 821, 828, 837, 845, 852, + 859, 865, 872, 879, 886, 895, 903, 910, + 917, 923, 930, 937, 944, 953, 961, 968, + 975, 981, 988, 995, 1002, 1011, 1019, 1026, + 1033, 1039, 1042, 1053, 1055, 1057, 1059, 1061, + 1063, 1065, 1067, 1069, 1071, 1084, 0}; + +static const short _address_cond_targs[] = { + 4, 6, 7, 9, 186, 3, 3, 3, + 2, 5, 8, 3, 3, 3, 3, 3, + 0, 3, 0, 4, 6, 7, 9, 3, + 10, 3, 11, 2, 5, 8, 3, 3, + 3, 3, 3, 0, 2, 0, 2, 0, + 2, 0, 5, 0, 5, 0, 5, 0, + 4, 6, 7, 9, 3, 3, 3, 3, + 2, 5, 8, 3, 3, 3, 3, 3, + 0, 13, 15, 16, 18, 21, 12, 14, + 17, 196, 196, 196, 0, 196, 0, 12, + 0, 12, 0, 12, 0, 14, 0, 14, + 0, 14, 0, 13, 15, 16, 18, 19, + 12, 14, 17, 196, 196, 196, 0, 13, + 15, 16, 18, 12, 14, 17, 196, 196, + 196, 0, 22, 26, 44, 46, 48, 45, + 23, 23, 0, 22, 23, 23, 23, 0, + 22, 24, 23, 23, 23, 0, 25, 25, + 0, 197, 0, 22, 27, 24, 23, 23, + 23, 0, 28, 40, 42, 41, 0, 29, + 0, 30, 36, 38, 37, 0, 31, 0, + 25, 32, 34, 33, 0, 197, 33, 0, + 197, 25, 0, 35, 197, 33, 25, 0, + 197, 25, 0, 31, 37, 0, 31, 30, + 0, 31, 39, 37, 30, 0, 31, 30, + 0, 29, 41, 0, 29, 28, 0, 29, + 43, 41, 28, 0, 29, 28, 0, 22, + 27, 24, 45, 23, 23, 0, 22, 27, + 24, 26, 23, 23, 0, 22, 27, 47, + 24, 45, 26, 23, 23, 0, 22, 27, + 24, 26, 23, 23, 23, 0, 22, 24, + 49, 23, 23, 23, 0, 22, 24, 50, + 23, 23, 23, 0, 22, 51, 24, 23, + 23, 23, 0, 22, 52, 23, 23, 23, + 0, 185, 25, 53, 25, 53, 25, 25, + 53, 25, 0, 57, 197, 54, 54, 54, + 0, 57, 55, 55, 55, 0, 57, 56, + 56, 56, 0, 57, 0, 124, 58, 58, + 58, 0, 62, 59, 59, 59, 0, 62, + 60, 60, 60, 0, 62, 61, 61, 61, + 0, 62, 0, 124, 63, 63, 63, 0, + 67, 64, 64, 64, 0, 67, 65, 65, + 65, 0, 67, 66, 66, 66, 0, 67, + 0, 124, 68, 68, 68, 0, 72, 69, + 69, 69, 0, 72, 70, 70, 70, 0, + 72, 71, 71, 71, 0, 72, 0, 124, + 73, 73, 73, 0, 77, 74, 74, 74, + 0, 77, 75, 75, 75, 0, 77, 76, + 76, 76, 0, 77, 0, 98, 78, 78, + 78, 0, 82, 79, 79, 79, 0, 82, + 80, 80, 80, 0, 82, 81, 81, 81, + 0, 82, 0, 83, 91, 94, 98, 97, + 123, 123, 0, 27, 87, 84, 84, 84, + 0, 87, 85, 85, 85, 0, 87, 86, + 86, 86, 0, 87, 0, 88, 88, 88, + 0, 197, 89, 89, 89, 0, 197, 90, + 90, 90, 0, 197, 25, 25, 25, 0, + 27, 87, 92, 84, 84, 0, 27, 87, + 93, 85, 85, 0, 27, 87, 86, 86, + 86, 0, 27, 95, 87, 92, 96, 84, + 84, 0, 27, 87, 93, 85, 85, 85, + 0, 27, 87, 85, 85, 85, 0, 27, + 87, 96, 84, 84, 0, 197, 99, 99, + 99, 0, 103, 197, 100, 100, 100, 0, + 103, 197, 101, 101, 101, 0, 103, 197, + 102, 102, 102, 0, 103, 197, 0, 104, + 104, 104, 0, 108, 197, 105, 105, 105, + 0, 108, 197, 106, 106, 106, 0, 108, + 197, 107, 107, 107, 0, 108, 197, 0, + 109, 109, 109, 0, 113, 197, 110, 110, + 110, 0, 113, 197, 111, 111, 111, 0, + 113, 197, 112, 112, 112, 0, 113, 197, + 0, 114, 114, 114, 0, 118, 197, 115, + 115, 115, 0, 118, 197, 116, 116, 116, + 0, 118, 197, 117, 117, 117, 0, 118, + 197, 0, 119, 119, 119, 0, 87, 197, + 120, 120, 120, 0, 87, 197, 121, 121, + 121, 0, 87, 197, 122, 122, 122, 0, + 87, 197, 0, 87, 84, 84, 84, 0, + 125, 177, 180, 197, 183, 184, 184, 0, + 27, 129, 197, 126, 126, 126, 0, 129, + 197, 127, 127, 127, 0, 129, 197, 128, + 128, 128, 0, 129, 197, 0, 130, 169, + 172, 175, 176, 176, 0, 27, 134, 197, + 131, 131, 131, 0, 134, 197, 132, 132, + 132, 0, 134, 197, 133, 133, 133, 0, + 134, 197, 0, 135, 161, 164, 167, 168, + 168, 0, 27, 139, 197, 136, 136, 136, + 0, 139, 197, 137, 137, 137, 0, 139, + 197, 138, 138, 138, 0, 139, 197, 0, + 140, 153, 156, 159, 160, 160, 0, 27, + 144, 197, 141, 141, 141, 0, 144, 197, + 142, 142, 142, 0, 144, 197, 143, 143, + 143, 0, 144, 197, 0, 145, 146, 149, + 152, 119, 119, 0, 27, 87, 197, 120, + 120, 120, 0, 27, 87, 197, 147, 120, + 120, 0, 27, 87, 197, 148, 121, 121, + 0, 27, 87, 197, 122, 122, 122, 0, + 27, 150, 87, 197, 147, 151, 120, 120, + 0, 27, 87, 197, 148, 121, 121, 121, + 0, 27, 87, 197, 121, 121, 121, 0, + 27, 87, 197, 151, 120, 120, 0, 27, + 144, 197, 154, 141, 141, 0, 27, 144, + 197, 155, 142, 142, 0, 27, 144, 197, + 143, 143, 143, 0, 27, 157, 144, 197, + 154, 158, 141, 141, 0, 27, 144, 197, + 155, 142, 142, 142, 0, 27, 144, 197, + 142, 142, 142, 0, 27, 144, 197, 158, + 141, 141, 0, 144, 197, 141, 141, 141, + 0, 27, 139, 197, 162, 136, 136, 0, + 27, 139, 197, 163, 137, 137, 0, 27, + 139, 197, 138, 138, 138, 0, 27, 165, + 139, 197, 162, 166, 136, 136, 0, 27, + 139, 197, 163, 137, 137, 137, 0, 27, + 139, 197, 137, 137, 137, 0, 27, 139, + 197, 166, 136, 136, 0, 139, 197, 136, + 136, 136, 0, 27, 134, 197, 170, 131, + 131, 0, 27, 134, 197, 171, 132, 132, + 0, 27, 134, 197, 133, 133, 133, 0, + 27, 173, 134, 197, 170, 174, 131, 131, + 0, 27, 134, 197, 171, 132, 132, 132, + 0, 27, 134, 197, 132, 132, 132, 0, + 27, 134, 197, 174, 131, 131, 0, 134, + 197, 131, 131, 131, 0, 27, 129, 197, + 178, 126, 126, 0, 27, 129, 197, 179, + 127, 127, 0, 27, 129, 197, 128, 128, + 128, 0, 27, 181, 129, 197, 178, 182, + 126, 126, 0, 27, 129, 197, 179, 127, + 127, 127, 0, 27, 129, 197, 127, 127, + 127, 0, 27, 129, 197, 182, 126, 126, + 0, 129, 197, 126, 126, 126, 0, 124, + 197, 0, 188, 190, 191, 193, 194, 195, + 187, 189, 192, 186, 0, 186, 0, 187, + 0, 187, 0, 187, 0, 189, 0, 189, + 0, 189, 0, 11, 0, 186, 0, 13, + 15, 16, 18, 19, 20, 12, 14, 17, + 196, 196, 196, 0, 0, 0, 1, 2, + 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 0}; + +static const signed char _address_cond_actions[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 3, 0, 3, + 0, 3, 0, 3, 0, 3, 0, 3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 3, 1, 3, 0, + 3, 0, 3, 0, 3, 0, 3, 0, + 3, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 3, 0, + 0, 0, 0, 0, 0, 0, 1, 1, + 1, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 3, + 0, 0, 0, 0, 0, 3, 0, 0, + 3, 1, 3, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 3, 0, + 3, 0, 0, 0, 0, 3, 0, 3, + 0, 0, 0, 0, 3, 1, 0, 3, + 1, 0, 3, 0, 1, 0, 0, 3, + 1, 0, 3, 0, 0, 3, 0, 0, + 3, 0, 0, 0, 0, 3, 0, 0, + 3, 0, 0, 3, 0, 0, 3, 0, + 0, 0, 0, 3, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 1, 0, 0, 0, + 3, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 3, 0, 3, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 3, 0, 0, 0, 0, + 3, 0, 3, 0, 0, 0, 0, 3, + 0, 0, 0, 0, 3, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 3, 0, + 3, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 3, + 0, 0, 0, 0, 3, 0, 3, 0, + 0, 0, 0, 3, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 3, 0, 3, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 3, 0, 0, 0, 0, + 3, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 3, 0, 3, 0, 0, 0, + 3, 1, 0, 0, 0, 3, 1, 0, + 0, 0, 3, 1, 0, 0, 0, 3, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 3, 1, 0, 0, + 0, 3, 0, 1, 0, 0, 0, 3, + 0, 1, 0, 0, 0, 3, 0, 1, + 0, 0, 0, 3, 0, 1, 3, 0, + 0, 0, 3, 0, 1, 0, 0, 0, + 3, 0, 1, 0, 0, 0, 3, 0, + 1, 0, 0, 0, 3, 0, 1, 3, + 0, 0, 0, 3, 0, 1, 0, 0, + 0, 3, 0, 1, 0, 0, 0, 3, + 0, 1, 0, 0, 0, 3, 0, 1, + 3, 0, 0, 0, 3, 0, 1, 0, + 0, 0, 3, 0, 1, 0, 0, 0, + 3, 0, 1, 0, 0, 0, 3, 0, + 1, 3, 0, 0, 0, 3, 0, 1, + 0, 0, 0, 3, 0, 1, 0, 0, + 0, 3, 0, 1, 0, 0, 0, 3, + 0, 1, 3, 0, 0, 0, 0, 3, + 0, 0, 0, 1, 0, 0, 0, 3, + 0, 0, 1, 0, 0, 0, 3, 0, + 1, 0, 0, 0, 3, 0, 1, 0, + 0, 0, 3, 0, 1, 3, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 1, + 0, 0, 0, 3, 0, 1, 0, 0, + 0, 3, 0, 1, 0, 0, 0, 3, + 0, 1, 3, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 1, 0, 0, 0, + 3, 0, 1, 0, 0, 0, 3, 0, + 1, 0, 0, 0, 3, 0, 1, 3, + 0, 0, 0, 0, 0, 0, 3, 0, + 0, 1, 0, 0, 0, 3, 0, 1, + 0, 0, 0, 3, 0, 1, 0, 0, + 0, 3, 0, 1, 3, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 1, 0, + 0, 0, 3, 0, 0, 1, 0, 0, + 0, 3, 0, 0, 1, 0, 0, 0, + 3, 0, 0, 1, 0, 0, 0, 3, + 0, 0, 0, 1, 0, 0, 0, 0, + 3, 0, 0, 1, 0, 0, 0, 0, + 3, 0, 0, 1, 0, 0, 0, 3, + 0, 0, 1, 0, 0, 0, 3, 0, + 0, 1, 0, 0, 0, 3, 0, 0, + 1, 0, 0, 0, 3, 0, 0, 1, + 0, 0, 0, 3, 0, 0, 0, 1, + 0, 0, 0, 0, 3, 0, 0, 1, + 0, 0, 0, 0, 3, 0, 0, 1, + 0, 0, 0, 3, 0, 0, 1, 0, + 0, 0, 3, 0, 1, 0, 0, 0, + 3, 0, 0, 1, 0, 0, 0, 3, + 0, 0, 1, 0, 0, 0, 3, 0, + 0, 1, 0, 0, 0, 3, 0, 0, + 0, 1, 0, 0, 0, 0, 3, 0, + 0, 1, 0, 0, 0, 0, 3, 0, + 0, 1, 0, 0, 0, 3, 0, 0, + 1, 0, 0, 0, 3, 0, 1, 0, + 0, 0, 3, 0, 0, 1, 0, 0, + 0, 3, 0, 0, 1, 0, 0, 0, + 3, 0, 0, 1, 0, 0, 0, 3, + 0, 0, 0, 1, 0, 0, 0, 0, + 3, 0, 0, 1, 0, 0, 0, 0, + 3, 0, 0, 1, 0, 0, 0, 3, + 0, 0, 1, 0, 0, 0, 3, 0, + 1, 0, 0, 0, 3, 0, 0, 1, + 0, 0, 0, 3, 0, 0, 1, 0, + 0, 0, 3, 0, 0, 1, 0, 0, + 0, 3, 0, 0, 0, 1, 0, 0, + 0, 0, 3, 0, 0, 1, 0, 0, + 0, 0, 3, 0, 0, 1, 0, 0, + 0, 3, 0, 0, 1, 0, 0, 0, + 3, 0, 1, 0, 0, 0, 3, 0, + 1, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 3, 0, + 3, 0, 3, 0, 3, 0, 3, 0, + 3, 0, 3, 0, 3, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 3, 3, 0, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 0, 0, 0}; + +static const short _address_eof_trans[] = { + 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, + 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, + 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, + 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, + 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, + 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, + 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, + 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149, + 1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157, + 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, + 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, + 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, + 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, + 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, + 1198, 1199, 1200, 1201, 1202, 1203, 1204, 1205, + 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, + 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, + 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, + 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, + 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, + 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, + 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, + 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, + 1270, 1271, 1272, 1273, 1274, 1275, 1276, 1277, + 1278, 1279, 1280, 1281, 1282, 1283, 0}; + +static const int address_start = 1; + +bool is_address(const char *p, const char *pe) +{ + int cs = 0; + + const char *eof = pe; + + bool result = false; + + { + cs = (int) address_start; + } + { + int _klen; + unsigned int _trans = 0; + const signed char *_keys; + const signed char *_acts; + unsigned int _nacts; + _resume : { + } + if (p == pe && p != eof) + goto _out; + if (p == eof) { + if (_address_eof_trans[cs] > 0) { + _trans = (unsigned int) _address_eof_trans[cs] - 1; + } + } else { + _keys = (_address_trans_keys + (_address_key_offsets[cs])); + _trans = (unsigned int) _address_index_offsets[cs]; + + _klen = (int) _address_single_lengths[cs]; + if (_klen > 0) { + const signed char *_lower = _keys; + const signed char *_upper = _keys + _klen - 1; + const signed char *_mid; + while (1) { + if (_upper < _lower) { + _keys += _klen; + _trans += (unsigned int) _klen; + break; + } + + _mid = _lower + ((_upper - _lower) >> 1); + if (((*(p))) < (*(_mid))) + _upper = _mid - 1; + else if (((*(p))) > (*(_mid))) + _lower = _mid + 1; + else { + _trans += (unsigned int) (_mid - _keys); + goto _match; + } + } + } + + _klen = (int) _address_range_lengths[cs]; + if (_klen > 0) { + const signed char *_lower = _keys; + const signed char *_upper = _keys + (_klen << 1) - 2; + const signed char *_mid; + while (1) { + if (_upper < _lower) { + _trans += (unsigned int) _klen; + break; + } + + _mid = _lower + (((_upper - _lower) >> 1) & ~1); + if (((*(p))) < (*(_mid))) + _upper = _mid - 2; + else if (((*(p))) > (*(_mid + 1))) + _lower = _mid + 2; + else { + _trans += (unsigned int) ((_mid - _keys) >> 1); + break; + } + } + } + + _match : { + } + } + cs = (int) _address_cond_targs[_trans]; + + if (_address_cond_actions[_trans] != 0) { + + _acts = (_address_actions + (_address_cond_actions[_trans])); + _nacts = (unsigned int) (*(_acts)); + _acts += 1; + while (_nacts > 0) { + switch ((*(_acts))) { + case 0: { + { + result = true; + } + break; + } + case 1: { + { + result = false; + } + break; + } + } + _nacts -= 1; + _acts += 1; + } + } + + if (p == eof) { + if (cs >= 196) + goto _out; + } else { + if (cs != 0) { + p += 1; + goto _resume; + } + } + _out : { + } + } + return result; +} diff --git a/externals/json-schema-validator/smtp-address-validator.hpp b/externals/json-schema-validator/smtp-address-validator.hpp new file mode 100644 index 0000000..8d3c12b --- /dev/null +++ b/externals/json-schema-validator/smtp-address-validator.hpp @@ -0,0 +1,34 @@ +#ifndef SMTP_ADDRESS_PARSER_HPP_INCLUDED +#define SMTP_ADDRESS_PARSER_HPP_INCLUDED + +/* + +Snarfed from + +: + +Copyright (c) 2021 Gene Hightower + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +bool is_address(const char *p, const char *pe); + +#endif // SMTP_ADDRESS_PARSER_HPP_INCLUDED diff --git a/externals/json-schema-validator/string-format-check.cpp b/externals/json-schema-validator/string-format-check.cpp new file mode 100644 index 0000000..ecc428f --- /dev/null +++ b/externals/json-schema-validator/string-format-check.cpp @@ -0,0 +1,414 @@ +#include + +#include "smtp-address-validator.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef JSON_SCHEMA_BOOST_REGEX +# include +# define REGEX_NAMESPACE boost +#elif defined(JSON_SCHEMA_NO_REGEX) +# define NO_STD_REGEX +#else +# include +# define REGEX_NAMESPACE std +#endif + +/** + * Many of the RegExes are from @see http://jmrware.com/articles/2009/uri_regexp/URI_regex.html + */ + +namespace +{ +template +void range_check(const T value, const T min, const T max) +{ + if (!((value >= min) && (value <= max))) { + std::stringstream out; + out << "Value " << value << " should be in interval [" << min << "," << max << "] but is not!"; + throw std::invalid_argument(out.str()); + } +} + +/** @see date_time_check */ +void rfc3339_date_check(const std::string &value) +{ + const static REGEX_NAMESPACE::regex dateRegex{R"(^([0-9]{4})\-([0-9]{2})\-([0-9]{2})$)"}; + + REGEX_NAMESPACE::smatch matches; + if (!REGEX_NAMESPACE::regex_match(value, matches, dateRegex)) { + throw std::invalid_argument(value + " is not a date string according to RFC 3339."); + } + + const auto year = std::stoi(matches[1].str()); + const auto month = std::stoi(matches[2].str()); + const auto mday = std::stoi(matches[3].str()); + + const auto isLeapYear = (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0)); + + range_check(month, 1, 12); + if (month == 2) { + range_check(mday, 1, isLeapYear ? 29 : 28); + } else if (month <= 7) { + range_check(mday, 1, month % 2 == 0 ? 30 : 31); + } else { + range_check(mday, 1, month % 2 == 0 ? 31 : 30); + } +} + +/** @see date_time_check */ +void rfc3339_time_check(const std::string &value) +{ + const static REGEX_NAMESPACE::regex timeRegex{R"(^([0-9]{2})\:([0-9]{2})\:([0-9]{2})(\.[0-9]+)?(?:[Zz]|((?:\+|\-)[0-9]{2})\:([0-9]{2}))$)"}; + + REGEX_NAMESPACE::smatch matches; + if (!REGEX_NAMESPACE::regex_match(value, matches, timeRegex)) { + throw std::invalid_argument(value + " is not a time string according to RFC 3339."); + } + + auto hour = std::stoi(matches[1].str()); + auto minute = std::stoi(matches[2].str()); + auto second = std::stoi(matches[3].str()); + // const auto secfrac = std::stof( matches[4].str() ); + + range_check(hour, 0, 23); + range_check(minute, 0, 59); + + int offsetHour = 0, + offsetMinute = 0; + + /* don't check the numerical offset if time zone is specified as 'Z' */ + if (!matches[5].str().empty()) { + offsetHour = std::stoi(matches[5].str()); + offsetMinute = std::stoi(matches[6].str()); + + range_check(offsetHour, -23, 23); + range_check(offsetMinute, 0, 59); + if (offsetHour < 0) + offsetMinute *= -1; + } + + /** + * @todo Could be made more exact by querying a leap second database and choosing the + * correct maximum in {58,59,60}. This current solution might match some invalid dates + * but it won't lead to false negatives. This only works if we know the full date, however + */ + + auto day_minutes = hour * 60 + minute - (offsetHour * 60 + offsetMinute); + if (day_minutes < 0) + day_minutes += 60 * 24; + hour = day_minutes % 24; + minute = day_minutes / 24; + + if (hour == 23 && minute == 59) + range_check(second, 0, 60); // possible leap-second + else + range_check(second, 0, 59); +} + +/** + * @see https://tools.ietf.org/html/rfc3339#section-5.6 + * + * @verbatim + * date-fullyear = 4DIGIT + * date-month = 2DIGIT ; 01-12 + * date-mday = 2DIGIT ; 01-28, 01-29, 01-30, 01-31 based on + * ; month/year + * time-hour = 2DIGIT ; 00-23 + * time-minute = 2DIGIT ; 00-59 + * time-second = 2DIGIT ; 00-58, 00-59, 00-60 based on leap second + * ; rules + * time-secfrac = "." 1*DIGIT + * time-numoffset = ("+" / "-") time-hour ":" time-minute + * time-offset = "Z" / time-numoffset + * + * partial-time = time-hour ":" time-minute ":" time-second + * [time-secfrac] + * full-date = date-fullyear "-" date-month "-" date-mday + * full-time = partial-time time-offset + * + * date-time = full-date "T" full-time + * @endverbatim + * NOTE: Per [ABNF] and ISO8601, the "T" and "Z" characters in this + * syntax may alternatively be lower case "t" or "z" respectively. + */ +void rfc3339_date_time_check(const std::string &value) +{ + const static REGEX_NAMESPACE::regex dateTimeRegex{R"(^([0-9]{4}\-[0-9]{2}\-[0-9]{2})[Tt]([0-9]{2}\:[0-9]{2}\:[0-9]{2}(?:\.[0-9]+)?(?:[Zz]|(?:\+|\-)[0-9]{2}\:[0-9]{2}))$)"}; + + REGEX_NAMESPACE::smatch matches; + if (!REGEX_NAMESPACE::regex_match(value, matches, dateTimeRegex)) { + throw std::invalid_argument(value + " is not a date-time string according to RFC 3339."); + } + + rfc3339_date_check(matches[1].str()); + rfc3339_time_check(matches[2].str()); +} + +const std::string decOctet{R"((?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9]))"}; // matches numbers 0-255 +const std::string ipv4Address{"(?:" + decOctet + R"(\.){3})" + decOctet}; +const std::string h16{R"([0-9A-Fa-f]{1,4})"}; +const std::string h16Left{"(?:" + h16 + ":)"}; +const std::string ipv6Address{ + "(?:" + "(?:" + + h16Left + "{6}" + "|::" + + h16Left + "{5}" + "|(?:" + + h16 + ")?::" + h16Left + "{4}" + "|(?:" + + h16Left + "{0,1}" + h16 + ")?::" + h16Left + "{3}" + "|(?:" + + h16Left + "{0,2}" + h16 + ")?::" + h16Left + "{2}" + "|(?:" + + h16Left + "{0,3}" + h16 + ")?::" + h16Left + + "|(?:" + h16Left + "{0,4}" + h16 + ")?::" + ")(?:" + + h16Left + h16 + "|" + ipv4Address + ")" + "|(?:" + + h16Left + "{0,5}" + h16 + ")?::" + h16 + + "|(?:" + h16Left + "{0,6}" + h16 + ")?::" + ")"}; +const std::string ipvFuture{R"([Vv][0-9A-Fa-f]+\.[A-Za-z0-9\-._~!$&'()*+,;=:]+)"}; +const std::string regName{R"((?:[A-Za-z0-9\-._~!$&'()*+,;=]|%[0-9A-Fa-f]{2})*)"}; +const std::string host{ + "(?:" + R"(\[(?:)" + + ipv6Address + "|" + ipvFuture + R"()\])" + + "|" + ipv4Address + + "|" + regName + + ")"}; + +const std::string uuid{R"([0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12})"}; + +// from http://stackoverflow.com/questions/106179/regular-expression-to-match-dns-hostname-or-ip-address +const std::string hostname{R"(^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$)"}; + +bool is_ascii(std::string const &value) +{ + for (auto ch : value) { + if (ch & 0x80) { + return false; + } + } + return true; +} + +/** + * @see + * + * @verbatim + * URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] + * + * hier-part = "//" authority path-abempty + * / path-absolute + * / path-rootless + * / path-empty + * + * URI-reference = URI / relative-ref + * + * absolute-URI = scheme ":" hier-part [ "?" query ] + * + * relative-ref = relative-part [ "?" query ] [ "#" fragment ] + * + * relative-part = "//" authority path-abempty + * / path-absolute + * / path-noscheme + * / path-empty + * + * scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) + * + * authority = [ userinfo "@" ] host [ ":" port ] + * userinfo = *( unreserved / pct-encoded / sub-delims / ":" ) + * host = IP-literal / IPv4address / reg-name + * port = *DIGIT + * + * IP-literal = "[" ( IPv6address / IPvFuture ) "]" + * + * IPvFuture = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" ) + * + * IPv6address = 6( h16 ":" ) ls32 + * / "::" 5( h16 ":" ) ls32 + * / [ h16 ] "::" 4( h16 ":" ) ls32 + * / [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32 + * / [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32 + * / [ *3( h16 ":" ) h16 ] "::" h16 ":" ls32 + * / [ *4( h16 ":" ) h16 ] "::" ls32 + * / [ *5( h16 ":" ) h16 ] "::" h16 + * / [ *6( h16 ":" ) h16 ] "::" + * + * h16 = 1*4HEXDIG + * ls32 = ( h16 ":" h16 ) / IPv4address + * IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet + * dec-octet = DIGIT ; 0-9 + * / %x31-39 DIGIT ; 10-99 + * / "1" 2DIGIT ; 100-199 + * / "2" %x30-34 DIGIT ; 200-249 + * / "25" %x30-35 ; 250-255 + * + * reg-name = *( unreserved / pct-encoded / sub-delims ) + * + * path = path-abempty ; begins with "/" or is empty + * / path-absolute ; begins with "/" but not "//" + * / path-noscheme ; begins with a non-colon segment + * / path-rootless ; begins with a segment + * / path-empty ; zero characters + * + * path-abempty = *( "/" segment ) + * path-absolute = "/" [ segment-nz *( "/" segment ) ] + * path-noscheme = segment-nz-nc *( "/" segment ) + * path-rootless = segment-nz *( "/" segment ) + * path-empty = 0 + * + * segment = *pchar + * segment-nz = 1*pchar + * segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" ) + * ; non-zero-length segment without any colon ":" + * + * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" + * + * query = *( pchar / "/" / "?" ) + * + * fragment = *( pchar / "/" / "?" ) + * + * pct-encoded = "%" HEXDIG HEXDIG + * + * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + * reserved = gen-delims / sub-delims + * gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@" + * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" + * / "*" / "+" / "," / ";" / "=" + * + * @endverbatim + * @see adapted from: https://github.com/jhermsmeier/uri.regex/blob/master/uri.regex + * + */ +void rfc3986_uri_check(const std::string &value) +{ + const static std::string scheme{R"(([A-Za-z][A-Za-z0-9+\-.]*):)"}; + const static std::string hierPart{ + R"((?:(\/\/)(?:((?:[A-Za-z0-9\-._~!$&'()*+,;=:]|)" + R"(%[0-9A-Fa-f]{2})*)@)?((?:\[(?:(?:(?:(?:[0-9A-Fa-f]{1,4}:){6}|)" + R"(::(?:[0-9A-Fa-f]{1,4}:){5}|)" + R"((?:[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){4}|)" + R"((?:(?:[0-9A-Fa-f]{1,4}:){0,1}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){3}|)" + R"((?:(?:[0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){2}|)" + R"((?:(?:[0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})?::[0-9A-Fa-f]{1,4}:|)" + R"((?:(?:[0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})?::)(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|)" + R"((?:(?:25[0-5]|2[0-4][0-9]|)" + R"([01]?[0-9][0-9]?)\.){3}(?:25[0-5]|)" + R"(2[0-4][0-9]|)" + R"([01]?[0-9][0-9]?))|)" + R"((?:(?:[0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})?::[0-9A-Fa-f]{1,4}|)" + R"((?:(?:[0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})?::)|)" + R"([Vv][0-9A-Fa-f]+\.[A-Za-z0-9\-._~!$&'()*+,;=:]+)\]|)" + R"((?:(?:25[0-5]|)" + R"(2[0-4][0-9]|)" + R"([01]?[0-9][0-9]?)\.){3}(?:25[0-5]|)" + R"(2[0-4][0-9]|)" + R"([01]?[0-9][0-9]?)|)" + R"((?:[A-Za-z0-9\-._~!$&'()*+,;=]|)" + R"(%[0-9A-Fa-f]{2})*))(?::([0-9]*))?((?:\/(?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|)" + R"(%[0-9A-Fa-f]{2})*)*)|)" + R"(\/((?:(?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|)" + R"(%[0-9A-Fa-f]{2})+(?:\/(?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|)" + R"(%[0-9A-Fa-f]{2})*)*)?)|)" + R"(((?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|)" + R"(%[0-9A-Fa-f]{2})+(?:\/(?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|)" + R"(%[0-9A-Fa-f]{2})*)*)|))"}; + + const static std::string query{R"((?:\?((?:[A-Za-z0-9\-._~!$&'()*+,;=:@\/?]|%[0-9A-Fa-f]{2})*))?)"}; + const static std::string fragment{ + R"((?:\#((?:[A-Za-z0-9\-._~!$&'()*+,;=:@\/?]|%[0-9A-Fa-f]{2})*))?)"}; + const static std::string uriFormat{scheme + hierPart + query + fragment}; + + const static REGEX_NAMESPACE::regex uriRegex{uriFormat}; + + if (!REGEX_NAMESPACE::regex_match(value, uriRegex)) { + throw std::invalid_argument(value + " is not a URI string according to RFC 3986."); + } +} + +} // namespace + +namespace nlohmann +{ +namespace json_schema +{ +/** + * Checks validity for built-ins by converting the definitions given as ABNF in the linked RFC from + * @see https://json-schema.org/understanding-json-schema/reference/string.html#built-in-formats + * into regular expressions using @see https://www.msweet.org/abnf/ and some manual editing. + * + * @see https://json-schema.org/latest/json-schema-validation.html + */ +void default_string_format_check(const std::string &format, const std::string &value) +{ + if (format == "date-time") { + rfc3339_date_time_check(value); + } else if (format == "date") { + rfc3339_date_check(value); + } else if (format == "time") { + rfc3339_time_check(value); + } else if (format == "uri") { + rfc3986_uri_check(value); + } else if (format == "email") { + if (!is_ascii(value)) { + throw std::invalid_argument(value + " contains non-ASCII values, not RFC 5321 compliant."); + } + if (!is_address(&*value.begin(), &*value.end())) { + throw std::invalid_argument(value + " is not a valid email according to RFC 5321."); + } + } else if (format == "idn-email") { + if (!is_address(&*value.begin(), &*value.end())) { + throw std::invalid_argument(value + " is not a valid idn-email according to RFC 6531."); + } + } else if (format == "hostname") { + static const REGEX_NAMESPACE::regex hostRegex{hostname}; + if (!REGEX_NAMESPACE::regex_match(value, hostRegex)) { + throw std::invalid_argument(value + " is not a valid hostname according to RFC 3986 Appendix A."); + } + } else if (format == "ipv4") { + const static REGEX_NAMESPACE::regex ipv4Regex{"^" + ipv4Address + "$"}; + if (!REGEX_NAMESPACE::regex_match(value, ipv4Regex)) { + throw std::invalid_argument(value + " is not an IPv4 string according to RFC 2673."); + } + } else if (format == "ipv6") { + static const REGEX_NAMESPACE::regex ipv6Regex{ipv6Address}; + if (!REGEX_NAMESPACE::regex_match(value, ipv6Regex)) { + throw std::invalid_argument(value + " is not an IPv6 string according to RFC 5954."); + } + } else if (format == "uuid") { + static const REGEX_NAMESPACE::regex uuidRegex{uuid}; + if (!REGEX_NAMESPACE::regex_match(value, uuidRegex)) { + throw std::invalid_argument(value + " is not an uuid string according to RFC 4122."); + } + } else if (format == "regex") { + try { + REGEX_NAMESPACE::regex re(value, std::regex::ECMAScript); + } catch (std::exception &exception) { + throw exception; + } + } else { + /* yet unsupported JSON schema draft 7 built-ins */ + static const std::vector jsonSchemaStringFormatBuiltIns{ + "date-time", "time", "date", "email", "idn-email", "hostname", "idn-hostname", "ipv4", "ipv6", "uri", + "uri-reference", "iri", "iri-reference", "uri-template", "json-pointer", "relative-json-pointer", "regex"}; + if (std::find(jsonSchemaStringFormatBuiltIns.begin(), jsonSchemaStringFormatBuiltIns.end(), format) != jsonSchemaStringFormatBuiltIns.end()) { + throw std::logic_error("JSON schema string format built-in " + format + " not yet supported. " + + "Please open an issue or use a custom format checker."); + } + + throw std::logic_error("Don't know how to validate " + format); + } +} +} // namespace json_schema +} // namespace nlohmann diff --git a/externals/nlohmann/LICENSE.MIT b/externals/json/nlohmann/LICENSE.MIT similarity index 100% rename from externals/nlohmann/LICENSE.MIT rename to externals/json/nlohmann/LICENSE.MIT diff --git a/externals/nlohmann/json.hpp b/externals/json/nlohmann/json.hpp similarity index 100% rename from externals/nlohmann/json.hpp rename to externals/json/nlohmann/json.hpp