diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/kgdb.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/kernel/kgdb.c b/kernel/kgdb.c index 3ec23c3ec97f..c0d45b2c4d79 100644 --- a/kernel/kgdb.c +++ b/kernel/kgdb.c | |||
@@ -166,13 +166,6 @@ early_param("nokgdbroundup", opt_nokgdbroundup); | |||
166 | * Weak aliases for breakpoint management, | 166 | * Weak aliases for breakpoint management, |
167 | * can be overriden by architectures when needed: | 167 | * can be overriden by architectures when needed: |
168 | */ | 168 | */ |
169 | int __weak kgdb_validate_break_address(unsigned long addr) | ||
170 | { | ||
171 | char tmp_variable[BREAK_INSTR_SIZE]; | ||
172 | |||
173 | return probe_kernel_read(tmp_variable, (char *)addr, BREAK_INSTR_SIZE); | ||
174 | } | ||
175 | |||
176 | int __weak kgdb_arch_set_breakpoint(unsigned long addr, char *saved_instr) | 169 | int __weak kgdb_arch_set_breakpoint(unsigned long addr, char *saved_instr) |
177 | { | 170 | { |
178 | int err; | 171 | int err; |
@@ -191,6 +184,25 @@ int __weak kgdb_arch_remove_breakpoint(unsigned long addr, char *bundle) | |||
191 | (char *)bundle, BREAK_INSTR_SIZE); | 184 | (char *)bundle, BREAK_INSTR_SIZE); |
192 | } | 185 | } |
193 | 186 | ||
187 | int __weak kgdb_validate_break_address(unsigned long addr) | ||
188 | { | ||
189 | char tmp_variable[BREAK_INSTR_SIZE]; | ||
190 | int err; | ||
191 | /* Validate setting the breakpoint and then removing it. In the | ||
192 | * remove fails, the kernel needs to emit a bad message because we | ||
193 | * are deep trouble not being able to put things back the way we | ||
194 | * found them. | ||
195 | */ | ||
196 | err = kgdb_arch_set_breakpoint(addr, tmp_variable); | ||
197 | if (err) | ||
198 | return err; | ||
199 | err = kgdb_arch_remove_breakpoint(addr, tmp_variable); | ||
200 | if (err) | ||
201 | printk(KERN_ERR "KGDB: Critical breakpoint error, kernel " | ||
202 | "memory destroyed at: %lx", addr); | ||
203 | return err; | ||
204 | } | ||
205 | |||
194 | unsigned long __weak kgdb_arch_pc(int exception, struct pt_regs *regs) | 206 | unsigned long __weak kgdb_arch_pc(int exception, struct pt_regs *regs) |
195 | { | 207 | { |
196 | return instruction_pointer(regs); | 208 | return instruction_pointer(regs); |