From a95d951922bbb485079e949214d611f830f9f97d Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Fri, 3 Jan 2025 22:15:54 +0900 Subject: [PATCH] util: introduce int56_to_long() type conversion helper This is to remove unnecessary mask with 0x00FFFFFFFFFFFFFF. Signed-off-by: Tokunori Ikegami --- plugins/ocp/ocp-print-json.c | 3 +-- plugins/ocp/ocp-print-stdout.c | 2 +- util/types.c | 21 +++++++++++++++++---- util/types.h | 1 + 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/plugins/ocp/ocp-print-json.c b/plugins/ocp/ocp-print-json.c index 316f152e..146dd030 100644 --- a/plugins/ocp/ocp-print-json.c +++ b/plugins/ocp/ocp-print-json.c @@ -181,8 +181,7 @@ static void json_smart_extended_log_v1(void *data) (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_EECE])); json_object_add_value_uint(root, "System data percent used", (__u8)log_data[SCAO_SDPU]); - json_object_add_value_uint64(root, "Refresh counts", - (uint64_t)(le64_to_cpu(*(uint64_t *)&log_data[SCAO_RFSC]) & 0x00FFFFFFFFFFFFFF)); + json_object_add_value_uint64(root, "Refresh counts", int56_to_long(&log_data[SCAO_RFSC])); json_object_add_value_uint(root, "Max User data erase counts", (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MXUDEC])); json_object_add_value_uint(root, "Min User data erase counts", diff --git a/plugins/ocp/ocp-print-stdout.c b/plugins/ocp/ocp-print-stdout.c index 7f767bbf..5880104a 100644 --- a/plugins/ocp/ocp-print-stdout.c +++ b/plugins/ocp/ocp-print-stdout.c @@ -131,7 +131,7 @@ static void stdout_smart_extended_log(void *data, unsigned int version) printf(" System data percent used %d\n", (__u8)log_data[SCAO_SDPU]); printf(" Refresh counts %"PRIu64"\n", - (uint64_t)(le64_to_cpu(*(uint64_t *)&log_data[SCAO_RFSC]) & 0x00FFFFFFFFFFFFFF)); + int56_to_long(&log_data[SCAO_RFSC])); printf(" Max User data erase counts %"PRIu32"\n", (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MXUDEC])); printf(" Min User data erase counts %"PRIu32"\n", diff --git a/util/types.c b/util/types.c index cc2e7550..a34479a5 100644 --- a/util/types.c +++ b/util/types.c @@ -5,6 +5,7 @@ #include #include #include +#include #include @@ -36,18 +37,30 @@ long double int128_to_double(__u8 *data) return result; } -uint64_t int48_to_long(const __u8 *data) +static uint64_t int_to_long(int bits, const __u8 *data) { int i; uint64_t result = 0; + int bytes = (bits + CHAR_BIT - 1) / CHAR_BIT; - for (i = 0; i < 6; i++) { - result *= 256; - result += data[5 - i]; + for (i = 0; i < bytes; i++) { + result <<= CHAR_BIT; + result += data[bytes - 1 - i]; } + return result; } +uint64_t int48_to_long(const __u8 *data) +{ + return int_to_long(48, data); +} + +uint64_t int56_to_long(const __u8 *data) +{ + return int_to_long(56, data); +} + long double uint128_t_to_double(nvme_uint128_t data) { long double result = 0; diff --git a/util/types.h b/util/types.h index bb4125f2..70a77607 100644 --- a/util/types.h +++ b/util/types.h @@ -37,6 +37,7 @@ typedef union nvme_uint128 nvme_uint128_t; nvme_uint128_t le128_to_cpu(__u8 *data); long double int128_to_double(__u8 *data); uint64_t int48_to_long(const __u8 *data); +uint64_t int56_to_long(const __u8 *data); char *uint128_t_to_string(nvme_uint128_t val); char *uint128_t_to_l10n_string(nvme_uint128_t val); -- 2.50.1