summaryrefslogtreecommitdiff
path: root/debian/patches/dyson-solaris-amd64-memory-layout.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/dyson-solaris-amd64-memory-layout.patch')
-rw-r--r--debian/patches/dyson-solaris-amd64-memory-layout.patch492
1 files changed, 492 insertions, 0 deletions
diff --git a/debian/patches/dyson-solaris-amd64-memory-layout.patch b/debian/patches/dyson-solaris-amd64-memory-layout.patch
new file mode 100644
index 0000000..e52ea77
--- /dev/null
+++ b/debian/patches/dyson-solaris-amd64-memory-layout.patch
@@ -0,0 +1,492 @@
+Description: fix for Solaris/amd64 memory layout
+ This patch:
+ 1. Fixes C++ classes
+ 2. Disables JIT and enables LLInt
+ 3. Fixes LLInt
+
+ TODO: Fix JIT
+Bug-Dyson: http://osdyson.org/issues/160
+Index: webkit/Source/WTF/wtf/Platform.h
+===================================================================
+--- webkit.orig/Source/WTF/wtf/Platform.h
++++ webkit/Source/WTF/wtf/Platform.h
+@@ -434,6 +434,15 @@
+ #define WTF_OS_SOLARIS 1
+ #endif
+
++#if CPU(X86_64) && OS(SOLARIS)
++# define WTF_OS_SOLARIS_AMD64 1
++# endif
++
++// Let's port LLInt first:
++#if OS(SOLARIS_AMD64)
++#define ENABLE_JIT 0
++#endif
++
+ /* OS(WINCE) - Windows CE; note that for this platform OS(WINDOWS) is also defined */
+ #if defined(_WIN32_WCE)
+ #define WTF_OS_WINCE 1
+@@ -762,7 +771,7 @@
+ low-level interpreter. */
+ #if !defined(ENABLE_LLINT) \
+ && ENABLE(JIT) \
+- && (OS(DARWIN) || OS(LINUX) || OS(FREEBSD) || OS(HURD)) \
++ && (OS(SOLARIS) || OS(DARWIN) || OS(LINUX) || OS(FREEBSD) || OS(HURD)) \
+ && (PLATFORM(MAC) || PLATFORM(IOS) || PLATFORM(GTK)) \
+ && (CPU(X86) || CPU(X86_64) || CPU(ARM_THUMB2) || CPU(ARM_TRADITIONAL) || CPU(ARM64) || CPU(MIPS) || CPU(SH4))
+ #define ENABLE_LLINT 1
+@@ -770,7 +779,7 @@
+
+ #if !defined(ENABLE_DFG_JIT) && ENABLE(JIT) && !COMPILER(MSVC)
+ /* Enable the DFG JIT on X86 and X86_64. */
+-#if (CPU(X86) || CPU(X86_64)) && (OS(DARWIN) || OS(LINUX) || OS(FREEBSD) || OS(HURD))
++#if (CPU(X86) || CPU(X86_64)) && (OS(SOLARIS) || OS(DARWIN) || OS(LINUX) || OS(FREEBSD) || OS(HURD))
+ #define ENABLE_DFG_JIT 1
+ #endif
+ /* Enable the DFG JIT on ARMv7. Only tested on iOS and Qt/GTK+ Linux. */
+Index: webkit/Source/JavaScriptCore/runtime/JSCJSValue.h
+===================================================================
+--- webkit.orig/Source/JavaScriptCore/runtime/JSCJSValue.h
++++ webkit/Source/JavaScriptCore/runtime/JSCJSValue.h
+@@ -405,6 +405,14 @@ private:
+ // alignment for a GC cell, and in the zero page).
+ #define ValueEmpty 0x0ll
+ #define ValueDeleted 0x4ll
++#if OS(SOLARIS_AMD64)
++// https://bugzilla.mozilla.org/show_bug.cgi?id=577056
++// Memory layout for 64-bit Solaris is different than other 64-bit systems.
++// User space memory may locate on PART-A (0xFFFFFD80.00000000 - 0xFFFF8000.00000000)
++// and PART-B (0x00008000.00000000 - 0x00000000.04000000).
++ bool isSolarisAMD64StackPointer() const;
++#endif
++
+ #endif
+
+ EncodedValueDescriptor u;
+Index: webkit/Source/JavaScriptCore/runtime/JSCJSValueInlines.h
+===================================================================
+--- webkit.orig/Source/JavaScriptCore/runtime/JSCJSValueInlines.h
++++ webkit/Source/JavaScriptCore/runtime/JSCJSValueInlines.h
+@@ -336,6 +336,13 @@ inline bool JSValue::asBoolean() const
+
+ #else // !USE(JSVALUE32_64) i.e. USE(JSVALUE64)
+
++#if OS(SOLARIS_AMD64)
++inline bool JSValue::isSolarisAMD64StackPointer() const
++{
++ return ((u.asInt64 & 0xFFFF800000000000LL) == 0xFFFF800000000000LL);
++}
++#endif
++
+ // 0x0 can never occur naturally because it has a tag of 00, indicating a pointer value, but a payload of 0x0, which is in the (invalid) zero page.
+ inline JSValue::JSValue()
+ {
+@@ -412,6 +419,10 @@ inline int32_t JSValue::asInt32() const
+
+ inline bool JSValue::isDouble() const
+ {
++#if OS(SOLARIS_AMD64)
++ if (isSolarisAMD64StackPointer())
++ return false;
++#endif
+ return isNumber() && !isInt32();
+ }
+
+@@ -437,22 +448,38 @@ inline JSValue::JSValue(JSFalseTag)
+
+ inline bool JSValue::isUndefinedOrNull() const
+ {
++#if OS(SOLARIS_AMD64)
++ if (isSolarisAMD64StackPointer())
++ return false;
++#endif
+ // Undefined and null share the same value, bar the 'undefined' bit in the extended tag.
+ return (u.asInt64 & ~TagBitUndefined) == ValueNull;
+ }
+
+ inline bool JSValue::isBoolean() const
+ {
++#if OS(SOLARIS_AMD64)
++ if (isSolarisAMD64StackPointer())
++ return false;
++#endif
+ return (u.asInt64 & ~1) == ValueFalse;
+ }
+
+ inline bool JSValue::isCell() const
+ {
++#if OS(SOLARIS_AMD64)
++ if (isSolarisAMD64StackPointer())
++ return true; // TRUE!
++#endif
+ return !(u.asInt64 & TagMask);
+ }
+
+ inline bool JSValue::isInt32() const
+ {
++#if OS(SOLARIS_AMD64)
++ if (isSolarisAMD64StackPointer())
++ return false;
++#endif
+ return (u.asInt64 & TagTypeNumber) == TagTypeNumber;
+ }
+
+@@ -483,6 +510,10 @@ inline double JSValue::asDouble() const
+
+ inline bool JSValue::isNumber() const
+ {
++#if OS(SOLARIS_AMD64)
++ if (isSolarisAMD64StackPointer())
++ return false;
++#endif
+ return u.asInt64 & TagTypeNumber;
+ }
+
+Index: webkit/Source/JavaScriptCore/jit/JITInlines.h
+===================================================================
+--- webkit.orig/Source/JavaScriptCore/jit/JITInlines.h
++++ webkit/Source/JavaScriptCore/jit/JITInlines.h
+@@ -989,7 +989,14 @@ ALWAYS_INLINE void JIT::emitInitRegister
+
+ ALWAYS_INLINE JIT::Jump JIT::emitJumpIfJSCell(RegisterID reg)
+ {
++#if OS(SOLARIS_AMD64)
++ // Does "reg" hold solaris 64-bit stack pointer?
++ move(TrustedImm64(static_cast<uint64_t>(0xFFFF800000000000)), scratchRegister);
++ and64(reg, scratchRegister);
++ return branch64(Equal, scratchRegister, TrustedImm64(static_cast<uint64_t>(0xFFFF800000000000)));
++#else
+ return branchTest64(Zero, reg, tagMaskRegister);
++#endif
+ }
+
+ ALWAYS_INLINE JIT::Jump JIT::emitJumpIfBothJSCells(RegisterID reg1, RegisterID reg2, RegisterID scratch)
+Index: webkit/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm
+===================================================================
+--- webkit.orig/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm
++++ webkit/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm
+@@ -323,12 +323,21 @@ end
+
+ macro loadConstantOrVariableInt32(index, value, slow)
+ loadConstantOrVariable(index, value)
++if SOLARIS_AMD64
++ bqaeq value, solarisAMD64StackBottom, slow
++end
+ bqb value, tagTypeNumber, slow
+ end
+
+ macro loadConstantOrVariableCell(index, value, slow)
+ loadConstantOrVariable(index, value)
++if SOLARIS_AMD64
++ bqaeq value, solarisAMD64StackBottom, .done
++end
+ btqnz value, tagMask, slow
++if SOLARIS_AMD64
++.done:
++end
+ end
+
+ macro writeBarrierOnOperand(cellOperand)
+@@ -518,7 +527,13 @@ _llint_op_to_this:
+ traceExecution()
+ loadisFromInstruction(1, t0)
+ loadq [cfr, t0, 8], t0
++if SOLARIS_AMD64
++ bqaeq t0, solarisAMD64StackBottom, .opToThisSolarisAMD64StackPointer
++end
+ btqnz t0, tagMask, .opToThisSlow
++if SOLARIS_AMD64
++.opToThisSolarisAMD64StackPointer:
++end
+ loadp JSCell::m_structure[t0], t0
+ bbneq Structure::m_typeInfo + TypeInfo::m_type[t0], FinalObjectType, .opToThisSlow
+ loadpFromInstruction(2, t2)
+@@ -636,7 +651,13 @@ _llint_op_neq:
+ macro equalNullComparison()
+ loadisFromInstruction(2, t0)
+ loadq [cfr, t0, 8], t0
++if SOLARIS_AMD64
++ bqaeq t0, solarisAMD64StackBottom, .solarisAMD64StackPointer
++end
+ btqnz t0, tagMask, .immediate
++if SOLARIS_AMD64
++.solarisAMD64StackPointer:
++end
+ loadp JSCell::m_structure[t0], t2
+ btbnz Structure::m_typeInfo + TypeInfo::m_flags[t2], MasqueradesAsUndefined, .masqueradesAsUndefined
+ move 0, t0
+@@ -676,6 +697,10 @@ macro strictEq(equalityOperation, slowPa
+ loadisFromInstruction(2, t2)
+ loadConstantOrVariable(t0, t1)
+ loadConstantOrVariable(t2, t0)
++if SOLARIS_AMD64
++ bqaeq t0, solarisAMD64StackBottom, .slow
++ bqaeq t1, solarisAMD64StackBottom, .slow
++end
+ move t0, t2
+ orq t1, t2
+ btqz t2, tagMask, .slow
+@@ -712,6 +737,9 @@ macro preOp(arithmeticOperation, slowPat
+ traceExecution()
+ loadisFromInstruction(1, t0)
+ loadq [cfr, t0, 8], t1
++if SOLARIS_AMD64
++ bqaeq t1, solarisAMD64StackBottom, .slow
++end
+ bqb t1, tagTypeNumber, .slow
+ arithmeticOperation(t1, .slow)
+ orq tagTypeNumber, t1
+@@ -740,6 +768,9 @@ _llint_op_to_number:
+ loadisFromInstruction(2, t0)
+ loadisFromInstruction(1, t1)
+ loadConstantOrVariable(t0, t2)
++if SOLARIS_AMD64
++ bqaeq t2, solarisAMD64StackBottom, .opToNumberSlow
++end
+ bqaeq t2, tagTypeNumber, .opToNumberIsImmediate
+ btqz t2, tagTypeNumber, .opToNumberSlow
+ .opToNumberIsImmediate:
+@@ -756,6 +787,9 @@ _llint_op_negate:
+ loadisFromInstruction(2, t0)
+ loadisFromInstruction(1, t1)
+ loadConstantOrVariable(t0, t2)
++if SOLARIS_AMD64
++ bqaeq t2, solarisAMD64StackBottom, .opNegateSlow
++end
+ bqb t2, tagTypeNumber, .opNegateNotInt
+ btiz t2, 0x7fffffff, .opNegateSlow
+ negi t2
+@@ -778,7 +812,13 @@ macro binaryOpCustomStore(integerOperati
+ loadisFromInstruction(2, t2)
+ loadConstantOrVariable(t0, t1)
+ loadConstantOrVariable(t2, t0)
++if SOLARIS_AMD64
++ bqaeq t0, solarisAMD64StackBottom, .slow
++end
+ bqb t0, tagTypeNumber, .op1NotInt
++if SOLARIS_AMD64
++ bqaeq t1, solarisAMD64StackBottom, .op2NotInt
++end
+ bqb t1, tagTypeNumber, .op2NotInt
+ loadisFromInstruction(1, t2)
+ integerOperationAndStore(t1, t0, .slow, t2)
+@@ -787,6 +827,9 @@ macro binaryOpCustomStore(integerOperati
+ .op1NotInt:
+ # First operand is definitely not an int, the second operand could be anything.
+ btqz t0, tagTypeNumber, .slow
++if SOLARIS_AMD64
++ bqaeq t1, solarisAMD64StackBottom, .slow
++end
+ bqaeq t1, tagTypeNumber, .op1NotIntOp2Int
+ btqz t1, tagTypeNumber, .slow
+ addq tagTypeNumber, t1
+@@ -807,6 +850,9 @@ macro binaryOpCustomStore(integerOperati
+ .op2NotInt:
+ # First operand is definitely an int, the second is definitely not.
+ loadisFromInstruction(1, t2)
++if SOLARIS_AMD64
++ bqaeq t1, solarisAMD64StackBottom, .slow
++end
+ btqz t1, tagTypeNumber, .slow
+ ci2d t0, ft0
+ addq tagTypeNumber, t1
+@@ -901,6 +947,10 @@ macro bitOp(operation, slowPath, advance
+ loadisFromInstruction(1, t3)
+ loadConstantOrVariable(t0, t1)
+ loadConstantOrVariable(t2, t0)
++if SOLARIS_AMD64
++ bqaeq t0, solarisAMD64StackBottom, .slow
++ bqaeq t1, solarisAMD64StackBottom, .slow
++end
+ bqb t0, tagTypeNumber, .slow
+ bqb t1, tagTypeNumber, .slow
+ operation(t1, t0)
+@@ -1004,6 +1054,9 @@ _llint_op_instanceof:
+ loadp JSCell::m_structure[t2], t2
+ loadq Structure::m_prototype[t2], t2
+ bqeq t2, t1, .opInstanceofDone
++if SOLARIS_AMD64
++ bqaeq t2, solarisAMD64StackBottom, .opInstanceofLoop
++end
+ btqz t2, tagMask, .opInstanceofLoop
+
+ move 0, t0
+@@ -1022,6 +1075,9 @@ _llint_op_is_undefined:
+ loadisFromInstruction(2, t1)
+ loadisFromInstruction(1, t2)
+ loadConstantOrVariable(t1, t0)
++if SOLARIS_AMD64
++ bqaeq t0, solarisAMD64StackBottom, .opIsUndefinedCell
++end
+ btqz t0, tagMask, .opIsUndefinedCell
+ cqeq t0, ValueUndefined, t3
+ orq ValueFalse, t3
+@@ -1059,6 +1115,12 @@ _llint_op_is_number:
+ loadisFromInstruction(2, t1)
+ loadisFromInstruction(1, t2)
+ loadConstantOrVariable(t1, t0)
++if SOLARIS_AMD64
++ bqb t0, solarisAMD64StackBottom, .opIsNumberNotSolarisAMD64StackPointer
++ storeq ValueFalse, [cfr, t2, 8]
++ dispatch(3)
++.opIsNumberNotSolarisAMD64StackPointer:
++end
+ tqnz t0, tagTypeNumber, t1
+ orq ValueFalse, t1
+ storeq t1, [cfr, t2, 8]
+@@ -1070,7 +1132,13 @@ _llint_op_is_string:
+ loadisFromInstruction(2, t1)
+ loadisFromInstruction(1, t2)
+ loadConstantOrVariable(t1, t0)
++if SOLARIS_AMD64
++ bqaeq t0, solarisAMD64StackBottom, .opIsStringSolarisAMD64StackPointer
++end
+ btqnz t0, tagMask, .opIsStringNotCell
++if SOLARIS_AMD64
++.opIsStringSolarisAMD64StackPointer:
++end
+ loadp JSCell::m_structure[t0], t0
+ cbeq Structure::m_typeInfo + TypeInfo::m_type[t0], StringType, t1
+ orq ValueFalse, t1
+@@ -1421,6 +1489,9 @@ macro putByVal(holeCheck, slowPath)
+ contiguousPutByVal(
+ macro (operand, scratch, address)
+ loadConstantOrVariable(operand, scratch)
++if SOLARIS_AMD64
++ bqaeq scratch, solarisAMD64StackBottom, .opPutByValSlow
++end
+ bpb scratch, tagTypeNumber, .opPutByValSlow
+ storep scratch, address
+ end)
+@@ -1430,6 +1501,9 @@ macro putByVal(holeCheck, slowPath)
+ contiguousPutByVal(
+ macro (operand, scratch, address)
+ loadConstantOrVariable(operand, scratch)
++if SOLARIS_AMD64
++ bqaeq scratch, solarisAMD64StackBottom, .notInt
++end
+ bqb scratch, tagTypeNumber, .notInt
+ ci2d scratch, ft0
+ jmp .ready
+@@ -1512,7 +1586,13 @@ macro equalNull(cellHandler, immediateHa
+ loadisFromInstruction(1, t0)
+ assertNotConstant(t0)
+ loadq [cfr, t0, 8], t0
++if SOLARIS_AMD64
++ bqaeq t0, solarisAMD64StackBottom, .solarisAMD64StackPointer
++end
+ btqnz t0, tagMask, .immediate
++if SOLARIS_AMD64
++.solarisAMD64StackPointer:
++end
+ loadp JSCell::m_structure[t0], t2
+ cellHandler(t2, Structure::m_typeInfo + TypeInfo::m_flags[t2], .target)
+ dispatch(3)
+@@ -1570,6 +1650,10 @@ macro compare(integerCompare, doubleComp
+ loadisFromInstruction(2, t3)
+ loadConstantOrVariable(t2, t0)
+ loadConstantOrVariable(t3, t1)
++if SOLARIS_AMD64
++ bqaeq t0, solarisAMD64StackBottom, .slow
++ bqaeq t1, solarisAMD64StackBottom, .slow
++end
+ bqb t0, tagTypeNumber, .op1NotInt
+ bqb t1, tagTypeNumber, .op2NotInt
+ integerCompare(t0, t1, .jumpTarget)
+@@ -1617,6 +1701,9 @@ _llint_op_switch_imm:
+ muli sizeof SimpleJumpTable, t3 # FIXME: would be nice to peephole this!
+ loadp CodeBlock::RareData::m_switchJumpTables + VectorBufferOffset[t2], t2
+ addp t3, t2
++if SOLARIS_AMD64
++ bqaeq t1, solarisAMD64StackBottom, .opSwitchImmFallThrough
++end
+ bqb t1, tagTypeNumber, .opSwitchImmNotInt
+ subi SimpleJumpTable::min[t2], t1
+ biaeq t1, SimpleJumpTable::branchOffsets + VectorSizeOffset[t2], .opSwitchImmFallThrough
+@@ -1645,7 +1732,13 @@ _llint_op_switch_char:
+ muli sizeof SimpleJumpTable, t3
+ loadp CodeBlock::RareData::m_switchJumpTables + VectorBufferOffset[t2], t2
+ addp t3, t2
++if SOLARIS_AMD64
++ bqaeq t1, solarisAMD64StackBottom, .opSwitchCharSolarisAMD64StackPointer
++end
+ btqnz t1, tagMask, .opSwitchCharFallThrough
++if SOLARIS_AMD64
++.opSwitchCharSolarisAMD64StackPointer:
++end
+ loadp JSCell::m_structure[t1], t0
+ bbneq Structure::m_typeInfo + TypeInfo::m_type[t0], StringType, .opSwitchCharFallThrough
+ bineq JSString::m_length[t1], 1, .opSwitchCharFallThrough
+@@ -1695,7 +1788,13 @@ macro arrayProfileForCall()
+ loadisFromInstruction(4, t3)
+ negp t3
+ loadq ThisArgumentOffset[cfr, t3, 8], t0
++if SOLARIS_AMD64
++ bqaeq t0, solarisAMD64StackBottom, .solarisAMD64StackPointer
++end
+ btqnz t0, tagMask, .done
++if SOLARIS_AMD64
++.solarisAMD64StackPointer:
++end
+ loadp JSCell::m_structure[t0], t0
+ loadpFromInstruction(6, t1)
+ storep t0, ArrayProfile::m_lastSeenStructure[t1]
+@@ -1759,7 +1858,13 @@ _llint_op_ret_object_or_this:
+ checkSwitchToJITForEpilogue()
+ loadisFromInstruction(1, t2)
+ loadConstantOrVariable(t2, t0)
++if SOLARIS_AMD64
++ bqaeq t0, solarisAMD64StackBottom, .opRetObjectOrThisSolarisAMD64StackPointer
++end
+ btqnz t0, tagMask, .opRetObjectOrThisNotObject
++if SOLARIS_AMD64
++.opRetObjectOrThisSolarisAMD64StackPointer:
++end
+ loadp JSCell::m_structure[t0], t2
+ bbb Structure::m_typeInfo + TypeInfo::m_type[t2], ObjectType, .opRetObjectOrThisNotObject
+ doReturn()
+@@ -1775,7 +1880,13 @@ _llint_op_to_primitive:
+ loadisFromInstruction(2, t2)
+ loadisFromInstruction(1, t3)
+ loadConstantOrVariable(t2, t0)
++if SOLARIS_AMD64
++ bqaeq t0, solarisAMD64StackBottom, .opToPrimitiveSolarisAMD64StackPointer
++end
+ btqnz t0, tagMask, .opToPrimitiveIsImm
++if SOLARIS_AMD64
++.opToPrimitiveSolarisAMD64StackPointer:
++end
+ loadp JSCell::m_structure[t0], t2
+ bbneq Structure::m_typeInfo + TypeInfo::m_type[t2], StringType, .opToPrimitiveSlowCase
+ .opToPrimitiveIsImm:
+Index: webkit/Source/JavaScriptCore/llint/LLIntOfflineAsmConfig.h
+===================================================================
+--- webkit.orig/Source/JavaScriptCore/llint/LLIntOfflineAsmConfig.h
++++ webkit/Source/JavaScriptCore/llint/LLIntOfflineAsmConfig.h
+@@ -124,6 +124,12 @@
+ #define OFFLINE_ASM_JSVALUE64 0
+ #endif
+
++#if OS(SOLARIS_AMD64)
++#define OFFLINE_ASM_SOLARIS_AMD64 1
++#else
++#define OFFLINE_ASM_SOLARIS_AMD64 0
++#endif
++
+ #if !ASSERT_DISABLED
+ #define OFFLINE_ASM_ASSERT_ENABLED 1
+ #else
+Index: webkit/Source/JavaScriptCore/llint/LowLevelInterpreter.asm
+===================================================================
+--- webkit.orig/Source/JavaScriptCore/llint/LowLevelInterpreter.asm
++++ webkit/Source/JavaScriptCore/llint/LowLevelInterpreter.asm
+@@ -60,6 +60,9 @@ const ValueFalse = TagBitTypeOther
+ const ValueTrue = TagBitTypeOther | TagBitBool | 1
+ const ValueUndefined = TagBitTypeOther | TagBitUndefined
+ const ValueNull = TagBitTypeOther
++if SOLARIS_AMD64
++const solarisAMD64StackBottom = 0xFFFF800000000000
++end
+ else
+ const Int32Tag = -1
+ const BooleanTag = -2