OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [rtems-20020807/] [c/] [src/] [librdbg/] [src/] [m68k/] [rdbg_f.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1026 ivang
/*
2
 **************************************************************************
3
 *
4
 * Component =
5
 *
6
 * Synopsis  =   rdbg/m68k/rdbg_f.c
7
 *
8
 * rdbg_f.c,v 1.2 2002/02/01 17:00:01 joel Exp
9
 *
10
 **************************************************************************
11
 */
12
 
13
#include <assert.h>
14
#include <errno.h>
15
#include <rdbg/reg.h>
16
#include <rdbg/remdeb.h>
17
#include <rdbg/rdbg.h>
18
#include <rtems/score/cpu.h>
19
#include <rtems/score/thread.h>
20
 
21
  void
22
CtxToRegs (const CPU_Exception_frame * ctx, xdr_regs * regs)
23
{
24
  regs->r_dreg[0] = ctx->d0;
25
  regs->r_dreg[1] = ctx->d1;
26
  regs->r_dreg[2] = ctx->d2;
27
  regs->r_dreg[3] = ctx->d3;
28
  regs->r_dreg[4] = ctx->d4;
29
  regs->r_dreg[5] = ctx->d5;
30
  regs->r_dreg[6] = ctx->d6;
31
  regs->r_dreg[7] = ctx->d7;
32
 
33
  regs->r_areg[0] = ctx->a0;
34
  regs->r_areg[1] = ctx->a1;
35
  regs->r_areg[2] = ctx->a2;
36
  regs->r_areg[3] = ctx->a3;
37
  regs->r_areg[4] = ctx->a4;
38
  regs->r_areg[5] = ctx->a5;
39
  regs->r_areg[6] = ctx->a6;
40
  regs->r_areg[7] = ctx->a7;
41
 
42
  regs->r_sr = ctx->sr;
43
  regs->r_pc = ctx->pc;
44
  regs->r_vec = ctx->vecnum;
45
}
46
 
47
  void
48
RegsToCtx (const xdr_regs * regs, CPU_Exception_frame * ctx)
49
{
50
  ctx->d0 = regs->r_dreg[0];
51
  ctx->d1 = regs->r_dreg[1];
52
  ctx->d2 = regs->r_dreg[2];
53
  ctx->d3 = regs->r_dreg[3];
54
  ctx->d4 = regs->r_dreg[4];
55
  ctx->d5 = regs->r_dreg[5];
56
  ctx->d6 = regs->r_dreg[6];
57
  ctx->d7 = regs->r_dreg[7];
58
 
59
  ctx->a0 = regs->r_areg[0];
60
  ctx->a1 = regs->r_areg[1];
61
  ctx->a2 = regs->r_areg[2];
62
  ctx->a3 = regs->r_areg[3];
63
  ctx->a4 = regs->r_areg[4];
64
  ctx->a5 = regs->r_areg[5];
65
  ctx->a6 = regs->r_areg[6];
66
  ctx->a7 = regs->r_areg[7];
67
 
68
  ctx->sr = regs->r_sr;
69
  ctx->pc = regs->r_pc;
70
  ctx->vecnum = regs->r_vec;
71
}
72
 
73
  void
74
get_ctx_thread (Thread_Control * thread, CPU_Exception_frame * ctx)
75
{
76
  unsigned int *ptr;
77
  unsigned int i;
78
 
79
  /*
80
   * ISR stores d0-d1/a0-a1, calls _Thread_Dispatch
81
   * _Thread_Dispatch calls _Context_Switch == _CPU_Context_switch
82
   * _CPU_Context_switch stores/restores sr,d2-d7,a2-a7
83
   * so if my reasoning is correct, *sp points to a location in
84
   * _Thread_Dispatch
85
   */
86
  ctx->vecnum = 0xdeadbeef;
87
  ctx->sr = thread->Registers.sr;
88
  ctx->pc = *(unsigned32 *) thread->Registers.a7_msp;
89
  ctx->d0 = 0xdeadbeef;
90
  ctx->d1 = 0xdeadbeef;
91
  ctx->a0 = 0xdeadbeef;
92
  ctx->a1 = 0xdeadbeef;
93
 
94
  ctx->a2 = (unsigned32) thread->Registers.a2;
95
  ctx->a3 = (unsigned32) thread->Registers.a3;
96
  ctx->a4 = (unsigned32) thread->Registers.a4;
97
  ctx->a5 = (unsigned32) thread->Registers.a5;
98
  ctx->a6 = (unsigned32) thread->Registers.a6;
99
  ctx->a7 = (unsigned32) thread->Registers.a7_msp;
100
  ctx->d2 = thread->Registers.d2;
101
  ctx->d3 = thread->Registers.d3;
102
  ctx->d4 = thread->Registers.d4;
103
  ctx->d5 = thread->Registers.d5;
104
  ctx->d6 = thread->Registers.d6;
105
  ctx->d7 = thread->Registers.d7;
106
}
107
 
108
  void
109
set_ctx_thread (Thread_Control * thread, CPU_Exception_frame * ctx)
110
{
111
  thread->Registers.sr = ctx->sr;
112
  thread->Registers.d2 = ctx->d2;
113
  thread->Registers.d3 = ctx->d3;
114
  thread->Registers.d4 = ctx->d4;
115
  thread->Registers.d5 = ctx->d5;
116
  thread->Registers.d6 = ctx->d6;
117
  thread->Registers.d7 = ctx->d7;
118
  thread->Registers.a2 = (void *) ctx->a2;
119
  thread->Registers.a3 = (void *) ctx->a3;
120
  thread->Registers.a4 = (void *) ctx->a4;
121
  thread->Registers.a5 = (void *) ctx->a5;
122
  thread->Registers.a6 = (void *) ctx->a6;
123
  thread->Registers.a7_msp = (void *) ctx->a7;
124
}
125
 
126
  int
127
Single_Step (CPU_Exception_frame * ctx)
128
{
129
  if ((ctx->sr & (1 << 15)) != 0 || ExitForSingleStep != 0) {
130
    /*
131
     * Check coherency
132
     */
133
    assert ((ctx->sr & (1 << 15)) != 0);
134
    assert (ExitForSingleStep != 0);
135
    return 0;
136
  }
137
  ctx->sr |= 1 << 15;
138
  ++ExitForSingleStep;
139
  return 0;
140
}
141
 
142
  int
143
CheckForSingleStep (CPU_Exception_frame * ctx)
144
{
145
  if (ExitForSingleStep) {
146
    ctx->sr &= ~(1 << 15);
147
    ExitForSingleStep = 0;
148
    return 1;
149
  }
150
  return 0;
151
}
152
 
153
  void
154
CancelSingleStep (CPU_Exception_frame * ctx)
155
{
156
  /*
157
   * Cancel scheduled SS
158
   */
159
  ctx->sr &= ~(1 << 15);
160
  ExitForSingleStep--;
161
}
162
 
163
extern rtems_isr excHandler ();
164
 
165
  void
166
connect_rdbg_exception (void)
167
{
168
  set_vector (excHandler, 9, 0);
169
  set_vector (excHandler, 47, 0);
170
  set_vector (excHandler, 36, 0);
171
}
172
 
173
void
174
disconnect_rdbg_exception (void)
175
{
176
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.