On Mon, Sep 9, 2024 at 11:38 AM Jan Beulich <jbeul...@suse.com> wrote:

> On 09.09.2024 12:08, Frediano Ziglio wrote:
> > --- a/xen/arch/x86/include/asm/config.h
> > +++ b/xen/arch/x86/include/asm/config.h
> > @@ -86,10 +86,10 @@
> >  #include <xen/const.h>
> >
> >  #define PML4_ENTRY_BITS  39
> > -#define PML4_ENTRY_BYTES (_AC(1,UL) << PML4_ENTRY_BITS)
> > +#define PML4_ENTRY_BYTES (UINT64_C(1) << PML4_ENTRY_BITS)
> >  #define PML4_ADDR(_slot)                              \
> > -    (((_AC(_slot, UL) >> 8) * _AC(0xffff000000000000,UL)) | \
> > -     (_AC(_slot, UL) << PML4_ENTRY_BITS))
> > +    (((UINT64_C(_slot) >> 8) * UINT64_C(0xffff000000000000)) | \
> > +     (UINT64_C(_slot) << PML4_ENTRY_BITS))
> >
> >  /*
> >   * Memory layout:
> > --- a/xen/arch/x86/include/asm/mm.h
> > +++ b/xen/arch/x86/include/asm/mm.h
> > @@ -20,7 +20,7 @@
> >  #define PFN_ORDER(_pfn) ((_pfn)->v.free.order)
> >
> >  #define PG_shift(idx)   (BITS_PER_LONG - (idx))
> > -#define PG_mask(x, idx) (x ## UL << PG_shift(idx))
> > +#define PG_mask(x, idx) (UINT64_C(x) << PG_shift(idx))
> >
> >   /* The following page types are MUTUALLY EXCLUSIVE. */
> >  #define PGT_none          PG_mask(0, 3)  /* no special uses of this
> page   */
> > @@ -59,7 +59,7 @@
> >
> >   /* Count of uses of this frame as its current type. */
> >  #define PGT_count_width   PG_shift(9)
> > -#define PGT_count_mask    ((1UL<<PGT_count_width)-1)
> > +#define PGT_count_mask    ((UINT64_C(1)<<PGT_count_width)-1)
> >
> >  /* Are the 'type mask' bits identical? */
> >  #define PGT_type_equal(x, y) (!(((x) ^ (y)) & PGT_type_mask))
> > @@ -97,7 +97,7 @@
> >  #else
> >  #define PGC_count_width   PG_shift(6)
> >  #endif
> > -#define PGC_count_mask    ((1UL<<PGC_count_width)-1)
> > +#define PGC_count_mask    ((UINT64_C(1)<<PGC_count_width)-1)
> >
> >  /*
> >   * Page needs to be scrubbed. Since this bit can only be set on a page
> that is
> > @@ -499,9 +499,9 @@ static inline int get_page_and_type(struct page_info
> *page,
> >   */
> >  #undef  machine_to_phys_mapping
> >  #define machine_to_phys_mapping  ((unsigned long *)RDWR_MPT_VIRT_START)
> > -#define INVALID_M2P_ENTRY        (~0UL)
> > -#define VALID_M2P(_e)            (!((_e) & (1UL<<(BITS_PER_LONG-1))))
> > -#define SHARED_M2P_ENTRY         (~0UL - 1UL)
> > +#define INVALID_M2P_ENTRY        (~UINT64_C(0))
> > +#define VALID_M2P(_e)            (!((_e) &
> (UINT64_C(1)<<(BITS_PER_LONG-1))))
> > +#define SHARED_M2P_ENTRY         (~UINT64_C(0) - UINT64_C(1))
> >  #define SHARED_M2P(_e)           ((_e) == SHARED_M2P_ENTRY)
> >
> >  /*
> > --- a/xen/arch/x86/include/asm/x86_64/page.h
> > +++ b/xen/arch/x86/include/asm/x86_64/page.h
> > @@ -4,8 +4,8 @@
> >
> >  #define __XEN_VIRT_START        XEN_VIRT_START
> >
> > -#define VADDR_TOP_BIT           (1UL << (VADDR_BITS - 1))
> > -#define CANONICAL_MASK          (~0UL & ~VADDR_MASK)
> > +#define VADDR_TOP_BIT           (UINT64_C(1) << (VADDR_BITS - 1))
> > +#define CANONICAL_MASK          (~UINT64_C(0) & ~VADDR_MASK)
> >
> >  #define is_canonical_address(x) (((long)(x) >> 47) == ((long)(x) >> 63))
> >
> > --- a/xen/arch/x86/setup.c
> > +++ b/xen/arch/x86/setup.c
> > @@ -1384,9 +1384,9 @@ void asmlinkage __init noreturn
> __start_xen(unsigned long mbi_p)
> >          }
> >
> >          if ( e > min(HYPERVISOR_VIRT_END - DIRECTMAP_VIRT_START,
> > -                     1UL << (PAGE_SHIFT + 32)) )
> > +                     UINT64_C(1) << (PAGE_SHIFT + 32)) )
> >              e = min(HYPERVISOR_VIRT_END - DIRECTMAP_VIRT_START,
> > -                    1UL << (PAGE_SHIFT + 32));
> > +                    UINT64_C(1) << (PAGE_SHIFT + 32));
>
> I disagree - we're dealing with virtual addresses here, which better
> wouldn't use fixed-width quantities.
>
>
I suppose you are suggesting type-based macros instead of fixed-type
macros, so something like PADDR_C  and VADDR_C.
That makes sense.


> While not always virtual addresses, I similarly disagree for most or all
> I've left in context further up: If the underlying type to deal with is
> unsigned long, constants should match.
>
>
Sure, in this case the underlying type if used as 32 bit cannot be unsigned
long but they should be unsigned long long (or any 64 bit type).

> --- a/xen/crypto/vmac.c
> > +++ b/xen/crypto/vmac.c
> > @@ -11,7 +11,9 @@
> >  #include <xen/types.h>
> >  #include <xen/lib.h>
> >  #include <crypto/vmac.h>
> > +#ifndef UINT64_C
> >  #define UINT64_C(x)  x##ULL
> > +#endif
> >  /* end for Xen */
>
> Here the #define should probably just be dropped?
>
>
If we go for newer type-base macros, we won't need to change here.


> > --- a/xen/include/crypto/vmac.h
> > +++ b/xen/include/crypto/vmac.h
> > @@ -51,12 +51,16 @@
> >  #elif (_MSC_VER)                  /* Microsoft C does not have
> stdint.h    */
> >  typedef unsigned __int32 uint32_t;
> >  typedef unsigned __int64 uint64_t;
> > +#ifndef UINT64_C
> >  #define UINT64_C(v) v ## UI64
> > +#endif
>
> This part surely isn't needed?
>
>
Indeed :-)


> > --- a/xen/include/xen/const.h
> > +++ b/xen/include/xen/const.h
> > @@ -15,10 +15,19 @@
> >  #ifdef __ASSEMBLY__
> >  #define _AC(X,Y)     X
> >  #define _AT(T,X)     X
> > +#define UINT64_C(X)     X
> > +#define INT64_C(X)      X
> >  #else
> >  #define __AC(X,Y)    (X##Y)
> >  #define _AC(X,Y)     __AC(X,Y)
> >  #define _AT(T,X)     ((T)(X))
> > +#if __SIZEOF_LONG__ >= 8
>
> This is available with gcc 4.3 and newer, yet for now our docs still
> specify 4.1.2 as the baseline.
>
>
Do we have some sort of configure generated macro for this?


> I'm also unconvinced of the >= - we're talking of fixed-width types here,
> so imo it needs to be == and then also ...
>
> > +#define UINT64_C(X)     X ## UL
> > +#define INT64_C(X)      X ## L
> > +#else
>
> #elif __SIZEOF_LONG_LONG__ == 8
>
> here.
>
> > +#define UINT64_C(X)     X ## ULL
> > +#define INT64_C(X)      X ## LL
> > +#endif
> >  #endif
>
> Finally if we introduce these, imo we should introduce the other
> UINT<n>_C()
> as well, and in a header named after the one mandated by the C library
> spec.
>
> > --- a/xen/include/xen/stdint.h
> > +++ b/xen/include/xen/stdint.h
> > @@ -30,4 +30,6 @@ typedef __UINT64_TYPE__    uint64_t;
> >
> >  #endif
> >
> > +#include <xen/const.h>
>
> Why's this needed?
>
>
Not strictly needed, but in the standard headers they are usually defined
including stdint.h.


> Jan
>

Frediano

Reply via email to