1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
/* $NetBSD: db_machdep.h,v 1.29 2021/01/24 07:36:54 mrg Exp $ */
/*
* Mach Operating System
* Copyright (c) 1991,1990 Carnegie Mellon University
* All Rights Reserved.
*
* Permission to use, copy, modify and distribute this software and its
* documentation is hereby granted, provided that both the copyright
* notice and this permission notice appear in all copies of the
* software, derivative works or modified versions, and any portions
* thereof, and that both notices appear in supporting documentation.
*
* CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
* CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
* ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
*
* Carnegie Mellon requests users of this software to return to
*
* Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
* School of Computer Science
* Carnegie Mellon University
* Pittsburgh PA 15213-3890
*
* any improvements or extensions that they make and grant Carnegie Mellon
* the rights to redistribute these changes.
*/
#ifndef _SPARC_DB_MACHDEP_H_
#define _SPARC_DB_MACHDEP_H_
/*
* Machine-dependent defines for new kernel debugger.
*/
#include <sys/types.h>
#include <uvm/uvm_extern.h>
#include <machine/frame.h>
#include <machine/pcb.h>
#include <machine/psl.h>
#include <machine/trap.h>
#include <machine/reg.h>
typedef vaddr_t db_addr_t; /* address - unsigned */
#define DDB_EXPR_FMT "l" /* expression is long */
typedef long db_expr_t; /* expression - signed */
typedef struct {
struct trapframe db_tf;
struct frame db_fr;
} db_regs_t;
/* Current CPU register state */
extern struct cpu_info *ddb_cpuinfo;
extern db_regs_t *ddb_regp;
#define DDB_REGS ddb_regp
#define DDB_TF (&ddb_regp->db_tf)
#define DDB_FR (&ddb_regp->db_fr)
#if defined(lint)
#define PC_REGS(regs) ((regs)->db_tf.tf_pc)
#else
#define PC_REGS(regs) ((db_addr_t)(regs)->db_tf.tf_pc)
#endif
#define PC_ADVANCE(regs) do { \
int n = (regs)->db_tf.tf_npc; \
(regs)->db_tf.tf_pc = n; \
(regs)->db_tf.tf_npc = n + 4; \
} while(0)
#define BKPT_ADDR(addr) (addr) /* breakpoint address */
#define BKPT_INST 0x91d02001 /* breakpoint instruction */
#define BKPT_SIZE (4) /* size of breakpoint inst */
#define BKPT_SET(inst, addr) (BKPT_INST)
#define IS_BREAKPOINT_TRAP(type, code) \
((type) == T_BREAKPOINT || (type) == T_KGDB_EXEC)
#define IS_WATCHPOINT_TRAP(type, code) (0)
/*
* Sparc cpus have no hardware single-step.
*/
#define SOFTWARE_SSTEP
bool db_inst_trap_return(int inst);
bool db_inst_return(int inst);
bool db_inst_call(int inst);
bool db_inst_branch(int inst);
int db_inst_load(int inst);
int db_inst_store(int inst);
bool db_inst_unconditional_flow_transfer(int inst);
db_addr_t db_branch_taken(int inst, db_addr_t pc, db_regs_t *regs);
void ddb_suspend(struct trapframe *);
#define inst_trap_return(ins) db_inst_trap_return(ins)
#define inst_return(ins) db_inst_return(ins)
#define inst_call(ins) db_inst_call(ins)
#define inst_branch(ins) db_inst_branch(ins)
#define inst_load(ins) db_inst_load(ins)
#define inst_store(ins) db_inst_store(ins)
#define inst_unconditional_flow_transfer(ins) \
db_inst_unconditional_flow_transfer(ins)
#define branch_taken(ins, pc, regs) \
db_branch_taken((ins), (pc), (regs))
/* see note in db_interface.c about reversed breakpoint addrs */
#define next_instr_address(pc, bd) \
((bd) ? (pc) : ddb_regp->db_tf.tf_npc)
#define DB_MACHINE_COMMANDS
int kdb_trap(int, struct trapframe *);
/*
* We use elf symbols in DDB.
*/
#define DB_ELF_SYMBOLS
/*
* KGDB definitions
*/
typedef u_long kgdb_reg_t;
#define KGDB_NUMREGS 72
#define KGDB_BUFLEN 1024
#endif /* _SPARC_DB_MACHDEP_H_ */
|