sparc: bpf_jit: fix loads from negative offsets
authorAlexei Starovoitov <ast@plumgrid.com>
Tue, 23 Sep 2014 20:50:10 +0000 (13:50 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 24 Sep 2014 19:04:07 +0000 (15:04 -0400)
commit35607b02dbef304fa5037236a3b43c1d8ab2aa52
treec219ac28ef9d9691122fb445be7a6dfbcf120a3d
parent543a2dff5edfab3ea53f3e16f4a876a00bf8023b
sparc: bpf_jit: fix loads from negative offsets

- fix BPF_LD|ABS|IND from negative offsets:
  make sure to sign extend lower 32 bits in 64-bit register
  before calling C helpers from JITed code, otherwise 'int k'
  argument of bpf_internal_load_pointer_neg_helper() function
  will be added as large unsigned integer, causing packet size
  check to trigger and abort the program.

  It's worth noting that JITed code for 'A = A op K' will affect
  upper 32 bits differently depending whether K is simm13 or not.
  Since small constants are sign extended, whereas large constants
  are stored in temp register and zero extended.
  That is ok and we don't have to pay a penalty of sign extension
  for every sethi, since all classic BPF instructions have 32-bit
  semantics and we only need to set correct upper bits when
  transitioning from JITed code into C.

- though instructions 'A &= 0' and 'A *= 0' are odd, JIT compiler
  should not optimize them out

Signed-off-by: Alexei Starovoitov <ast@plumgrid.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
arch/sparc/net/bpf_jit_asm.S
arch/sparc/net/bpf_jit_comp.c