fdtget: Fix signedness comparisons warnings

With -Wsign-compare, compilers warn about a mismatching signedness in
the different legs of the conditional operator, in fdtget.c.

In the questionable expression, we are constructing a 16-bit value out of
two unsigned 8-bit values, however are relying on the compiler's
automatic expansion of the uint8_t to a larger type, to survive the left
shift. This larger type happens to be an "int", so this part of the
expression becomes signed.

Fix this by explicitly blowing up the uint8_t to a larger *unsigned* type,
before doing the left shift. And while we are at it, convert the hardly
readable conditional operator usage into a sane switch/case expression.

This fixes "make fdtget", when compiled with -Wsign-compare.

Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Message-Id: <20210618172030.9684-3-andre.przywara@arm.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
Andre Przywara 2021-06-18 18:20:27 +01:00 committed by David Gibson
parent d966f08fcd
commit 9102211855
2 changed files with 15 additions and 2 deletions

View file

@ -62,8 +62,14 @@ static int show_cell_list(struct display_info *disp, const char *data, int len,
for (i = 0; i < len; i += size, p += size) { for (i = 0; i < len; i += size, p += size) {
if (i) if (i)
printf(" "); printf(" ");
value = size == 4 ? fdt32_ld((const fdt32_t *)p) : switch (size) {
size == 2 ? (*p << 8) | p[1] : *p; case 4: value = fdt32_ld((const fdt32_t *)p); break;
case 2: value = fdt16_ld((const fdt16_t *)p); break;
case 1:
default:
value = *p;
break;
}
printf(fmt, value); printf(fmt, value);
} }

View file

@ -131,6 +131,13 @@ uint32_t fdt_next_tag(const void *fdt, int offset, int *nextoffset);
* to work even with unaligned pointers on platforms (such as ARMv5) that don't * to work even with unaligned pointers on platforms (such as ARMv5) that don't
* like unaligned loads and stores. * like unaligned loads and stores.
*/ */
static inline uint16_t fdt16_ld(const fdt16_t *p)
{
const uint8_t *bp = (const uint8_t *)p;
return ((uint16_t)bp[0] << 8) | bp[1];
}
static inline uint32_t fdt32_ld(const fdt32_t *p) static inline uint32_t fdt32_ld(const fdt32_t *p)
{ {
const uint8_t *bp = (const uint8_t *)p; const uint8_t *bp = (const uint8_t *)p;