📄 debug.c
字号:
#ifdef EXTERN
#undef EXTERN
#endif
#define EXTERN extern
#include "global.h"
void break_point_add(UINT32 addr,int addr_type)
{
break_point_node * p;
if ((p=(break_point_node *)malloc(sizeof(break_point_node)))==NULL)
{
fprintf(stderr,"(break_point_add)Error when malloc memory. Aborting!\n");
exit(1);
}
else
{
p->addr = addr;
p->addr_type = addr_type;
p->next = NULL;
}
if (debug.break_point_number==0)
{
//an empty queue
debug.break_point_header= p;
debug.break_point_tail = p;
}
else
{
debug.break_point_tail->next = p;
debug.break_point_tail = p;
}
debug.break_point_number++;
}
void break_point_delete(int i)
{
break_point_node * p,*q;
int j;
if ((i>debug.break_point_number)||(i<=0))
{
printf("You have entered a invalid breakpoint number to delete!\n");
return ;
}
if (debug.break_point_number==0)
{
//an empty queue
}
else if(debug.break_point_number==1)
{
//only one node and i=1
free(debug.break_point_header);
debug.break_point_header=NULL;
debug.break_point_tail=NULL;
}
else
{
j=1;
p=debug.break_point_header;
while (j<(i-1))
{
p=p->next;
++j;
}
if (i!=1)
{
q= p->next;
p->next=p->next->next;
free(q);
}
else
{
q=p;
p=p->next;
free(q);
debug.break_point_header=p;
}
}
debug.break_point_number--;
}
void break_point_info()
{
int i;
break_point_node * p;
p=debug.break_point_header;
i =0;
while (p!=NULL)
{
i++;
printf("Breakpoint %d : 0x%x",i,p->addr);
if (p->addr_type==VADDR)
{
printf("(V)");
}
else
{
printf("(P)");
}
printf("\n");
p=p->next;
}
printf("%d breakpoints total",i);
printf("\n");
}
static void cpr_number2name(int index,char name[])
{
switch (index)
{
case 0:
sprintf(name,"%s","zero");
break;
case 1:
sprintf(name,"%s","at");
break;
case 2:
sprintf(name,"%s","v0");
break;
case 3:
sprintf(name,"%s","v1");
break;
case 4:
sprintf(name,"%s","a0");
break;
case 5:
sprintf(name,"%s","a1");
break;
case 6:
sprintf(name,"%s","a2");
break;
case 7:
sprintf(name,"%s","a3");
break;
case 8:
sprintf(name,"%s","t0");
break;
case 9:
sprintf(name,"%s","t1");
break;
case 10:
sprintf(name,"%s","t2");
break;
case 11:
sprintf(name,"%s","t3");
break;
case 12:
sprintf(name,"%s","t4");
break;
case 13:
sprintf(name,"%s","t5");
break;
case 14:
sprintf(name,"%s","56");
break;
case 15:
sprintf(name,"%s","t7");
break;
case 16:
sprintf(name,"%s","s0");
break;
case 17:
sprintf(name,"%s","s1");
break;
case 18:
sprintf(name,"%s","s2");
break;
case 19:
sprintf(name,"%s","s3");
break;
case 20:
sprintf(name,"%s","s4");
break;
case 21:
sprintf(name,"%s","s5");
break;
case 22:
sprintf(name,"%s","s6");
break;
case 23:
sprintf(name,"%s","s7");
break;
case 24:
sprintf(name,"%s","t8");
break;
case 25:
sprintf(name,"%s","t9");
break;
case 26:
sprintf(name,"%s","k0");
break;
case 27:
sprintf(name,"%s","k1");
break;
case 28:
sprintf(name,"%s","gp");
break;
case 29:
sprintf(name,"%s","sp");
break;
case 30:
sprintf(name,"%s","s8");
break;
case 31:
sprintf(name,"%s","ra");
break;
}
}
void cp0r_number2name(int index,char name[])
{
switch (index)
{
case INDEX:
sprintf(name,"%s","Index");
break;
case RANDOM:
sprintf(name,"%s","Random");
break;
case ENTRYLO:
sprintf(name,"%s","Entrylo");
break;
case CONTEXT:
sprintf(name,"%s","Context");
break;
case BADVADDR:
sprintf(name,"%s","Badvaddr");
break;
case ENTRYHI:
sprintf(name,"%s","Entryhi");
break;
case SR:
sprintf(name,"%s","Sr");
break;
case CAUSE:
sprintf(name,"%s","Cause");
break;
case EPC:
sprintf(name,"%s","EPC");
break;
case PRID:
sprintf(name,"%s","PRID");
break;
}
}
static void cp_register_info(int index)
{
char name[10];
int i;
if (index==-1)
{
for(i=0;i<CPU_REGISTER_NUMBER;i++)
{
index = i;
cpr_number2name(index,name);
printf("CPU Register #%d [%s]: 0x%x\n",index,name,cpu_register[index]);
}
printf("CPU Register [%s]: 0x%x\n","mthi",hi);
printf("CPU Register [%s]: 0x%x\n","mtloi",lo);
return;
}
if (strncasecmp(name,"mthi",4)==0)
{
printf("CPU Register [%s]: 0x%x\n","mthi",hi);
}
else if (strncasecmp(name,"mthlo",5)==0)
{
printf("CPU Register [%s]: 0x%x\n","mthlo",lo);
}
else
{
cpr_number2name(index,name);
printf("CPU Register #%d [%s]: 0x%x\n",index,name,cpu_register[index]);
}
}
void decode_cp0_register(int index)
{
switch (index)
{
case INDEX:
printf("[P]:%d ",(cp0_register[index] & CP0_INDEX_P_MASK)>>31 );
printf("[Index]:%d ",(cp0_register[index] & CP0_INDEX_INDEX_MASK)>>8 );
printf("\n");
break;
case RANDOM:
printf("[Random]:%d ",(cp0_register[index] & CP0_RANDOM_RANDOM_MASK)>>8 );
printf("\n");
break;
case ENTRYLO:
printf("[PFN]:0x%x ",(cp0_register[index] & CP0_ENTRYLO_PFN_MASK)>>12 );
printf("[N]:%d ",(cp0_register[index] & CP0_ENTRYLO_N_MASK)>>11 );
printf("[D]:%d ",(cp0_register[index] & CP0_ENTRYLO_D_MASK)>>10 );
printf("[V]:%d ",(cp0_register[index] & CP0_ENTRYLO_V_MASK)>>9 );
printf("[G]:%d ",(cp0_register[index] & CP0_ENTRYLO_G_MASK)>>8 );
printf("\n");
break;
case CONTEXT:
printf("[PTEBase]:0x%x ",(cp0_register[index] & CP0_CONTEXT_PTEBASE_MASK)>>21 );
printf("[BADVPN]:0x%x ",(cp0_register[index] & CP0_CONTEXT_BADVPN_MASK)>>2 );
printf("\n");
break;
case BADVADDR:
printf("\n");
break;
case ENTRYHI:
printf("[VPN]:0x%x ",(cp0_register[index] & CP0_ENTRYHI_VPN_MASK)>>12 );
printf("[ASID]:%d ",(cp0_register[index] & CP0_ENTRYHI_ASID_MASK)>>6 );
printf("\n");
break;
case SR:
printf("[CU1]:%d ",(cp0_register[index] & CP0_SR_CU1_MASK)>>29);
printf("[CU0]:%d ",(cp0_register[index] & CP0_SR_CU0_MASK)>>28);
printf("[CU0]:%d ",(cp0_register[index] & CP0_SR_RE_MASK)>>25);
printf("[BEV]:%d ",(cp0_register[index] & CP0_SR_BEV_MASK)>>22);
printf("[TS]:%d ",(cp0_register[index] & CP0_SR_TS_MASK)>>21);
printf("[PE]:%d ",(cp0_register[index] & CP0_SR_PE_MASK)>>20);
printf("\n");
printf("[CM]:%d ",(cp0_register[index] & CP0_SR_CM_MASK)>>19);
printf("[PZ]:%d ",(cp0_register[index] & CP0_SR_PZ_MASK)>>18);
printf("[SWC]:%d ",(cp0_register[index] & CP0_SR_SWC_MASK)>>17);
printf("[ISC]:%d ",(cp0_register[index] & CP0_SR_ISC_MASK)>>16);
printf("[IM]:0x%x ",(cp0_register[index] & CP0_SR_IM_MASK)>>8);
printf("\n");
printf("[KU0]:%d ",(cp0_register[index] & CP0_SR_KUO_MASK)>>5);
printf("[IE0]:%d ",(cp0_register[index] & CP0_SR_IEO_MASK)>>4);
printf("[KUP]:%d ",(cp0_register[index] & CP0_SR_KUP_MASK)>>3);
printf("[IEP]:%d ",(cp0_register[index] & CP0_SR_IEP_MASK)>>2);
printf("[KUC]:%d ",(cp0_register[index] & CP0_SR_KUC_MASK)>>1);
printf("[IEC]:%d ",(cp0_register[index] & CP0_SR_IEC_MASK));
//printf("\n");
break;
case CAUSE:
printf("[BD]:%d ",(cp0_register[index] & CP0_CAUSE_BD_MASK)>>31);
printf("[CE]:%d ",(cp0_register[index] & CP0_CAUSE_CE_MASK)>>28);
printf("[IP]:%d ",(cp0_register[index] & CP0_CAUSE_IP_MASK)>>8);
printf("[Exccode]:%d ",(cp0_register[index] & CP0_CAUSE_EXCCODE_MASK)>>2);
printf("\n");
break;
case EPC:
printf("\n");
break;
case PRID:
printf("[IMP]:%d ",(cp0_register[index] & CP0_PRID_IMP_MASK)>>8);
printf("[REV]:%d ",(cp0_register[index] & CP0_PRID_REV_MASK));
printf("\n");
break;
}
}
void cp0_register_info(int index)
{
char name[10];
if (index==-1)
{
index = INDEX;
cp0r_number2name(index,name);
printf("CP0 Register #%d [%s]: 0x%x",index,name,cp0_register[index]);
decode_cp0_register( index);
index = RANDOM;
cp0r_number2name(index,name);
printf("CP0 Register #%d [%s]: 0x%x",index,name,cp0_register[index]);
decode_cp0_register( index);
index = ENTRYLO;
cp0r_number2name(index,name);
printf("CP0 Register #%d [%s]: 0x%x",index,name,cp0_register[index]);
decode_cp0_register( index);
index = CONTEXT;
cp0r_number2name(index,name);
printf("CP0 Register #%d [%s]: 0x%x",index,name,cp0_register[index]);
decode_cp0_register( index);
index = BADVADDR;
cp0r_number2name(index,name);
printf("CP0 Register #%d [%s]: 0x%x",index,name,cp0_register[index]);
decode_cp0_register( index);
index = ENTRYHI;
cp0r_number2name(index,name);
printf("CP0 Register #%d [%s]: 0x%x",index,name,cp0_register[index]);
decode_cp0_register( index);
index = SR;
cp0r_number2name(index,name);
printf("CP0 Register #%d [%s]: 0x%x",index,name,cp0_register[index]);
decode_cp0_register( index);
index = CAUSE;
cp0r_number2name(index,name);
printf("CP0 Register #%d [%s]: 0x%x",index,name,cp0_register[index]);
decode_cp0_register( index);
index = EPC;
cp0r_number2name(index,name);
printf("CP0 Register #%d [%s]: 0x%x",index,name,cp0_register[index]);
decode_cp0_register( index);
index = PRID;
cp0r_number2name(index,name);
printf("CP0 Register #%d [%s]: 0x%x",index,name,cp0_register[index]);
decode_cp0_register( index);
}
else
{
cp0r_number2name(index,name);
printf("CP0 Register #%d [%s]: 0x%x",index,name,cp0_register[index]);
decode_cp0_register( index);
}
}
static void tlb_info(int low,int high)
{
int i;
for (i=low;i<=high;i++)
{
printf("TLB Entry %d: 0x%x 0x%x",i,tlb[i].entryhi,tlb[i].entrylo);
printf("\n");
}
}
boolean get_bpaddr(char input[],int len,UINT32 *addrp)
{
/*
bpaddrv 0x12345678
i j
*/
int i,j,k;
char a[20];
//printf("%s\n",input);
for (i=6;i<len;i++)
if (input[i]!=' ')
break;
if (i==len)
{
printf("Virtual address must not be null.\n");
return false;
}
j=i;
for (;j<len;j++)
{
if ((input[j]==' ')||(input[j]=='\0')||(input[j]==10) )
break;
}
j=j-1;
if (input[i]=='0' && ((input[i+1]=='x' )||(input[i+1]=='X' )))
i+=2;
//printf("i= %d\n",i);
//printf("j= %d\n",j);
for(k=0;k<=j-i;k++)
{
a[k]=input[i+k];
//printf("*%d*\n",a[k]==10);
}
//printf("k=%d\n",k);
a[k]='\0';
//printf("a= %s\n",a);
//printf("%d\n",strlen(a));
if (strlen(a)>8)
{
printf("Virtual address must not be large than 4 bytes \n");
return false;
}
for (i=0;i<strlen(a);i++)
{
if(!isxdigit(a[i]))
{
printf("Virtual address must be a hexadecimal digit \n");
return false;
}
}
*addrp= strtoul(a,NULL,16);
return true;
}
boolean get_bp_del_index(char input[],int len,int *index)
{
int i,j,k;
char a[20];
//printf("%s\n",input);
for (i=5;i<len;i++)
if (input[i]!=' ')
break;
if (i==len)
{
printf("Index can not be null.\n");
return false;
}
j=i;
for (;j<len;j++)
{
if ((input[j]==' ')||(input[j]=='\0')||(input[j]==10) )
break;
}
j=j-1;
for(k=0;k<=j-i;k++)
a[k]=input[i+k];
a[k]='\0';
for (i=0;i<strlen(a);i++)
{
if(!isdigit(a[i]))
{
printf("Breakpoint index must be a digit \n");
return false;
}
}
*index = atoi(a);
return true;
}
boolean get_tlb_index(char input[],int len,int *low,int *high)
{
int i,j,k;
int l;
char a[20];
char b[20];
*low = 0;
*high = TLBENTRY_NO-1;
for (i=3;i<len;i++)
if ((input[i]!=' ') && (input[i]!=10 ))
break;
if (i==len)
{
return true;
}
j=i;
for (;j<len;j++)
{
if ((input[j]==' ')||(input[j]=='\0')||(input[j]==10) )
break;
}
j=j-1;
for (l=i;l<=j;l++)
{
if (input[l]=='-')
break;
}
if (l>j)
{
//no -
for(k=0;k<=j-i;k++)
a[k]=input[i+k];
a[k]='\0';
//printf("a = %s\n",a);
if (strlen(a)>2)
{
printf("Wrong tlb index \n");
return false;
}
if (((strlen(a)==1) && !isdigit(a[0])) ||((strlen(a)==2) && (!isdigit(a[1]) || !isdigit(a[0])) ) )
{
printf("Wrong tlb index \n");
return false;
}
else
{
*low = atoi(a);
}
}
else if (l==j)
{
//wront input
printf("Wrong Input tlb index!\n");
return false;
}
else
{
for(k=0;k<l-i;k++)
a[k]=input[i+k];
a[k]='\0';
//printf("a = %s\n",a);
if (strlen(a)>2)
{
printf("Wrong tlb index \n");
return false;
}
if (((strlen(a)==1) && !isdigit(a[0])) ||((strlen(a)==2) && (!isdigit(a[1]) || !isdigit(a[0])) ) )
{
printf("Wrong tlb index \n");
return false;
}
else
{
*low = atoi(a);
}
for(k=0;k<j-l;k++)
b[k]=input[l+1+k];
b[k]='\0';
//printf("b = %s\n",b);
if (strlen(b)>2)
{
printf("Wrong tlb index \n");
return false;
}
if (((strlen(b)==1) && !isdigit(b[0])) ||((strlen(b)==2) && (!isdigit(b[1]) || !isdigit(b[0])) ) )
{
printf("Wrong tlb index \n");
return false;
}
else
{
*high = atoi(b);
}
//printf("*high %d \n",*high);
//printf("*low %d \n",*low);
if (*low>*high)
{
printf("Wrong tlb index \n");
return false;
}
if (*high>TLBENTRY_NO)
{
printf("Wrong tlb index \n");
return false;
}
return true;
}
return true;
}
boolean get_cpr_index(char input[],int len,int *index)
{
int i,j,k;
char a[20];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -