db_interface.c revision 81337
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 81337 2001-08-09 02:32:05Z obrien $
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
5180709Sjake#include <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	struct kdbframe *kf;
6680709Sjake
6780709Sjake	if (db_global_jmpbuf_valid)
6880709Sjake		longjmp(db_global_jmpbuf, 1);
6980709Sjake	ddb_regs = *tf;
7080709Sjake	kf = ddb_regs.tf_arg;
7180709Sjake	kf->kf_cfp = kf->kf_fp;
7280709Sjake	setjmp(db_global_jmpbuf);
7380709Sjake	db_global_jmpbuf_valid = TRUE;
7480709Sjake	db_active++;
7580709Sjake	cndbctl(TRUE);
7680709Sjake	db_trap(tf->tf_type, 0);
7780709Sjake	cndbctl(FALSE);
7880709Sjake	db_active--;
7980709Sjake	db_global_jmpbuf_valid = FALSE;
8080709Sjake	return (1);
8180709Sjake}
8280709Sjake
8380709Sjakevoid
8480709Sjakedb_read_bytes(vm_offset_t addr, size_t size, char *data)
8580709Sjake{
8680709Sjake	char *src;
8780709Sjake
8880709Sjake	db_nofault = &db_jmpbuf;
8980709Sjake	src = (char *)addr;
9080709Sjake	while (size-- > 0)
9180709Sjake		*data++ = *src++;
9280709Sjake	db_nofault = NULL;
9380709Sjake}
9480709Sjake
9580709Sjakevoid
9680709Sjakedb_write_bytes(vm_offset_t addr, size_t size, char *data)
9780709Sjake{
9880709Sjake	char *dst;
9980709Sjake
10080709Sjake	db_nofault = &db_jmpbuf;
10180709Sjake	dst = (char *)addr;
10280709Sjake	while (size-- > 0)
10380709Sjake		*dst++ = *data++;
10480709Sjake	db_nofault = NULL;
10580709Sjake}
10680709Sjake
10780709SjakeDB_COMMAND(reboot, db_reboot)
10880709Sjake{
10980709Sjake	cpu_reset();
11080709Sjake}
111