[PATCH] drm/amdgpu: Add double-sscanf but invert

Felix Kuehling felix.kuehling at amd.com
Wed Apr 14 15:58:35 UTC 2021


>From the sscanf manpage:

       i      Matches  an optionally signed integer; the next pointer
must be
              a pointer to int.  The integer is read in base 16 if it 
begins
              with  0x  or  0X, in base 8 if it begins with 0, and in
base 10
              otherwise.  Only characters that correspond  to  the 
base  are
              used.

So a single sscanf("%*s %i", ...) would to the job. The only problem is
that accepts signed integers, not unsigned. I'm not sure if that's a
problem in this use case.

Regards,
  Felix

Am 2021-04-14 um 11:21 a.m. schrieb Luben Tuikov:
> Add back the double-sscanf so that both decimal
> and hexadecimal values could be read in, but this
> time invert the scan so that hexadecimal format
> with a leading 0x is tried first, and if that
> fails, then try decimal format.
>
> Also use a logical-AND instead of nesting double
> if-conditional.
>
> See commit "drm/amdgpu: Fix a bug for input with double sscanf"
>
> Cc: Alexander Deucher <Alexander.Deucher at amd.com>
> Cc: John Clements <john.clements at amd.com>
> Cc: Hawking Zhang <Hawking.Zhang at amd.com>
> Signed-off-by: Luben Tuikov <luben.tuikov at amd.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c | 7 +++++--
>  1 file changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
> index 44dfb3613e37..38a691a3b600 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
> @@ -229,7 +229,8 @@ static int amdgpu_ras_debugfs_ctrl_parse_data(struct file *f,
>  
>  	if (op != -1) {
>  		if (op == 3) {
> -			if (sscanf(str, "%*s %llx", &address) != 1)
> +			if (sscanf(str, "%*s 0x%llx", &address) != 1 &&
> +			    sscanf(str, "%*s %llu", &address) != 1)
>  				return -EINVAL;
>  
>  			data->op = op;
> @@ -253,7 +254,9 @@ static int amdgpu_ras_debugfs_ctrl_parse_data(struct file *f,
>  		data->op = op;
>  
>  		if (op == 2) {
> -			if (sscanf(str, "%*s %*s %*s %x %llx %llx",
> +			if (sscanf(str, "%*s %*s %*s 0x%x 0x%llx 0x%llx",
> +				   &sub_block, &address, &value) != 3 &&
> +			    sscanf(str, "%*s %*s %*s %u %llu %llu",
>  				   &sub_block, &address, &value) != 3)
>  				return -EINVAL;
>  			data->head.sub_block_index = sub_block;


More information about the amd-gfx mailing list