📄 cp0.c
字号:
}
if(branch_flag_wp == 1){
EPC=pc_address_wp - 4;
CPR[14]=pc_address_wp - 4;
/* if((Status&(0x00000004)) == 0){
//ERL == 0
EPC=pc_address_wp - 4;
CPR[14]=pc_address_wp - 4;
}else{
//ERL == 1
ErrorEPC=pc_address_wp - 4;
CPR[30]=pc_address_wp - 4;
}*/
if(((Status>>1)&(0x00000001)) == 0){
//EPC=pc_address_wp - 4;
Cause=Cause|(0x80000000);
Status=Status|(0x00000002);
//CPR[14]=EPC;
CPR[12]=Status;
CPR[13]=Cause;
}else{
Status=Status|(0x00000002);
CPR[12]=Status;
}
}else{
EPC=pc_address_wp;
CPR[14]=pc_address_wp;
/* if((Status&(0x00000004)) == 0){
//ERL == 0
EPC=pc_address_wp;
CPR[14]=pc_address_wp;
}else{
//ERL == 1
ErrorEPC=pc_address_wp;
CPR[30]=pc_address_wp;
}*/
if(((Status>>1)&(0x00000001)) == 0){
//EPC=pc_address_wp;
Cause=Cause&(0x7fffffff);
Status=Status|(0x00000002);
//CPR[14]=EPC;
CPR[12]=Status;
CPR[13]=Cause;
}else{
Status=Status|(0x00000002);
CPR[12]=Status;
}
}
Cause=(Cause&(0xffffff03))|(0x0000000c); //Exc Code in Cause is 3
CPR[13]=Cause;
instruction_dp=instruction_ip;
instruction_ip=icache(pc_address_ip,0);
pc_ip=(pc_address_ip&(0x0000ffff))/4;
break;
case 26 : //TLB MOD
exception_flag=0;
exception_invalid_instr_flag=5;
if(((Status>>22)&(0x00000001)) == 1){
//BEV in Status is one
pc_address_ip=0xbfc00380;
}else{
//BEV in Status is zero
pc_address_ip=0x80000180;
}
if((Status&(0x00000002)) == 0){
if(branch_flag_wp == 1){
EPC=pc_address_wp - 4;
CPR[14]=pc_address_wp - 4;
/* if((Status&(0x00000004)) == 0){
//ERL == 0
EPC=pc_address_wp - 4;
CPR[14]=pc_address_wp - 4;
}else{
//ERL == 1
ErrorEPC=pc_address_wp - 4;
CPR[30]=pc_address_wp - 4;
}*/
}else{
EPC=pc_address_wp;
CPR[14]=pc_address_wp;
/* if((Status&(0x00000004)) == 0){
//ERL == 0
EPC=pc_address_wp;
CPR[14]=pc_address_wp;
}else{
//ERL == 1
ErrorEPC=pc_address_wp;
CPR[30]=pc_address_wp;
}*/
}
}
Status=Status|(0x00000002);
CPR[12]=Status;
Cause=(Cause&(0xffffff03))|(0x00000004); //Exc Code in Cause is 1
CPR[13]=Cause;
instruction_dp=instruction_ip;
instruction_ip=icache(pc_address_ip,0);
pc_ip=(pc_address_ip&(0x0000ffff))/4;
break;
case 27 : //DBE general exception
exception_flag=0;
exception_invalid_instr_flag=5;
if(((Status>>22)&(0x00000001)) == 1){
//BEV in Status is one
pc_address_ip=0xbfc00380;
}else{
//BEV in Status is zero
pc_address_ip=0x80000180;
}
if((Status&(0x00000002)) == 0){
if(branch_flag_wp == 1){
EPC=pc_address_wp - 4;
CPR[14]=pc_address_wp - 4;
/* if((Status&(0x00000004)) == 0){
//ERL == 0
EPC=pc_address_wp - 4;
CPR[14]=pc_address_wp - 4;
}else{
//ERL == 1
ErrorEPC=pc_address_wp - 4;
CPR[30]=pc_address_wp - 4;
}*/
}else{
EPC=pc_address_wp;
CPR[14]=pc_address_wp;
/* if((Status&(0x00000004)) == 0){
//ERL == 0
EPC=pc_address_wp;
CPR[14]=pc_address_wp;
}else{
//ERL == 1
ErrorEPC=pc_address_wp;
CPR[30]=pc_address_wp;
}*/
}
}
Status=Status|(0x00000002);
CPR[12]=Status;
Cause=(Cause&(0xffffff03))|(0x0000001c); //Exc Code in Cause is 7
CPR[13]=Cause;
instruction_dp=instruction_ip;
instruction_ip=icache(pc_address_ip,0);
pc_ip=(pc_address_ip&(0x0000ffff))/4;
break;
//case 28 :break;
case 29 : // tlbl general exception
exception_flag=0;
exception_invalid_instr_flag=5;
if(((Status>>22)&(0x00000001)) == 1){
//BEV in Status is one
pc_address_ip=0xbfc00380;
}else{
//BEV in Status is zero
pc_address_ip=0x80000180;
}
if((Status&(0x00000002)) == 0){
if(branch_flag_wp == 1){
EPC=pc_address_wp - 4;
CPR[14]=pc_address_wp - 4;
/* if((Status&(0x00000004)) == 0){
//ERL == 0
EPC=pc_address_wp - 4;
CPR[14]=pc_address_wp - 4;
}else{
//ERL == 1
ErrorEPC=pc_address_wp - 4;
CPR[30]=pc_address_wp - 4;
}*/
}else{
EPC=pc_address_wp;
CPR[14]=pc_address_wp;
/* if((Status&(0x00000004)) == 0){
//ERL == 0
EPC=pc_address_wp;
CPR[14]=pc_address_wp;
}else{
//ERL == 1
ErrorEPC=pc_address_wp;
CPR[30]=pc_address_wp;
}*/
}
}
Status=Status|(0x00000002);
CPR[12]=Status;
Cause=(Cause&(0xffffff03))|(0x00000008); //Exc Code in Cause is 2
CPR[13]=Cause;
instruction_dp=instruction_ip;
instruction_ip=icache(pc_address_ip,0);
pc_ip=(pc_address_ip&(0x0000ffff))/4;
break;
case 30 : // tlbs general exception
exception_flag=0;
exception_invalid_instr_flag=5;
if(((Status>>22)&(0x00000001)) == 1){
//BEV in Status is one
pc_address_ip=0xbfc00380;
}else{
//BEV in Status is zero
pc_address_ip=0x80000180;
}
if((Status&(0x00000002)) == 0){
if(branch_flag_wp == 1){
EPC=pc_address_wp - 4;
CPR[14]=pc_address_wp - 4;
/* if((Status&(0x00000004)) == 0){
//ERL == 0
EPC=pc_address_wp - 4;
CPR[14]=pc_address_wp - 4;
}else{
//ERL == 1
ErrorEPC=pc_address_wp - 4;
CPR[30]=pc_address_wp - 4;
}*/
}else{
EPC=pc_address_wp;
CPR[14]=pc_address_wp;
/* if((Status&(0x00000004)) == 0){
//ERL == 0
EPC=pc_address_wp;
CPR[14]=pc_address_wp;
}else{
//ERL == 1
ErrorEPC=pc_address_wp;
CPR[30]=pc_address_wp;
}*/
}
}
Status=Status|(0x00000002);
CPR[12]=Status;
Cause=(Cause&(0xffffff03))|(0x0000000c); //Exc Code in Cause is 3
CPR[13]=Cause;
instruction_dp=instruction_ip;
instruction_ip=icache(pc_address_ip,0);
pc_ip=(pc_address_ip&(0x0000ffff))/4;
break;
case 31 : // eret general exception
exception_flag=0;
exception_invalid_instr_flag=5;
if(((Status)&(0x00000004)) == 4){
pc_address_ip=ErrorEPC;
Status=Status&(0xfffffffb);
CPR[12]=Status;
}else{
printf("\nErrorEPC=0x%08x\n",ErrorEPC);
printf("\nEPC=0x%08x\n",EPC);
printf("\nStatus=0x%08x\n",Status);
pc_address_ip=EPC;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -