1a9643ea8Slogwang /*- 2a9643ea8Slogwang * Copyright (c) 2014 The FreeBSD Foundation 3a9643ea8Slogwang * All rights reserved. 4a9643ea8Slogwang * 5a9643ea8Slogwang * This software was developed by Semihalf under 6a9643ea8Slogwang * the sponsorship of the FreeBSD Foundation. 7a9643ea8Slogwang * 8a9643ea8Slogwang * Redistribution and use in source and binary forms, with or without 9a9643ea8Slogwang * modification, are permitted provided that the following conditions 10a9643ea8Slogwang * are met: 11a9643ea8Slogwang * 1. Redistributions of source code must retain the above copyright 12a9643ea8Slogwang * notice, this list of conditions and the following disclaimer. 13a9643ea8Slogwang * 2. Redistributions in binary form must reproduce the above copyright 14a9643ea8Slogwang * notice, this list of conditions and the following disclaimer in the 15a9643ea8Slogwang * documentation and/or other materials provided with the distribution. 16a9643ea8Slogwang * 17a9643ea8Slogwang * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18a9643ea8Slogwang * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19a9643ea8Slogwang * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20a9643ea8Slogwang * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21a9643ea8Slogwang * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22a9643ea8Slogwang * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23a9643ea8Slogwang * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24a9643ea8Slogwang * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25a9643ea8Slogwang * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26a9643ea8Slogwang * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27a9643ea8Slogwang * SUCH DAMAGE. 28a9643ea8Slogwang * 29a9643ea8Slogwang * $FreeBSD$ 30a9643ea8Slogwang */ 31a9643ea8Slogwang 32a9643ea8Slogwang #ifndef _MACHINE_DEBUG_MONITOR_H_ 33a9643ea8Slogwang #define _MACHINE_DEBUG_MONITOR_H_ 34a9643ea8Slogwang 35*22ce4affSfengbojiang #define DBG_BRP_MAX 16 36*22ce4affSfengbojiang #define DBG_WRP_MAX 16 37a9643ea8Slogwang 38*22ce4affSfengbojiang struct debug_monitor_state { 39*22ce4affSfengbojiang uint32_t dbg_enable_count; 40*22ce4affSfengbojiang uint32_t dbg_flags; 41*22ce4affSfengbojiang #define DBGMON_ENABLED (1 << 0) 42*22ce4affSfengbojiang #define DBGMON_KERNEL (1 << 1) 43*22ce4affSfengbojiang uint64_t dbg_bcr[DBG_BRP_MAX]; 44*22ce4affSfengbojiang uint64_t dbg_bvr[DBG_BRP_MAX]; 45*22ce4affSfengbojiang uint64_t dbg_wcr[DBG_WRP_MAX]; 46*22ce4affSfengbojiang uint64_t dbg_wvr[DBG_WRP_MAX]; 47a9643ea8Slogwang }; 48a9643ea8Slogwang 49*22ce4affSfengbojiang #ifdef _KERNEL 50*22ce4affSfengbojiang 51a9643ea8Slogwang enum dbg_access_t { 52a9643ea8Slogwang HW_BREAKPOINT_X = 0, 53a9643ea8Slogwang HW_BREAKPOINT_R = 1, 54a9643ea8Slogwang HW_BREAKPOINT_W = 2, 55a9643ea8Slogwang HW_BREAKPOINT_RW = HW_BREAKPOINT_R | HW_BREAKPOINT_W, 56a9643ea8Slogwang }; 57a9643ea8Slogwang 58a9643ea8Slogwang void dbg_monitor_init(void); 59*22ce4affSfengbojiang void dbg_register_sync(struct debug_monitor_state *); 60*22ce4affSfengbojiang int dbg_setup_watchpoint(struct debug_monitor_state *, vm_offset_t, vm_size_t, 61*22ce4affSfengbojiang enum dbg_access_t); 62*22ce4affSfengbojiang int dbg_remove_watchpoint(struct debug_monitor_state *, vm_offset_t, vm_size_t); 63*22ce4affSfengbojiang 64*22ce4affSfengbojiang #ifdef DDB 65a9643ea8Slogwang void dbg_show_watchpoint(void); 66a9643ea8Slogwang #endif 67a9643ea8Slogwang 68*22ce4affSfengbojiang #endif /* _KERNEL */ 69*22ce4affSfengbojiang 70a9643ea8Slogwang #endif /* _MACHINE_DEBUG_MONITOR_H_ */ 71