svn commit: r341103 - head/sys/powerpc/include

Justin Hibbits jhibbits at FreeBSD.org
Mon Dec 3 16:21:48 UTC 2018


On Wed, 28 Nov 2018 16:31:33 +1100 (EST)
Bruce Evans <brde at optusnet.com.au> wrote:

> On Wed, 28 Nov 2018, Justin Hibbits wrote:
> 
> > Log:
> >  powerpc: Fix the powerpc64 build post-r341102
> >
> >  VM_MIN_KERNEL_ADDRESS is now used in locore.S, but the UL suffix
> > isn't permitted in .S files.  
> 
> The UL suffix is arguably a style bug in .c files too.  It was not
> even wrong (it had no effect) this case, but nearby code seems to be
> more broken.
> 
> A ULL suffix would be unarguably a style bug everywhere.

I'll take a closer look at this eventually.  I'm in the process of
overhauling a lot of the Book-E bits to play nicer with loader, etc.
This does involve touching vmparam.h a lot, so I'll think about
cleaning it up for these cases as well.

> 
> > Modified: head/sys/powerpc/include/vmparam.h
> > ==============================================================================
> > --- head/sys/powerpc/include/vmparam.h	Wed Nov 28 02:00:27
> > 2018	(r341102) +++ head/sys/powerpc/include/vmparam.h
> > Wed Nov 28 02:48:43 2018	(r341103) @@ -106,8 +106,13 @@
> > #define	FREEBSD32_USRSTACK	FREEBSD32_SHAREDPAGE
> >
> > #ifdef __powerpc64__
> > +#ifndef LOCORE
> > #define	VM_MIN_KERNEL_ADDRESS
> > 0xe000000000000000UL #define
> > VM_MAX_KERNEL_ADDRESS		0xe0000007ffffffffUL +#else
> > +#define	VM_MIN_KERNEL_ADDRESS
> > 0xe000000000000000 +#define
> > VM_MAX_KERNEL_ADDRESS		0xe0000007ffffffff +#endif  
> 
> These constants automatically have type unsigned long, since they are
> larger that LONG_MAX and smaller than ULONG_MAX.  Thus the UL suffix
> had no effect except to break in asm files.
> 
> This would not be true for smaller constants.  Smaller constants often
> need to be combined or shifted back and forth, and then it may be
> necessary to use them as unsigned int or unsigned long constants
> (signed constants are better handled by implicit conversions between
> int and long unless they are mixed with unsigned constants).  This is
> sometimes done using U or UL or suffixes.  I don't like this.  Cases
> where the natural type doesn't work are delicate and it is better to
> not hide the unnatural conversions by implicitly converting using a
> suffix on some constants.
> 
> The correct fix is to remove the bogus UL suffixes and not add any
> ifdefs.
> 
> On 32-bit arches, the above constants would have natural type
> [(long long abomination; should be deleted].  The abominatation is
> unavoidable, but badly written code increases it using explicit
> [abomination deleted] suffixes.
> 
> > #define	VM_MAX_SAFE_KERNEL_ADDRESS
> > VM_MAX_KERNEL_ADDRESS #endif  
> 
> Nearby code has mounds of unportabilities and style bugs.  E.g.,
> - VM_MIN_ADDRESS for the !LOCORE && 64-bit case has bogus UL suffixes
> and bogus parentheses around single tokens.  It is 0, so it has
> natural type int, so  the suffix might be needed to obfuscate
> conversions to unsigned long in some cases.
> - VM_MIN_ADDRESS for the !LOCORE && 32-bit case casts to vm_offset_t
> instead of hard-coding the same conversion using a suffix.  The cast
> is more technically correct, but is an even larger syntax error -- it
> breaks both asm uses and uses in cpp expressions.

Indeed, the cast is probably redundant.

> - VM_MIN_ADDRESS already had the bogus ifdefs to support LOCORE.
> These are expressed in the opposite order (LOCORE is in the outer
> ifdef instead of the inner ifdef), which makes them more unreadable.
> - similarly for VM_MAXUSER_ADDRESS, plus an extra convolution to
> define this in terms of VM_MAXUSER_ADDRESS32 in the 32-bit case, but
> only for the !LOCORE case (since VM_MAXUSER_ADDRESS32 doesn't have a
> LOCORE ifdef).

Agreed.  Removing the LOCORE differentiation would certainly clean up
the file.

> 
> I used to like casts on constants and macros, like the ones here for
> vm_offset_t here, but jake@ convinced me that this was wrong in
> connection with PAE and sparc64 work.  The wrongness is most obvious
> for PAE.  vm_paddr_t is 64 bits for PAE, but most vm types for PAE
> (especially vm_offset_t) are only 32 bits.  If you sprinkle
> [abomination deleted] suffixes or casts to uint64_t or vm_paddr_t on
> constants or macros, then this is too pessimal and/or confusing for
> most vm expressions.  Sprinkling UL suffixes and vm_offset_t casts is
> relatively harmless only because it usually has no effect, especially
> on 32-bit non-PAE arches where even more types are naturally 32 bits.
> 
> The i386 vmparam.h has the following style bugs in this area:
> - UL suffixes only for MAXTSIZ and friends
> - cast to vm_offset_t only for VM_MIN_KERNEL_ADDRESS
> - VM_MAX_KERNEL_ADDRESS and related values are encrypted through about
>    10 layers of macros depending on configuration variables like PAE.
>    Most of the encryption is no longer really used, since it was
> mostly to make addresses depend on the user/kernel split.
> 
>    The encryptions mostly use signed constants and expressions, but a
>    critical one is NPDEPTD defined in another file using sizeof().
>    Unsigned poisoning from this probably leaks into most macros, but
>    the resulting types are even less clear than the resulting values
>    since the resulting values are now documented for the only
> supported user/kernel split.
> 
> - bogus extra parentheses only for VM_KMEM_SIZE_SCALE.
> 
>    The existence and default value of this macro are also wrong.  They
>    were last almost correct when the default user/kernel split was 3/1
>    and the physical memory size was 3 or 4 GB.
> 
>    The default for the macro is 3, which is closely related to the
> split ratio.  This value works to prevent overflow in kva size
> calculations when the physical memory size is larger than the total
> kva size but less than 3 or 4 GB.  Overflow still occurs for PAE
> since then the memory size can be larger than 4GB.  Other magic
> properties of 3 result in the overflows giving reasonable values for
> the kva sizes when the memory size is 8GB or 16GB, but not when it is
> 12GB (because 12GB / 3 = 4GB = 0GB after overflow, and 0GB is not a
> useful kva size).

Thanks for the x86 lesson with this.

> 
> Bruce

- Justin


More information about the svn-src-head mailing list