diff options
Diffstat (limited to 'debian/patches/dyson-solaris-amd64-memory-layout.patch')
-rw-r--r-- | debian/patches/dyson-solaris-amd64-memory-layout.patch | 492 |
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 |