summaryrefslogtreecommitdiff
path: root/sys/src/9/pc/trap.c
diff options
context:
space:
mode:
authoraiju <devnull@localhost>2018-12-11 09:09:08 +0000
committeraiju <devnull@localhost>2018-12-11 09:09:08 +0000
commitcc066d813083789d76169720edbf7a3104538117 (patch)
tree718af5de9f51a6996d137ae591f9a2b7c46cd911 /sys/src/9/pc/trap.c
parent6f30420136d8f2a87790dbe826bc6800de74770a (diff)
dtracy: catch page faults
Diffstat (limited to 'sys/src/9/pc/trap.c')
-rw-r--r--sys/src/9/pc/trap.c15
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)