Changeset 260680 in webkit
- Timestamp:
- Apr 24, 2020 4:35:02 PM (4 years ago)
- Location:
- trunk
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/ChangeLog
r260672 r260680 1 2020-04-24 Michael Catanzaro <mcatanzaro@gnome.org> 2 3 [GTK][WPE][JSCOnly] compile error when -DWTF_CPU_ARM64_CORTEXA53=ON set for arm64 4 https://bugs.webkit.org/show_bug.cgi?id=197192 5 6 Reviewed by Yusuke Suzuki. 7 8 * Source/cmake/OptionsCommon.cmake: 9 1 10 2020-04-24 Christopher Reid <chris.reid@sony.com> 2 11 -
trunk/Source/JavaScriptCore/ChangeLog
r260674 r260680 1 2020-04-24 Michael Catanzaro <mcatanzaro@gnome.org> 2 3 [GTK][WPE][JSCOnly] compile error when -DWTF_CPU_ARM64_CORTEXA53=ON set for arm64 4 https://bugs.webkit.org/show_bug.cgi?id=197192 5 6 Reviewed by Yusuke Suzuki. 7 8 This workaround is supposed to fix WebKit on old Cortex A53 CPUs, but it has been broken 9 since 2018, and people would like to use WebKit on modern Cortex A53. If anyone using WebKit 10 on the original hardware wants to fix and reimplement the workaround, feel free. 11 12 * assembler/ARM64Assembler.h: 13 (JSC::ARM64Assembler::adrp): 14 (JSC::ARM64Assembler::madd): 15 (JSC::ARM64Assembler::msub): 16 (JSC::ARM64Assembler::smaddl): 17 (JSC::ARM64Assembler::smsubl): 18 (JSC::ARM64Assembler::umaddl): 19 (JSC::ARM64Assembler::umsubl): 20 (JSC::ARM64Assembler::nopCortexA53Fix835769): Deleted. 21 (JSC::ARM64Assembler::nopCortexA53Fix843419): Deleted. 22 * offlineasm/arm64.rb: 23 * offlineasm/instructions.rb: 24 1 25 2020-04-24 Yusuke Suzuki <ysuzuki@apple.com> 2 26 -
trunk/Source/JavaScriptCore/assembler/ARM64Assembler.h
r259582 r260680 741 741 ASSERT(!(offset & 0xfff)); 742 742 insn(pcRelative(true, offset >> 12, rd)); 743 nopCortexA53Fix843419();744 743 } 745 744 … … 1386 1385 { 1387 1386 CHECK_DATASIZE(); 1388 nopCortexA53Fix835769<datasize>();1389 1387 insn(dataProcessing3Source(DATASIZE, DataOp_MADD, rm, ra, rn, rd)); 1390 1388 } … … 1439 1437 { 1440 1438 CHECK_DATASIZE(); 1441 nopCortexA53Fix835769<datasize>();1442 1439 insn(dataProcessing3Source(DATASIZE, DataOp_MSUB, rm, ra, rn, rd)); 1443 1440 } … … 1687 1684 ALWAYS_INLINE void smaddl(RegisterID rd, RegisterID rn, RegisterID rm, RegisterID ra) 1688 1685 { 1689 nopCortexA53Fix835769<64>();1690 1686 insn(dataProcessing3Source(Datasize_64, DataOp_SMADDL, rm, ra, rn, rd)); 1691 1687 } … … 1698 1694 ALWAYS_INLINE void smsubl(RegisterID rd, RegisterID rn, RegisterID rm, RegisterID ra) 1699 1695 { 1700 nopCortexA53Fix835769<64>();1701 1696 insn(dataProcessing3Source(Datasize_64, DataOp_SMSUBL, rm, ra, rn, rd)); 1702 1697 } … … 1956 1951 ALWAYS_INLINE void umaddl(RegisterID rd, RegisterID rn, RegisterID rm, RegisterID ra) 1957 1952 { 1958 nopCortexA53Fix835769<64>();1959 1953 insn(dataProcessing3Source(Datasize_64, DataOp_UMADDL, rm, ra, rn, rd)); 1960 1954 } … … 1967 1961 ALWAYS_INLINE void umsubl(RegisterID rd, RegisterID rn, RegisterID rm, RegisterID ra) 1968 1962 { 1969 nopCortexA53Fix835769<64>();1970 1963 insn(dataProcessing3Source(Datasize_64, DataOp_UMSUBL, rm, ra, rn, rd)); 1971 1964 } … … 3729 3722 } 3730 3723 3731 // Workaround for Cortex-A53 erratum (835769). Emit an extra nop if the3732 // last instruction in the buffer is a load, store or prefetch. Needed3733 // before 64-bit multiply-accumulate instructions.3734 template<int datasize>3735 ALWAYS_INLINE void nopCortexA53Fix835769()3736 {3737 #if CPU(ARM64_CORTEXA53)3738 CHECK_DATASIZE();3739 if (datasize == 64) {3740 if (LIKELY(m_buffer.codeSize() >= sizeof(int32_t))) {3741 // From ARMv8 Reference Manual, Section C4.1: the encoding of the3742 // instructions in the Loads and stores instruction group is:3743 // ---- 1-0- ---- ---- ---- ---- ---- ----3744 if (UNLIKELY((*reinterpret_cast_ptr<int32_t*>(reinterpret_cast_ptr<char*>(m_buffer.data()) + m_buffer.codeSize() - sizeof(int32_t)) & 0x0a000000) == 0x08000000))3745 nop();3746 }3747 }3748 #endif3749 }3750 3751 // Workaround for Cortex-A53 erratum (843419). Emit extra nops to avoid3752 // wrong address access after ADRP instruction.3753 ALWAYS_INLINE void nopCortexA53Fix843419()3754 {3755 #if CPU(ARM64_CORTEXA53)3756 nop();3757 nop();3758 nop();3759 #endif3760 }3761 3762 3724 Vector<LinkRecord, 0, UnsafeVectorOverflow> m_jumpsToLink; 3763 3725 int m_indexOfLastWatchpoint; -
trunk/Source/JavaScriptCore/offlineasm/arm64.rb
r252422 r260680 352 352 end 353 353 354 # Workaround for Cortex-A53 erratum (835769)355 def arm64CortexA53Fix835769(list)356 newList = []357 lastOpcodeUnsafe = false358 359 list.each {360 | node |361 if node.is_a? Instruction362 case node.opcode363 when /^store/, /^load/364 # List all macro instructions that can be lowered to a load, store or prefetch ARM64 assembly instruction365 lastOpcodeUnsafe = true366 when "muli", "mulp", "mulq", "smulli"367 # List all macro instructions that can be lowered to a 64-bit multiply-accumulate ARM64 assembly instruction368 # (defined as one of MADD, MSUB, SMADDL, SMSUBL, UMADDL or UMSUBL).369 if lastOpcodeUnsafe370 newList << Instruction.new(node.codeOrigin, "nopCortexA53Fix835769", [])371 end372 lastOpcodeUnsafe = false373 else374 lastOpcodeUnsafe = false375 end376 end377 newList << node378 }379 newList380 end381 382 354 class Sequence 383 355 def getModifiedListARM64(result = @list) … … 471 443 result = assignRegistersToTemporaries(result, :gpr, ARM64_EXTRA_GPRS) 472 444 result = assignRegistersToTemporaries(result, :fpr, ARM64_EXTRA_FPRS) 473 result = arm64CortexA53Fix835769(result)474 445 return result 475 446 end … … 1116 1087 when "pcrtoaddr" 1117 1088 $asm.puts "adr #{operands[1].arm64Operand(:quad)}, #{operands[0].value}" 1118 when "nopCortexA53Fix835769"1119 $asm.putStr("#if CPU(ARM64_CORTEXA53)")1120 $asm.puts "nop"1121 $asm.putStr("#endif")1122 1089 when "globaladdr" 1123 1090 uid = $asm.newUID -
trunk/Source/JavaScriptCore/offlineasm/instructions.rb
r252422 r260680 355 355 "bfiq", # Bit field insert <source reg> <last bit written> <width immediate> <dest reg> 356 356 "pcrtoaddr", # Address from PC relative offset - adr instruction 357 "nopFixCortexA53Err835769", # nop on Cortex-A53 (nothing otherwise)358 357 "globaladdr", 359 358 "divi", -
trunk/Source/cmake/OptionsCommon.cmake
r260554 r260680 19 19 set_property(GLOBAL PROPERTY USE_FOLDERS ON) 20 20 define_property(TARGET PROPERTY FOLDER INHERITED BRIEF_DOCS "folder" FULL_DOCS "IDE folder name") 21 22 # Detect Cortex-A53 core if CPU is ARM64 and OS is Linux.23 # Query /proc/cpuinfo for each available core and check reported CPU part number: 0xd03 signals Cortex-A53.24 # (see Main ID Register in ARM Cortex-A53 MPCore Processor Technical Reference Manual)25 set(WTF_CPU_ARM64_CORTEXA53_INITIALVALUE OFF)26 if (WTF_CPU_ARM64 AND (${CMAKE_SYSTEM_NAME} STREQUAL "Linux"))27 execute_process(COMMAND nproc OUTPUT_VARIABLE PROC_COUNT)28 math(EXPR PROC_MAX ${PROC_COUNT}-1)29 foreach (PROC_ID RANGE ${PROC_MAX})30 execute_process(COMMAND taskset -c ${PROC_ID} grep "^CPU part" /proc/cpuinfo OUTPUT_VARIABLE PROC_PART)31 if (PROC_PART MATCHES "0xd03")32 set(WTF_CPU_ARM64_CORTEXA53_INITIALVALUE ON)33 break ()34 endif ()35 endforeach ()36 endif ()37 option(WTF_CPU_ARM64_CORTEXA53 "Enable Cortex-A53-specific code paths" ${WTF_CPU_ARM64_CORTEXA53_INITIALVALUE})38 39 if (WTF_CPU_ARM64_CORTEXA53)40 if (NOT WTF_CPU_ARM64)41 message(FATAL_ERROR "WTF_CPU_ARM64_CORTEXA53 set without WTF_CPU_ARM64")42 endif ()43 WEBKIT_PREPEND_GLOBAL_COMPILER_FLAGS(-mfix-cortex-a53-835769)44 endif ()45 46 EXPOSE_VARIABLE_TO_BUILD(WTF_CPU_ARM64_CORTEXA53)47 21 48 22 set(ARM_TRADITIONAL_DETECTED FALSE)
Note: See TracChangeset
for help on using the changeset viewer.