OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include <setjmp.h> // NOLINT | 5 #include <setjmp.h> // NOLINT |
6 #include <stdlib.h> | 6 #include <stdlib.h> |
7 | 7 |
8 #include "vm/globals.h" | 8 #include "vm/globals.h" |
9 #if defined(TARGET_ARCH_ARM) | 9 #if defined(TARGET_ARCH_ARM) |
10 | 10 |
(...skipping 1488 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1499 typedef double (*SimulatorLeafFloatRuntimeCall)(double d0, double d1); | 1499 typedef double (*SimulatorLeafFloatRuntimeCall)(double d0, double d1); |
1500 | 1500 |
1501 // Calls to native Dart functions are based on this interface. | 1501 // Calls to native Dart functions are based on this interface. |
1502 typedef void (*SimulatorBootstrapNativeCall)(NativeArguments* arguments); | 1502 typedef void (*SimulatorBootstrapNativeCall)(NativeArguments* arguments); |
1503 typedef void (*SimulatorNativeCall)(NativeArguments* arguments, uword target); | 1503 typedef void (*SimulatorNativeCall)(NativeArguments* arguments, uword target); |
1504 | 1504 |
1505 | 1505 |
1506 void Simulator::SupervisorCall(Instr* instr) { | 1506 void Simulator::SupervisorCall(Instr* instr) { |
1507 int svc = instr->SvcField(); | 1507 int svc = instr->SvcField(); |
1508 switch (svc) { | 1508 switch (svc) { |
1509 case kRedirectionSvcCode: { | 1509 case Instr::kSimulatorRedirectCode: { |
1510 SimulatorSetjmpBuffer buffer(this); | 1510 SimulatorSetjmpBuffer buffer(this); |
1511 | 1511 |
1512 if (!setjmp(buffer.buffer_)) { | 1512 if (!setjmp(buffer.buffer_)) { |
1513 int32_t saved_lr = get_register(LR); | 1513 int32_t saved_lr = get_register(LR); |
1514 Redirection* redirection = Redirection::FromSvcInstruction(instr); | 1514 Redirection* redirection = Redirection::FromSvcInstruction(instr); |
1515 uword external = redirection->external_function(); | 1515 uword external = redirection->external_function(); |
1516 if (IsTracingExecution()) { | 1516 if (IsTracingExecution()) { |
1517 OS::Print("Call to host function at 0x%" Pd "\n", external); | 1517 OS::Print("Call to host function at 0x%" Pd "\n", external); |
1518 } | 1518 } |
1519 | 1519 |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1620 | 1620 |
1621 // Return. | 1621 // Return. |
1622 set_pc(saved_lr); | 1622 set_pc(saved_lr); |
1623 } else { | 1623 } else { |
1624 // Coming via long jump from a throw. Continue to exception handler. | 1624 // Coming via long jump from a throw. Continue to exception handler. |
1625 set_top_exit_frame_info(0); | 1625 set_top_exit_frame_info(0); |
1626 } | 1626 } |
1627 | 1627 |
1628 break; | 1628 break; |
1629 } | 1629 } |
1630 case kBreakpointSvcCode: { | 1630 case Instr::kSimulatorBreakCode: { |
1631 SimulatorDebugger dbg(this); | 1631 SimulatorDebugger dbg(this); |
1632 dbg.Stop(instr, "breakpoint"); | 1632 dbg.Stop(instr, "breakpoint"); |
1633 break; | 1633 break; |
1634 } | 1634 } |
1635 case kStopMessageSvcCode: { | |
1636 SimulatorDebugger dbg(this); | |
1637 const char* message = *reinterpret_cast<const char**>( | |
1638 reinterpret_cast<intptr_t>(instr) - Instr::kInstrSize); | |
1639 set_pc(get_pc() + Instr::kInstrSize); | |
1640 dbg.Stop(instr, message); | |
1641 break; | |
1642 } | |
1643 default: { | 1635 default: { |
1644 UNREACHABLE(); | 1636 UNREACHABLE(); |
1645 break; | 1637 break; |
1646 } | 1638 } |
1647 } | 1639 } |
1648 } | 1640 } |
1649 | 1641 |
1650 | 1642 |
1651 // Handle execution based on instruction types. | 1643 // Handle execution based on instruction types. |
1652 | 1644 |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1689 int32_t rm_val = get_register(rm); | 1681 int32_t rm_val = get_register(rm); |
1690 intptr_t pc = get_pc(); | 1682 intptr_t pc = get_pc(); |
1691 set_register(LR, pc + Instr::kInstrSize); | 1683 set_register(LR, pc + Instr::kInstrSize); |
1692 set_pc(rm_val); | 1684 set_pc(rm_val); |
1693 break; | 1685 break; |
1694 } | 1686 } |
1695 case 7: { | 1687 case 7: { |
1696 if ((instr->Bits(21, 2) == 0x1) && (instr->ConditionField() == AL)) { | 1688 if ((instr->Bits(21, 2) == 0x1) && (instr->ConditionField() == AL)) { |
1697 // Format(instr, "bkpt #'imm12_4"); | 1689 // Format(instr, "bkpt #'imm12_4"); |
1698 SimulatorDebugger dbg(this); | 1690 SimulatorDebugger dbg(this); |
1699 set_pc(get_pc() + Instr::kInstrSize); | 1691 int32_t imm = instr->BkptField(); |
1700 char buffer[32]; | 1692 if (imm == Instr::kStopMessageCode) { |
1701 snprintf(buffer, sizeof(buffer), "bkpt #0x%x", instr->BkptField()); | 1693 const char* message = *reinterpret_cast<const char**>( |
1702 dbg.Stop(instr, buffer); | 1694 reinterpret_cast<intptr_t>(instr) - Instr::kInstrSize); |
| 1695 set_pc(get_pc() + Instr::kInstrSize); |
| 1696 dbg.Stop(instr, message); |
| 1697 } else { |
| 1698 char buffer[32]; |
| 1699 snprintf(buffer, sizeof(buffer), "bkpt #0x%x", imm); |
| 1700 set_pc(get_pc() + Instr::kInstrSize); |
| 1701 dbg.Stop(instr, buffer); |
| 1702 } |
1703 } else { | 1703 } else { |
1704 // Format(instr, "smc'cond"); | 1704 // Format(instr, "smc'cond"); |
1705 UnimplementedInstruction(instr); | 1705 UnimplementedInstruction(instr); |
1706 } | 1706 } |
1707 break; | 1707 break; |
1708 } | 1708 } |
1709 default: { | 1709 default: { |
1710 UnimplementedInstruction(instr); | 1710 UnimplementedInstruction(instr); |
1711 break; | 1711 break; |
1712 } | 1712 } |
(...skipping 2160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3873 set_register(kExceptionObjectReg, bit_cast<int32_t>(raw_exception)); | 3873 set_register(kExceptionObjectReg, bit_cast<int32_t>(raw_exception)); |
3874 set_register(kStackTraceObjectReg, bit_cast<int32_t>(raw_stacktrace)); | 3874 set_register(kStackTraceObjectReg, bit_cast<int32_t>(raw_stacktrace)); |
3875 buf->Longjmp(); | 3875 buf->Longjmp(); |
3876 } | 3876 } |
3877 | 3877 |
3878 } // namespace dart | 3878 } // namespace dart |
3879 | 3879 |
3880 #endif // !defined(HOST_ARCH_ARM) | 3880 #endif // !defined(HOST_ARCH_ARM) |
3881 | 3881 |
3882 #endif // defined TARGET_ARCH_ARM | 3882 #endif // defined TARGET_ARCH_ARM |
OLD | NEW |