• Palmer Dabbelt's avatar
    RISC-V: Don't have MAX_PHYSMEM_BITS exceed phys_addr_t · ad380f6a
    Palmer Dabbelt authored
    I recently ended up with a warning on some compilers along the lines of
    
          CC      kernel/resource.o
        In file included from include/linux/ioport.h:16,
                         from kernel/resource.c:15:
        kernel/resource.c: In function 'gfr_start':
        include/linux/minmax.h:49:37: error: conversion from 'long long unsigned int' to 'resource_size_t' {aka 'unsigned int'} changes value from '17179869183' to '4294967295' [-Werror=overflow]
           49 |         ({ type ux = (x); type uy = (y); __cmp(op, ux, uy); })
              |                                     ^
        include/linux/minmax.h:52:9: note: in expansion of macro '__cmp_once_unique'
           52 |         __cmp_once_unique(op, type, x, y, __UNIQUE_ID(x_), __UNIQUE_ID(y_))
              |         ^~~~~~~~~~~~~~~~~
        include/linux/minmax.h:161:27: note: in expansion of macro '__cmp_once'
          161 | #define min_t(type, x, y) __cmp_once(min, type, x, y)
              |                           ^~~~~~~~~~
        kernel/resource.c:1829:23: note: in expansion of macro 'min_t'
         1829 |                 end = min_t(resource_size_t, base->end,
              |                       ^~~~~
        kernel/resource.c: In function 'gfr_continue':
        include/linux/minmax.h:49:37: error: conversion from 'long long unsigned int' to 'resource_size_t' {aka 'unsigned int'} changes value from '17179869183' to '4294967295' [-Werror=overflow]
           49 |         ({ type ux = (x); type uy = (y); __cmp(op, ux, uy); })
              |                                     ^
        include/linux/minmax.h:52:9: note: in expansion of macro '__cmp_once_unique'
           52 |         __cmp_once_unique(op, type, x, y, __UNIQUE_ID(x_), __UNIQUE_ID(y_))
              |         ^~~~~~~~~~~~~~~~~
        include/linux/minmax.h:161:27: note: in expansion of macro '__cmp_once'
          161 | #define min_t(type, x, y) __cmp_once(min, type, x, y)
              |                           ^~~~~~~~~~
        kernel/resource.c:1847:24: note: in expansion of macro 'min_t'
         1847 |                addr <= min_t(resource_size_t, base->end,
              |                        ^~~~~
        cc1: all warnings being treated as errors
    
    which looks like a real problem: our phys_addr_t is only 32 bits now, so
    having 34-bit masks is just going to result in overflows.
    Reviewed-by: default avatarCharlie Jenkins <charlie@rivosinc.com>
    Reviewed-by: default avatarAlexandre Ghiti <alexghiti@rivosinc.com>
    Link: https://lore.kernel.org/r/20240731162159.9235-2-palmer@rivosinc.comSigned-off-by: default avatarPalmer Dabbelt <palmer@rivosinc.com>
    ad380f6a
sparsemem.h 331 Bytes