Annotation of src/usr.bin/pmdb/pmdb.h, Revision 1.4
1.4 ! art 1: /* $OpenBSD: pmdb.h,v 1.3 2002/06/05 18:02:27 fgsch Exp $ */
1.1 art 2: /*
3: * Copyright (c) 2002 Artur Grabowski <art@openbsd.org>
4: * All rights reserved.
5: *
6: * Redistribution and use in source and binary forms, with or without
7: * modification, are permitted provided that the following conditions
8: * are met:
9: *
10: * 1. Redistributions of source code must retain the above copyright
11: * notice, this list of conditions and the following disclaimer.
12: * 2. The name of the author may not be used to endorse or promote products
13: * derived from this software without specific prior written permission.
14: *
15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
16: * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
17: * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
18: * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
21: * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
22: * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23: * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
24: * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25: */
26:
27: #include <sys/signal.h> /* for NSIG */
28: #include <sys/queue.h>
29: #include <sys/ptrace.h>
1.3 fgsch 30: #include <sys/stat.h>
31:
1.1 art 32: #include <err.h>
33:
34: /* XXX - ugh, yuck, bleah. */
35: #ifndef PT_STEP
36: #define PT_STEP PT_CONTINUE
37: #endif
38:
39: /*
40: * Process handling.
41: */
42:
43: struct breakpoint;
44: struct callback;
1.3 fgsch 45: struct corefile;
1.1 art 46: struct sym_table;
47: struct sym_ops;
1.4 ! art 48: struct reg;
1.1 art 49:
50: /* XXX - should be machdep some day. */
51: typedef unsigned long reg;
52:
53: /* The state for a debugged process. */
54: struct pstate {
55: pid_t ps_pid;
56: enum { NONE, LOADED, RUNNING, STOPPED, TERMINATED } ps_state;
57: int ps_argc;
58: char **ps_argv;
59: int ps_flags;
60: int ps_signum;
61: int ps_sigstate[NSIG];
62: reg ps_npc;
63: TAILQ_HEAD(,sym_table) ps_syms; /* all symbols tables in a list */
64: struct sym_table *ps_sym_exe; /* symbol table for the executable */
65: struct sym_ops *ps_sops; /* operations on symbol tables */
1.3 fgsch 66: struct stat exec_stat; /* stat of the exec file */
67: struct corefile *ps_core; /* core file data */
1.1 art 68: TAILQ_HEAD(,breakpoint) ps_bkpts; /* breakpoints */
69: TAILQ_HEAD(,callback) ps_sstep_cbs; /* single step actions */
70: };
71:
72: /* flags in ps_flags */
73: #define PSF_SYMBOLS 0x02 /* basic symbols loaded */
74: #define PSF_KILL 0x04 /* kill this process asap */
75: #define PSF_STEP 0x08 /* next continue should sstep */
1.3 fgsch 76: #define PSF_CORE 0x10 /* core file loaded */
77: #define PSF_ATCH 0x20 /* process attached with PT_ATTACH */
1.1 art 78:
79: /* ps_sigstate */
80: #define SS_STOP 0x00
81: #define SS_IGNORE 0x01
82:
83: /* misc helper functions */
84: int process_kill(struct pstate *);
85: int read_from_pid(pid_t pid, off_t from, void *to, size_t size);
86: int write_to_pid(pid_t pid, off_t to, void *from, size_t size);
87:
88: /* process.c */
89: int process_load(struct pstate *);
1.4 ! art 90: int process_run(struct pstate *);
! 91: int process_read(struct pstate *, off_t, void *, size_t);
! 92: int process_write(struct pstate *, off_t, void *, size_t);
! 93: int process_getregs(struct pstate *, struct reg *);
! 94:
1.1 art 95: int cmd_process_run(int, char **, void *);
96: int cmd_process_cont(int, char **, void *);
97: int cmd_process_kill(int, char **, void *);
98:
99: /* signal.c */
100: void init_sigstate(struct pstate *);
101: void process_signal(struct pstate *, int, int, int);
102: int cmd_signal_ignore(int, char **, void *);
103: int cmd_signal_show(int, char **, void *);
104:
105: /*
106: * Machine dependent stuff.
107: */
108: /* register names */
109: struct md_def {
110: const char **md_reg_names; /* array of register names */
111: const int nregs; /* number of registers */
112: const int pcoff; /* offset of the pc */
113: };
114: extern struct md_def md_def;
115: void md_def_init(void);
116:
117: #define MDF_MAX_ARGS 16
118:
119: struct md_frame {
120: reg pc, fp;
121: int nargs;
122: reg args[MDF_MAX_ARGS];
123: };
124:
125: /*
126: * Return the registers for the process "ps" in the frame "frame".
127: */
128: int md_getframe(struct pstate *, int, struct md_frame *);
129: int md_getregs(struct pstate *, reg *);
130:
131: /* misc */
132: void *emalloc(size_t);