[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 2/2] hvmloader: do not include system headers for type declarations
On 24.02.2021 12:07, Ian Jackson wrote: > Jan Beulich writes ("Re: [PATCH 2/2] hvmloader: do not include system headers > for type declarations"): >> On 24.02.2021 11:26, Roger Pau Monne wrote: >>> --- /dev/null >>> +++ b/tools/firmware/hvmloader/types.h >>> @@ -0,0 +1,47 @@ >>> +#ifndef _HVMLOADER_TYPES_H_ >>> +#define _HVMLOADER_TYPES_H_ >>> + >>> +typedef unsigned char uint8_t; >>> +typedef signed char int8_t; >>> + >>> +typedef unsigned short uint16_t; >>> +typedef signed short int16_t; >>> + >>> +typedef unsigned int uint32_t; >>> +typedef signed int int32_t; >>> + >>> +typedef unsigned long long uint64_t; >>> +typedef signed long long int64_t; >> >> I wonder if we weren't better of not making assumptions on >> short / int / long long, and instead use >> __attribute__((__mode__(...))) or, if available, the compiler >> provided __{,U}INT*_TYPE__. > > This code is only ever going to be for 32-bit x86, so I think the way > Roger did it is fine. It is technically correct at this point in time, from all we can tell. I can't see any reason though why a compiler might not support wider int or, in particular, long long. hvmloader, unlike most of the rest of the tools, is a freestanding binary and hence not tied to any particular ABI the compiler used may have been built for. > Doing it the other way, to cope with this file being used with > compiler settings where the above set of types is wrong, would also > imply more complex definitions of INT32_MIN et al. Well, that's only as far as the use of number suffixes goes. The values used won't change, as these constants describe fixed width types. >>> +typedef uint32_t size_t; > > I would be inclined to provide ssize_t too but maybe hvmloader will > never need it. > >> Like the hypervisor, we should prefer using __SIZE_TYPE__ >> when available. > > I disagree. May I ask why? There is a reason providing of these types did get added to (at least) gcc. One argument against this would be above mentioned independence on any ABI the compiler would be built for, but I'd buy that only if above we indeed used __attribute__((__mode__())), as that's the only way to achieve such independence. IOW imo if we stick to what is there now for {,u}int<N>_t, we should use __SIZE_TYPE__ here. If we used the mode attribute approach there, using uint32_t here would indeed be better. >>> +typedef uint32_t uintptr_t; >> >> Again - use __UINTPTR_TYPE__ or, like Xen, >> __attribute__((__mode__(__pointer__))). > > I disagree. The same question / considerations apply here then. >>> +#define bool _Bool >>> +#define true 1 >>> +#define false 0 >>> +#define __bool_true_false_are_defined 1 >>> + >>> +typedef __builtin_va_list va_list; >>> +#define va_copy(dest, src) __builtin_va_copy((dest), (src)) >>> +#define va_start(ap, last) __builtin_va_start((ap), (last)) >> >> Nit: Perhaps better omit the unnecessary inner parentheses? > > We should definitely keep the inner parentheses. I don't want to > start carefully reasoning about precisely which inner parentheses are > necesary for macro argument parsing correctness. Can you give me an example of when the inner parentheses would be needed? I don't think they're needed no matter whether (taking the example here) __builtin_va_...() were functions or macros. They would of course be needed if the identifiers were part of expressions beyond the mere function invocation. We've been trying to eliminate such in the hypervisor part of the tree, and since hvmloader is more closely related to the hypervisor than the tools (see also its maintainership), I think we would want to do so here, too. But of course if there are cases where such parentheses are really needed, we'd want (need) to change our approach in hypervisor code as well. The primary reason why I've been advocating to avoid them is that, as long as they're not needed for anything, they harm readability and increase the risk of mistakes like the one that had led to XSA-316. Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |