1 //===-- DNBArchImpl.h -------------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // Created by Greg Clayton on 6/25/07. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef __DebugNubArchMachPPC_h__ 15 #define __DebugNubArchMachPPC_h__ 16 17 #if defined (__powerpc__) || defined (__ppc__) || defined (__ppc64__) 18 19 #include "DNBArch.h" 20 21 class MachThread; 22 23 class DNBArchMachPPC : public DNBArchProtocol 24 { 25 public: 26 DNBArchMachPPC(MachThread *thread) : 27 m_thread(thread), 28 m_state() 29 { 30 } 31 32 virtual ~DNBArchMachPPC() 33 { 34 } 35 36 virtual const DNBRegisterSetInfo * 37 GetRegisterSetInfo(nub_size_t *num_reg_sets) const; 38 virtual bool GetRegisterValue(int set, int reg, DNBRegisterValue *value) const; 39 virtual kern_return_t GetRegisterState (int set, bool force); 40 virtual kern_return_t SetRegisterState (int set); 41 virtual bool RegisterSetStateIsValid (int set) const; 42 43 virtual uint64_t GetPC(uint64_t failValue); // Get program counter 44 virtual kern_return_t SetPC(uint64_t value); 45 virtual uint64_t GetSP(uint64_t failValue); // Get stack pointer 46 virtual bool ThreadWillResume(); 47 virtual bool ThreadDidStop(); 48 49 static const uint8_t * const SoftwareBreakpointOpcode (nub_size_t byte_size); 50 static uint32_t GetCPUType(); 51 52 protected: 53 54 55 kern_return_t EnableHardwareSingleStep (bool enable); 56 57 typedef enum RegisterSetTag 58 { 59 e_regSetALL = REGISTER_SET_ALL, 60 e_regSetGPR, 61 e_regSetFPR, 62 e_regSetEXC, 63 e_regSetVEC, 64 kNumRegisterSets 65 } RegisterSet; 66 67 typedef enum RegisterSetWordSizeTag 68 { 69 e_regSetWordSizeGPR = PPC_THREAD_STATE_COUNT, 70 e_regSetWordSizeFPR = PPC_FLOAT_STATE_COUNT, 71 e_regSetWordSizeEXC = PPC_EXCEPTION_STATE_COUNT, 72 e_regSetWordSizeVEC = PPC_VECTOR_STATE_COUNT 73 } RegisterSetWordSize; 74 75 enum 76 { 77 Read = 0, 78 Write = 1, 79 kNumErrors = 2 80 }; 81 82 struct State 83 { 84 ppc_thread_state_t gpr; 85 ppc_float_state_t fpr; 86 ppc_exception_state_t exc; 87 ppc_vector_state_t vec; 88 kern_return_t gpr_errs[2]; // Read/Write errors 89 kern_return_t fpr_errs[2]; // Read/Write errors 90 kern_return_t exc_errs[2]; // Read/Write errors 91 kern_return_t vec_errs[2]; // Read/Write errors 92 93 State() 94 { 95 uint32_t i; 96 for (i=0; i<kNumErrors; i++) 97 { 98 gpr_errs[i] = -1; 99 fpr_errs[i] = -1; 100 exc_errs[i] = -1; 101 vec_errs[i] = -1; 102 } 103 } 104 void InvalidateAllRegisterStates() 105 { 106 SetError (e_regSetALL, Read, -1); 107 } 108 kern_return_t GetError (int set, uint32_t err_idx) const 109 { 110 if (err_idx < kNumErrors) 111 { 112 switch (set) 113 { 114 // When getting all errors, just OR all values together to see if 115 // we got any kind of error. 116 case e_regSetALL: return gpr_errs[err_idx] | fpr_errs[err_idx] | exc_errs[err_idx] | vec_errs[err_idx]; 117 case e_regSetGPR: return gpr_errs[err_idx]; 118 case e_regSetFPR: return fpr_errs[err_idx]; 119 case e_regSetEXC: return exc_errs[err_idx]; 120 case e_regSetVEC: return vec_errs[err_idx]; 121 default: break; 122 } 123 } 124 return -1; 125 } 126 bool SetError (int set, uint32_t err_idx, kern_return_t err) 127 { 128 if (err_idx < kNumErrors) 129 { 130 switch (set) 131 { 132 case e_regSetALL: 133 gpr_errs[err_idx] = fpr_errs[err_idx] = exc_errs[err_idx] = vec_errs[err_idx] = err; 134 return true; 135 136 case e_regSetGPR: 137 gpr_errs[err_idx] = err; 138 return true; 139 140 case e_regSetFPR: 141 fpr_errs[err_idx] = err; 142 return true; 143 144 case e_regSetEXC: 145 exc_errs[err_idx] = err; 146 return true; 147 148 case e_regSetVEC: 149 vec_errs[err_idx] = err; 150 return true; 151 152 default: break; 153 } 154 } 155 return false; 156 } 157 bool RegsAreValid (int set) const 158 { 159 return GetError(set, Read) == KERN_SUCCESS; 160 } 161 }; 162 163 kern_return_t GetGPRState (bool force); 164 kern_return_t GetFPRState (bool force); 165 kern_return_t GetEXCState (bool force); 166 kern_return_t GetVECState (bool force); 167 168 kern_return_t SetGPRState (); 169 kern_return_t SetFPRState (); 170 kern_return_t SetEXCState (); 171 kern_return_t SetVECState (); 172 173 protected: 174 MachThread * m_thread; 175 State m_state; 176 }; 177 178 #endif // #if defined (__powerpc__) || defined (__ppc__) || defined (__ppc64__) 179 #endif // #ifndef __DebugNubArchMachPPC_h__ 180