diff options
author | aiju <devnull@localhost> | 2018-12-11 09:09:08 +0000 |
---|---|---|
committer | aiju <devnull@localhost> | 2018-12-11 09:09:08 +0000 |
commit | cc066d813083789d76169720edbf7a3104538117 (patch) | |
tree | 718af5de9f51a6996d137ae591f9a2b7c46cd911 /sys/src/9/pc/trap.c | |
parent | 6f30420136d8f2a87790dbe826bc6800de74770a (diff) |
dtracy: catch page faults
Diffstat (limited to 'sys/src/9/pc/trap.c')
-rw-r--r-- | sys/src/9/pc/trap.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/sys/src/9/pc/trap.c b/sys/src/9/pc/trap.c index b76afaff2..12d062adf 100644 --- a/sys/src/9/pc/trap.c +++ b/sys/src/9/pc/trap.c @@ -450,6 +450,7 @@ trap(Ureg* ureg) extern void _forkretiret(void); extern void _rdmsrinst(void); extern void _wrmsrinst(void); + extern void _peekinst(void); extern void load_fs(ulong); extern void load_gs(ulong); @@ -478,6 +479,12 @@ trap(Ureg* ureg) ureg->pc += 2; return; } + } else if(pc == _peekinst){ + if(vno == VectorGPF){ + ureg->ax = -1; + ureg->pc += 2; + return; + } } } @@ -712,6 +719,14 @@ fault386(Ureg* ureg, void*) if(!user){ if(vmapsync(addr)) return; + { + extern void _peekinst(void); + if((void(*)(void))ureg->pc == _peekinst){ + ureg->ax = -1; + ureg->pc += 2; + return; + } + } if(addr >= USTKTOP) panic("kernel fault: bad address pc=0x%.8lux addr=0x%.8lux", ureg->pc, addr); if(up == nil) |