diff options
Diffstat (limited to 'kernel/bpf/core.c')
| -rw-r--r-- | kernel/bpf/core.c | 61 | 
1 files changed, 61 insertions, 0 deletions
| diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c index ad5f55922a13..917cc04a0a94 100644 --- a/kernel/bpf/core.c +++ b/kernel/bpf/core.c @@ -595,9 +595,13 @@ static int bpf_jit_blind_insn(const struct bpf_insn *from,  	case BPF_JMP | BPF_JEQ  | BPF_K:  	case BPF_JMP | BPF_JNE  | BPF_K:  	case BPF_JMP | BPF_JGT  | BPF_K: +	case BPF_JMP | BPF_JLT  | BPF_K:  	case BPF_JMP | BPF_JGE  | BPF_K: +	case BPF_JMP | BPF_JLE  | BPF_K:  	case BPF_JMP | BPF_JSGT | BPF_K: +	case BPF_JMP | BPF_JSLT | BPF_K:  	case BPF_JMP | BPF_JSGE | BPF_K: +	case BPF_JMP | BPF_JSLE | BPF_K:  	case BPF_JMP | BPF_JSET | BPF_K:  		/* Accommodate for extra offset in case of a backjump. */  		off = from->off; @@ -833,12 +837,20 @@ static unsigned int ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn,  		[BPF_JMP | BPF_JNE | BPF_K] = &&JMP_JNE_K,  		[BPF_JMP | BPF_JGT | BPF_X] = &&JMP_JGT_X,  		[BPF_JMP | BPF_JGT | BPF_K] = &&JMP_JGT_K, +		[BPF_JMP | BPF_JLT | BPF_X] = &&JMP_JLT_X, +		[BPF_JMP | BPF_JLT | BPF_K] = &&JMP_JLT_K,  		[BPF_JMP | BPF_JGE | BPF_X] = &&JMP_JGE_X,  		[BPF_JMP | BPF_JGE | BPF_K] = &&JMP_JGE_K, +		[BPF_JMP | BPF_JLE | BPF_X] = &&JMP_JLE_X, +		[BPF_JMP | BPF_JLE | BPF_K] = &&JMP_JLE_K,  		[BPF_JMP | BPF_JSGT | BPF_X] = &&JMP_JSGT_X,  		[BPF_JMP | BPF_JSGT | BPF_K] = &&JMP_JSGT_K, +		[BPF_JMP | BPF_JSLT | BPF_X] = &&JMP_JSLT_X, +		[BPF_JMP | BPF_JSLT | BPF_K] = &&JMP_JSLT_K,  		[BPF_JMP | BPF_JSGE | BPF_X] = &&JMP_JSGE_X,  		[BPF_JMP | BPF_JSGE | BPF_K] = &&JMP_JSGE_K, +		[BPF_JMP | BPF_JSLE | BPF_X] = &&JMP_JSLE_X, +		[BPF_JMP | BPF_JSLE | BPF_K] = &&JMP_JSLE_K,  		[BPF_JMP | BPF_JSET | BPF_X] = &&JMP_JSET_X,  		[BPF_JMP | BPF_JSET | BPF_K] = &&JMP_JSET_K,  		/* Program return */ @@ -1073,6 +1085,18 @@ out:  			CONT_JMP;  		}  		CONT; +	JMP_JLT_X: +		if (DST < SRC) { +			insn += insn->off; +			CONT_JMP; +		} +		CONT; +	JMP_JLT_K: +		if (DST < IMM) { +			insn += insn->off; +			CONT_JMP; +		} +		CONT;  	JMP_JGE_X:  		if (DST >= SRC) {  			insn += insn->off; @@ -1085,6 +1109,18 @@ out:  			CONT_JMP;  		}  		CONT; +	JMP_JLE_X: +		if (DST <= SRC) { +			insn += insn->off; +			CONT_JMP; +		} +		CONT; +	JMP_JLE_K: +		if (DST <= IMM) { +			insn += insn->off; +			CONT_JMP; +		} +		CONT;  	JMP_JSGT_X:  		if (((s64) DST) > ((s64) SRC)) {  			insn += insn->off; @@ -1097,6 +1133,18 @@ out:  			CONT_JMP;  		}  		CONT; +	JMP_JSLT_X: +		if (((s64) DST) < ((s64) SRC)) { +			insn += insn->off; +			CONT_JMP; +		} +		CONT; +	JMP_JSLT_K: +		if (((s64) DST) < ((s64) IMM)) { +			insn += insn->off; +			CONT_JMP; +		} +		CONT;  	JMP_JSGE_X:  		if (((s64) DST) >= ((s64) SRC)) {  			insn += insn->off; @@ -1109,6 +1157,18 @@ out:  			CONT_JMP;  		}  		CONT; +	JMP_JSLE_X: +		if (((s64) DST) <= ((s64) SRC)) { +			insn += insn->off; +			CONT_JMP; +		} +		CONT; +	JMP_JSLE_K: +		if (((s64) DST) <= ((s64) IMM)) { +			insn += insn->off; +			CONT_JMP; +		} +		CONT;  	JMP_JSET_X:  		if (DST & SRC) {  			insn += insn->off; @@ -1378,6 +1438,7 @@ const struct bpf_func_proto bpf_ktime_get_ns_proto __weak;  const struct bpf_func_proto bpf_get_current_pid_tgid_proto __weak;  const struct bpf_func_proto bpf_get_current_uid_gid_proto __weak;  const struct bpf_func_proto bpf_get_current_comm_proto __weak; +const struct bpf_func_proto bpf_sock_map_update_proto __weak;  const struct bpf_func_proto * __weak bpf_get_trace_printk_proto(void)  { |