diff --git a/projects/rocr-runtime/runtime/hsa-runtime/core/inc/hsa_ven_amd_loader_impl.h b/projects/rocr-runtime/runtime/hsa-runtime/core/inc/hsa_ven_amd_loader_impl.h index 51ba4289cf..82167253a8 100644 --- a/projects/rocr-runtime/runtime/hsa-runtime/core/inc/hsa_ven_amd_loader_impl.h +++ b/projects/rocr-runtime/runtime/hsa-runtime/core/inc/hsa_ven_amd_loader_impl.h @@ -78,6 +78,12 @@ namespace rocr { size_t size, hsa_code_object_reader_t *code_object_reader); + hsa_status_t + hsa_ven_amd_loader_iterate_executables( + hsa_status_t (*callback)( + hsa_executable_t executable, + void *data), + void *data); } // namespace rocr #endif diff --git a/projects/rocr-runtime/runtime/hsa-runtime/core/runtime/hsa.cpp b/projects/rocr-runtime/runtime/hsa-runtime/core/runtime/hsa.cpp index c78eaa3ec2..f496f2ca9d 100644 --- a/projects/rocr-runtime/runtime/hsa-runtime/core/runtime/hsa.cpp +++ b/projects/rocr-runtime/runtime/hsa-runtime/core/runtime/hsa.cpp @@ -341,6 +341,8 @@ static size_t get_extension_table_length(uint16_t extension, uint16_t major, uin {"hsa_ext_finalizer_1_00_pfn_t", sizeof(hsa_ext_finalizer_1_00_pfn_t)}, {"hsa_ven_amd_loader_1_00_pfn_t", sizeof(hsa_ven_amd_loader_1_00_pfn_t)}, {"hsa_ven_amd_loader_1_01_pfn_t", sizeof(hsa_ven_amd_loader_1_01_pfn_t)}, + {"hsa_ven_amd_loader_1_02_pfn_t", sizeof(hsa_ven_amd_loader_1_02_pfn_t)}, + {"hsa_ven_amd_loader_1_03_pfn_t", sizeof(hsa_ven_amd_loader_1_03_pfn_t)}, {"hsa_ven_amd_aqlprofile_1_00_pfn_t", sizeof(hsa_ven_amd_aqlprofile_1_00_pfn_t)}}; static const size_t num_tables = sizeof(sizes) / sizeof(sizes_t); @@ -448,15 +450,21 @@ hsa_status_t hsa_system_get_major_extension_table(uint16_t extension, uint16_t v if (extension == HSA_EXTENSION_AMD_LOADER) { if (version_major != 1) return HSA_STATUS_ERROR; - hsa_ven_amd_loader_1_01_pfn_t ext_table; - ext_table.hsa_ven_amd_loader_query_host_address = hsa_ven_amd_loader_query_host_address; + hsa_ven_amd_loader_1_03_pfn_t ext_table; + ext_table.hsa_ven_amd_loader_query_host_address = + hsa_ven_amd_loader_query_host_address; ext_table.hsa_ven_amd_loader_query_segment_descriptors = hsa_ven_amd_loader_query_segment_descriptors; - ext_table.hsa_ven_amd_loader_query_executable = hsa_ven_amd_loader_query_executable; + ext_table.hsa_ven_amd_loader_query_executable = + hsa_ven_amd_loader_query_executable; ext_table.hsa_ven_amd_loader_executable_iterate_loaded_code_objects = hsa_ven_amd_loader_executable_iterate_loaded_code_objects; ext_table.hsa_ven_amd_loader_loaded_code_object_get_info = hsa_ven_amd_loader_loaded_code_object_get_info; + ext_table.hsa_ven_amd_loader_code_object_reader_create_from_file_with_offset_size = + hsa_ven_amd_loader_code_object_reader_create_from_file_with_offset_size; + ext_table.hsa_ven_amd_loader_iterate_executables = + hsa_ven_amd_loader_iterate_executables; memcpy(table, &ext_table, Min(sizeof(ext_table), table_length)); diff --git a/projects/rocr-runtime/runtime/hsa-runtime/core/runtime/hsa_ven_amd_loader.cpp b/projects/rocr-runtime/runtime/hsa-runtime/core/runtime/hsa_ven_amd_loader.cpp index a74181d3b3..c945637157 100644 --- a/projects/rocr-runtime/runtime/hsa-runtime/core/runtime/hsa_ven_amd_loader.cpp +++ b/projects/rocr-runtime/runtime/hsa-runtime/core/runtime/hsa_ven_amd_loader.cpp @@ -53,6 +53,7 @@ using namespace core; using loader::CodeObjectReaderImpl; using loader::Executable; using loader::LoadedCodeObject; +using loader::Loader; namespace AMD { @@ -273,4 +274,30 @@ hsa_ven_amd_loader_code_object_reader_create_from_file_with_offset_size( } catch(...) { return AMD::handleException(); } } +namespace { + +Loader *GetLoader() { + return Runtime::runtime_singleton_->loader(); +} + +} // namespace anonymous + +hsa_status_t +hsa_ven_amd_loader_iterate_executables( + hsa_status_t (*callback)( + hsa_executable_t executable, + void *data), + void *data) { + try { + if (!Runtime::runtime_singleton_->IsOpen()) { + return HSA_STATUS_ERROR_NOT_INITIALIZED; + } + if (nullptr == callback) { + return HSA_STATUS_ERROR_INVALID_ARGUMENT; + } + + return GetLoader()->IterateExecutables(callback, data); + } catch(...) { return AMD::handleException(); } +} + } // namespace rocr diff --git a/projects/rocr-runtime/runtime/hsa-runtime/inc/hsa_ven_amd_loader.h b/projects/rocr-runtime/runtime/hsa-runtime/inc/hsa_ven_amd_loader.h index 3ce8475556..3ee0e332e3 100644 --- a/projects/rocr-runtime/runtime/hsa-runtime/inc/hsa_ven_amd_loader.h +++ b/projects/rocr-runtime/runtime/hsa-runtime/inc/hsa_ven_amd_loader.h @@ -493,10 +493,39 @@ hsa_ven_amd_loader_code_object_reader_create_from_file_with_offset_size( //===----------------------------------------------------------------------===// +/** + * @brief Iterate over the available executables, and invoke an + * application-defined callback on every iteration. + * + * @param[in] callback Callback to be invoked once per executable. The HSA + * runtime passes two arguments to the callback: the executable and the + * application data. If @p callback returns a status other than + * ::HSA_STATUS_SUCCESS for a particular iteration, the traversal stops and + * ::hsa_ven_amd_loader_iterate_executables returns that status value. + * + * @param[in] data Application data that is passed to @p callback on every + * iteration. May be NULL. + * + * @retval ::HSA_STATUS_SUCCESS The function has been executed successfully. + * + * @retval ::HSA_STATUS_ERROR_NOT_INITIALIZED The HSA runtime has not been + * initialized. + * + * @retval ::HSA_STATUS_ERROR_INVALID_ARGUMENT @p callback is NULL. +*/ +hsa_status_t +hsa_ven_amd_loader_iterate_executables( + hsa_status_t (*callback)( + hsa_executable_t executable, + void *data), + void *data); + +//===----------------------------------------------------------------------===// + /** * @brief Extension version. */ -#define hsa_ven_amd_loader 001002 +#define hsa_ven_amd_loader 001003 /** * @brief Extension function table version 1.00. @@ -582,6 +611,50 @@ typedef struct hsa_ven_amd_loader_1_02_pfn_s { hsa_code_object_reader_t *code_object_reader); } hsa_ven_amd_loader_1_02_pfn_t; +/** + * @brief Extension function table version 1.03. + */ +typedef struct hsa_ven_amd_loader_1_03_pfn_s { + hsa_status_t (*hsa_ven_amd_loader_query_host_address)( + const void *device_address, + const void **host_address); + + hsa_status_t (*hsa_ven_amd_loader_query_segment_descriptors)( + hsa_ven_amd_loader_segment_descriptor_t *segment_descriptors, + size_t *num_segment_descriptors); + + hsa_status_t (*hsa_ven_amd_loader_query_executable)( + const void *device_address, + hsa_executable_t *executable); + + hsa_status_t (*hsa_ven_amd_loader_executable_iterate_loaded_code_objects)( + hsa_executable_t executable, + hsa_status_t (*callback)( + hsa_executable_t executable, + hsa_loaded_code_object_t loaded_code_object, + void *data), + void *data); + + hsa_status_t (*hsa_ven_amd_loader_loaded_code_object_get_info)( + hsa_loaded_code_object_t loaded_code_object, + hsa_ven_amd_loader_loaded_code_object_info_t attribute, + void *value); + + hsa_status_t + (*hsa_ven_amd_loader_code_object_reader_create_from_file_with_offset_size)( + hsa_file_t file, + size_t offset, + size_t size, + hsa_code_object_reader_t *code_object_reader); + + hsa_status_t + (*hsa_ven_amd_loader_iterate_executables)( + hsa_status_t (*callback)( + hsa_executable_t executable, + void *data), + void *data); +} hsa_ven_amd_loader_1_03_pfn_t; + #ifdef __cplusplus } #endif /* __cplusplus */