| From ed38350d85d25239ba9e115b65001622826530ff Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 10 Apr 2024 19:58:52 -0700 |
| Subject: tools/arch/x86/intel_sdsi: Fix maximum meter bundle length |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: David E. Box <david.e.box@linux.intel.com> |
| |
| [ Upstream commit a66f962f67ebbbdf7c82c6652180930c0169cf13 ] |
| |
| The maximum number of bundles in the meter certificate was set to 8 which |
| is much less than the maximum. Instead, since the bundles appear at the end |
| of the file, set it based on the remaining file size from the bundle start |
| position. |
| |
| Fixes: 7fdc03a7370f ("tools/arch/x86: intel_sdsi: Add support for reading meter certificates") |
| Signed-off-by: David E. Box <david.e.box@linux.intel.com> |
| Reviewed-by: Ilpo Jรคrvinen <ilpo.jarvinen@linux.intel.com> |
| Link: https://lore.kernel.org/r/20240411025856.2782476-6-david.e.box@linux.intel.com |
| Signed-off-by: Hans de Goede <hdegoede@redhat.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| tools/arch/x86/intel_sdsi/intel_sdsi.c | 12 ++++++++---- |
| 1 file changed, 8 insertions(+), 4 deletions(-) |
| |
| diff --git a/tools/arch/x86/intel_sdsi/intel_sdsi.c b/tools/arch/x86/intel_sdsi/intel_sdsi.c |
| index 2cd92761f1714..7eaffcbff788c 100644 |
| --- a/tools/arch/x86/intel_sdsi/intel_sdsi.c |
| +++ b/tools/arch/x86/intel_sdsi/intel_sdsi.c |
| @@ -43,7 +43,6 @@ |
| #define METER_CERT_MAX_SIZE 4096 |
| #define STATE_MAX_NUM_LICENSES 16 |
| #define STATE_MAX_NUM_IN_BUNDLE (uint32_t)8 |
| -#define METER_MAX_NUM_BUNDLES 8 |
| |
| #define __round_mask(x, y) ((__typeof__(x))((y) - 1)) |
| #define round_up(x, y) ((((x) - 1) | __round_mask(x, y)) + 1) |
| @@ -167,6 +166,11 @@ struct bundle_encoding_counter { |
| uint32_t encoding; |
| uint32_t counter; |
| }; |
| +#define METER_BUNDLE_SIZE sizeof(struct bundle_encoding_counter) |
| +#define BUNDLE_COUNT(length) ((length) / METER_BUNDLE_SIZE) |
| +#define METER_MAX_NUM_BUNDLES \ |
| + ((METER_CERT_MAX_SIZE - sizeof(struct meter_certificate)) / \ |
| + sizeof(struct bundle_encoding_counter)) |
| |
| struct sdsi_dev { |
| struct sdsi_regs regs; |
| @@ -386,9 +390,9 @@ static int sdsi_meter_cert_show(struct sdsi_dev *s) |
| return -1; |
| } |
| |
| - if (mc->bundle_length > METER_MAX_NUM_BUNDLES * 8) { |
| - fprintf(stderr, "More than %d bundles: %d\n", |
| - METER_MAX_NUM_BUNDLES, mc->bundle_length / 8); |
| + if (mc->bundle_length > METER_MAX_NUM_BUNDLES * METER_BUNDLE_SIZE) { |
| + fprintf(stderr, "More than %ld bundles: actual %ld\n", |
| + METER_MAX_NUM_BUNDLES, BUNDLE_COUNT(mc->bundle_length)); |
| return -1; |
| } |
| |
| -- |
| 2.43.0 |
| |