Adding back mailing list.

On Mon, Mar 23, 2020 at 12:33 PM <[email protected]> wrote:
>
> Thanks for the reply. All of your suggestions make sense. Because I'm 
> targeting a kernel 4.15 for this specific bit of code, I can't use 
> bpf_probe_read_str().. I think? The way I'm developing is that I cloned the 
> kernel src of kernel 4.15 to a certain depth, and then compiled libbpf. 
> Should I use the standalone libbpf repo instead? I've tried that but have 
> struggled to get samples/bpf/ to compile taking that approach.

bpf_probe_read_str() has been there for a long time, at least 4.12 or
even older.

samples/bpf are part of kernel, so yes, they are using libbpf from
kernel sources. For stand-alone application I'd go with
github.com/libbpf/libbpf

>
> Regardless, I took your advice, and my code now looks like:
>
> struct data_t {
>         u32 pid;
>         char program_name[256]; // max comm length is arbitrary

comm is 16 and unlikely to ever change. No need to waste 256 bytes here.

>         char *file;
> };
>
> struct bpf_map_def SEC("maps") events = {
>   .type = BPF_MAP_TYPE_PERF_EVENT_ARRAY,
>   .key_size = sizeof(int),
>   .value_size = sizeof(u32),
>   .max_entries = MAX_CPUS,
> };
>
>
>
> struct sys_enter_openat_args {
>         u16 common_type;
>         u8 common_flags;
>         u8 common_preempt_count;
>         int common_pid;
>         int __syscall_nr;
>         int dfd;
>         char *filename;
>         int flags;
>         __mode_t mode;
> };
>
> SEC("tracepoint/syscalls/sys_enter_openat")
> int bpf_prog(struct sys_enter_openat_args *ctx) {
>   struct data_t data;

data has to be initialized here:

struct data_t data = {};

>   struct sys_enter_openat_args args;
>
>   int res = bpf_probe_read(&args, sizeof(args), ctx); // read the ctx into 
> bpf space
>   if(!res) {
>          data.file = "couldn't get file";
>   } else {
>          data.file = args.filename;
>   }
>
>   data.pid = bpf_get_current_pid_tgid();
>   bpf_get_current_comm(data.program_name, sizeof(data.program_name));
>
>   bpf_perf_event_output(ctx, &events, 0, &data, sizeof(data));
>   return 0;
> }
>
> char _license[] SEC("license") = "GPL";
> u32 _version SEC("version") = LINUX_VERSION_CODE;
>
> ---
> With a new error code
>
> bpf_load_program() err=13
> 0: (bf) r6 = r1
> 1: (bf) r1 = r10
> 2: (07) r1 += -304
> 3: (b7) r2 = 32
> 4: (bf) r3 = r6
> 5: (85) call bpf_probe_read#4
> 6: (67) r0 <<= 32
> 7: (77) r0 >>= 32
> 8: (55) if r0 != 0x0 goto pc+3
>  R0=inv0 R6=ctx(id=0,off=0,imm=0) R10=fp0
> 9: (18) r1 = 0xffff88ac7c953000
> 11: (05) goto pc+1
> 13: (7b) *(u64 *)(r10 -8) = r1
> 14: (85) call bpf_get_current_pid_tgid#14
> 15: (63) *(u32 *)(r10 -272) = r0
> 16: (bf) r1 = r10
> 17: (07) r1 += -268
> 18: (b7) r2 = 256
> 19: (85) call bpf_get_current_comm#16
> 20: (bf) r4 = r10
> 21: (07) r4 += -272
> 22: (bf) r1 = r6
> 23: (18) r2 = 0xffff88ac7c953000
> 25: (b7) r3 = 0
> 26: (b7) r5 = 272
> 27: (85) call bpf_perf_event_output#25
> invalid indirect read from stack off -272+260 size 272
> The kernel didn't load the BPF program
> ---
>
> Thanks for the pointer about the libbpf-tools in the BCC repo! I had seen it 
> before but for some reason didn't make any kind of note about it. It's 
> extremely helpful.
>
> I will change the map declaration, just trying to understand getting data 
> from the tracepoint right now.

data is not completely initialized, see above.

Please keep this discussion on mailing list, though, it might benefit
someone else.

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.

View/Reply Online (#1831): https://lists.iovisor.org/g/iovisor-dev/message/1831
Mute This Topic: https://lists.iovisor.org/mt/72496365/21656
Group Owner: [email protected]
Unsubscribe: https://lists.iovisor.org/g/iovisor-dev/unsub  
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to