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