+ // --- Check for write to controlled area ---
+ // TODO: Catch user access
+ if( (*pde & PF_PRESENT) && (*pte & PF_PRESENT) && !(*pte & PF_WRITE) && (*pte & PF_WATCHED) )
+ {
+ Uint page = Addr >> 12;
+ Uint ofs = Addr & 0xFFF;
+ // Watchpoints are active for this page.
+ // > Locate watchpoint bitmap for page (dword granuality)
+ tWatchpoint *wp = ( Addr >= KERNEL_BASE ? gapKernelWatchpoints[page%KWATCH_BUCKETS] : NULL);
+ while( wp && wp->PageNum == page )
+ wp = wp->Next;
+ if( !wp )
+ {
+ Log_Warning("MMVirt", "PF_WATCHED set on %p but no watchpoint info avaliable", Addr);
+ }
+ else
+ {
+ // > If bit set, log/raise
+ if( wp->Bitmap[ (ofs/4)/8 ] & (1 << (ofs/4)%8) )
+ {
+ Log_Error("DEBUG", "Watchpoint %p written by %x:%p",
+ Addr, Regs->cs, Regs->eip);
+ }
+ Regs->eflags |= 1<<8;
+ //Proc_GetCurThread()->Proc.WPPage = Addr;
+ }
+ // > Clear write protection, set tracing
+ *pte |= PF_WRITE;
+ INVLPG( Addr & ~0xFFF );
+ return ;
+ }
+