diff --git a/src/hip_device.cpp b/src/hip_device.cpp index 3322690731..ff511b5509 100644 --- a/src/hip_device.cpp +++ b/src/hip_device.cpp @@ -274,6 +274,9 @@ hipError_t ihipDeviceGetAttribute(int* pi, hipDeviceAttribute_t attr, int device hipError_t hipDeviceGetAttribute(int* pi, hipDeviceAttribute_t attr, int device) { HIP_INIT_API(pi, attr, device); + if ((device < 0) || (device >= g_deviceCnt)) { + return ihipLogStatus(hipErrorInvalidDevice); + } return ihipLogStatus(ihipDeviceGetAttribute(pi,attr,device)); } @@ -300,6 +303,9 @@ hipError_t ihipGetDeviceProperties(hipDeviceProp_t* props, int device) hipError_t hipGetDeviceProperties(hipDeviceProp_t* props, int device) { HIP_INIT_API(props, device); + if ((device < 0) || (device >= g_deviceCnt)) { + return ihipLogStatus(hipErrorInvalidDevice); + } return ihipLogStatus(ihipGetDeviceProperties(props, device)); } @@ -352,8 +358,12 @@ hipError_t hipDeviceComputeCapability(int *major, int *minor, hipDevice_t device { HIP_INIT_API(major,minor, device); hipError_t e = hipSuccess; - e = ihipDeviceGetAttribute(major, hipDeviceAttributeComputeCapabilityMajor, device); - e = ihipDeviceGetAttribute(minor, hipDeviceAttributeComputeCapabilityMinor, device); + if ((device < 0) || (device >= g_deviceCnt)) { + e = hipErrorInvalidDevice; + } else { + e = ihipDeviceGetAttribute(major, hipDeviceAttributeComputeCapabilityMajor, device); + e = ihipDeviceGetAttribute(minor, hipDeviceAttributeComputeCapabilityMinor, device); + } return ihipLogStatus(e); } @@ -362,10 +372,14 @@ hipError_t hipDeviceGetName(char *name,int len,hipDevice_t device) // Cast to void* here to avoid printing garbage in debug modes. HIP_INIT_API((void*)name,len, device); hipError_t e = hipSuccess; - auto deviceHandle = ihipGetDevice(device); - int nameLen = strlen(deviceHandle->_props.name); - if(nameLen <= len) - memcpy(name,deviceHandle->_props.name,nameLen); + if ((device < 0) || (device >= g_deviceCnt)) { + e = hipErrorInvalidDevice; + } else { + auto deviceHandle = ihipGetDevice(device); + int nameLen = strlen(deviceHandle->_props.name); + if(nameLen <= len) + memcpy(name,deviceHandle->_props.name,nameLen); + } return ihipLogStatus(e); } @@ -374,9 +388,7 @@ hipError_t hipDeviceGetPCIBusId (char *pciBusId,int len, int device) // Cast to void* here to avoid printing garbage in debug modes. HIP_INIT_API((void*)pciBusId, len, device); hipError_t e = hipErrorInvalidValue; - int deviceCount = 0; - ihipGetDeviceCount( &deviceCount ); - if((device > deviceCount) || (device < 0)) { + if ((device < 0) || (device >= g_deviceCnt)) { e = hipErrorInvalidDevice; } else { if((pciBusId != nullptr) && (len > 0)) { @@ -394,8 +406,12 @@ hipError_t hipDeviceTotalMem (size_t *bytes,hipDevice_t device) { HIP_INIT_API(bytes, device); hipError_t e = hipSuccess; - auto deviceHandle = ihipGetDevice(device); - *bytes= deviceHandle->_props.totalGlobalMem; + if ((device < 0) || (device >= g_deviceCnt)) { + e = hipErrorInvalidDevice; + } else { + auto deviceHandle = ihipGetDevice(device); + *bytes= deviceHandle->_props.totalGlobalMem; + } return ihipLogStatus(e); } diff --git a/tests/src/runtimeApi/device/hipDeviceGetByPCIBusId.cpp b/tests/src/runtimeApi/device/hipDeviceGetByPCIBusId.cpp new file mode 100644 index 0000000000..448c9d3730 --- /dev/null +++ b/tests/src/runtimeApi/device/hipDeviceGetByPCIBusId.cpp @@ -0,0 +1,56 @@ +/* +Copyright (c) 2015-2017 Advanced Micro Devices, Inc. All rights reserved. + +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. +*/ + +/* HIT_START + * BUILD: %t %s ../../test_common.cpp + * RUN: %t + * HIT_END + */ + +#include +#include "hip/hip_runtime.h" +#include "test_common.h" + +int main( void ) { + char pciBusId[13]; + int deviceCount = 0; + HIPCHECK(hipGetDeviceCount(&deviceCount)); + HIPASSERT(deviceCount != 0); + for(int i=0; i< deviceCount;i++) { + int pciBusID = -1; + int pciDeviceID = -1; + int pciDomainID = -1; + int tempPciBusId = -1; + int tempDeviceId = -1; + HIPCHECK(hipDeviceGetPCIBusId ( &pciBusId[0], 13, i )); + sscanf (pciBusId,"%04x:%02x:%02x",&pciDomainID,&pciBusID,&pciDeviceID); + HIPCHECK(hipDeviceGetAttribute(&tempPciBusId,hipDeviceAttributePciBusId , i)); + if(pciBusID != tempPciBusId) { + exit(EXIT_FAILURE); + } + HIPCHECK(hipDeviceGetByPCIBusId ( &tempDeviceId, pciBusId )); + if(tempDeviceId != i) { + exit(EXIT_FAILURE); + } + } + passed(); +} diff --git a/tests/src/runtimeApi/device/hipDeviceGetPCIBusId.cpp b/tests/src/runtimeApi/device/hipDeviceGetPCIBusId.cpp new file mode 100644 index 0000000000..7fb0340a48 --- /dev/null +++ b/tests/src/runtimeApi/device/hipDeviceGetPCIBusId.cpp @@ -0,0 +1,51 @@ +/* +Copyright (c) 2015-2017 Advanced Micro Devices, Inc. All rights reserved. + +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. +*/ + +/* HIT_START + * BUILD: %t %s ../../test_common.cpp + * RUN: %t + * HIT_END + */ + +#include +#include "hip/hip_runtime.h" +#include "test_common.h" + +int main( void ) { + char pciBusId[13]; + int deviceCount = 0; + HIPCHECK(hipGetDeviceCount(&deviceCount)); + HIPASSERT(deviceCount != 0); + for(int i=0; i< deviceCount;i++) { + int pciBusID = -1; + int pciDeviceID = -1; + int pciDomainID = -1; + int tempPciBusId = -1; + HIPCHECK(hipDeviceGetPCIBusId ( &pciBusId[0], 13, i )); + sscanf (pciBusId,"%04x:%02x:%02x",&pciDomainID,&pciBusID,&pciDeviceID); + HIPCHECK(hipDeviceGetAttribute(&tempPciBusId,hipDeviceAttributePciBusId , i)); + if(pciBusID != tempPciBusId) { + exit(EXIT_FAILURE); + } + } + passed(); +}