]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/sparc/tb_entry-sparc.cpp
1f44db3ebd027ccf2b85e06e1a832a95b3cf507d
[l4.git] / kernel / fiasco / src / kern / sparc / tb_entry-sparc.cpp
1 INTERFACE [sparc]:
2
3 EXTENSION class Tb_entry
4 {
5 public:
6   enum
7   {
8     Tb_entry_size = 64,
9   };
10 };
11
12 /** logged kernel event plus register content. */
13 class Tb_entry_ke_reg : public Tb_entry
14 {
15 private:
16   struct Payload
17   {
18     union {
19       char          _msg[16];       ///< debug message
20       struct {
21         char        _dsc[2];
22         char const* _const_msg;
23       };
24     };
25     Mword         _r3, _r4, _r5;    ///< registers
26   };
27 };
28
29 /** logged trap. */
30 class Tb_entry_trap : public Tb_entry
31 {
32 private:
33   struct Payload
34   {
35     Unsigned8     _trapno;
36     Unsigned16    _error;
37     Mword         _cpsr, _sp;
38   };
39 };
40
41 // --------------------------------------------------------------------
42 IMPLEMENTATION [sparc]:
43
44 PUBLIC inline
45 void
46 Tb_entry::rdtsc()
47 {}
48
49 PUBLIC inline
50 const char *
51 Tb_entry_ke_reg::msg() const
52 {
53   return payload<Payload>()->_dsc[0] == 0 && payload<Payload>()->_dsc[1] == 1
54     ? payload<Payload>()->_const_msg : payload<Payload>()->_msg;
55 }
56
57 PUBLIC inline
58 Mword
59 Tb_entry_ke_reg::val1() const
60 { return payload<Payload>()->_r3; }
61
62 PUBLIC inline
63 Mword
64 Tb_entry_ke_reg::val2() const
65 { return payload<Payload>()->_r4; }
66
67 PUBLIC inline
68 Mword
69 Tb_entry_ke_reg::val3() const
70 { return payload<Payload>()->_r5; }
71
72 PUBLIC inline
73 void
74 Tb_entry_ke_reg::set(Context const *ctx, Mword eip, Mword v1, Mword v2, Mword v3)
75 {
76   set_global(Tbuf_ke_reg, ctx, eip);
77   payload<Payload>()->_r3 = v1;
78   payload<Payload>()->_r4 = v2;
79   payload<Payload>()->_r5 = v3;
80 }
81
82 PUBLIC inline
83 void
84 Tb_entry_ke_reg::set_const(Context const *ctx, Mword eip, const char * const msg,
85                            Mword v1, Mword v2, Mword v3)
86 {
87   set(ctx, eip, v1, v2, v3);
88   payload<Payload>()->_dsc[0] = 0; payload<Payload>()->_dsc[1] = 1;
89   payload<Payload>()->_const_msg = msg;
90 }
91
92 PUBLIC inline
93 void
94 Tb_entry_ke_reg::set_buf(unsigned i, char c)
95 {
96   if (i < sizeof(payload<Payload>()->_msg) - 1)
97     payload<Payload>()->_msg[i] = c >= ' ' ? c : '.';
98 }
99
100 PUBLIC inline
101 void
102 Tb_entry_ke_reg::term_buf(unsigned i)
103 {payload<Payload>()->_msg[i < sizeof(payload<Payload>()->_msg)-1 ? i
104   : sizeof(payload<Payload>()->_msg)-1] = '\0';}
105
106 // ------------------
107 PUBLIC inline
108 Unsigned16
109 Tb_entry_trap::cs() const
110 { return 0; }
111
112 PUBLIC inline
113 Unsigned8
114 Tb_entry_trap::trapno() const
115 { return payload<Payload>()->_trapno; }
116
117 PUBLIC inline
118 Unsigned16
119 Tb_entry_trap::error() const
120 { return payload<Payload>()->_error; }
121
122 PUBLIC inline
123 Mword
124 Tb_entry_trap::sp() const
125 { return payload<Payload>()->_sp; }
126
127 PUBLIC inline
128 Mword
129 Tb_entry_trap::cr2() const
130 { return 0; }
131
132 PUBLIC inline
133 Mword
134 Tb_entry_trap::eax() const
135 { return 0; }
136
137 PUBLIC inline NEEDS ["trap_state.h"]
138 void
139 Tb_entry_trap::set(Context const *ctx, Mword pc, Trap_state *)
140 {
141   set_global(Tbuf_trap, ctx, pc);
142   // More...
143 }
144
145 PUBLIC inline NEEDS ["trap_state.h"]
146 void
147 Tb_entry_trap::set(Context const *ctx, Mword pc, Mword )
148 {
149   set_global(Tbuf_trap, ctx, pc);
150 }
151