DNBArchImplI386.h revision 9d544f43d8c1637c45562f1402012c235f648ee9
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- DNBArchImplI386.h ---------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Created by Greg Clayton on 6/25/07. 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef __DNBArchImplI386_h__ 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define __DNBArchImplI386_h__ 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton#if defined (__i386__) || defined (__x86_64__) 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DNBArch.h" 20db15e0cbbd18d6cd10a0197bae31aafb9e078365Sean Callanan#include "../HasAVX.h" 214d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan#include "MachRegisterStatesI386.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass MachThread; 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DNBArchImplI386 : public DNBArchProtocol 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DNBArchImplI386(MachThread *thread) : 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_thread(thread), 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_state() 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual ~DNBArchImplI386() 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 3620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton 3720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton static void Initialize(); 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39fa1502444821fb699b14883bd24188c85a8793e0Johnny Chen virtual bool GetRegisterValue(int set, int reg, DNBRegisterValue *value); 40fa1502444821fb699b14883bd24188c85a8793e0Johnny Chen virtual bool SetRegisterValue(int set, int reg, const DNBRegisterValue *value); 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual nub_size_t GetRegisterContext (void *buf, nub_size_t buf_len); 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual nub_size_t SetRegisterContext (const void *buf, nub_size_t buf_len); 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual kern_return_t GetRegisterState (int set, bool force); 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual kern_return_t SetRegisterState (int set); 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool RegisterSetStateIsValid (int set) const; 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual uint64_t GetPC(uint64_t failValue); // Get program counter 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual kern_return_t SetPC(uint64_t value); 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual uint64_t GetSP(uint64_t failValue); // Get stack pointer 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual void ThreadWillResume(); 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool ThreadDidStop(); 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool NotifyException(MachException::Data& exc); 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 54eb0eae254e4e2d737b9c137296197a70a1ba7f68Johnny Chen virtual uint32_t NumSupportedHardwareWatchpoints(); 55eb0eae254e4e2d737b9c137296197a70a1ba7f68Johnny Chen virtual uint32_t EnableHardwareWatchpoint (nub_addr_t addr, nub_size_t size, bool read, bool write); 56eb0eae254e4e2d737b9c137296197a70a1ba7f68Johnny Chen virtual bool DisableHardwareWatchpoint (uint32_t hw_break_index); 57eb0eae254e4e2d737b9c137296197a70a1ba7f68Johnny Chen 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected: 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner kern_return_t EnableHardwareSingleStep (bool enable); 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 614d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan typedef __i386_thread_state_t GPR; 624d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan typedef __i386_float_state_t FPU; 634d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan typedef __i386_exception_state_t EXC; 644d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan typedef __i386_avx_state_t AVX; 65e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton typedef __i386_debug_state_t DBG; 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static const DNBRegisterInfo g_gpr_registers[]; 684d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan static const DNBRegisterInfo g_fpu_registers_no_avx[]; 694d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan static const DNBRegisterInfo g_fpu_registers_avx[]; 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static const DNBRegisterInfo g_exc_registers[]; 714d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan static const DNBRegisterSetInfo g_reg_sets_no_avx[]; 724d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan static const DNBRegisterSetInfo g_reg_sets_avx[]; 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static const size_t k_num_gpr_registers; 744d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan static const size_t k_num_fpu_registers_no_avx; 754d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan static const size_t k_num_fpu_registers_avx; 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static const size_t k_num_exc_registers; 774d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan static const size_t k_num_all_registers_no_avx; 784d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan static const size_t k_num_all_registers_avx; 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static const size_t k_num_register_sets; 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef enum RegisterSetTag 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner e_regSetALL = REGISTER_SET_ALL, 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner e_regSetGPR, 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner e_regSetFPU, 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner e_regSetEXC, 87e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton e_regSetDBG, 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner kNumRegisterSets 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } RegisterSet; 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef enum RegisterSetWordSizeTag 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 934d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan e_regSetWordSizeGPR = sizeof(GPR) / sizeof(int), 944d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan e_regSetWordSizeFPR = sizeof(FPU) / sizeof(int), 954d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan e_regSetWordSizeEXC = sizeof(EXC) / sizeof(int), 96e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton e_regSetWordSizeAVX = sizeof(AVX) / sizeof(int), 97e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton e_regSetWordSizeDBG = sizeof(DBG) / sizeof(int) 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } RegisterSetWordSize; 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner enum 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Read = 0, 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Write = 1, 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner kNumErrors = 2 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner struct Context 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 109e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton GPR gpr; 1104d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan union { 111e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton FPU no_avx; 112e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton AVX avx; 1134d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan } fpu; 114e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton EXC exc; 115e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton DBG dbg; 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner struct State 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Context context; 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner kern_return_t gpr_errs[2]; // Read/Write errors 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner kern_return_t fpu_errs[2]; // Read/Write errors 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner kern_return_t exc_errs[2]; // Read/Write errors 124e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton kern_return_t dbg_errs[2]; // Read/Write errors 1254d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner State() 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t i; 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (i=0; i<kNumErrors; i++) 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner gpr_errs[i] = -1; 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner fpu_errs[i] = -1; 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exc_errs[i] = -1; 134e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton dbg_errs[i] = -1; 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void InvalidateAllRegisterStates() 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetError (e_regSetALL, Read, -1); 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner kern_return_t GetError (int flavor, uint32_t err_idx) const 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (err_idx < kNumErrors) 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (flavor) 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // When getting all errors, just OR all values together to see if 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // we got any kind of error. 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case e_regSetALL: return gpr_errs[err_idx] | 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner fpu_errs[err_idx] | 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exc_errs[err_idx]; 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case e_regSetGPR: return gpr_errs[err_idx]; 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case e_regSetFPU: return fpu_errs[err_idx]; 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case e_regSetEXC: return exc_errs[err_idx]; 155e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton case e_regSetDBG: return dbg_errs[err_idx]; 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: break; 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return -1; 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool SetError (int flavor, uint32_t err_idx, kern_return_t err) 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (err_idx < kNumErrors) 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (flavor) 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case e_regSetALL: 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner gpr_errs[err_idx] = 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner fpu_errs[err_idx] = 170e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton exc_errs[err_idx] = 171e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton dbg_errs[err_idx] = err; 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case e_regSetGPR: 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner gpr_errs[err_idx] = err; 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case e_regSetFPU: 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner fpu_errs[err_idx] = err; 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case e_regSetEXC: 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exc_errs[err_idx] = err; 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 185e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton 186e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton case e_regSetDBG: 187e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton dbg_errs[err_idx] = err; 188e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton return true; 189e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: break; 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool RegsAreValid (int flavor) const 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetError(flavor, Read) == KERN_SUCCESS; 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner kern_return_t GetGPRState (bool force); 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner kern_return_t GetFPUState (bool force); 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner kern_return_t GetEXCState (bool force); 204e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton kern_return_t GetDBGState (bool force); 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner kern_return_t SetGPRState (); 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner kern_return_t SetFPUState (); 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner kern_return_t SetEXCState (); 209e39356825b86cd7484097ca4c4c9f07f9ff95e2eGreg Clayton kern_return_t SetDBGState (); 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton static DNBArchProtocol * 21220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton Create (MachThread *thread); 21320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton 21420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton static const uint8_t * const 21520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton SoftwareBreakpointOpcode (nub_size_t byte_size); 21620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton 21720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton static const DNBRegisterSetInfo * 21820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton GetRegisterSetInfo(nub_size_t *num_reg_sets); 2194d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan 2204d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan static bool 221db15e0cbbd18d6cd10a0197bae31aafb9e078365Sean Callanan CPUHasAVX() 2224d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan { 2234d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan if (s_has_avx == kAVXUnknown) 224db15e0cbbd18d6cd10a0197bae31aafb9e078365Sean Callanan s_has_avx = (::HasAVX() ? kAVXPresent : kAVXNotPresent); 2254d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan 2264d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan return (s_has_avx == kAVXPresent); 2274d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan } 22820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton 22925d2818c62140bb79cc3d689c4052b306c59c6b7Johnny Chen // Helper functions for watchpoint manipulations. 23025d2818c62140bb79cc3d689c4052b306c59c6b7Johnny Chen static void SetWatchpoint(DBG &debug_state, uint32_t hw_index, nub_addr_t addr, nub_size_t size, bool read, bool write); 23125d2818c62140bb79cc3d689c4052b306c59c6b7Johnny Chen static void ClearWatchpoint(DBG &debug_state, uint32_t hw_index); 23225d2818c62140bb79cc3d689c4052b306c59c6b7Johnny Chen static bool IsVacantWatchpoint(const DBG &debug_state, uint32_t hw_index); 2339d544f43d8c1637c45562f1402012c235f648ee9Johnny Chen static void ClearWatchpointHit(DBG &debug_state); 2349d544f43d8c1637c45562f1402012c235f648ee9Johnny Chen static bool IsWatchpointHit(const DBG &debug_state, uint32_t hw_index); 23525d2818c62140bb79cc3d689c4052b306c59c6b7Johnny Chen 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner MachThread *m_thread; 2374d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan State m_state; 2384d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan 2394d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan static enum AVXPresence { 2404d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan kAVXPresent, 2414d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan kAVXNotPresent, 2424d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan kAVXUnknown 2434d3a89ef9d015e0cc3c12736b61d367fd98fe073Sean Callanan } s_has_avx; 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton#endif // #if defined (__i386__) || defined (__x86_64__) 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif // #ifndef __DNBArchImplI386_h__ 248