]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/jdb/jdb_utcb.cpp
update
[l4.git] / kernel / fiasco / src / jdb / jdb_utcb.cpp
1 /**
2  * @brief Jdb-Utcb module
3  *
4  * This module shows the user tcbs and the vCPU state of a thread/vcpu
5  */
6
7 IMPLEMENTATION:
8
9 #include <cassert>
10 #include <cstdio>
11 #include "l4_types.h"
12 #include "config.h"
13 #include "jdb.h"
14 #include "jdb_kobject.h"
15 #include "jdb_module.h"
16 #include "space.h"
17 #include "static_init.h"
18 #include "thread_object.h"
19 #include "thread_state.h"
20
21 class Jdb_utcb : public Jdb_module
22 {
23 public:
24   Jdb_utcb() FIASCO_INIT;
25 private:
26   static Kobject *thread;
27 };
28
29
30 static Jdb_utcb Jdb_utcb INIT_PRIORITY(JDB_MODULE_INIT_PRIO);
31
32 Kobject *Jdb_utcb::thread;
33
34 IMPLEMENT
35 Jdb_utcb::Jdb_utcb()
36   : Jdb_module("INFO")
37 {}
38
39 PUBLIC static
40 void
41 Jdb_utcb::print(Thread *t)
42 {
43   if (t->utcb())
44     {
45       printf("\nUtcb-addr: %p\n", t->utcb());
46       t->utcb()->print();
47     }
48
49   if (t->state() & Thread_vcpu_enabled)
50     {
51       Vcpu_state *v = t->vcpu_state();
52       printf("\nVcpu-state-addr: %p\n", v);
53       printf("state: %lx    saved-state:  %lx  sticky: %lx\n",
54              v->state, v->_saved_state, v->sticky_flags);
55       printf("entry_sp = %lx    entry_ip = %lx  sp = %lx\n",
56              v->_entry_sp, v->_entry_ip, v->_sp);
57       v->_ts.dump();
58     }
59 }
60
61 PUBLIC virtual
62 Jdb_module::Action_code
63 Jdb_utcb::action( int cmd, void *&, char const *&, int &)
64 {
65   if (cmd)
66     return NOTHING;
67
68   Thread *t = Kobject::dcast<Thread_object *>(thread);
69   if (!t)
70     {
71       printf(" Invalid thread\n");
72       return NOTHING;
73     }
74
75   print(t);
76
77   return NOTHING;
78 }
79
80 PUBLIC
81 int
82 Jdb_utcb::num_cmds() const
83 { return 1; }
84
85 PUBLIC
86 Jdb_module::Cmd
87 const * Jdb_utcb::cmds() const
88 {
89   static Cmd cs[] =
90     {
91       { 0, "z", "z", "%q", "z<thread>\tshow UTCB and vCPU state", &thread }
92     };
93   return cs;
94 }
95
96 // --------------------------------------------------------------------------
97 // Handler for kobject list
98
99 class Jdb_kobject_utcb_hdl : public Jdb_kobject_handler
100 {
101 public:
102   Jdb_kobject_utcb_hdl() : Jdb_kobject_handler(0) {}
103   virtual bool show_kobject(Kobject *, int) { return true; }
104   virtual ~Jdb_kobject_utcb_hdl() {}
105 };
106
107 PUBLIC static FIASCO_INIT
108 void
109 Jdb_kobject_utcb_hdl::init()
110 {
111   static Jdb_kobject_utcb_hdl hdl;
112   Jdb_kobject::module()->register_handler(&hdl);
113 }
114
115 PUBLIC
116 bool
117 Jdb_kobject_utcb_hdl::handle_key(Kobject *o, int keycode)
118 {
119   if (keycode == 'z')
120     {
121       Thread *t = Kobject::dcast<Thread_object *>(o);
122       if (!t)
123         return false;
124
125       Jdb_utcb::print(t);
126       Jdb::getchar();
127       return true;
128     }
129
130   return false;
131 }
132
133 STATIC_INITIALIZE(Jdb_kobject_utcb_hdl);