db_interface.c revision 87702
180709Sjake/*- 280709Sjake * Copyright (c) 2001 Jake Burkholder. 380709Sjake * All rights reserved. 480709Sjake * 580709Sjake * Redistribution and use in source and binary forms, with or without 680709Sjake * modification, are permitted provided that the following conditions 780709Sjake * are met: 880709Sjake * 1. Redistributions of source code must retain the above copyright 980709Sjake * notice, this list of conditions and the following disclaimer. 1080709Sjake * 2. Redistributions in binary form must reproduce the above copyright 1180709Sjake * notice, this list of conditions and the following disclaimer in the 1280709Sjake * documentation and/or other materials provided with the distribution. 1380709Sjake * 1481337Sobrien * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1580709Sjake * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1680709Sjake * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1781337Sobrien * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1880709Sjake * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 1980709Sjake * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2080709Sjake * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2180709Sjake * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2280709Sjake * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2380709Sjake * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2480709Sjake * SUCH DAMAGE. 2580709Sjake * 2680709Sjake * $FreeBSD: head/sys/sparc64/sparc64/db_interface.c 87702 2001-12-11 23:33:44Z jhb $ 2780709Sjake */ 2880709Sjake 2980709Sjake#include <sys/param.h> 3080709Sjake#include <sys/systm.h> 3180709Sjake#include <sys/reboot.h> 3280709Sjake#include <sys/cons.h> 3380709Sjake#include <sys/ktr.h> 3480709Sjake#include <sys/linker_set.h> 3580709Sjake#include <sys/lock.h> 3680709Sjake#include <sys/pcpu.h> 3780709Sjake#include <sys/proc.h> 3880709Sjake#include <sys/smp.h> 3980709Sjake 4080709Sjake#include <machine/cpu.h> 4180709Sjake#include <machine/md_var.h> 4280709Sjake 4380709Sjake#include <vm/vm.h> 4480709Sjake#include <vm/pmap.h> 4580709Sjake 4680709Sjake#include <ddb/ddb.h> 4780709Sjake#include <ddb/db_access.h> 4880709Sjake#include <ddb/db_sym.h> 4980709Sjake#include <ddb/db_variables.h> 5080709Sjake 5184181Sjake#include <machine/setjmp.h> 5280709Sjake 5380709Sjakestatic jmp_buf *db_nofault = 0; 5480709Sjakeextern jmp_buf db_jmpbuf; 5580709Sjake 5680709Sjakeint db_active; 5780709Sjakedb_regs_t ddb_regs; 5880709Sjake 5980709Sjakestatic jmp_buf db_global_jmpbuf; 6080709Sjakestatic int db_global_jmpbuf_valid; 6180709Sjake 6280709Sjakeint 6380709Sjakekdb_trap(struct trapframe *tf) 6480709Sjake{ 6580709Sjake 6680709Sjake if (db_global_jmpbuf_valid) 6780709Sjake longjmp(db_global_jmpbuf, 1); 6886525Sjake flushw(); 6980709Sjake ddb_regs = *tf; 7080709Sjake setjmp(db_global_jmpbuf); 7180709Sjake db_global_jmpbuf_valid = TRUE; 7280709Sjake db_active++; 7380709Sjake cndbctl(TRUE); 7480709Sjake db_trap(tf->tf_type, 0); 7580709Sjake cndbctl(FALSE); 7680709Sjake db_active--; 7780709Sjake db_global_jmpbuf_valid = FALSE; 7886525Sjake *tf = ddb_regs; 7980709Sjake return (1); 8080709Sjake} 8180709Sjake 8280709Sjakevoid 8380709Sjakedb_read_bytes(vm_offset_t addr, size_t size, char *data) 8480709Sjake{ 8580709Sjake char *src; 8680709Sjake 8780709Sjake db_nofault = &db_jmpbuf; 8880709Sjake src = (char *)addr; 8980709Sjake while (size-- > 0) 9080709Sjake *data++ = *src++; 9180709Sjake db_nofault = NULL; 9280709Sjake} 9380709Sjake 9480709Sjakevoid 9580709Sjakedb_write_bytes(vm_offset_t addr, size_t size, char *data) 9680709Sjake{ 9780709Sjake char *dst; 9880709Sjake 9980709Sjake db_nofault = &db_jmpbuf; 10080709Sjake dst = (char *)addr; 10180709Sjake while (size-- > 0) 10280709Sjake *dst++ = *data++; 10380709Sjake db_nofault = NULL; 10480709Sjake} 10580709Sjake 10687702Sjhbvoid 10787702Sjhbdb_show_mdpcpu(struct pcpu *pc) 10887702Sjhb{ 10987702Sjhb} 11087702Sjhb 11180709SjakeDB_COMMAND(reboot, db_reboot) 11280709Sjake{ 11380709Sjake cpu_reset(); 11480709Sjake} 11586147Stmm 11686147StmmDB_COMMAND(halt, db_halt) 11786147Stmm{ 11886147Stmm cpu_halt(); 11986147Stmm} 120