⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 debug.c

📁 一个MIPS虚拟机的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -