• Johan Almbladh's avatar
    bpf, arm: Fix register clobbering in div/mod implementation · 79e3445b
    Johan Almbladh authored
    On ARM CPUs that lack div/mod instructions, ALU32 BPF_DIV and BPF_MOD are
    implemented using a call to a helper function. Before, the emitted code
    for those function calls failed to preserve caller-saved ARM registers.
    Since some of those registers happen to be mapped to BPF registers, it
    resulted in eBPF register values being overwritten.
    
    This patch emits code to push and pop the remaining caller-saved ARM
    registers r2-r3 into the stack during the div/mod function call. ARM
    registers r0-r1 are used as arguments and return value, and those were
    already saved and restored correctly.
    
    Fixes: 39c13c20 ("arm: eBPF JIT compiler")
    Signed-off-by: default avatarJohan Almbladh <johan.almbladh@anyfinetworks.com>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    79e3445b
bpf_jit_32.c 54.1 KB