DNBArchImplX86_64.h revision 5693e875ac7ac8d6ce1614da40e0b56f3f58716c
1ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch//===-- DNBArchImplX86_64.h -------------------------------------*- C++ -*-===// 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The LLVM Compiler Infrastructure 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Created by Greg Clayton on 6/25/07. 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef __DNBArchImplX86_64_h__ 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define __DNBArchImplX86_64_h__ 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined (__i386__) || defined (__x86_64__) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "DNBArch.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "../HasAVX.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "MachRegisterStatesX86_64.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MachThread; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DNBArchImplX86_64 : public DNBArchProtocol 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch{ 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochpublic: 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DNBArchImplX86_64(MachThread *thread) : 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) m_thread(thread), 2968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) m_state() 3068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) virtual ~DNBArchImplX86_64() 338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) { 348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 3668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) static void Initialize(); 378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) virtual bool GetRegisterValue(int set, int reg, DNBRegisterValue *value); 3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual bool SetRegisterValue(int set, int reg, const DNBRegisterValue *value); 3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual nub_size_t GetRegisterContext (void *buf, nub_size_t buf_len); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual nub_size_t SetRegisterContext (const void *buf, nub_size_t buf_len); 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual kern_return_t GetRegisterState (int set, bool force); 4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual kern_return_t SetRegisterState (int set); 4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual bool RegisterSetStateIsValid (int set) const; 4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual uint64_t GetPC(uint64_t failValue); // Get program counter 4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual kern_return_t SetPC(uint64_t value); 488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) virtual uint64_t GetSP(uint64_t failValue); // Get stack pointer 498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) virtual void ThreadWillResume(); 5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual bool ThreadDidStop(); 5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual bool NotifyException(MachException::Data& exc); 5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual uint32_t NumSupportedHardwareWatchpoints(); 54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual uint32_t EnableHardwareWatchpoint (nub_addr_t addr, nub_size_t size, bool read, bool write); 55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual bool DisableHardwareWatchpoint (uint32_t hw_break_index); 56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void HardwareWatchpointStateChanged (); 57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual uint32_t GetHardwareWatchpointHit(nub_addr_t &addr); 58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)protected: 60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) kern_return_t EnableHardwareSingleStep (bool enable); 61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) typedef __x86_64_thread_state_t GPR; 63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) typedef __x86_64_float_state_t FPU; 64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) typedef __x86_64_exception_state_t EXC; 65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) typedef __x86_64_avx_state_t AVX; 6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typedef __x86_64_debug_state_t DBG; 6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static const DNBRegisterInfo g_gpr_registers[]; 6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static const DNBRegisterInfo g_fpu_registers_no_avx[]; 7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static const DNBRegisterInfo g_fpu_registers_avx[]; 718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) static const DNBRegisterInfo g_exc_registers[]; 728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) static const DNBRegisterSetInfo g_reg_sets_no_avx[]; 7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static const DNBRegisterSetInfo g_reg_sets_avx[]; 7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static const size_t k_num_gpr_registers; 7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static const size_t k_num_fpu_registers_no_avx; 7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static const size_t k_num_fpu_registers_avx; 7768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) static const size_t k_num_exc_registers; 7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static const size_t k_num_all_registers_no_avx; 7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static const size_t k_num_all_registers_avx; 8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static const size_t k_num_register_sets; 8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) typedef enum RegisterSetTag 838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) { 8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) e_regSetALL = REGISTER_SET_ALL, 8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) e_regSetGPR, 8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) e_regSetFPU, 8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) e_regSetEXC, 8868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) e_regSetDBG, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kNumRegisterSets 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } RegisterSet; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef enum RegisterSetWordSizeTag 9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) { 9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) e_regSetWordSizeGPR = sizeof(GPR) / sizeof(int), 9568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) e_regSetWordSizeFPU = sizeof(FPU) / sizeof(int), 9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) e_regSetWordSizeEXC = sizeof(EXC) / sizeof(int), 9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) e_regSetWordSizeAVX = sizeof(AVX) / sizeof(int), 9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) e_regSetWordSizeDBG = sizeof(DBG) / sizeof(int) 9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } RegisterSetWordSize; 10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) enum 102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) { 10368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Read = 0, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Write = 1, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kNumErrors = 2 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Context 10968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) { 11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GPR gpr; 11168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) union { 11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FPU no_avx; 11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) AVX avx; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } fpu; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXC exc; 11668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DBG dbg; 11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) }; 11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // See also HardwareWatchpointStateChanged() which updates this class-wide variable. 12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static DBG Global_Debug_State; 12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static bool Valid_Global_Debug_State; 12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 12368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) struct State 12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) { 12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Context context; 12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) kern_return_t gpr_errs[2]; // Read/Write errors 12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) kern_return_t fpu_errs[2]; // Read/Write errors 1288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) kern_return_t exc_errs[2]; // Read/Write errors 1298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) kern_return_t dbg_errs[2]; // Read/Write errors 13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) State() 13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) { 13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) uint32_t i; 13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (i=0; i<kNumErrors; i++) 13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) { 13668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) gpr_errs[i] = -1; 13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fpu_errs[i] = -1; 13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) exc_errs[i] = -1; 13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) dbg_errs[i] = -1; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void 14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) InvalidateAllRegisterStates() 145a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) { 14668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) SetError (e_regSetALL, Read, -1); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kern_return_t 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetError (int flavor, uint32_t err_idx) const 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 15268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (err_idx < kNumErrors) 15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) { 15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switch (flavor) 15558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) { 15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // When getting all errors, just OR all values together to see if 15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // we got any kind of error. 15868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case e_regSetALL: return gpr_errs[err_idx] | 15958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fpu_errs[err_idx] | 16058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) exc_errs[err_idx]; 16158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case e_regSetGPR: return gpr_errs[err_idx]; 16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case e_regSetFPU: return fpu_errs[err_idx]; 16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case e_regSetEXC: return exc_errs[err_idx]; 16468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case e_regSetDBG: return dbg_errs[err_idx]; 165a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) default: break; 166a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 167a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 168a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return -1; 169a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 17068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 171a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool 172a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) SetError (int flavor, uint32_t err_idx, kern_return_t err) 173a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) { 174a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (err_idx < kNumErrors) 175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) { 17658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switch (flavor) 17758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) { 17858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case e_regSetALL: 17958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gpr_errs[err_idx] = 18058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fpu_errs[err_idx] = 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exc_errs[err_idx] = 18258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) dbg_errs[err_idx] = err; 18358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return true; 18458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 18558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case e_regSetGPR: 186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) gpr_errs[err_idx] = err; 18758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return true; 18858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 18958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case e_regSetFPU: 19058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fpu_errs[err_idx] = err; 19158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return true; 19258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 19358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case e_regSetEXC: 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exc_errs[err_idx] = err; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case e_regSetDBG: 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbg_errs[err_idx] = err; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) default: break; 202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool 208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RegsAreValid (int flavor) const 209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetError(flavor, Read) == KERN_SUCCESS; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) }; 21358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 21458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) kern_return_t GetGPRState (bool force); 21558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) kern_return_t GetFPUState (bool force); 21658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) kern_return_t GetEXCState (bool force); 21758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) kern_return_t GetDBGState (bool force); 21858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 21958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) kern_return_t SetGPRState (); 22058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) kern_return_t SetFPUState (); 221a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) kern_return_t SetEXCState (); 222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) kern_return_t SetDBGState (); 223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static DNBArchProtocol * 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Create (MachThread *thread); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static const uint8_t * const 228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SoftwareBreakpointOpcode (nub_size_t byte_size); 22958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static const DNBRegisterSetInfo * 231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetRegisterSetInfo(nub_size_t *num_reg_sets); 232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Helper functions for watchpoint manipulations. 234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static void SetWatchpoint(DBG &debug_state, uint32_t hw_index, nub_addr_t addr, nub_size_t size, bool read, bool write); 235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static void ClearWatchpoint(DBG &debug_state, uint32_t hw_index); 236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static bool IsWatchpointVacant(const DBG &debug_state, uint32_t hw_index); 237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static void ClearWatchpointHits(DBG &debug_state); 238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static bool IsWatchpointHit(const DBG &debug_state, uint32_t hw_index); 239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static nub_addr_t GetWatchAddress(const DBG &debug_state, uint32_t hw_index); 240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual bool StartTransForHWP(); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool RollbackTransForHWP(); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool FinishTransForHWP(); 24458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DBG GetDBGCheckpoint(); 24558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 24658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MachThread *m_thread; 24758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) State m_state; 24858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DBG m_2pc_dbg_checkpoint; 249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) uint32_t m_2pc_trans_state; // Is transaction of DBG state change: Pedning (0), Done (1), or Rolled Back (2)? 250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 251a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 252a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // #if defined (__i386__) || defined (__x86_64__) 253a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // #ifndef __DNBArchImplX86_64_h__ 25458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)