Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amd/amdgpu: Fix GPR read from debugfs (v2)

The offset into the array was specified in bytes but should
be in terms of 32-bit words. Also prevent large reads that
would also cause a buffer overread.

v2: Read from correct offset from internal storage buffer.

Signed-off-by: Tom St Denis <tom.stdenis@amd.com>
Acked-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org

authored by

Tom St Denis and committed by
Alex Deucher
5bbc6604 b55dbe59

+3 -3
+3 -3
drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
··· 781 781 ssize_t result = 0; 782 782 uint32_t offset, se, sh, cu, wave, simd, thread, bank, *data; 783 783 784 - if (size & 3 || *pos & 3) 784 + if (size > 4096 || size & 3 || *pos & 3) 785 785 return -EINVAL; 786 786 787 787 /* decode offset */ 788 - offset = *pos & GENMASK_ULL(11, 0); 788 + offset = (*pos & GENMASK_ULL(11, 0)) >> 2; 789 789 se = (*pos & GENMASK_ULL(19, 12)) >> 12; 790 790 sh = (*pos & GENMASK_ULL(27, 20)) >> 20; 791 791 cu = (*pos & GENMASK_ULL(35, 28)) >> 28; ··· 823 823 while (size) { 824 824 uint32_t value; 825 825 826 - value = data[offset++]; 826 + value = data[result >> 2]; 827 827 r = put_user(value, (uint32_t *)buf); 828 828 if (r) { 829 829 result = r;