1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
|
/*
ppc_regdefs.c - necessary ppc definition for skyeye debugger
Copyright (C) 2003 Skyeye Develop Group
for help please send mail to <skyeye-developer@lists.sf.linuxforum.net>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*
* 12/21/2006 Michael.Kang <blackfin.kang@gmail.com>
*/
/*
* according to GDB_SOURCE/gdb/regformats/ppc-reg.dat
32:r0 32:r1 32:r2 32:r3 32:r4 32:r5 32:r6 32:r7
32:r8 32:r9 32:r10 32:r11 32:r12 32:r13 32:r14 32:r15
32:r16 32:r17 32:r18 32:r19 32:r20 32:r21 32:r22 32:r23
32:r24 32:r25 32:r26 32:r27 32:r28 32:r29 32:r30 32:r31
64:f0 64:f1 64:f2 64:f3 64:f4 64:f5 64:f6 64:f7
64:f8 64:f9 64:f10 64:f11 64:f12 64:f13 64:f14 64:f15
64:f16 64:f17 64:f18 64:f19 64:f20 64:f21 64:f22 64:f23
64:f24 64:f25 64:f26 64:f27 64:f28 64:f29 64:f30 64:f31
32:pc 32:ps 32:cr 32:lr 32:ctr 32:xer 32:fpscr
* in gdb internal, it seem that there is 72 register, need to dig more.
*/
#include <skyeye_defs.h>
#include "skyeye2gdb.h"
#include "ppc_cpu.h"
extern PPC_CPU_State gCPU;
static int ppc_register_raw_size(int x){
#if 0
if(x > 31 && x < 64)
return 8;
else
#endif
return 4;
}
static int ppc_register_byte(int x){
#if 0
if(x < 32)
return (4 * x);
else if(31 < x && x < 64)
return (32 * 4 + (x - 32) * 8);
else
return (32 * 4 + 32 * 8 + (x - 64) * 4);
#endif
return 4 * x;
}
static int ppc_store_register(int rn, unsigned char * memory){
int v = frommem(memory);
if(rn < 32)
gCPU.gpr[rn] = v ;
else if(rn > 31 && rn < 64)
return 0;
else{
switch(rn){
case 64:
//NIA = v;
gCPU.pc = v;
break;
case 65:
gCPU.msr = v;
//MSR = v;
break;
case 66:
//CR = v;
gCPU.cr = v;
break;
case 67:
//LR = v;
gCPU.lr = v;
break;
case 68:
//CTR = v;
gCPU.ctr = v;
break;
case 69:
//XER = v;
gCPU.xer = v;
return;
case 70:
//FPSCR = v;
gCPU.fpscr = v;
break;
case 71:
break;
default:
fprintf(stderr,"Wrong reg number 0x%d in %s\n", rn, __FUNCTION__);
return -1;
}
}
return 0;
}
static int ppc_fetch_register(int rn, unsigned char * memory){
uint32_t v;
if(rn < 32)
v = gCPU.gpr[rn];
else if(rn > 31 && rn < 64)
return 0;
else{
switch(rn){
case 64:
v = gCPU.pc;
break;
case 65:
v = gCPU.msr;
break;
case 66:
v = gCPU.cr;
break;
case 67:
v = gCPU.lr;
break;
case 68:
v = gCPU.ctr;
break;
case 69:
v = gCPU.xer;
break;
case 70:
v = gCPU.fpscr;
break;
default:
v = 0;
//fprintf(stderr,"Wrong reg number 0x%d in %s\n", rn, __FUNCTION__);
//return -1;
}
}
tomem (memory, v);
return 0;
}
/*
* register powerpc register type to the array
*/
void init_ppc_register_defs(void){
/* initialize the struct of powerpc register defination */
static register_defs_t ppc_reg_defs;
ppc_reg_defs.name = "ppc";
ppc_reg_defs.register_raw_size = ppc_register_raw_size;
ppc_reg_defs.register_bytes = 32 * 4 + 32 * 4 + 7 * 4;
ppc_reg_defs.register_byte = ppc_register_byte;
ppc_reg_defs.num_regs = 71; /* the total number of ppc register is 71 */
ppc_reg_defs.max_register_raw_size = 4;
ppc_reg_defs.store_register = ppc_store_register;
ppc_reg_defs.fetch_register = ppc_fetch_register;
ppc_reg_defs.endian_flag = HIGH;
register_reg_type(&ppc_reg_defs);
}
|