1231990Smp// SPDX-License-Identifier: GPL-2.0-only 259243Sobrien/* Copyright (c) 2020 Facebook */ 3231990Smp#include <stddef.h> 459243Sobrien#include <linux/bpf.h> 559243Sobrien#include <bpf/bpf_helpers.h> 659243Sobrien#include "bpf_misc.h" 7231990Smp 859243Sobrien#define MAX_STACK 260 959243Sobrien 1059243Sobrienstatic __attribute__ ((noinline)) 11231990Smpint f0(int var, struct __sk_buff *skb) 1259243Sobrien{ 1359243Sobrien asm volatile (""); 14231990Smp 1559243Sobrien return skb->len; 16231990Smp} 17231990Smp 18231990Smp__attribute__ ((noinline)) 1959243Sobrienint f1(struct __sk_buff *skb) 2059243Sobrien{ 2159243Sobrien volatile char buf[MAX_STACK] = {}; 22231990Smp 23231990Smp __sink(buf[MAX_STACK - 1]); 2459243Sobrien 2559243Sobrien return f0(0, skb) + skb->len; 2659243Sobrien} 2759243Sobrien 28231990Smpint f3(int, struct __sk_buff *skb, int); 2959243Sobrien 3059243Sobrien__attribute__ ((noinline)) 31231990Smpint f2(int val, struct __sk_buff *skb) 3259243Sobrien{ 3359243Sobrien volatile char buf[MAX_STACK] = {}; 34231990Smp 35231990Smp __sink(buf[MAX_STACK - 1]); 36231990Smp 3759243Sobrien return f1(skb) + f3(val, skb, 1); 38231990Smp} 39231990Smp 40231990Smp__attribute__ ((noinline)) 4159243Sobrienint f3(int val, struct __sk_buff *skb, int var) 4259243Sobrien{ 4359243Sobrien volatile char buf[MAX_STACK] = {}; 4459243Sobrien 45231990Smp __sink(buf[MAX_STACK - 1]); 4659243Sobrien 47231990Smp return skb->ifindex * val * var; 48231990Smp} 49231990Smp 5059243SobrienSEC("tc") 5159243Sobrien__failure __msg("combined stack size of 3 calls is") 52231990Smpint global_func1(struct __sk_buff *skb) 5359243Sobrien{ 5459243Sobrien return f0(1, skb) + f1(skb) + f2(2, skb) + f3(3, skb, 4); 5559243Sobrien} 5659243Sobrien