Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (213375 => 213376)
--- trunk/Source/_javascript_Core/ChangeLog 2017-03-03 19:38:37 UTC (rev 213375)
+++ trunk/Source/_javascript_Core/ChangeLog 2017-03-03 21:05:55 UTC (rev 213376)
@@ -1,5 +1,38 @@
2017-03-03 Mark Lam <[email protected]>
+ Add MacroAssembler::isBreakpoint() query function.
+ https://bugs.webkit.org/show_bug.cgi?id=169139
+
+ Reviewed by Michael Saboff.
+
+ This will be needed soon when we use breakpoint instructions to implement
+ non-polling VM traps, and need to discern between a VM trap signal and a genuine
+ assertion breakpoint.
+
+ * assembler/ARM64Assembler.h:
+ (JSC::ARM64Assembler::isBrk):
+ (JSC::ARM64Assembler::excepnGenerationImmMask):
+ * assembler/ARMAssembler.h:
+ (JSC::ARMAssembler::isBkpt):
+ * assembler/ARMv7Assembler.h:
+ (JSC::ARMv7Assembler::isBkpt):
+ * assembler/MIPSAssembler.h:
+ (JSC::MIPSAssembler::isBkpt):
+ * assembler/MacroAssemblerARM.h:
+ (JSC::MacroAssemblerARM::isBreakpoint):
+ * assembler/MacroAssemblerARM64.h:
+ (JSC::MacroAssemblerARM64::isBreakpoint):
+ * assembler/MacroAssemblerARMv7.h:
+ (JSC::MacroAssemblerARMv7::isBreakpoint):
+ * assembler/MacroAssemblerMIPS.h:
+ (JSC::MacroAssemblerMIPS::isBreakpoint):
+ * assembler/MacroAssemblerX86Common.h:
+ (JSC::MacroAssemblerX86Common::isBreakpoint):
+ * assembler/X86Assembler.h:
+ (JSC::X86Assembler::isInt3):
+
+2017-03-03 Mark Lam <[email protected]>
+
We should only check for traps that we're able to handle.
https://bugs.webkit.org/show_bug.cgi?id=169136
Modified: trunk/Source/_javascript_Core/assembler/ARM64Assembler.h (213375 => 213376)
--- trunk/Source/_javascript_Core/assembler/ARM64Assembler.h 2017-03-03 19:38:37 UTC (rev 213375)
+++ trunk/Source/_javascript_Core/assembler/ARM64Assembler.h 2017-03-03 21:05:55 UTC (rev 213376)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012, 2014, 2017 Apple Inc. All rights reserved.
+ * Copyright (C) 2012-2017 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -868,6 +868,14 @@
insn(excepnGeneration(ExcepnOp_BREAKPOINT, imm, 0));
}
+ ALWAYS_INLINE static bool isBrk(void* address)
+ {
+ int expected = excepnGeneration(ExcepnOp_BREAKPOINT, 0, 0);
+ int immediateMask = excepnGenerationImmMask();
+ int candidateInstruction = *reinterpret_cast<int*>(address);
+ return (candidateInstruction & ~immediateMask) == expected;
+ }
+
template<int datasize>
ALWAYS_INLINE void cbnz(RegisterID rt, int32_t offset = 0)
{
@@ -3282,6 +3290,11 @@
const int op2 = 0;
return (0xd4000000 | opc << 21 | imm16 << 5 | op2 << 2 | LL);
}
+ ALWAYS_INLINE static int excepnGenerationImmMask()
+ {
+ uint16_t imm16 = std::numeric_limit<uint16_t>::max();
+ return (static_cast<int>(imm16) << 5);
+ }
ALWAYS_INLINE static int extract(Datasize sf, RegisterID rm, int imms, RegisterID rn, RegisterID rd)
{
Modified: trunk/Source/_javascript_Core/assembler/ARMAssembler.h (213375 => 213376)
--- trunk/Source/_javascript_Core/assembler/ARMAssembler.h 2017-03-03 19:38:37 UTC (rev 213375)
+++ trunk/Source/_javascript_Core/assembler/ARMAssembler.h 2017-03-03 21:05:55 UTC (rev 213376)
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2009, 2010 University of Szeged
+ * Copyright (C) 2017 Apple Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -701,6 +702,14 @@
m_buffer.putInt(BKPT | ((value & 0xff0) << 4) | (value & 0xf));
}
+ static bool isBkpt(void* address)
+ {
+ ARMWord expected = BKPT;
+ ARMWord immediateMask = (0xff0 << 4) | 0xf);
+ ARMWord candidateInstruction = *reinterpret_cast<ARMWord*>(address);
+ return (candidateInstruction & ~immediateMask) == expected;
+ }
+
void nop()
{
m_buffer.putInt(NOP);
Modified: trunk/Source/_javascript_Core/assembler/ARMv7Assembler.h (213375 => 213376)
--- trunk/Source/_javascript_Core/assembler/ARMv7Assembler.h 2017-03-03 19:38:37 UTC (rev 213375)
+++ trunk/Source/_javascript_Core/assembler/ARMv7Assembler.h 2017-03-03 21:05:55 UTC (rev 213376)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009, 2010, 2012, 2013, 2014 Apple Inc. All rights reserved.
+ * Copyright (C) 2009-2017 Apple Inc. All rights reserved.
* Copyright (C) 2010 University of Szeged
*
* Redistribution and use in source and binary forms, with or without
@@ -987,6 +987,14 @@
m_formatter.oneWordOp8Imm8(OP_BKPT, imm);
}
+ static bool isBkpt(void* address)
+ {
+ unsigned short expected = OP_BKPT;
+ unsigned short immediateMask = 0xff;
+ unsigned short candidateInstruction = *reinterpret_cast<unsigned short*>(address);
+ return (candidateInstruction & ~immediateMask) == expected;
+ }
+
ALWAYS_INLINE void clz(RegisterID rd, RegisterID rm)
{
ASSERT(!BadReg(rd));
Modified: trunk/Source/_javascript_Core/assembler/MIPSAssembler.h (213375 => 213376)
--- trunk/Source/_javascript_Core/assembler/MIPSAssembler.h 2017-03-03 19:38:37 UTC (rev 213375)
+++ trunk/Source/_javascript_Core/assembler/MIPSAssembler.h 2017-03-03 21:05:55 UTC (rev 213376)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2009-2017 Apple Inc. All rights reserved.
* Copyright (C) 2009 University of Szeged
* All rights reserved.
* Copyright (C) 2010 MIPS Technologies, Inc. All rights reserved.
@@ -447,6 +447,14 @@
emitInst(0x0000000d | ((value & 0x3ff) << OP_SH_CODE));
}
+ static bool isBkpt(void* address)
+ {
+ int value = 512; /* BRK_BUG */
+ MIPSWord expected = (0x0000000d | ((value & 0x3ff) << OP_SH_CODE));
+ MIPSWord candidateInstruction = *reinterpret_cast<MIPSWord*>(address);
+ return candidateInstruction == expected;
+ }
+
void bgez(RegisterID rs, int imm)
{
emitInst(0x04010000 | (rs << OP_SH_RS) | (imm & 0xffff));
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerARM.h (213375 => 213376)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerARM.h 2017-03-03 19:38:37 UTC (rev 213375)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerARM.h 2017-03-03 21:05:55 UTC (rev 213376)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008, 2013-2016 Apple Inc.
+ * Copyright (C) 2008-2017 Apple Inc.
* Copyright (C) 2009, 2010 University of Szeged
* All rights reserved.
*
@@ -955,6 +955,8 @@
m_assembler.bkpt(0);
}
+ static bool isBreakpoint(void* address) { return ARMAssembler::isBkpt(address); }
+
Call nearCall()
{
m_assembler.loadBranchTarget(ARMRegisters::S1, ARMAssembler::AL, true);
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerARM64.h (213375 => 213376)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerARM64.h 2017-03-03 19:38:37 UTC (rev 213375)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerARM64.h 2017-03-03 21:05:55 UTC (rev 213376)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012, 2014-2017 Apple Inc. All rights reserved.
+ * Copyright (C) 2012-2017 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -3348,6 +3348,8 @@
m_assembler.brk(imm);
}
+ static bool isBreakpoint(void* address) { return ARM64Assembler::isBrk(address); }
+
void nop()
{
m_assembler.nop();
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerARMv7.h (213375 => 213376)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerARMv7.h 2017-03-03 19:38:37 UTC (rev 213375)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerARMv7.h 2017-03-03 21:05:55 UTC (rev 213376)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2009-2010, 2014-2016 Apple Inc. All rights reserved.
+ * Copyright (C) 2009-2017 Apple Inc. All rights reserved.
* Copyright (C) 2010 University of Szeged
*
* Redistribution and use in source and binary forms, with or without
@@ -1752,6 +1752,8 @@
m_assembler.bkpt(imm);
}
+ static bool isBreakpoint(void* address) { return ARMv7Assembler::isBkpt(address); }
+
ALWAYS_INLINE Call nearCall()
{
moveFixedWidthEncoding(TrustedImm32(0), dataTempRegister);
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerMIPS.h (213375 => 213376)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerMIPS.h 2017-03-03 19:38:37 UTC (rev 213375)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerMIPS.h 2017-03-03 21:05:55 UTC (rev 213376)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008, 2014 Apple Inc. All rights reserved.
+ * Copyright (C) 2008-2017 Apple Inc. All rights reserved.
* Copyright (C) 2010 MIPS Technologies, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -2158,6 +2158,8 @@
m_assembler.bkpt();
}
+ static bool isBreakpoint(void* address) { return MIPSAssembler::isBkpt(address); }
+
Call nearCall()
{
/* We need two words for relaxation. */
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerX86Common.h (213375 => 213376)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerX86Common.h 2017-03-03 19:38:37 UTC (rev 213375)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerX86Common.h 2017-03-03 21:05:55 UTC (rev 213376)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008, 2014-2017 Apple Inc. All rights reserved.
+ * Copyright (C) 2008-2017 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -2557,6 +2557,8 @@
m_assembler.int3();
}
+ static bool isBreakpoint(void* address) { return X86Assembler::isInt3(address); }
+
Call nearTailCall()
{
return Call(m_assembler.jmp(), Call::LinkableNearTail);
Modified: trunk/Source/_javascript_Core/assembler/X86Assembler.h (213375 => 213376)
--- trunk/Source/_javascript_Core/assembler/X86Assembler.h 2017-03-03 19:38:37 UTC (rev 213375)
+++ trunk/Source/_javascript_Core/assembler/X86Assembler.h 2017-03-03 21:05:55 UTC (rev 213376)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008, 2012-2017 Apple Inc. All rights reserved.
+ * Copyright (C) 2008-2017 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -2760,6 +2760,12 @@
m_formatter.oneByteOp(OP_INT3);
}
+ static bool isInt3(void* address)
+ {
+ uint8_t candidateInstruction = *reinterpret_cast<uint8_t*>(address);
+ return candidateInstruction == OP_INT3;
+ }
+
void ret()
{
m_formatter.oneByteOp(OP_RET);