bvm_dbg.c revision 245678
1248302Sbrooks/*- 2244401Sbrooks * Copyright (c) 2011 NetApp, Inc. 3241236Sbrooks * All rights reserved. 4241236Sbrooks * 5241236Sbrooks * Redistribution and use in source and binary forms, with or without 6241236Sbrooks * modification, are permitted provided that the following conditions 7241236Sbrooks * are met: 8241236Sbrooks * 1. Redistributions of source code must retain the above copyright 9241236Sbrooks * notice, this list of conditions and the following disclaimer. 10241236Sbrooks * 2. Redistributions in binary form must reproduce the above copyright 11241236Sbrooks * notice, this list of conditions and the following disclaimer in the 12241236Sbrooks * documentation and/or other materials provided with the distribution. 13241236Sbrooks * 14241236Sbrooks * THIS SOFTWARE IS PROVIDED BY NETAPP, INC ``AS IS'' AND 15241236Sbrooks * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16241236Sbrooks * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17241236Sbrooks * ARE DISCLAIMED. IN NO EVENT SHALL NETAPP, INC OR CONTRIBUTORS BE LIABLE 18241236Sbrooks * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19241236Sbrooks * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20241236Sbrooks * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21241236Sbrooks * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22241236Sbrooks * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23241236Sbrooks * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24241236Sbrooks * SUCH DAMAGE. 25241236Sbrooks * 26241236Sbrooks * $FreeBSD: head/sys/dev/bvm/bvm_dbg.c 245678 2013-01-20 03:42:49Z neel $ 27241236Sbrooks */ 28241236Sbrooks 29241236Sbrooks#include <sys/cdefs.h> 30241236Sbrooks__FBSDID("$FreeBSD: head/sys/dev/bvm/bvm_dbg.c 245678 2013-01-20 03:42:49Z neel $"); 31241236Sbrooks 32241236Sbrooks#include <sys/param.h> 33241236Sbrooks#include <sys/kernel.h> 34241236Sbrooks#include <sys/bus.h> 35241236Sbrooks 36241236Sbrooks#include <gdb/gdb.h> 37241236Sbrooks 38241236Sbrooks#include <machine/cpufunc.h> 39241236Sbrooks 40241236Sbrooksstatic gdb_probe_f bvm_dbg_probe; 41241236Sbrooksstatic gdb_init_f bvm_dbg_init; 42241236Sbrooksstatic gdb_term_f bvm_dbg_term; 43244230Sbrooksstatic gdb_getc_f bvm_dbg_getc; 44244230Sbrooksstatic gdb_putc_f bvm_dbg_putc; 45241236Sbrooks 46241236SbrooksGDB_DBGPORT(bvm, bvm_dbg_probe, bvm_dbg_init, bvm_dbg_term, 47241236Sbrooks bvm_dbg_getc, bvm_dbg_putc); 48241236Sbrooks 49241236Sbrooks#define BVM_DBG_PORT 0x224 50244230Sbrooksstatic int bvm_dbg_port = BVM_DBG_PORT; 51244230Sbrooks 52244230Sbrooks#define BVM_DBG_SIG ('B' << 8 | 'V') 53241236Sbrooks 54244230Sbrooksstatic int 55241236Sbrooksbvm_dbg_probe(void) 56241236Sbrooks{ 57241236Sbrooks int disabled, port; 58241236Sbrooks 59244230Sbrooks disabled = 0; 60244230Sbrooks resource_int_value("bvmdbg", 0, "disabled", &disabled); 61244230Sbrooks 62244401Sbrooks if (!disabled) { 63244401Sbrooks if (resource_int_value("bvmdbg", 0, "port", &port) == 0) 64244401Sbrooks bvm_dbg_port = port; 65244401Sbrooks 66244401Sbrooks if (inw(bvm_dbg_port) == BVM_DBG_SIG) { 67241236Sbrooks /* 68241236Sbrooks * Return a higher priority than 0 to override other 69241236Sbrooks * gdb dbgport providers that may be present (e.g. uart) 70241236Sbrooks */ 71241236Sbrooks return (1); 72241236Sbrooks } 73241236Sbrooks } 74241236Sbrooks 75241236Sbrooks return (-1); 76241236Sbrooks} 77241236Sbrooks 78241236Sbrooksstatic void 79241236Sbrooksbvm_dbg_init(void) 80241236Sbrooks{ 81241236Sbrooks} 82241236Sbrooks 83241236Sbrooksstatic void 84241236Sbrooksbvm_dbg_term(void) 85241236Sbrooks{ 86241236Sbrooks} 87241236Sbrooks 88241236Sbrooksstatic void 89241236Sbrooksbvm_dbg_putc(int c) 90241236Sbrooks{ 91241236Sbrooks 92241236Sbrooks outl(bvm_dbg_port, c); 93241236Sbrooks} 94241236Sbrooks 95241236Sbrooksstatic int 96241236Sbrooksbvm_dbg_getc(void) 97241236Sbrooks{ 98241236Sbrooks 99248302Sbrooks return (inl(bvm_dbg_port)); 100241236Sbrooks} 101241236Sbrooks