Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [day] [month] [year] [list]
Message-ID: <CAHgaXdJW=-tprZtBcWBWxM1En-aCp4B++3DmoRyDKVAtqY6uuA@mail.gmail.com>
Date: Mon, 30 Jan 2017 15:46:47 +0530
From: Shubham Bansal <illusionist.neo@...il.com>
To: Kees Cook <keescook@...omium.org>, Daniel Borkmann <daniel@...earbox.net>, 
	Mircea Gherzan <mgherzan@...il.com>
Cc: netdev@...r.kernel.org, kernel-hardening@...ts.openwall.com, 
	linux@...linux.org.uk, linux-arm-kernel@...ts.infradead.org
Subject: arch: arm: bpf: Converting cBPF to eBPF for arm 32 bit

Hi all,

Just starting a new thread with proper heading on the main kernel hardening
and net-dev mailing list so that other people can be involved in this.
Please don't take this as a personal mail.

I am working on conversion of arm32 cBPF into eBPF JIT. I wanted some help,
regarding understanding of kernel code, from the dev available on the
mailing list. If you look at the ./arch/arm/net/bpf_jit_32.c code, you will
see jit_ctx structure. If anybody could help me understand what each fields
of this structure represent then it would be great.

Also, currently I am mapping the eBPF registers to arm 32 bit registers in
the following way.

static const int bpf2a32[] = {
>
>         /* return value from in-kernel function, and exit value from eBPF
> */
>         [BPF_REG_0] = ARM_R0,
>
>         /* arguments from eBPF program to in-kernel function */
>
>         [BPF_REG_1] = ARM_R1,
>
>         [BPF_REG_2] = ARM_R2,
>
>         [BPF_REG_3] = ARM_R3,
>
>         [BPF_REG_4] = ARM_R4,
>
>         [BPF_REG_5] = ARM_R5,
>
>         /* callee saved registers that in-kernel function will preserve */
>
>         [BPF_REG_6] = ARM_R6,
>
>         [BPF_REG_7] = ARM_R7,
>
>         [BPF_REG_8] = ARM_R8,
>
>         [BPF_REG_9] = ARM_R9,
>
>         /* Read only Frame Pointer to access Stack */
>
>         [BPF_REG_FP] = ARM_FP,
>
>         /* Temperory Register for internal BPF JIT */
>
>         [TMP_REG_1] = ARM_R11,
>
>         /* temporary register for blinding constants */
>
>         [BPF_REG_AX] = ARM_R10,
>
> };


But I have some question if anybody could help with those.

   - Currently, as eBPF uses 64 bit registers, I am mapping 64 bit eBPF
   registers with 32 bit arm registers which looks wrong to me. Do anybody
   have some idea about how to map eBPF->arm 32 bit registers ?
   - Also, is my current mapping good enough to make the JIT fast enough ?
   because as you might know, eBPF JIT mostly depends on 1-to-1 mapping of its
   instructions with native instructions.


Appreciate the help from anybody from the mailing list.

Best,
Shubham Bansal

Content of type "text/html" skipped

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.