omap: fix breakpoint instruction trap handling (from sources)
This commit is contained in:
parent
358f72266a
commit
180e04ee41
|
@ -33,6 +33,12 @@
|
|||
#define CpDFP 11 /* double FP */
|
||||
#define CpSC 15 /* System Control */
|
||||
|
||||
/*
|
||||
* CpFSR op1==0, Crm==0 opcode 2 values.
|
||||
*/
|
||||
#define CpDFSR 0 /* data fault status */
|
||||
#define CpIFSR 1 /* instruction fault status */
|
||||
|
||||
/*
|
||||
* Primary (CRn) CpSC registers.
|
||||
*/
|
||||
|
|
|
@ -50,6 +50,7 @@ extern u32int fsrget(void);
|
|||
extern u32int getscr(void);
|
||||
extern u32int getpsr(void);
|
||||
extern ulong getwayssets(void);
|
||||
extern u32int ifsrget(void);
|
||||
extern void intrsoff(void);
|
||||
extern int isaconfig(char*, int, ISAConf*);
|
||||
extern int isdmadone(int);
|
||||
|
|
|
@ -474,10 +474,14 @@ TEXT dacput(SB), 1, $-4 /* domain access control */
|
|||
ISB
|
||||
RET
|
||||
|
||||
TEXT fsrget(SB), 1, $-4 /* fault status */
|
||||
MRC CpSC, 0, R0, C(CpFSR), C(0)
|
||||
TEXT fsrget(SB), 1, $-4 /* data fault status */
|
||||
MRC CpSC, 0, R0, C(CpFSR), C(0), CpDFSR
|
||||
RET
|
||||
|
||||
TEXT ifsrget(SB), 1, $-4 /* instruction fault status */
|
||||
MRC CpSC, 0, R0, C(CpFSR), C(0), CpIFSR
|
||||
RET
|
||||
|
||||
TEXT farget(SB), 1, $-4 /* fault address */
|
||||
MRC CpSC, 0, R0, C(CpFAR), C(0x0)
|
||||
RET
|
||||
|
|
|
@ -493,7 +493,23 @@ trap(Ureg *ureg)
|
|||
break;
|
||||
case PsrMabt: /* prefetch fault */
|
||||
ldrexvalid = 0;
|
||||
faultarm(ureg, ureg->pc, user, 1);
|
||||
x = ifsrget();
|
||||
fsr = (x>>7) & 0x8 | x & 0x7;
|
||||
switch(fsr){
|
||||
case 0x02: /* instruction debug event (BKPT) */
|
||||
if(user){
|
||||
snprint(buf, sizeof buf, "sys: breakpoint");
|
||||
postnote(up, 1, buf, NDebug);
|
||||
}else{
|
||||
iprint("kernel bkpt: pc %#lux inst %#ux\n",
|
||||
ureg->pc, *(u32int*)ureg->pc);
|
||||
panic("kernel bkpt");
|
||||
}
|
||||
break;
|
||||
default:
|
||||
faultarm(ureg, ureg->pc, user, 1);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case PsrMabt+1: /* data fault */
|
||||
ldrexvalid = 0;
|
||||
|
|
Loading…
Reference in a new issue