• Paul Mackerras's avatar
    perf_counter: fix type/event_id layout on big-endian systems · 9aaa131a
    Paul Mackerras authored
    Impact: build fix for powerpc
    
    Commit db3a944aca35ae61 ("perf_counter: revamp syscall input ABI")
    expanded the hw_event.type field into a union of structs containing
    bitfields.  In particular it introduced a type field and a raw_type
    field, with the intention that the 1-bit raw_type field should
    overlay the most-significant bit of the 8-bit type field, and in fact
    perf_counter_alloc() now assumes that (or at least, assumes that
    raw_type doesn't overlay any of the bits that are 1 in the values of
    PERF_TYPE_{HARDWARE,SOFTWARE,TRACEPOINT}).
    
    Unfortunately this is not true on big-endian systems such as PowerPC,
    where bitfields are laid out from left to right, i.e. from most
    significant bit to least significant.  This means that setting
    hw_event.type = PERF_TYPE_SOFTWARE will set hw_event.raw_type to 1.
    
    This fixes it by making the layout depend on whether or not
    __BIG_ENDIAN_BITFIELD is defined.  It's a bit ugly, but that's what
    we get for using bitfields in a user/kernel ABI.
    
    Also, that commit didn't fix up some places in arch/powerpc/kernel/
    perf_counter.c where hw_event.raw and hw_event.event_id were used.
    This fixes them too.
    Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
    9aaa131a
perf_counter.c 19.5 KB