summaryrefslogtreecommitdiffstats
path: root/arch/arm/net
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@armlinux.org.uk>2018-01-13 22:51:27 +0000
committerRussell King <rmk+kernel@armlinux.org.uk>2018-01-17 19:36:43 +0000
commit0005e55a79cfda88199e41a406a829c88d708c67 (patch)
tree7b7c6773a85dce1f352ad2a12232d781ac1bcc38 /arch/arm/net
parent70ec3a6c2c11e4b0e107a65de943a082f9aff351 (diff)
downloadlinux-0005e55a79cfda88199e41a406a829c88d708c67.tar.bz2
ARM: net: bpf: correct stack layout documentation
The stack layout documentation incorrectly suggests that the BPF JIT scratch space starts immediately below BPF_FP. This is not correct, so let's fix the documentation to reflect reality. Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
Diffstat (limited to 'arch/arm/net')
-rw-r--r--arch/arm/net/bpf_jit_32.c35
1 files changed, 27 insertions, 8 deletions
diff --git a/arch/arm/net/bpf_jit_32.c b/arch/arm/net/bpf_jit_32.c
index e90229d58c77..dcb3181e85f3 100644
--- a/arch/arm/net/bpf_jit_32.c
+++ b/arch/arm/net/bpf_jit_32.c
@@ -28,24 +28,43 @@
int bpf_jit_enable __read_mostly;
/*
- * eBPF prog stack layout
+ * eBPF prog stack layout:
*
* high
- * original ARM_SP => +-----+ eBPF prologue
- * |FP/LR|
- * current ARM_FP => +-----+
- * | ... | callee saved registers
- * eBPF fp register => +-----+ <= (BPF_FP)
+ * original ARM_SP => +-----+
+ * | | callee saved registers
+ * +-----+ <= (BPF_FP + SCRATCH_SIZE)
* | ... | eBPF JIT scratch space
- * | | eBPF prog stack
+ * eBPF fp register => +-----+
+ * (BPF_FP) | ... | eBPF prog stack
* +-----+
* |RSVD | JIT scratchpad
- * current ARM_SP => +-----+ <= (BPF_FP - STACK_SIZE)
+ * current ARM_SP => +-----+ <= (BPF_FP - STACK_SIZE + SCRATCH_SIZE)
* | |
* | ... | Function call stack
* | |
* +-----+
* low
+ *
+ * The callee saved registers depends on whether frame pointers are enabled.
+ * With frame pointers (to be compliant with the ABI):
+ *
+ * high
+ * original ARM_SP => +------------------+ \
+ * | pc | |
+ * current ARM_FP => +------------------+ } callee saved registers
+ * |r4-r8,r10,fp,ip,lr| |
+ * +------------------+ /
+ * low
+ *
+ * Without frame pointers:
+ *
+ * high
+ * original ARM_SP => +------------------+
+ * | lr | (optional)
+ * | r4-r8,r10 | callee saved registers
+ * +------------------+
+ * low
*/
#define STACK_OFFSET(k) (k)