Patch "bpf: fix 64-bit divide" has been added to the 3.19-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
bpf: fix 64-bit divide
to the 3.19-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
bpf-fix-64-bit-divide.patch
and it can be found in the queue-3.19 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Fri May 8 13:04:43 CEST 2015
From: Alexei Starovoitov <[email protected]>
Date: Mon, 27 Apr 2015 14:40:37 -0700
Subject: bpf: fix 64-bit divide
From: Alexei Starovoitov <[email protected]>
[ Upstream commit 876a7ae65b86d8cec8efe7d15d050ac61116874e ]
ALU64_DIV instruction should be dividing 64-bit by 64-bit, whereas do_div() does 64-bit by 32-bit divide.
x64 and arm64 JITs correctly implement 64 by 64 unsigned divide. llvm BPF backend emits code assuming that ALU64_DIV does 64 by 64.
--- kernel/bpf/core.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
kernel/bpf/core.c +6 -6
@@ -357,8 +357,8 @@ select_insn: ALU64_MOD_X:if (unlikely (SRC ==0 ))return 0 ; - tmp =DST ; -DST =do_div (tmp,SRC ); +div64_u64_rem (DST ,SRC , &tmp); +DST = tmp;CONT ; ALU_MOD_X:if (unlikely (SRC ==0 ))
@@ -367,8 +367,8 @@ select_insn:DST =do_div (tmp, (u32 )SRC );CONT ; ALU64_MOD_K: - tmp =DST ; -DST =do_div (tmp,IMM ); +div64_u64_rem (DST ,IMM , &tmp); +DST = tmp;CONT ; ALU_MOD_K: tmp = (u32 )DST ;
@@ -377,7 +377,7 @@ select_insn: ALU64_DIV_X:if (unlikely (SRC ==0 ))return 0 ; -do_div (DST ,SRC ); +DST =div64_u64 (DST ,SRC );CONT ; ALU_DIV_X:if (unlikely (SRC ==0 ))
@@ -387,7 +387,7 @@ select_insn:DST = (u32 ) tmp;CONT ; ALU64_DIV_K: -do_div (DST ,IMM ); +DST =div64_u64 (DST ,IMM );CONT ; ALU_DIV_K: tmp = (u32 )DST ;
Patches currently in stable-queue which might be from [email protected] are
queue-3.19/bpf-fix-64-bit-divide.patch