|
@@ -0,0 +1,57 @@
|
|
|
+/*
|
|
|
+ * Just-In-Time compiler for BPF filters on 32bit ARM
|
|
|
+ *
|
|
|
+ * Copyright (c) 2011 Mircea Gherzan <mgherzan@gmail.com>
|
|
|
+ *
|
|
|
+ * This program is free software; you can redistribute it and/or modify it
|
|
|
+ * under the terms of the GNU General Public License as published by the
|
|
|
+ * Free Software Foundation; version 2 of the License.
|
|
|
+ */
|
|
|
+
|
|
|
+#include <linux/bitops.h>
|
|
|
+#include <linux/compiler.h>
|
|
|
+#include <linux/errno.h>
|
|
|
+#include <linux/filter.h>
|
|
|
+#include <linux/moduleloader.h>
|
|
|
+#include <linux/netdevice.h>
|
|
|
+#include <linux/string.h>
|
|
|
+#include <linux/slab.h>
|
|
|
+#include <linux/if_vlan.h>
|
|
|
+#include <asm/cacheflush.h>
|
|
|
+#include <asm/hwcap.h>
|
|
|
+
|
|
|
+#include "bpf_jit_32.h"
|
|
|
+
|
|
|
+/*
|
|
|
+ * ABI:
|
|
|
+ *
|
|
|
+ * r0 scratch register
|
|
|
+ * r4 BPF register A
|
|
|
+ * r5 BPF register X
|
|
|
+ * r6 pointer to the skb
|
|
|
+ * r7 skb->data
|
|
|
+ * r8 skb_headlen(skb)
|
|
|
+ */
|
|
|
+
|
|
|
+#define r_scratch ARM_R0
|
|
|
+/* r1-r3 are (also) used for the unaligned loads on the non-ARMv7 slowpath */
|
|
|
+#define r_off ARM_R1
|
|
|
+#define r_A ARM_R4
|
|
|
+#define r_X ARM_R5
|
|
|
+#define r_skb ARM_R6
|
|
|
+#define r_skb_data ARM_R7
|
|
|
+#define r_skb_hl ARM_R8
|
|
|
+
|
|
|
+#define SCRATCH_SP_OFFSET 0
|
|
|
+#define SCRATCH_OFF(k) (SCRATCH_SP_OFFSET + 4 * (k))
|
|
|
+
|
|
|
+#define SEEN_MEM ((1 << BPF_MEMWORDS) - 1)
|
|
|
+#define SEEN_MEM_WORD(k) (1 << (k))
|
|
|
+#define SEEN_X (1 << BPF_MEMWORDS)
|
|
|
+#define SEEN_CALL (1 << (BPF_MEMWORDS + 1))
|
|
|
+#define SEEN_SKB (1 << (BPF_MEMWORDS + 2))
|
|
|
+#define SEEN_DATA (1 << (BPF_MEMWORDS + 3))
|
|
|
+
|
|
|
+#define FLAG_NEED_X_RESET (1 << 0)
|
|
|
+
|
|
|
+struct jit_ctx {
|