162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/* Copyright (c) 2021 Facebook */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#include "vmlinux.h"
562306a36Sopenharmony_ci#include <bpf/bpf_helpers.h>
662306a36Sopenharmony_ci#include <bpf/bpf_tracing.h>
762306a36Sopenharmony_ci
862306a36Sopenharmony_cistruct my_key { long x; };
962306a36Sopenharmony_cistruct my_value { long x; };
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_cistruct {
1262306a36Sopenharmony_ci	__uint(type, BPF_MAP_TYPE_HASH);
1362306a36Sopenharmony_ci	__type(key, struct my_key);
1462306a36Sopenharmony_ci	__type(value, struct my_value);
1562306a36Sopenharmony_ci	__uint(max_entries, 16);
1662306a36Sopenharmony_ci} map1 SEC(".maps");
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci /* Matches map2 definition in linked_maps2.c. Order of the attributes doesn't
1962306a36Sopenharmony_ci  * matter.
2062306a36Sopenharmony_ci  */
2162306a36Sopenharmony_citypedef struct {
2262306a36Sopenharmony_ci	__uint(max_entries, 8);
2362306a36Sopenharmony_ci	__type(key, int);
2462306a36Sopenharmony_ci	__type(value, int);
2562306a36Sopenharmony_ci	__uint(type, BPF_MAP_TYPE_ARRAY);
2662306a36Sopenharmony_ci} map2_t;
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ciextern map2_t map2 SEC(".maps");
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci/* This should be the winning map definition, but we have no way of verifying,
3162306a36Sopenharmony_ci * so we just make sure that it links and works without errors
3262306a36Sopenharmony_ci */
3362306a36Sopenharmony_cistruct {
3462306a36Sopenharmony_ci	__uint(type, BPF_MAP_TYPE_ARRAY);
3562306a36Sopenharmony_ci	__type(key, int);
3662306a36Sopenharmony_ci	__type(value, int);
3762306a36Sopenharmony_ci	__uint(max_entries, 16);
3862306a36Sopenharmony_ci} map_weak __weak SEC(".maps");
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ciint output_first1;
4162306a36Sopenharmony_ciint output_second1;
4262306a36Sopenharmony_ciint output_weak1;
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ciSEC("raw_tp/sys_enter")
4562306a36Sopenharmony_ciint BPF_PROG(handler_enter1)
4662306a36Sopenharmony_ci{
4762306a36Sopenharmony_ci	/* update values with key = 1 */
4862306a36Sopenharmony_ci	int key = 1, val = 1;
4962306a36Sopenharmony_ci	struct my_key key_struct = { .x = 1 };
5062306a36Sopenharmony_ci	struct my_value val_struct = { .x = 1000 };
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci	bpf_map_update_elem(&map1, &key_struct, &val_struct, 0);
5362306a36Sopenharmony_ci	bpf_map_update_elem(&map2, &key, &val, 0);
5462306a36Sopenharmony_ci	bpf_map_update_elem(&map_weak, &key, &val, 0);
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci	return 0;
5762306a36Sopenharmony_ci}
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ciSEC("raw_tp/sys_exit")
6062306a36Sopenharmony_ciint BPF_PROG(handler_exit1)
6162306a36Sopenharmony_ci{
6262306a36Sopenharmony_ci	/* lookup values with key = 2, set in another file */
6362306a36Sopenharmony_ci	int key = 2, *val;
6462306a36Sopenharmony_ci	struct my_key key_struct = { .x = 2 };
6562306a36Sopenharmony_ci	struct my_value *value_struct;
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci	value_struct = bpf_map_lookup_elem(&map1, &key_struct);
6862306a36Sopenharmony_ci	if (value_struct)
6962306a36Sopenharmony_ci		output_first1 = value_struct->x;
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci	val = bpf_map_lookup_elem(&map2, &key);
7262306a36Sopenharmony_ci	if (val)
7362306a36Sopenharmony_ci		output_second1 = *val;
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci	val = bpf_map_lookup_elem(&map_weak, &key);
7662306a36Sopenharmony_ci	if (val)
7762306a36Sopenharmony_ci		output_weak1 = *val;
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci	return 0;
8062306a36Sopenharmony_ci}
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_cichar LICENSE[] SEC("license") = "GPL";
83