ppc: bpf: Add SKF_AD_CPU for ppc32
authorDenis Kirjanov <kda@linux-powerpc.org>
Tue, 17 Feb 2015 07:04:42 +0000 (10:04 +0300)
committerDavid S. Miller <davem@davemloft.net>
Fri, 20 Feb 2015 20:19:43 +0000 (15:19 -0500)
Signed-off-by: Denis Kirjanov <kda@linux-powerpc.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
arch/powerpc/net/bpf_jit.h
arch/powerpc/net/bpf_jit_comp.c

index 2d5e71577210471bb9f1f78891407e8235f1977b..889fd199a821cbda22fe6e61ebed54cfa115d53f 100644 (file)
@@ -154,6 +154,23 @@ DECLARE_LOAD_FUNC(sk_load_byte_msh);
 #define PPC_LL_OFFS(r, base, i) do { PPC_LWZ_OFFS(r, base, i); } while(0)
 #endif
 
+#ifdef CONFIG_SMP
+#ifdef CONFIG_PPC64
+#define PPC_BPF_LOAD_CPU(r)            \
+       do { BUILD_BUG_ON(FIELD_SIZEOF(struct paca_struct, paca_index) != 2);   \
+               PPC_LHZ_OFFS(r, 13, offsetof(struct paca_struct, paca_index));          \
+       } while (0)
+#else
+#define PPC_BPF_LOAD_CPU(r)     \
+       do { BUILD_BUG_ON(FIELD_SIZEOF(struct thread_info, cpu) != 4);                  \
+               PPC_LHZ_OFFS(r, (1 & ~(THREAD_SIZE - 1)),                                                       \
+                               offsetof(struct thread_info, cpu));                                                     \
+       } while(0)
+#endif
+#else
+#define PPC_BPF_LOAD_CPU(r) do { PPC_LI(r, 0); } while(0)
+#endif
+
 #define PPC_CMPWI(a, i)                EMIT(PPC_INST_CMPWI | ___PPC_RA(a) | IMM_L(i))
 #define PPC_CMPDI(a, i)                EMIT(PPC_INST_CMPDI | ___PPC_RA(a) | IMM_L(i))
 #define PPC_CMPLWI(a, i)       EMIT(PPC_INST_CMPLWI | ___PPC_RA(a) | IMM_L(i))
index 8b2926850125ba2e1b4b974e439e517afee4dfdd..17cea18a09d32f103aa453c645a7324739c58ffe 100644 (file)
@@ -411,20 +411,8 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image,
                        PPC_SRWI(r_A, r_A, 5);
                        break;
                case BPF_ANC | SKF_AD_CPU:
-#ifdef CONFIG_SMP
-                       /*
-                        * PACA ptr is r13:
-                        * raw_smp_processor_id() = local_paca->paca_index
-                        */
-                       BUILD_BUG_ON(FIELD_SIZEOF(struct paca_struct,
-                                                 paca_index) != 2);
-                       PPC_LHZ_OFFS(r_A, 13,
-                                    offsetof(struct paca_struct, paca_index));
-#else
-                       PPC_LI(r_A, 0);
-#endif
+                       PPC_BPF_LOAD_CPU(r_A);
                        break;
-
                        /*** Absolute loads from packet header/data ***/
                case BPF_LD | BPF_W | BPF_ABS:
                        func = CHOOSE_LOAD_FUNC(K, sk_load_word);