Function report

Linux Kernel

v5.5.9

Brick Technologies Co., Ltd

Source Code:kernel\bpf\verifier.c Create Date:2022-07-28 13:01:24
Last Modify:2022-05-19 20:02:10 Copyright©Brick
home page Tree
Annotation kernel can get tool activityDownload SCCTChinese

Name:Adjusts the register min/max values in the case that the dst_reg is the* variable register that we are working on, and src_reg is a constant or we're* simply doing a BPF_K check.* In JEQ/JNE cases we also adjust the var_off values.

Proto:static void reg_set_min_max(struct bpf_reg_state *true_reg, struct bpf_reg_state *false_reg, u64 val, u8 opcode, bool is_jmp32)

Type:void

Parameter:

TypeParameterName
struct bpf_reg_state *true_reg
struct bpf_reg_state *false_reg
u64val
u8opcode
boolis_jmp32
5581  If __is_pointer_value(TSC's on different sockets may be reset asynchronously.* This may cause the TSC ADJUST value on socket 0 to be NOT 0., false_reg) Then Return
5584  val = If is_jmp32 Then val Else val
5585  sval = If is_jmp32 Then val Else val
5588  Case opcode == BPF_JEQ
5589  Case opcode == jump !=
5591  reg = If opcode == BPF_JEQ Then true_reg Else false_reg
5598  If is_jmp32 Then
5599  old_v = value
5600  hi_mask = ~0xffffffffULL
5602  value = old_v & hi_mask | val
5603  mask &= hi_mask
5604  Else
5607  Break
5609  Case opcode == BPF_JSET
5610  For scalar types (SCALAR_VALUE), this represents our knowledge of * the actual value. * For pointer types, this represents the variable part of the offset * from the pointed-to object, and is shared with all bpf_reg_states * with the same id as us. = Bitwise-AND, return @a & @b
5612  If s_power_of_2() - check if a value is a power of two*@n: the value to check* Determine whether some value is a power of two, where zero is* *not* considered a power of two.* Return: true if @n is a power of 2, otherwise false. Then For scalar types (SCALAR_VALUE), this represents our knowledge of * the actual value. * For pointer types, this represents the variable part of the offset * from the pointed-to object, and is shared with all bpf_reg_states * with the same id as us. = Bitwise-OR, return @a | @b
5615  Break
5616  Case opcode == BPF_JGE
5617  Case opcode == BPF_JGT
5619  false_umax = If opcode == BPF_JGT Then val Else val - 1
5620  true_umin = If opcode == BPF_JGT Then val + 1 Else val
5622  If is_jmp32 Then
5626  maximum possible (u64)value = min - return minimum of two values of the same or compatible types*@x: first value*@y: second value( maximum possible (u64)value , false_umax)
5627  minimum possible (u64)value = max - return maximum of two values of the same or compatible types*@x: first value*@y: second value( minimum possible (u64)value , true_umin)
5628  Break
5630  Case opcode == SGE is signed '>=', GE in x86
5631  Case opcode == SGT is signed '>', GT in x86
5633  false_smax = If opcode == SGT is signed '>', GT in x86 Then sval Else sval - 1
5634  true_smin = If opcode == SGT is signed '>', GT in x86 Then sval + 1 Else sval
5639  If is_jmp32 && Not Return true if VAL is compared with a s64 sign extended from s32, and they* are with the same signedness. Then Break
5641  maximum possible (s64)value = min - return minimum of two values of the same or compatible types*@x: first value*@y: second value( maximum possible (s64)value , false_smax)
5642  minimum possible (s64)value = max - return maximum of two values of the same or compatible types*@x: first value*@y: second value( minimum possible (s64)value , true_smin)
5643  Break
5645  Case opcode == LE is unsigned, '<='
5646  Case opcode == LT is unsigned, '<'
5648  false_umin = If opcode == LT is unsigned, '<' Then val Else val + 1
5649  true_umax = If opcode == LT is unsigned, '<' Then val - 1 Else val
5651  If is_jmp32 Then
5655  minimum possible (u64)value = max - return maximum of two values of the same or compatible types*@x: first value*@y: second value( minimum possible (u64)value , false_umin)
5656  maximum possible (u64)value = min - return minimum of two values of the same or compatible types*@x: first value*@y: second value( maximum possible (u64)value , true_umax)
5657  Break
5659  Case opcode == SLE is signed, '<='
5660  Case opcode == SLT is signed, '<'
5662  false_smin = If opcode == SLT is signed, '<' Then sval Else sval + 1
5663  true_smax = If opcode == SLT is signed, '<' Then sval - 1 Else sval
5665  If is_jmp32 && Not Return true if VAL is compared with a s64 sign extended from s32, and they* are with the same signedness. Then Break
5667  minimum possible (s64)value = max - return maximum of two values of the same or compatible types*@x: first value*@y: second value( minimum possible (s64)value , false_smin)
5668  maximum possible (s64)value = min - return minimum of two values of the same or compatible types*@x: first value*@y: second value( maximum possible (s64)value , true_smax)
5669  Break
5671  Default
5672  Break
5675  Uses signed min/max values to inform unsigned, and vice-versa
5676  Uses signed min/max values to inform unsigned, and vice-versa
5678  Attempts to improve var_off based on unsigned min/max information
5679  Attempts to improve var_off based on unsigned min/max information
5680  If is_jmp32 Then
5681  __reg_bound_offset32(false_reg)
5682  __reg_bound_offset32(true_reg)
5688  Attempts to improve min/max values based on var_off information
5689  Attempts to improve min/max values based on var_off information
Caller
NameDescribe
check_cond_jmp_op