#endif
#endif
+#if __mips_isa_rev>=6
+#define JALR_ENCODE_DIFF 0x1
+#else
+#define JALR_ENCODE_DIFF 0x0
+#endif
+
#ifndef CODE_EXECUTABLE
/* How do we make the trampoline's code executable? */
#if defined(HAVE_MACH_VM) || defined(HAVE_WORKING_MPROTECT)
*/
*(unsigned int *) (function + 0) = 0x8F220010;
*(unsigned int *) (function + 4) = 0x8F390014;
- *(unsigned int *) (function + 8) = 0x03200008;
+ *(unsigned int *) (function + 8) = 0x03200008 | JALR_ENCODE_DIFF;
*(unsigned int *) (function +12) = 0x00000000;
*(unsigned int *) (function +16) = (unsigned int) data;
*(unsigned int *) (function +20) = (unsigned int) address;
#define is_tramp(function) \
*(unsigned int *) (function + 0) == 0x8F220010 && \
*(unsigned int *) (function + 4) == 0x8F390014 && \
- *(unsigned int *) (function + 8) == 0x03200008 && \
+ *(unsigned int *) (function + 8) == (0x03200008 | JALR_ENCODE_DIFF) && \
*(unsigned int *) (function +12) == 0x00000000
#define tramp_address(function) \
*(unsigned int *) (function +20)
*/
*(unsigned int *) (function + 0) = 0xDF220010;
*(unsigned int *) (function + 4) = 0xDF390018;
- *(unsigned int *) (function + 8) = 0x03200008;
+ *(unsigned int *) (function + 8) = 0x03200008 | JALR_ENCODE_DIFF;
*(unsigned int *) (function +12) = 0x00000000;
*(unsigned long *) (function +16) = (unsigned long) data;
*(unsigned long *) (function +24) = (unsigned long) address;
#define is_tramp(function) \
*(unsigned int *) (function + 0) == 0xDF220010 && \
*(unsigned int *) (function + 4) == 0xDF390018 && \
- *(unsigned int *) (function + 8) == 0x03200008 && \
+ *(unsigned int *) (function + 8) == (0x03200008 | JALR_ENCODE_DIFF) && \
*(unsigned int *) (function +12) == 0x00000000
#define tramp_address(function) \
*(unsigned long *) (function +24)
#endif
#endif
+#if __mips_isa_rev>=6
+#define JALR_ENCODE_DIFF 0x1
+#else
+#define JALR_ENCODE_DIFF 0x0
+#endif
+
#ifndef CODE_EXECUTABLE
/* How do we make the trampoline's code executable? */
#if defined(HAVE_MACH_VM) || defined(HAVE_WORKING_MPROTECT)
*(unsigned int *) (function + 4) = 0x8F23001C;
*(unsigned int *) (function + 8) = 0xAC430000;
*(unsigned int *) (function +12) = 0x8F390020;
- *(unsigned int *) (function +16) = 0x03200008;
+ *(unsigned int *) (function +16) = 0x03200008 | JALR_ENCODE_DIFF;
*(unsigned int *) (function +20) = 0x00000000;
*(unsigned int *) (function +24) = (unsigned int) variable;
*(unsigned int *) (function +28) = (unsigned int) data;
*(int *) (function + 4) == 0x8F23001C && \
*(int *) (function + 8) == 0xAC430000 && \
*(int *) (function +12) == 0x8F390020 && \
- *(int *) (function +16) == 0x03200008 && \
+ *(int *) (function +16) == (0x03200008 | JALR_ENCODE_DIFF) && \
*(int *) (function +20) == 0x00000000
#define tramp_address(function) \
*(unsigned int *) (function +32)
*(unsigned int *) (function + 4) = 0xDF230020;
*(unsigned int *) (function + 8) = 0xFC430000;
*(unsigned int *) (function +12) = 0xDF390028;
- *(unsigned int *) (function +16) = 0x03200008;
+ *(unsigned int *) (function +16) = 0x03200008 | JALR_ENCODE_DIFF;
*(unsigned int *) (function +20) = 0x00000000;
*(unsigned long *) (function +24) = (unsigned long) variable;
*(unsigned long *) (function +32) = (unsigned long) data;
*(unsigned int *) (function + 4) == 0xDF230020 && \
*(unsigned int *) (function + 8) == 0xFC430000 && \
*(unsigned int *) (function +12) == 0xDF390028 && \
- *(unsigned int *) (function +16) == 0x03200008 && \
+ *(unsigned int *) (function +16) == (0x03200008 | JALR_ENCODE_DIFF) && \
*(unsigned int *) (function +20) == 0x00000000
#define tramp_address(function) \
*(unsigned long *) (function +40)