Blame SOURCES/0004-MIPS-Fix-handling-of-spare-long-range-jump-slots.patch

006bc1
From c7c3c4da432ddb543d4b0a9abbb245f11b26afd0 Mon Sep 17 00:00:00 2001
006bc1
From: Mike Pall <mike>
006bc1
Date: Wed, 7 Jun 2017 19:36:46 +0200
006bc1
Subject: [PATCH 04/72] MIPS: Fix handling of spare long-range jump slots.
006bc1
006bc1
Contributed by Djordje Kovacevic and Stefan Pejic.
006bc1
---
006bc1
 src/lj_asm_mips.h | 9 +++++----
006bc1
 src/lj_jit.h      | 6 ++++++
006bc1
 src/lj_mcode.c    | 6 ------
006bc1
 3 files changed, 11 insertions(+), 10 deletions(-)
006bc1
006bc1
diff --git a/src/lj_asm_mips.h b/src/lj_asm_mips.h
006bc1
index d0a1ca5..7631190 100644
006bc1
--- a/src/lj_asm_mips.h
006bc1
+++ b/src/lj_asm_mips.h
006bc1
@@ -65,10 +65,9 @@ static Reg ra_alloc2(ASMState *as, IRIns *ir, RegSet allow)
006bc1
 static void asm_sparejump_setup(ASMState *as)
006bc1
 {
006bc1
   MCode *mxp = as->mcbot;
006bc1
-  /* Assumes sizeof(MCLink) == 8. */
006bc1
-  if (((uintptr_t)mxp & (LJ_PAGESIZE-1)) == 8) {
006bc1
+  if (((uintptr_t)mxp & (LJ_PAGESIZE-1)) == sizeof(MCLink)) {
006bc1
     lua_assert(MIPSI_NOP == 0);
006bc1
-    memset(mxp+2, 0, MIPS_SPAREJUMP*8);
006bc1
+    memset(mxp, 0, MIPS_SPAREJUMP*2*sizeof(MCode));
006bc1
     mxp += MIPS_SPAREJUMP*2;
006bc1
     lua_assert(mxp < as->mctop);
006bc1
     lj_mcode_sync(as->mcbot, mxp);
006bc1
@@ -1947,7 +1946,9 @@ void lj_asm_patchexit(jit_State *J, GCtrace *T, ExitNo exitno, MCode *target)
006bc1
 	  if (!cstart) cstart = p-1;
006bc1
 	} else {  /* Branch out of range. Use spare jump slot in mcarea. */
006bc1
 	  int i;
006bc1
-	  for (i = 2; i < 2+MIPS_SPAREJUMP*2; i += 2) {
006bc1
+	  for (i = (int)(sizeof(MCLink)/sizeof(MCode));
006bc1
+	       i < (int)(sizeof(MCLink)/sizeof(MCode)+MIPS_SPAREJUMP*2);
006bc1
+	       i += 2) {
006bc1
 	    if (mcarea[i] == tjump) {
006bc1
 	      delta = mcarea+i - p;
006bc1
 	      goto patchbranch;
006bc1
diff --git a/src/lj_jit.h b/src/lj_jit.h
006bc1
index a2e8fd9..3f38d28 100644
006bc1
--- a/src/lj_jit.h
006bc1
+++ b/src/lj_jit.h
006bc1
@@ -155,6 +155,12 @@ typedef uint8_t MCode;
006bc1
 typedef uint32_t MCode;
006bc1
 #endif
006bc1
 
006bc1
+/* Linked list of MCode areas. */
006bc1
+typedef struct MCLink {
006bc1
+  MCode *next;		/* Next area. */
006bc1
+  size_t size;		/* Size of current area. */
006bc1
+} MCLink;
006bc1
+
006bc1
 /* Stack snapshot header. */
006bc1
 typedef struct SnapShot {
006bc1
   uint16_t mapofs;	/* Offset into snapshot map. */
006bc1
diff --git a/src/lj_mcode.c b/src/lj_mcode.c
006bc1
index f0a1f69..5ea89f6 100644
006bc1
--- a/src/lj_mcode.c
006bc1
+++ b/src/lj_mcode.c
006bc1
@@ -272,12 +272,6 @@ static void *mcode_alloc(jit_State *J, size_t sz)
006bc1
 
006bc1
 /* -- MCode area management ----------------------------------------------- */
006bc1
 
006bc1
-/* Linked list of MCode areas. */
006bc1
-typedef struct MCLink {
006bc1
-  MCode *next;		/* Next area. */
006bc1
-  size_t size;		/* Size of current area. */
006bc1
-} MCLink;
006bc1
-
006bc1
 /* Allocate a new MCode area. */
006bc1
 static void mcode_allocarea(jit_State *J)
006bc1
 {
006bc1
-- 
006bc1
2.20.1
006bc1