ARM: p2v: use relative references in patch site arrays
[linux-2.6-microblaze.git] / arch / arm / include / asm / memory.h
index 99035b5..4121662 100644 (file)
@@ -183,20 +183,20 @@ extern const void *__pv_table_begin, *__pv_table_end;
 #define PHYS_OFFSET    ((phys_addr_t)__pv_phys_pfn_offset << PAGE_SHIFT)
 #define PHYS_PFN_OFFSET        (__pv_phys_pfn_offset)
 
-#define __pv_stub(from,to,instr,type)                  \
+#define __pv_stub(from,to,instr)                       \
        __asm__("@ __pv_stub\n"                         \
        "1:     " instr "       %0, %1, %2\n"           \
        "       .pushsection .pv_table,\"a\"\n"         \
-       "       .long   1b\n"                           \
+       "       .long   1b - .\n"                       \
        "       .popsection\n"                          \
        : "=r" (to)                                     \
-       : "r" (from), "I" (type))
+       : "r" (from), "I" (__PV_BITS_31_24))
 
 #define __pv_stub_mov_hi(t)                            \
        __asm__ volatile("@ __pv_stub_mov\n"            \
        "1:     mov     %R0, %1\n"                      \
        "       .pushsection .pv_table,\"a\"\n"         \
-       "       .long   1b\n"                           \
+       "       .long   1b - .\n"                       \
        "       .popsection\n"                          \
        : "=r" (t)                                      \
        : "I" (__PV_BITS_7_0))
@@ -206,7 +206,7 @@ extern const void *__pv_table_begin, *__pv_table_end;
        "1:     adds    %Q0, %1, %2\n"                  \
        "       adc     %R0, %R0, #0\n"                 \
        "       .pushsection .pv_table,\"a\"\n"         \
-       "       .long   1b\n"                           \
+       "       .long   1b - .\n"                       \
        "       .popsection\n"                          \
        : "+r" (y)                                      \
        : "r" (x), "I" (__PV_BITS_31_24)                \
@@ -217,7 +217,7 @@ static inline phys_addr_t __virt_to_phys_nodebug(unsigned long x)
        phys_addr_t t;
 
        if (sizeof(phys_addr_t) == 4) {
-               __pv_stub(x, t, "add", __PV_BITS_31_24);
+               __pv_stub(x, t, "add");
        } else {
                __pv_stub_mov_hi(t);
                __pv_add_carry_stub(x, t);
@@ -235,7 +235,7 @@ static inline unsigned long __phys_to_virt(phys_addr_t x)
         * assembler expression receives 32 bit argument
         * in place where 'r' 32 bit operand is expected.
         */
-       __pv_stub((unsigned long) x, t, "sub", __PV_BITS_31_24);
+       __pv_stub((unsigned long) x, t, "sub");
        return t;
 }