1 /*-
2 * Copyright (c) 2001 Jake Burkholder.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 * $FreeBSD: releng/5.2/sys/sparc64/sparc64/db_interface.c 92205 2002-03-13 04:59:01Z jake $
27 */
28
29 #include <sys/param.h>
30 #include <sys/systm.h>
31 #include <sys/reboot.h>
32 #include <sys/cons.h>
33 #include <sys/ktr.h>
34 #include <sys/linker_set.h>
35 #include <sys/lock.h>
36 #include <sys/pcpu.h>
37 #include <sys/proc.h>
38 #include <sys/smp.h>
39
40 #include <machine/cpu.h>
41 #include <machine/md_var.h>
42
43 #include <vm/vm.h>
44 #include <vm/pmap.h>
45
46 #include <ddb/ddb.h>
47 #include <ddb/db_access.h>
48 #include <ddb/db_sym.h>
49 #include <ddb/db_variables.h>
50
51 #include <machine/atomic.h>
52 #include <machine/setjmp.h>
53
54 static jmp_buf *db_nofault = 0;
55 extern jmp_buf db_jmpbuf;
56
57 int db_active;
58 db_regs_t ddb_regs;
59
60 static jmp_buf db_global_jmpbuf;
61 static int db_global_jmpbuf_valid;
62
63 int
64 kdb_trap(struct trapframe *tf)
65 {
66
67 if (db_global_jmpbuf_valid)
68 longjmp(db_global_jmpbuf, 1);
69 flushw();
70 ddb_regs = *tf;
71 critical_enter();
72 setjmp(db_global_jmpbuf);
73 db_global_jmpbuf_valid = TRUE;
74 atomic_add_acq_int(&db_active, 1);
75 #ifdef SMP
76 stop_cpus(PCPU_GET(other_cpus));
77 #endif
78 cndbctl(TRUE);
79 db_trap(tf->tf_type, 0);
80 cndbctl(FALSE);
81 db_active--;
82 #ifdef SMP
83 restart_cpus(stopped_cpus);
84 #endif
85 db_global_jmpbuf_valid = FALSE;
86 critical_exit();
87 *tf = ddb_regs;
88 TF_DONE(tf);
89 return (1);
90 }
91
92 void
93 db_read_bytes(vm_offset_t addr, size_t size, char *data)
94 {
95 char *src;
96
97 db_nofault = &db_jmpbuf;
98 src = (char *)addr;
99 while (size-- > 0)
100 *data++ = *src++;
101 db_nofault = NULL;
102 }
103
104 void
105 db_write_bytes(vm_offset_t addr, size_t size, char *data)
106 {
107 char *dst;
108
109 db_nofault = &db_jmpbuf;
110 dst = (char *)addr;
111 while (size-- > 0)
112 *dst++ = *data++;
113 db_nofault = NULL;
114 }
115
116 void
117 db_show_mdpcpu(struct pcpu *pc)
118 {
119 }
120
121 DB_COMMAND(reboot, db_reboot)
122 {
123 cpu_reset();
124 }
125
126 DB_COMMAND(halt, db_halt)
127 {
128 cpu_halt();
129 }
Cache object: bedb898e8b46d0e54b9a15e4306a4c91
|