Subversion Repositories HelenOS

Rev

Rev 3431 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3431 Rev 4377
Line 33... Line 33...
33
 */
33
 */
34
 
34
 
35
#include <arch/debugger.h>
35
#include <arch/debugger.h>
36
#include <console/kconsole.h>
36
#include <console/kconsole.h>
37
#include <console/cmd.h>
37
#include <console/cmd.h>
38
#include <symtab.h>
-
 
39
#include <print.h>
38
#include <print.h>
40
#include <panic.h>
39
#include <panic.h>
41
#include <interrupt.h>
40
#include <interrupt.h>
42
#include <arch/asm.h>
41
#include <arch/asm.h>
43
#include <arch/cpu.h>
42
#include <arch/cpu.h>
44
#include <debug.h>
43
#include <debug.h>
45
#include <func.h>
44
#include <func.h>
46
#include <smp/ipi.h>
45
#include <smp/ipi.h>
-
 
46
#include <symtab.h>
47
 
47
 
48
typedef struct  {
48
typedef struct  {
49
    uintptr_t address;      /**< Breakpoint address */
49
    uintptr_t address;      /**< Breakpoint address */
50
    int flags;              /**< Flags regarding breakpoint */
50
    int flags;              /**< Flags regarding breakpoint */
51
    int counter;            /**< How many times the exception occured */
51
    int counter;            /**< How many times the exception occured */
52
} bpinfo_t;
52
} bpinfo_t;
53
 
53
 
54
static bpinfo_t breakpoints[BKPOINTS_MAX];
54
static bpinfo_t breakpoints[BKPOINTS_MAX];
55
SPINLOCK_INITIALIZE(bkpoint_lock);
55
SPINLOCK_INITIALIZE(bkpoint_lock);
56
 
56
 
-
 
57
#ifdef CONFIG_KCONSOLE
-
 
58
 
57
static int cmd_print_breakpoints(cmd_arg_t *argv);
59
static int cmd_print_breakpoints(cmd_arg_t *argv);
58
static cmd_info_t bkpts_info = {
60
static cmd_info_t bkpts_info = {
59
    .name = "bkpts",
61
    .name = "bkpts",
60
    .description = "Print breakpoint table.",
62
    .description = "Print breakpoint table.",
61
    .func = cmd_print_breakpoints,
63
    .func = cmd_print_breakpoints,
62
    .argc = 0,
64
    .argc = 0,
63
};
65
};
64
 
66
 
65
#ifndef CONFIG_DEBUG_AS_WATCHPOINT
-
 
66
 
-
 
67
static int cmd_del_breakpoint(cmd_arg_t *argv);
67
static int cmd_del_breakpoint(cmd_arg_t *argv);
68
static cmd_arg_t del_argv = {
68
static cmd_arg_t del_argv = {
69
    .type = ARG_TYPE_INT
69
    .type = ARG_TYPE_INT
70
};
70
};
71
static cmd_info_t delbkpt_info = {
71
static cmd_info_t delbkpt_info = {
Line 97... Line 97...
97
    .func = cmd_add_breakpoint,
97
    .func = cmd_add_breakpoint,
98
    .argc = 1,
98
    .argc = 1,
99
    .argv = &addw_argv
99
    .argv = &addw_argv
100
};
100
};
101
 
101
 
102
#endif
-
 
103
 
-
 
104
/** Print table of active breakpoints */
-
 
105
int cmd_print_breakpoints(cmd_arg_t *argv __attribute__((unused)))
-
 
106
{
-
 
107
    unsigned int i;
-
 
108
    char *symbol;
-
 
109
 
-
 
110
#ifdef __32_BITS__  
102
#endif /* CONFIG_KCONSOLE */
111
    printf("#  Count Address    In symbol\n");
-
 
112
    printf("-- ----- ---------- ---------\n");
-
 
113
#endif
-
 
114
 
-
 
115
#ifdef __64_BITS__
-
 
116
    printf("#  Count Address            In symbol\n");
-
 
117
    printf("-- ----- ------------------ ---------\n");
-
 
118
#endif
-
 
119
   
-
 
120
    for (i = 0; i < BKPOINTS_MAX; i++)
-
 
121
        if (breakpoints[i].address) {
-
 
122
            symbol = get_symtab_entry(breakpoints[i].address);
-
 
123
 
-
 
124
#ifdef __32_BITS__
-
 
125
            printf("%-2u %-5d %#10zx %s\n", i,
-
 
126
                breakpoints[i].counter, breakpoints[i].address,
-
 
127
                symbol);
-
 
128
#endif
-
 
129
 
-
 
130
#ifdef __64_BITS__
-
 
131
            printf("%-2u %-5d %#18zx %s\n", i,
-
 
132
                breakpoints[i].counter, breakpoints[i].address,
-
 
133
                symbol);
-
 
134
#endif
-
 
135
 
-
 
136
        }
-
 
137
    return 1;
-
 
138
}
-
 
139
 
103
 
140
/* Setup DR register according to table */
104
/* Setup DR register according to table */
141
static void setup_dr(int curidx)
105
static void setup_dr(int curidx)
142
{
106
{
143
    unative_t dr7;
107
    unative_t dr7;
Line 235... Line 199...
235
    spinlock_unlock(&bkpoint_lock);
199
    spinlock_unlock(&bkpoint_lock);
236
    interrupts_restore(ipl);
200
    interrupts_restore(ipl);
237
 
201
 
238
    /* Send IPI */
202
    /* Send IPI */
239
#ifdef CONFIG_SMP
203
#ifdef CONFIG_SMP
240
//  ipi_broadcast(VECTOR_DEBUG_IPI);    
204
//  ipi_broadcast(VECTOR_DEBUG_IPI);
241
#endif  
205
#endif  
242
 
206
 
243
    return curidx;
207
    return curidx;
244
}
208
}
245
 
209
 
246
#ifdef amd64
210
#ifdef __64_BITS__
247
#   define getip(x) ((x)->rip)
211
    #define getip(x)  ((x)->rip)
248
#else
212
#else
249
#   define getip(x) ((x)->eip)
213
    #define getip(x)  ((x)->eip)
250
#endif
214
#endif
251
 
215
 
252
static void handle_exception(int slot, istate_t *istate)
216
static void handle_exception(int slot, istate_t *istate)
253
{
217
{
254
    ASSERT(breakpoints[slot].address);
218
    ASSERT(breakpoints[slot].address);
Line 263... Line 227...
263
        } else {
227
        } else {
264
            printf("Data watchpoint - new data: %lx\n",
228
            printf("Data watchpoint - new data: %lx\n",
265
                *((unative_t *) breakpoints[slot].address));
229
                *((unative_t *) breakpoints[slot].address));
266
        }
230
        }
267
    }
231
    }
-
 
232
 
268
    printf("Reached breakpoint %d:%lx(%s)\n", slot, getip(istate),
233
    printf("Reached breakpoint %d:%lx (%s)\n", slot, getip(istate),
269
        get_symtab_entry(getip(istate)));
234
        symtab_fmt_name_lookup(getip(istate)));
-
 
235
 
270
    printf("***Type 'exit' to exit kconsole.\n");
236
#ifdef CONFIG_KCONSOLE
271
    atomic_set(&haltstate,1);
237
    atomic_set(&haltstate, 1);
272
    kconsole((void *) "debug");
238
    kconsole("debug", "Debug console ready.\n", false);
273
    atomic_set(&haltstate,0);
239
    atomic_set(&haltstate, 0);
-
 
240
#endif
274
}
241
}
275
 
242
 
276
void breakpoint_del(int slot)
243
void breakpoint_del(int slot)
277
{
244
{
278
    bpinfo_t *cur;
245
    bpinfo_t *cur;
Line 297... Line 264...
297
#ifdef CONFIG_SMP
264
#ifdef CONFIG_SMP
298
//  ipi_broadcast(VECTOR_DEBUG_IPI);    
265
//  ipi_broadcast(VECTOR_DEBUG_IPI);    
299
#endif
266
#endif
300
}
267
}
301
 
268
 
302
#ifndef CONFIG_DEBUG_AS_WATCHPOINT
-
 
303
 
269
 
304
/** Remove breakpoint from table */
-
 
305
int cmd_del_breakpoint(cmd_arg_t *argv)
-
 
306
{
-
 
307
    unative_t bpno = argv->intval;
-
 
308
    if (bpno > BKPOINTS_MAX) {
-
 
309
        printf("Invalid breakpoint number.\n");
-
 
310
        return 0;
-
 
311
    }
-
 
312
    breakpoint_del(argv->intval);
-
 
313
    return 1;
-
 
314
}
-
 
315
 
-
 
316
/** Add new breakpoint to table */
-
 
317
static int cmd_add_breakpoint(cmd_arg_t *argv)
-
 
318
{
-
 
319
    int flags;
-
 
320
    int id;
-
 
321
 
-
 
322
    if (argv == &add_argv) {
-
 
323
        flags = BKPOINT_INSTR;
-
 
324
    } else { /* addwatchp */
-
 
325
        flags = BKPOINT_WRITE;
-
 
326
    }
-
 
327
    printf("Adding breakpoint on address: %p\n", argv->intval);
-
 
328
    id = breakpoint_add((void *)argv->intval, flags, -1);
-
 
329
    if (id < 0)
-
 
330
        printf("Add breakpoint failed.\n");
-
 
331
    else
-
 
332
        printf("Added breakpoint %d.\n", id);
-
 
333
   
-
 
334
    return 1;
-
 
335
}
-
 
336
#endif
-
 
337
 
270
 
338
static void debug_exception(int n __attribute__((unused)), istate_t *istate)
271
static void debug_exception(int n __attribute__((unused)), istate_t *istate)
339
{
272
{
340
    unative_t dr6;
273
    unative_t dr6;
341
    int i;
274
    int i;
Line 354... Line 287...
354
        }
287
        }
355
    }
288
    }
356
#endif
289
#endif
357
 
290
 
358
    /* Set RF to restart the instruction  */
291
    /* Set RF to restart the instruction  */
359
#ifdef amd64       
292
#ifdef __64_BITS__
360
    istate->rflags |= RFLAGS_RF;
293
    istate->rflags |= RFLAGS_RF;
361
#else
294
#else
362
    istate->eflags |= EFLAGS_RF;
295
    istate->eflags |= EFLAGS_RF;
363
#endif
296
#endif
364
 
297
 
Line 391... Line 324...
391
{
324
{
392
    int i;
325
    int i;
393
 
326
 
394
    for (i = 0; i < BKPOINTS_MAX; i++)
327
    for (i = 0; i < BKPOINTS_MAX; i++)
395
        breakpoints[i].address = NULL;
328
        breakpoints[i].address = NULL;
396
   
329
 
-
 
330
#ifdef CONFIG_KCONSOLE
397
    cmd_initialize(&bkpts_info);
331
    cmd_initialize(&bkpts_info);
398
    if (!cmd_register(&bkpts_info))
332
    if (!cmd_register(&bkpts_info))
399
        panic("could not register command %s\n", bkpts_info.name);
333
        printf("Cannot register command %s\n", bkpts_info.name);
400
 
334
 
401
#ifndef CONFIG_DEBUG_AS_WATCHPOINT
-
 
402
    cmd_initialize(&delbkpt_info);
335
    cmd_initialize(&delbkpt_info);
403
    if (!cmd_register(&delbkpt_info))
336
    if (!cmd_register(&delbkpt_info))
404
        panic("could not register command %s\n", delbkpt_info.name);
337
        printf("Cannot register command %s\n", delbkpt_info.name);
405
 
338
 
406
    cmd_initialize(&addbkpt_info);
339
    cmd_initialize(&addbkpt_info);
407
    if (!cmd_register(&addbkpt_info))
340
    if (!cmd_register(&addbkpt_info))
408
        panic("could not register command %s\n", addbkpt_info.name);
341
        printf("Cannot register command %s\n", addbkpt_info.name);
409
 
342
 
410
    cmd_initialize(&addwatchp_info);
343
    cmd_initialize(&addwatchp_info);
411
    if (!cmd_register(&addwatchp_info))
344
    if (!cmd_register(&addwatchp_info))
412
        panic("could not register command %s\n", addwatchp_info.name);
345
        printf("Cannot register command %s\n", addwatchp_info.name);
413
#endif
346
#endif /* CONFIG_KCONSOLE */
414
   
347
   
415
    exc_register(VECTOR_DEBUG, "debugger", debug_exception);
348
    exc_register(VECTOR_DEBUG, "debugger", debug_exception);
416
#ifdef CONFIG_SMP
349
#ifdef CONFIG_SMP
417
    exc_register(VECTOR_DEBUG_IPI, "debugger_smp", debug_ipi);
350
    exc_register(VECTOR_DEBUG_IPI, "debugger_smp", debug_ipi);
418
#endif
351
#endif
419
}
352
}
420
 
353
 
-
 
354
#ifdef CONFIG_KCONSOLE
-
 
355
/** Print table of active breakpoints */
-
 
356
int cmd_print_breakpoints(cmd_arg_t *argv __attribute__((unused)))
-
 
357
{
-
 
358
    unsigned int i;
-
 
359
    char *symbol;
-
 
360
 
-
 
361
#ifdef __32_BITS__
-
 
362
    printf("#  Count Address    In symbol\n");
-
 
363
    printf("-- ----- ---------- ---------\n");
-
 
364
#endif
-
 
365
 
-
 
366
#ifdef __64_BITS__
-
 
367
    printf("#  Count Address            In symbol\n");
-
 
368
    printf("-- ----- ------------------ ---------\n");
-
 
369
#endif
-
 
370
   
-
 
371
    for (i = 0; i < BKPOINTS_MAX; i++)
-
 
372
        if (breakpoints[i].address) {
-
 
373
            symbol = symtab_fmt_name_lookup(
-
 
374
                breakpoints[i].address);
-
 
375
 
-
 
376
#ifdef __32_BITS__
-
 
377
            printf("%-2u %-5d %#10zx %s\n", i,
-
 
378
                breakpoints[i].counter, breakpoints[i].address,
-
 
379
                symbol);
-
 
380
#endif
-
 
381
 
-
 
382
#ifdef __64_BITS__
-
 
383
            printf("%-2u %-5d %#18zx %s\n", i,
-
 
384
                breakpoints[i].counter, breakpoints[i].address,
-
 
385
                symbol);
-
 
386
#endif
-
 
387
 
-
 
388
        }
-
 
389
    return 1;
-
 
390
}
-
 
391
 
-
 
392
/** Remove breakpoint from table */
-
 
393
int cmd_del_breakpoint(cmd_arg_t *argv)
-
 
394
{
-
 
395
    unative_t bpno = argv->intval;
-
 
396
    if (bpno > BKPOINTS_MAX) {
-
 
397
        printf("Invalid breakpoint number.\n");
-
 
398
        return 0;
-
 
399
    }
-
 
400
    breakpoint_del(argv->intval);
-
 
401
    return 1;
-
 
402
}
-
 
403
 
-
 
404
/** Add new breakpoint to table */
-
 
405
static int cmd_add_breakpoint(cmd_arg_t *argv)
-
 
406
{
-
 
407
    int flags;
-
 
408
    int id;
-
 
409
 
-
 
410
    if (argv == &add_argv) {
-
 
411
        flags = BKPOINT_INSTR;
-
 
412
    } else { /* addwatchp */
-
 
413
        flags = BKPOINT_WRITE;
-
 
414
    }
-
 
415
    printf("Adding breakpoint on address: %p\n", argv->intval);
-
 
416
    id = breakpoint_add((void *)argv->intval, flags, -1);
-
 
417
    if (id < 0)
-
 
418
        printf("Add breakpoint failed.\n");
-
 
419
    else
-
 
420
        printf("Added breakpoint %d.\n", id);
-
 
421
   
-
 
422
    return 1;
-
 
423
}
-
 
424
#endif /* CONFIG_KCONSOLE */
-
 
425
 
421
/** @}
426
/** @}
422
 */
427
 */