On Fri, 06 Apr 2018 12:08:43 -0700 Joe Perches <joe@xxxxxxxxxxx> wrote: > debug_sprintf_event calls __debug_sprintf_event > with a format and arguments. > > There various types of arguments used in these > call, but __debug_sprintf_event uses va_arg > with only long as the type argument so random > errors could occur because the type and argument > are supposed to match. > > debug_entry_t *__debug_sprintf_event(debug_info_t *id, int level, char *string, ...) > { > [...] > va_start(ap, string); > curr_event->string = string; > for (idx = 0; idx < min(numargs, (int)(id->buf_size / sizeof(long)) - 1); idx++) > curr_event->args[idx] = va_arg(ap, long); > va_end(ap); > [...] > } > > from man va_arg > > va_arg() > > if type is not compatible with the type of the actual next argument > (as promoted according to the default argument promotions), > random errors will occur. > > For instance, uses like: > > arch/s390/kernel/perf_cpum_sf.c:919: debug_sprintf_event(sfdbg, 6, "pmu_enable: es=%i cs=%i ed=%i cd=%i " > arch/s390/kernel/perf_cpum_sf.c-920- "tear=%p dear=%p\n", cpuhw->lsctl.es, cpuhw->lsctl.cs, > arch/s390/kernel/perf_cpum_sf.c-921- cpuhw->lsctl.ed, cpuhw->lsctl.cd, > arch/s390/kernel/perf_cpum_sf.c-922- (void *) cpuhw->lsctl.tear, (void *) cpuhw->lsctl.dear); > > where the first 3 arguments are int but their type > as used by va_arg in __debug_sprintf_event is long > which could produce random errors. In principle you are right that the va_arg handling is not 100% correct. It works though because the C ABI for s390x requires that arguments are sign- or zero-extended to 64 bits by the caller of a function. This is true for values passed in registers and for the variable argument list. -- blue skies, Martin. "Reality continues to ruin my life." - Calvin. -- To unsubscribe from this list: send the line "unsubscribe linux-s390" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html