blob: eee839e3c11533d540c4e805fe85c3a6f044f7a0 [file] [log] [blame]
/*
* Copyright (c) 2011 Nokia and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Nokia - Initial API and implementation
*/
/* WinHWBkptMgr.h
*
* This class manages the use of the X86 Hardware Debug Registers
* to set Hardware Breakpoints and Hardware Watchpoints.
*
* Rules governing the use of X86 Debug registers:
* - there are four debug registers (DR0, DR1, DR2 & DR3)
* which can be set with an address in memory that will be
* monitored for access
* - there is a management debug register (DR7) that contains
* the bits governing which of the DR0-DR3 registers will be
* monitored, the type of access, and the size of the memory
* to be monitored.
* - eligible access modes are {execution, write, read+write}
* - eligible sizes are 1, 2, 4 and 8
* - monitoring is only legal for each size at proper alignment
* (i.e. a watchpoint of size 8 must have an address that is
* aligned on a 8-byte boundary; a watchpoint of size 2 can
* be on any 2-byte boundary; a watchpoint of size 1 can be
* at any address)
*
* This implementation currently allows watchpoints only, and
* will monitor memory regions of sizes from 1-32, depending
* upon alignment, by combining the use of available registers
* when necessary and available.
*
* The use of this manager thus restricts the caller to a
* maximum of 4 hardware watchpoints, and fewer if any user
* watchpoints are unaligned for size and/or greater in size
* than 8 bytes.
*
* The use of this manager also restricts watchpoints to being
* identified on a per-process basis. The thread accessing the
* watchpoint will be identified, but the caller cannot
* establish a watchpoint only for specific threads; all
* threads in a process will be established.
*
* This implementation does not currently allow hardware
* breakpoints for execution, nor does it manage debug registers
* in such a way as to optimize for overlapping watchpoint
* regions.
*
* Created on: Aug 17, 2011
* Author: bkirk
*/
#ifndef WINHWBKPTMGR_H_
#define WINHWBKPTMGR_H_
#include "TCFContext.h"
#define MAX_HWBP 4
struct TBreakpoint;
class WinHWBkptMgr {
public:
typedef unsigned char DRMask;
typedef unsigned char DRFlags;
static int SetHardwareBreak(TBreakpoint*);
static int ClearHardwareBreak(TBreakpoint*);
public: // would like these to be private, but static initializers require otherwise
typedef unsigned char Mode;
typedef unsigned char SizeBits;
static const Mode execute = 0x00;
static const Mode write = 0x01;
// 0x02 is defined to mean break on I/O read/write, unsupported
static const Mode readwrite = 0x03;
static const Mode invalid = 0x04;
private:
typedef struct {
ContextAddress address; // address of the full HW break
DRMask inUse; // mask of the regs used for this hw-break
Mode accessMode; // accessMode to use for all regs used
unsigned char size; // combined size of HW breaks in bits of all DRegs
} HWBreakInfo;
static DRMask inUse;
static unsigned char InUseCount();
static unsigned char UnusedCount();
static DRMask UseUnusedRegister();
static HWBreakInfo hwBkpt[MAX_HWBP];
static unsigned char GetUnusedWatchpoint();
};
#endif /* WINHWBKPTMGR_H_ */