brintos

brintos / linux-shallow public Read only

0
0
Text · 2.8 KiB · 458984d Raw
145 lines · c
1// SPDX-License-Identifier: GPL-2.02/* Converted from tools/testing/selftests/bpf/verifier/div_overflow.c */3 4#include <linux/bpf.h>5#include <bpf/bpf_helpers.h>6#include <limits.h>7#include "bpf_misc.h"8 9/* Just make sure that JITs used udiv/umod as otherwise we get10 * an exception from INT_MIN/-1 overflow similarly as with div11 * by zero.12 */13 14SEC("tc")15__description("DIV32 overflow, check 1")16__success __retval(0)17__naked void div32_overflow_check_1(void)18{19	asm volatile ("					\20	w1 = -1;					\21	w0 = %[int_min];				\22	w0 /= w1;					\23	exit;						\24"	:25	: __imm_const(int_min, INT_MIN)26	: __clobber_all);27}28 29SEC("tc")30__description("DIV32 overflow, check 2")31__success __retval(0)32__naked void div32_overflow_check_2(void)33{34	asm volatile ("					\35	w0 = %[int_min];				\36	w0 /= -1;					\37	exit;						\38"	:39	: __imm_const(int_min, INT_MIN)40	: __clobber_all);41}42 43SEC("tc")44__description("DIV64 overflow, check 1")45__success __retval(0)46__naked void div64_overflow_check_1(void)47{48	asm volatile ("					\49	r1 = -1;					\50	r2 = %[llong_min] ll;				\51	r2 /= r1;					\52	w0 = 0;						\53	if r0 == r2 goto l0_%=;				\54	w0 = 1;						\55l0_%=:	exit;						\56"	:57	: __imm_const(llong_min, LLONG_MIN)58	: __clobber_all);59}60 61SEC("tc")62__description("DIV64 overflow, check 2")63__success __retval(0)64__naked void div64_overflow_check_2(void)65{66	asm volatile ("					\67	r1 = %[llong_min] ll;				\68	r1 /= -1;					\69	w0 = 0;						\70	if r0 == r1 goto l0_%=;				\71	w0 = 1;						\72l0_%=:	exit;						\73"	:74	: __imm_const(llong_min, LLONG_MIN)75	: __clobber_all);76}77 78SEC("tc")79__description("MOD32 overflow, check 1")80__success __retval(INT_MIN)81__naked void mod32_overflow_check_1(void)82{83	asm volatile ("					\84	w1 = -1;					\85	w0 = %[int_min];				\86	w0 %%= w1;					\87	exit;						\88"	:89	: __imm_const(int_min, INT_MIN)90	: __clobber_all);91}92 93SEC("tc")94__description("MOD32 overflow, check 2")95__success __retval(INT_MIN)96__naked void mod32_overflow_check_2(void)97{98	asm volatile ("					\99	w0 = %[int_min];				\100	w0 %%= -1;					\101	exit;						\102"	:103	: __imm_const(int_min, INT_MIN)104	: __clobber_all);105}106 107SEC("tc")108__description("MOD64 overflow, check 1")109__success __retval(1)110__naked void mod64_overflow_check_1(void)111{112	asm volatile ("					\113	r1 = -1;					\114	r2 = %[llong_min] ll;				\115	r3 = r2;					\116	r2 %%= r1;					\117	w0 = 0;						\118	if r3 != r2 goto l0_%=;				\119	w0 = 1;						\120l0_%=:	exit;						\121"	:122	: __imm_const(llong_min, LLONG_MIN)123	: __clobber_all);124}125 126SEC("tc")127__description("MOD64 overflow, check 2")128__success __retval(1)129__naked void mod64_overflow_check_2(void)130{131	asm volatile ("					\132	r2 = %[llong_min] ll;				\133	r3 = r2;					\134	r2 %%= -1;					\135	w0 = 0;						\136	if r3 != r2 goto l0_%=;				\137	w0 = 1;						\138l0_%=:	exit;						\139"	:140	: __imm_const(llong_min, LLONG_MIN)141	: __clobber_all);142}143 144char _license[] SEC("license") = "GPL";145