From 46e4e856ed1dc798e583b05bb6d7fa7daabe2da7 Mon Sep 17 00:00:00 2001 From: Ben Goz Date: Sun, 7 Dec 2014 14:36:21 +0200 Subject: [PATCH] Adding support in allocating executable memory Signed-off-by: Ben Goz [ROCm/ROCR-Runtime commit: bd7e10b0ec67ebd755ab38e1a353dbe1ede9f121] --- projects/rocr-runtime/include/hsakmttypes.h | 3 +- projects/rocr-runtime/src/memory.c | 38 +++++++++++++-------- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/projects/rocr-runtime/include/hsakmttypes.h b/projects/rocr-runtime/include/hsakmttypes.h index 178a86d178..3eb1dff41f 100644 --- a/projects/rocr-runtime/include/hsakmttypes.h +++ b/projects/rocr-runtime/include/hsakmttypes.h @@ -420,7 +420,8 @@ typedef struct _HsaMemFlags // when setting this entry to 1. Scratch allocation may fail due to limited // resources. Application code is required to work without any allocation. // Allocation fails on any node without GPU function. - unsigned int Reserved : 22; + unsigned int ExecAccess : 1; + unsigned int Reserved : 21; } ui32; HSAuint32 Value; }; diff --git a/projects/rocr-runtime/src/memory.c b/projects/rocr-runtime/src/memory.c index 9c8e63f55b..d37d1b16ed 100644 --- a/projects/rocr-runtime/src/memory.c +++ b/projects/rocr-runtime/src/memory.c @@ -26,8 +26,12 @@ #include "libhsakmt.h" #include "linux/kfd_ioctl.h" #include +#include #include #include +#include +#include +#include #include "fmm.h" HSAKMT_STATUS @@ -97,6 +101,7 @@ hsaKmtAllocMemory( CHECK_KFD_OPEN(); HSAKMT_STATUS result; uint32_t gpu_id; + int err; result = validate_nodeid(PreferredNode, &gpu_id); if (result != HSAKMT_STATUS_SUCCESS) @@ -108,23 +113,28 @@ hsaKmtAllocMemory( return HSAKMT_STATUS_INVALID_PARAMETER; } - if (MemFlags.ui32.HostAccess && !MemFlags.ui32.NonPaged){ - int err = posix_memalign(MemoryAddress, page_size, SizeInBytes); - if (err == 0) - return HSAKMT_STATUS_SUCCESS; - else + if (MemFlags.ui32.HostAccess && !MemFlags.ui32.NonPaged) { + err = posix_memalign(MemoryAddress, page_size, SizeInBytes); + if (err != 0) return HSAKMT_STATUS_NO_MEMORY; + if (MemFlags.ui32.ExecAccess) { + err = mprotect(*MemoryAddress, SizeInBytes, PROT_READ | PROT_WRITE | PROT_EXEC); + if (err != 0) { + free(*MemoryAddress); + return err; + } + } + return HSAKMT_STATUS_SUCCESS; } - else if(!MemFlags.ui32.HostAccess && MemFlags.ui32.NonPaged){ - *MemoryAddress = fmm_allocate_device(gpu_id, SizeInBytes); - if (*MemoryAddress) - return HSAKMT_STATUS_SUCCESS; - else - return HSAKMT_STATUS_NO_MEMORY; - } - else - return HSAKMT_STATUS_INVALID_PARAMETER; + if(!MemFlags.ui32.HostAccess && MemFlags.ui32.NonPaged){ + *MemoryAddress = fmm_allocate_device(gpu_id, SizeInBytes); + if (*MemoryAddress == NULL) + return HSAKMT_STATUS_NO_MEMORY; + return HSAKMT_STATUS_SUCCESS; + } + + return HSAKMT_STATUS_INVALID_PARAMETER; } HSAKMT_STATUS