]> 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().kern())
44     {
45       printf("\nUtcb-addr: %p\n", t->utcb().kern());
46       t->utcb().kern()->print();
47     }
48
49   if (t->state(false) & Thread_vcpu_enabled)
50     {
51       Vcpu_state *v = t->vcpu_state().kern();
52       printf("\nVcpu-state-addr: %p\n", v);
53       printf("state: %x    saved-state:  %x  sticky: %x\n",
54              (unsigned)v->state, (unsigned)v->_saved_state,
55              (unsigned)v->sticky_flags);
56       printf("entry_sp = %lx    entry_ip = %lx  sp = %lx\n",
57              v->_entry_sp, v->_entry_ip, v->_sp);
58       v->_regs.dump();
59     }
60 }
61
62 PUBLIC virtual
63 Jdb_module::Action_code
64 Jdb_utcb::action( int cmd, void *&, char const *&, int &)
65 {
66   if (cmd)
67     return NOTHING;
68
69   Thread *t = cxx::dyn_cast<Thread *>(thread);
70   if (!t)
71     {
72       printf(" Invalid thread\n");
73       return NOTHING;
74     }
75
76   print(t);
77
78   return NOTHING;
79 }
80
81 PUBLIC
82 int
83 Jdb_utcb::num_cmds() const
84 { return 1; }
85
86 PUBLIC
87 Jdb_module::Cmd
88 const * Jdb_utcb::cmds() const
89 {
90   static Cmd cs[] =
91     {
92       { 0, "z", "z", "%q", "z<thread>\tshow UTCB and vCPU state", &thread }
93     };
94   return cs;
95 }
96
97 // --------------------------------------------------------------------------
98 // Handler for kobject list
99
100 class Jdb_kobject_utcb_hdl : public Jdb_kobject_handler
101 {
102 public:
103   virtual bool show_kobject(Kobject_common *, 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_common *o, int keycode)
118 {
119   if (keycode == 'z')
120     {
121       Thread *t = cxx::dyn_cast<Thread *>(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);