powerpc/bpf/jit: Fix/enhance 32-bit Load Immediate implementation
[cascardo/linux.git] / arch / powerpc / net / bpf_jit.h
index 889fd19..a9882db 100644 (file)
@@ -232,10 +232,17 @@ DECLARE_LOAD_FUNC(sk_load_byte_msh);
                                             (((cond) & 0x3ff) << 16) |       \
                                             (((dest) - (ctx->idx * 4)) &     \
                                              0xfffc))
-#define PPC_LI32(d, i)         do { PPC_LI(d, IMM_L(i));                     \
-               if ((u32)(uintptr_t)(i) >= 32768) {                           \
-                       PPC_ADDIS(d, d, IMM_HA(i));                           \
+/* Sign-extended 32-bit immediate load */
+#define PPC_LI32(d, i)         do {                                          \
+               if ((int)(uintptr_t)(i) >= -32768 &&                          \
+                               (int)(uintptr_t)(i) < 32768)                  \
+                       PPC_LI(d, i);                                         \
+               else {                                                        \
+                       PPC_LIS(d, IMM_H(i));                                 \
+                       if (IMM_L(i))                                         \
+                               PPC_ORI(d, d, IMM_L(i));                      \
                } } while(0)
+
 #define PPC_LI64(d, i)         do {                                          \
                if (!((uintptr_t)(i) & 0xffffffff00000000ULL))                \
                        PPC_LI32(d, i);                                       \