forked from pulp-platform/debug_bridge
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbreakpoints.cpp
More file actions
152 lines (114 loc) · 3.22 KB
/
breakpoints.cpp
File metadata and controls
152 lines (114 loc) · 3.22 KB
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#include "breakpoints.h"
#include "mem.h"
#include <stdio.h>
#include <stdlib.h>
#define INSN_IS_COMPRESSED(instr) ((instr & 0x3) != 0x3)
#define INSN_BP_COMPRESSED 0x8002
#define INSN_BP 0x00100073
BreakPoints::BreakPoints(MemIF* mem, Cache* cache) {
m_mem = mem;
m_cache = cache;
}
bool
BreakPoints::insert(unsigned int addr) {
bool retval;
uint32_t data_bp;
struct bp_insn bp;
bp.addr = addr;
retval = m_mem->access(0, addr, 4, (char*)&bp.insn_orig);
bp.is_compressed = INSN_IS_COMPRESSED(bp.insn_orig);
m_bp_list.push_back(bp);
if (bp.is_compressed) {
data_bp = INSN_BP_COMPRESSED;
retval = retval && m_mem->access(1, addr, 2, (char*)&data_bp);
} else {
data_bp = INSN_BP;
retval = retval && m_mem->access(1, addr, 4, (char*)&data_bp);
}
return retval && m_cache->flush();
}
bool
BreakPoints::remove(unsigned int addr) {
bool retval;
bool is_compressed;
uint32_t data;
for (std::list<struct bp_insn>::iterator it = m_bp_list.begin(); it != m_bp_list.end(); it++) {
if (it->addr == addr) {
data = it->insn_orig;
is_compressed = it->is_compressed;
m_bp_list.erase(it);
if (is_compressed)
retval = m_mem->access(1, addr, 2, (char*)&data);
else
retval = m_mem->access(1, addr, 4, (char*)&data);
return retval && m_cache->flush();
}
}
return false;
}
bool
BreakPoints::clear() {
bool retval = this->disable_all();
m_bp_list.clear();
return retval;
}
bool
BreakPoints::at_addr(unsigned int addr) {
for (std::list<struct bp_insn>::iterator it = m_bp_list.begin(); it != m_bp_list.end(); it++) {
if (it->addr == addr) {
// we found our bp
return true;
}
}
return false;
}
bool
BreakPoints::enable(unsigned int addr) {
bool retval;
uint32_t data;
for (std::list<struct bp_insn>::iterator it = m_bp_list.begin(); it != m_bp_list.end(); it++) {
if (it->addr == addr) {
if (it->is_compressed) {
data = INSN_BP_COMPRESSED;
retval = m_mem->access(1, addr, 2, (char*)&data);
} else {
data = INSN_BP;
retval = m_mem->access(1, addr, 4, (char*)&data);
}
return retval && m_cache->flush();
}
}
fprintf(stderr, "bp_enable: Did not find any bp at addr %08X\n", addr);
return false;
}
bool
BreakPoints::disable(unsigned int addr) {
bool retval;
for (std::list<struct bp_insn>::iterator it = m_bp_list.begin(); it != m_bp_list.end(); it++) {
if (it->addr == addr) {
if (it->is_compressed)
retval = m_mem->access(1, addr, 2, (char*)&it->insn_orig);
else
retval = m_mem->access(1, addr, 4, (char*)&it->insn_orig);
return retval && m_cache->flush();
}
}
fprintf(stderr, "bp_enable: Did not find any bp at addr %08X\n", addr);
return false;
}
bool
BreakPoints::enable_all() {
bool retval = true;
for (std::list<struct bp_insn>::iterator it = m_bp_list.begin(); it != m_bp_list.end(); it++) {
retval = retval && this->enable(it->addr);
}
return retval;
}
bool
BreakPoints::disable_all() {
bool retval = true;
for (std::list<struct bp_insn>::iterator it = m_bp_list.begin(); it != m_bp_list.end(); it++) {
retval = retval && this->disable(it->addr);
}
return retval;
}