📄 cp0.c
字号:
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))|(0x00000000); //Exc Code in Cause is 0
CPR[13]=Cause;
instruction_dp=instruction_ip;
instruction_ip=icache(pc_address_ip,0);
pc_ip=(pc_address_ip&(0x0000ffff))/4;
break;
//case 8 :break;
//case 9 :break;
case 10 : //Watch instr
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))|(0x0000005c); //Exc Code in Cause is 23
CPR[13]=Cause;
instruction_dp=instruction_ip;
instruction_ip=icache(pc_address_ip,0);
pc_ip=(pc_address_ip&(0x0000ffff))/4;
break;
case 11 : //AdEl 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))|(0x00000010); //Exc Code in Cause is 4
CPR[13]=Cause;
instruction_dp=instruction_ip;
instruction_ip=icache(pc_address_ip,0);
pc_ip=(pc_address_ip&(0x0000ffff))/4;
break;
case 12 : //TLBL
exception_flag=0;
exception_invalid_instr_flag=5;
Entryhi=Entryhi; //需要在异常发生时设置
Badvaddr=Badvaddr; //需要在异常发生时设置
Context=(Context&(0xff80000f))|((Entryhi>>9)&(0x007ffff0));
Cause=Cause|(0x00000008); //set exccode 每一种不同
Cause=Cause&(0xcfffffff); //set ce
CPR[10]=Entryhi;
CPR[4]=Context;
CPR[13]=Cause;
CPR[8]=Badvaddr;
//Entryhi=vpn2,asid
//Context=(Context&(0xff80000f))|((Entryhi>>9)&(0x007ffff0));
// Cause=set(exccode,ce)
// Badvaddr=vaddress
if(((Status>>22)&(0x00000001)) == 0){
if(((Status>>1)&(0x00000001)) == 0){
pc_address_ip=0x80000000;
}else{
pc_address_ip=0x80000180;
}
}else{
if(((Status>>1)&(0x00000001)) == 0){
pc_address_ip=0xbfc00200;
}else{
pc_address_ip=0xbfc00380;
}
}
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;
//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_mp;
//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))|(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 13 : //IBE 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))|(0x00000018); //Exc Code in Cause is 6
CPR[13]=Cause;
instruction_dp=instruction_ip;
instruction_ip=icache(pc_address_ip,0);
pc_ip=(pc_address_ip&(0x0000ffff))/4;
break;
//case 14 :break;
case 15 : //SYS 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -