Subversion Repositories HelenOS

Rev

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

Rev 3005 Rev 3093
Line 33... Line 33...
33
 */
33
 */
34
 
34
 
35
#include <stdio.h>
35
#include <stdio.h>
36
#include <stdlib.h>
36
#include <stdlib.h>
37
#include <sys/types.h>
37
#include <sys/types.h>
-
 
38
#include <bool.h>
38
#include <udebug.h>
39
#include <udebug.h>
39
 
40
 
40
#include <kernel/arch/context_offset.h>
41
#include <kernel/arch/context_offset.h>
41
 
42
 
42
#include "../../../cons.h"
43
#include "../../../cons.h"
43
#include "../../../main.h"
44
#include "../../../main.h"
44
#include "../../../include/arch.h"
45
#include "../../../include/arch.h"
45
 
46
 
46
#define OPCODE_INT3     0xCC
47
#define OPCODE_INT3     0xCC
47
 
48
 
-
 
49
static int _set_trap_flag(dthread_t *dt, bool enable)
-
 
50
{
-
 
51
    static istate_t istate;
-
 
52
    int rc;
-
 
53
 
-
 
54
    rc = udebug_regs_read(app_phone, dt->hash, &istate);
-
 
55
    if (rc < 0) { printf("regs read failed\n"); return; }
-
 
56
 
-
 
57
    if (enable) istate.eflags |= 0x0100; /* trap flag */
-
 
58
    else if (!active_bkpt) istate.eflags &= ~0x0100; /* trap flag */
-
 
59
 
-
 
60
    rc = udebug_regs_write(app_phone, dt->hash, &istate);  
-
 
61
    if (rc < 0) { printf("regs write failed\n"); return; }
-
 
62
 
-
 
63
    return 0;
-
 
64
}
-
 
65
 
48
int arch_breakpoint_set(breakpoint_t *b)
66
int arch_breakpoint_set(breakpoint_t *b)
49
{
67
{
50
    char brkp[1];
68
    char brkp[1];
51
    int rc;
69
    int rc;
52
 
70
 
Line 126... Line 144...
126
        rc = udebug_mem_write(app_phone, brkinstr, b->addr, 1);
144
        rc = udebug_mem_write(app_phone, brkinstr, b->addr, 1);
127
//      cons_printf("restore breakpoint -> %d\n", rc);
145
//      cons_printf("restore breakpoint -> %d\n", rc);
128
        active_bkpt = NULL;
146
        active_bkpt = NULL;
129
    }
147
    }
130
 
148
 
131
    if (!dt->arch.singlestep) {
-
 
132
        rc = udebug_regs_read(app_phone, dt->hash, &istate);
149
    rc = _set_trap_flag(dt, false);
133
//      cons_printf("udebug_regs_read -> %d\n", rc);
-
 
134
        istate.eflags &= ~0x0100; /* trap flag */
150
    dt->arch.singlestep = false;
135
        rc = udebug_regs_write(app_phone, dt->hash, &istate);
-
 
136
    } else {
151
 
137
//      printf("ss-hit\n");
-
 
138
        singlestep_hit();
152
    singlestep_hit();
139
    }
-
 
140
}
153
}
141
 
154
 
142
void arch_dump_regs(thash_t thash)
155
void arch_dump_regs(thash_t thash)
143
{
156
{
144
    static istate_t istate;
157
    static istate_t istate;
Line 153... Line 166...
153
        istate.eip, istate.eflags, istate.eax, istate.ebx,
166
        istate.eip, istate.eflags, istate.eax, istate.ebx,
154
        istate.ecx, istate.edx, istate.esi, istate.edi, istate.cs,
167
        istate.ecx, istate.edx, istate.esi, istate.edi, istate.cs,
155
        istate.ds, istate.es, istate.fs, istate.gs);
168
        istate.ds, istate.es, istate.fs, istate.gs);
156
}
169
}
157
 
170
 
158
void arch_set_singlestep(dthread_t *dt, int enable)
171
void arch_singlestep(dthread_t *dt)
159
{
172
{
160
    static istate_t istate;
-
 
161
    int rc;
173
    int rc;
162
 
174
 
163
    rc = udebug_regs_read(app_phone, dt->hash, &istate);
175
    rc = _set_trap_flag(dt, true);
164
    if (rc < 0) { printf("regs read failed\n"); return; }
176
    if (rc != 0) return;
165
 
-
 
166
    if (enable) istate.eflags |= 0x0100; /* trap flag */
-
 
167
    else if (!active_bkpt) istate.eflags &= ~0x0100; /* trap flag */
-
 
168
 
-
 
169
    rc = udebug_regs_write(app_phone, dt->hash, &istate);  
-
 
170
    if (rc < 0) { printf("regs write failed\n"); return; }
-
 
171
 
177
 
172
    dt->arch.singlestep = enable;
178
    dthread_resume(dt);
173
}
179
}
174
 
180
 
175
/** @}
181
/** @}
176
 */
182
 */