You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
hashcat/src/ext_hiprtc.c

215 lines
5.9 KiB

/**
* Author......: See docs/credits.txt
* License.....: MIT
*/
#include "common.h"
#include "types.h"
#include "memory.h"
#include "event.h"
#include "ext_hiprtc.h"
#include "dynloader.h"
int hiprtc_make_options_array_from_string (char *string, char **options)
{
char *saveptr = NULL;
char *next = strtok_r (string, " ", &saveptr);
int cnt = 0;
do
{
options[cnt] = next;
cnt++;
} while ((next = strtok_r ((char *) NULL, " ", &saveptr)) != NULL);
return cnt;
}
int hiprtc_init (void *hashcat_ctx)
{
backend_ctx_t *backend_ctx = ((hashcat_ctx_t *) hashcat_ctx)->backend_ctx;
HIPRTC_PTR *hiprtc = (HIPRTC_PTR *) backend_ctx->hiprtc;
memset (hiprtc, 0, sizeof (HIPRTC_PTR));
#if defined (_WIN)
hiprtc->lib = hc_dlopen ("hiprtc.dll");
if (hiprtc->lib == NULL) hiprtc->lib = hc_dlopen ("C:/Program Files/AMD/ROCm/5.5/bin/hiprtc0505.dll");
if (hiprtc->lib == NULL) hiprtc->lib = hc_dlopen ("amdhip64.dll");
#elif defined (__APPLE__)
hiprtc->lib = hc_dlopen ("fixme.dylib");
#elif defined (__CYGWIN__)
hiprtc->lib = hc_dlopen ("hiprtc.dll");
if (hiprtc->lib == NULL) hiprtc->lib = hc_dlopen ("C:/Program Files/AMD/ROCm/5.5/bin/hiprtc0505.dll");
if (hiprtc->lib == NULL) hiprtc->lib = hc_dlopen ("amdhip64.dll");
#else
hiprtc->lib = hc_dlopen ("libhiprtc.so");
#endif
if (hiprtc->lib == NULL) return -1;
HC_LOAD_FUNC (hiprtc, hiprtcCompileProgram, HIPRTC_HIPRTCCOMPILEPROGRAM, HIPRTC, 1);
HC_LOAD_FUNC (hiprtc, hiprtcCreateProgram, HIPRTC_HIPRTCCREATEPROGRAM, HIPRTC, 1);
HC_LOAD_FUNC (hiprtc, hiprtcDestroyProgram, HIPRTC_HIPRTCDESTROYPROGRAM, HIPRTC, 1);
HC_LOAD_FUNC (hiprtc, hiprtcGetCode, HIPRTC_HIPRTCGETCODE, HIPRTC, 1);
HC_LOAD_FUNC (hiprtc, hiprtcGetCodeSize, HIPRTC_HIPRTCGETCODESIZE, HIPRTC, 1);
HC_LOAD_FUNC (hiprtc, hiprtcGetProgramLog, HIPRTC_HIPRTCGETPROGRAMLOG, HIPRTC, 1);
HC_LOAD_FUNC (hiprtc, hiprtcGetProgramLogSize, HIPRTC_HIPRTCGETPROGRAMLOGSIZE, HIPRTC, 1);
HC_LOAD_FUNC (hiprtc, hiprtcGetErrorString, HIPRTC_HIPRTCGETERRORSTRING, HIPRTC, 1);
return 0;
}
void hiprtc_close (void *hashcat_ctx)
{
backend_ctx_t *backend_ctx = ((hashcat_ctx_t *) hashcat_ctx)->backend_ctx;
HIPRTC_PTR *hiprtc = (HIPRTC_PTR *) backend_ctx->hiprtc;
if (hiprtc)
{
if (hiprtc->lib)
{
hc_dlclose (hiprtc->lib);
}
hcfree (backend_ctx->hiprtc);
backend_ctx->hiprtc = NULL;
}
}
int hc_hiprtcCreateProgram (void *hashcat_ctx, hiprtcProgram *prog, const char *src, const char *name, int numHeaders, const char * const *headers, const char * const *includeNames)
{
backend_ctx_t *backend_ctx = ((hashcat_ctx_t *) hashcat_ctx)->backend_ctx;
HIPRTC_PTR *hiprtc = (HIPRTC_PTR *) backend_ctx->hiprtc;
const hiprtcResult HIPRTC_err = hiprtc->hiprtcCreateProgram (prog, src, name, numHeaders, headers, includeNames);
if (HIPRTC_err != HIPRTC_SUCCESS)
{
event_log_error (hashcat_ctx, "hiprtcCreateProgram(): %s", hiprtc->hiprtcGetErrorString (HIPRTC_err));
return -1;
}
return 0;
}
int hc_hiprtcDestroyProgram (void *hashcat_ctx, hiprtcProgram *prog)
{
backend_ctx_t *backend_ctx = ((hashcat_ctx_t *) hashcat_ctx)->backend_ctx;
HIPRTC_PTR *hiprtc = (HIPRTC_PTR *) backend_ctx->hiprtc;
const hiprtcResult HIPRTC_err = hiprtc->hiprtcDestroyProgram (prog);
if (HIPRTC_err != HIPRTC_SUCCESS)
{
event_log_error (hashcat_ctx, "hiprtcDestroyProgram(): %s", hiprtc->hiprtcGetErrorString (HIPRTC_err));
return -1;
}
return 0;
}
int hc_hiprtcCompileProgram (void *hashcat_ctx, hiprtcProgram prog, int numOptions, const char * const *options)
{
backend_ctx_t *backend_ctx = ((hashcat_ctx_t *) hashcat_ctx)->backend_ctx;
HIPRTC_PTR *hiprtc = (HIPRTC_PTR *) backend_ctx->hiprtc;
const hiprtcResult HIPRTC_err = hiprtc->hiprtcCompileProgram (prog, numOptions, options);
if (HIPRTC_err != HIPRTC_SUCCESS)
{
event_log_error (hashcat_ctx, "hiprtcCompileProgram(): %s", hiprtc->hiprtcGetErrorString (HIPRTC_err));
return -1;
}
return 0;
}
int hc_hiprtcGetProgramLogSize (void *hashcat_ctx, hiprtcProgram prog, size_t *logSizeRet)
{
backend_ctx_t *backend_ctx = ((hashcat_ctx_t *) hashcat_ctx)->backend_ctx;
HIPRTC_PTR *hiprtc = (HIPRTC_PTR *) backend_ctx->hiprtc;
const hiprtcResult HIPRTC_err = hiprtc->hiprtcGetProgramLogSize (prog, logSizeRet);
if (HIPRTC_err != HIPRTC_SUCCESS)
{
event_log_error (hashcat_ctx, "hiprtcGetProgramLogSize(): %s", hiprtc->hiprtcGetErrorString (HIPRTC_err));
return -1;
}
return 0;
}
int hc_hiprtcGetProgramLog (void *hashcat_ctx, hiprtcProgram prog, char *log)
{
backend_ctx_t *backend_ctx = ((hashcat_ctx_t *) hashcat_ctx)->backend_ctx;
HIPRTC_PTR *hiprtc = (HIPRTC_PTR *) backend_ctx->hiprtc;
const hiprtcResult HIPRTC_err = hiprtc->hiprtcGetProgramLog (prog, log);
if (HIPRTC_err != HIPRTC_SUCCESS)
{
event_log_error (hashcat_ctx, "hiprtcGetProgramLog(): %s", hiprtc->hiprtcGetErrorString (HIPRTC_err));
return -1;
}
return 0;
}
int hc_hiprtcGetCodeSize (void *hashcat_ctx, hiprtcProgram prog, size_t *codeSizeRet)
{
backend_ctx_t *backend_ctx = ((hashcat_ctx_t *) hashcat_ctx)->backend_ctx;
HIPRTC_PTR *hiprtc = (HIPRTC_PTR *) backend_ctx->hiprtc;
const hiprtcResult HIPRTC_err = hiprtc->hiprtcGetCodeSize (prog, codeSizeRet);
if (HIPRTC_err != HIPRTC_SUCCESS)
{
event_log_error (hashcat_ctx, "hiprtcGetCodeSize(): %s", hiprtc->hiprtcGetErrorString (HIPRTC_err));
return -1;
}
return 0;
}
int hc_hiprtcGetCode (void *hashcat_ctx, hiprtcProgram prog, char *code)
{
backend_ctx_t *backend_ctx = ((hashcat_ctx_t *) hashcat_ctx)->backend_ctx;
HIPRTC_PTR *hiprtc = (HIPRTC_PTR *) backend_ctx->hiprtc;
const hiprtcResult HIPRTC_err = hiprtc->hiprtcGetCode (prog, code);
if (HIPRTC_err != HIPRTC_SUCCESS)
{
event_log_error (hashcat_ctx, "hiprtcGetCode(): %s", hiprtc->hiprtcGetErrorString (HIPRTC_err));
return -1;
}
return 0;
}