Deleted Added
full compact
1/*
2 * Copyright (c) 2004 Marcel Moolenaar
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 *

--- 11 unchanged lines hidden (view full) ---

20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27#include <sys/cdefs.h>
28__FBSDID("$FreeBSD: head/sys/gdb/gdb_main.c 133446 2004-08-10 19:32:33Z marcel $");
28__FBSDID("$FreeBSD: head/sys/gdb/gdb_main.c 138253 2004-12-01 06:40:35Z marcel $");
29
30#include <sys/param.h>
31#include <sys/systm.h>
32#include <sys/kdb.h>
33#include <sys/kernel.h>
34#include <sys/pcpu.h>
35#include <sys/proc.h>
36#include <sys/reboot.h>

--- 78 unchanged lines hidden (view full) ---

115 switch (gdb_rx_char()) {
116 case '?': /* Last signal. */
117 gdb_tx_begin('S');
118 gdb_tx_hex(gdb_cpu_signal(type, code), 2);
119 gdb_tx_end();
120 break;
121 case 'c': { /* Continue. */
122 uintmax_t addr;
123 if (!gdb_rx_varhex(&addr))
124 gdb_cpu_setreg(GDB_REG_PC, addr);
123 register_t pc;
124 if (!gdb_rx_varhex(&addr)) {
125 pc = addr;
126 gdb_cpu_setreg(GDB_REG_PC, &pc);
127 }
128 kdb_cpu_clear_singlestep();
129 return (1);
130 }
131 case 'C': { /* Continue with signal. */
132 uintmax_t addr, sig;
133 register_t pc;
134 if (!gdb_rx_varhex(&sig) && gdb_rx_char() == ';' &&
131 !gdb_rx_varhex(&addr))
132 gdb_cpu_setreg(GDB_REG_PC, addr);
135 !gdb_rx_varhex(&addr)) {
136 pc = addr;
137 gdb_cpu_setreg(GDB_REG_PC, &pc);
138 }
139 kdb_cpu_clear_singlestep();
140 return (1);
141 }
142 case 'g': { /* Read registers. */
143 size_t r;
144 gdb_tx_begin(0);
145 for (r = 0; r < GDB_NREGS; r++)
146 gdb_tx_reg(r);

--- 45 unchanged lines hidden (view full) ---

192 }
193 if (gdb_rx_mem((char *)(uintptr_t)addr, size) == 0)
194 gdb_tx_err(EIO);
195 else
196 gdb_tx_ok();
197 break;
198 }
199 case 'P': { /* Write register. */
194 uintmax_t reg, val;
200 char *val;
201 uintmax_t reg;
202 val = gdb_rxp;
203 if (gdb_rx_varhex(&reg) || gdb_rx_char() != '=' ||
196 gdb_rx_varhex(&val)) {
204 !gdb_rx_mem(val, gdb_cpu_regsz(reg))) {
205 gdb_tx_err(EINVAL);
206 break;
207 }
208 gdb_cpu_setreg(reg, val);
209 gdb_tx_ok();
210 break;
211 }
212 case 'q': /* General query. */

--- 16 unchanged lines hidden (view full) ---

229 gdb_tx_begin('l');
230 gdb_tx_end();
231 }
232 } else if (!gdb_cpu_query())
233 gdb_tx_empty();
234 break;
235 case 's': { /* Step. */
236 uintmax_t addr;
229 if (!gdb_rx_varhex(&addr))
230 gdb_cpu_setreg(GDB_REG_PC, addr);
237 register_t pc;
238 if (!gdb_rx_varhex(&addr)) {
239 pc = addr;
240 gdb_cpu_setreg(GDB_REG_PC, &pc);
241 }
242 kdb_cpu_set_singlestep();
243 return (1);
244 }
245 case 'S': { /* Step with signal. */
246 uintmax_t addr, sig;
247 register_t pc;
248 if (!gdb_rx_varhex(&sig) && gdb_rx_char() == ';' &&
237 !gdb_rx_varhex(&addr))
238 gdb_cpu_setreg(GDB_REG_PC, addr);
249 !gdb_rx_varhex(&addr)) {
250 pc = addr;
251 gdb_cpu_setreg(GDB_REG_PC, &pc);
252 }
253 kdb_cpu_set_singlestep();
254 return (1);
255 }
256 case 'T': { /* Thread alive. */
257 intmax_t tid;
258 gdb_rx_varhex(&tid);
259 if (kdb_thr_lookup(tid) != NULL)
260 gdb_tx_ok();

--- 15 unchanged lines hidden ---