]> rtime.felk.cvut.cz Git - l4.git/blobdiff - kernel/fiasco/src/jdb/jdb_tcb.cpp
update
[l4.git] / kernel / fiasco / src / jdb / jdb_tcb.cpp
index b4d21dd8b6e1af79c65c42af3345e715233d4823..fd476f4f91750e20acc8f38bf3a54e5abcde24ce 100644 (file)
@@ -23,13 +23,14 @@ IMPLEMENTATION:
 #include "jdb_thread.h"
 #include "jdb_util.h"
 #include "kernel_console.h"
+#include "kernel_task.h"
 #include "keycodes.h"
 #include "l4_types.h"
 #include "push_console.h"
 #include "simpleio.h"
 #include "static_init.h"
 #include "task.h"
-#include "thread.h"
+#include "thread_object.h"
 #include "thread_state.h"
 #include "types.h"
 
@@ -46,8 +47,8 @@ class Jdb_tcb_ptr
 {
 public:
   Jdb_tcb_ptr(Address addr = 0)
-    : _base(addr & ~(Config::thread_block_size-1)),
-      _offs(addr &  (Config::thread_block_size-1))
+    : _base(addr & ~(Context::Size-1)),
+      _offs(addr &  (Context::Size-1))
   {}
 
   Jdb_tcb_ptr(Jdb_tcb_ptr const &p)
@@ -55,12 +56,12 @@ public:
   {}
 
   inline bool valid() const
-  { return _offs <= Config::thread_block_size-sizeof(Mword); }
+  { return _offs <= Context::Size-sizeof(Mword); }
 
   bool operator > (int offs) const
   {
-    return offs < 0 ? _offs > Config::thread_block_size + offs*sizeof(Mword)
-                   : _offs > offs*sizeof(Mword);
+    return offs < 0 ? _offs > Context::Size + offs*sizeof(Mword)
+                    : _offs > offs*sizeof(Mword);
   }
 
   Jdb_tcb_ptr &operator += (int offs)
@@ -80,7 +81,7 @@ public:
   inline const char *user_value_desc() const;
 
   inline Mword top_value(int offs) const
-  { return *((Mword*)(Cpu::stack_align(_base + Config::thread_block_size)) + offs); }
+  { return *((Mword*)(Cpu::stack_align(_base + Context::Size)) + offs); }
 
   inline Address base() const
   { return _base; }
@@ -134,7 +135,7 @@ class Jdb_tcb : public Jdb_module, public Jdb_kobject_handler
 
 private:
   static void print_return_frame_regs(Jdb_tcb_ptr const &current, Mword ksp);
-  static void print_entry_frame_regs(Space *task);
+  static void print_entry_frame_regs(Thread *t);
   static void info_thread_state(Thread *t);
 
   static Jdb_disasm_view _disasm_view;
@@ -145,8 +146,8 @@ private:
 
 Kobject *Jdb_tcb::threadid;
 Address Jdb_tcb::address;
-char   Jdb_tcb::first_char;
-char   Jdb_tcb::auto_tcb;
+char    Jdb_tcb::first_char;
+char    Jdb_tcb::auto_tcb;
 Jdb_disasm_view Jdb_tcb::_disasm_view(Jdb_tcb::Disasm_x, Jdb_tcb::Disasm_y);
 Jdb_stack_view  Jdb_tcb::_stack_view (Jdb_tcb::Stack_y);
 
@@ -225,7 +226,7 @@ Jdb_stack_view::print_value(Jdb_tcb_ptr const &p, bool highl = false)
          } */
     }
 
-  printf(" %s"ADDR_FMT"%s", s1, p.value(), s2);
+  printf(" %s" ADDR_FMT "%s", s1, p.value(), s2);
 }
 
 
@@ -243,14 +244,14 @@ Jdb_stack_view::dump()//Jdb_tcb_ptr const &current)
       Kconsole::console()->getchar_chance();
 
       if (p.valid())
-       {
-         printf("    %03lx ", p.addr() & 0xfff);
-         for (unsigned x = 0; x < cols(); ++x, p+=1)
-           print_value(p);
-         putchar('\n');
-       }
+        {
+          printf("    %03lx ", p.addr() & 0xfff);
+          for (unsigned x = 0; x < cols(); ++x, p+=1)
+            print_value(p);
+          putchar('\n');
+        }
       else
-       puts("\033[K");
+        puts("\033[K");
     }
 }
 
@@ -285,6 +286,7 @@ Jdb_stack_view::highlight(bool highl)
 
   char kobj_desc[120];
   kobj_desc[0] = 0;
+  Kobject_dbg::Iterator o;
 
   if (current.is_kern_code())
     strcpy(kobj_desc, "Kernel code"); // todo: print kernel function name
@@ -292,9 +294,9 @@ Jdb_stack_view::highlight(bool highl)
     snprintf(kobj_desc, sizeof(kobj_desc), "Return frame: %s",
              current.user_value_desc());
   else
-    if (Kobject *o = Kobject::pointer_to_obj(reinterpret_cast<void *>(current.value())))
+    if ((o = Kobject_dbg::pointer_to_obj(reinterpret_cast<void *>(current.value()))) != Kobject_dbg::end())
       {
-        Jdb_kobject::obj_description(kobj_desc, sizeof(kobj_desc), true, o);
+        Jdb_kobject::obj_description(kobj_desc, sizeof(kobj_desc), true, *o);
         kobj_desc[sizeof(kobj_desc) - 1] = 0;
       }
 
@@ -307,7 +309,7 @@ bool
 Jdb_stack_view::handle_key(int key, bool *redraw)
 {
   Mword   lines    = Jdb_screen::height() - start_y;
-  Mword   max_lines = (Config::thread_block_size + bytes_per_line() - 1)/bytes_per_line();
+  Mword   max_lines = (Context::Size + bytes_per_line() - 1)/bytes_per_line();
   Address max_absy = max_lines - lines;
 
   if (lines > max_lines)
@@ -337,43 +339,43 @@ Jdb_stack_view::edit_stack(bool *redraw)
       Jdb::cursor(posy(), posx());
       printf(" %.*s", Jdb_screen::Mword_size_bmode, Jdb_screen::Mword_blank);
       Jdb::printf_statline("tcb",
-         is_current ? "<Space>=edit registers" : 0,
-         "edit <"ADDR_FMT"> = "ADDR_FMT,
-         current.addr(), current.value());
+          is_current ? "<Space>=edit registers" : 0,
+          "edit <" ADDR_FMT "> = " ADDR_FMT,
+          current.addr(), current.value());
 
       Jdb::cursor(posy(), posx() + 1);
       c = Jdb_core::getchar();
 
       if (c==KEY_ESC)
-       {
-         *redraw = true;
-         return;
-       }
+        {
+          *redraw = true;
+          return;
+        }
 
       if (c != ' ' || !is_current)
-       {
-         // edit memory
-         putchar(c);
-         Jdb::printf_statline("tcb", 0, "edit <"ADDR_FMT"> = "ADDR_FMT,
-             current.addr(), current.value());
-         Jdb::cursor(posy(), posx() + 1);
-         if (!Jdb_input::get_mword(&value, c, 16))
-           {
-             Jdb::cursor(posy(), posx());
-             print_value(current);
-             return;
-           }
-         else
-           current.value(value);
-       }
+        {
+          // edit memory
+          putchar(c);
+          Jdb::printf_statline("tcb", 0, "edit <" ADDR_FMT "> = " ADDR_FMT,
+              current.addr(), current.value());
+          Jdb::cursor(posy(), posx() + 1);
+          if (!Jdb_input::get_mword(&value, c, 16))
+            {
+              Jdb::cursor(posy(), posx());
+              print_value(current);
+              return;
+            }
+          else
+            current.value(value);
+        }
       else
-       {
-         // edit registers
-         Jdb::cursor(posy(), posx());
-         print_value(current);
-         edit_registers();
-         return;
-       }
+        {
+          // edit registers
+          Jdb::cursor(posy(), posx());
+          print_value(current);
+          edit_registers();
+          return;
+        }
       *redraw = true;
     }
 }
@@ -402,7 +404,7 @@ Jdb_disasm_view::show(Jdb_tcb_ptr const &p, Space *s)
 
 PUBLIC
 Jdb_tcb::Jdb_tcb()
-  : Jdb_module("INFO"), Jdb_kobject_handler(Thread::static_kobj_type)
+  : Jdb_module("INFO"), Jdb_kobject_handler(Thread_object::static_kobj_type)
 {
   static Jdb_handler enter(at_jdb_enter);
 
@@ -427,7 +429,7 @@ PUBLIC virtual
 Kobject *
 Jdb_tcb::parent(Kobject *o)
 {
-  Thread *t = Kobject::dcast<Thread*>(o);
+  Thread *t = Kobject::dcast<Thread_object*>(o);
   if (!t)
     return 0;
 
@@ -453,8 +455,6 @@ PUBLIC static
 Jdb_module::Action_code
 Jdb_tcb::show(Thread *t, int level)
 {
-new_tcb:
-
   Thread *t_current      = Jdb::get_current_active();
   bool is_current_thread;
   bool redraw_screen     = true;
@@ -467,8 +467,8 @@ new_tcb:
     {
 #if 0
       const Mword mask
-       = (Config::thread_block_size * Mem_layout::max_threads()) - 1;
-      const Mword tsksz = Config::thread_block_size*L4_uid::threads_per_task();
+        = (Context::Size * Mem_layout::max_threads()) - 1;
+      const Mword tsksz = Context::Size*L4_uid::threads_per_task();
       LThread_num task = ((Address)Jdb::get_thread() & mask) / tsksz;
 #endif
 #if 0
@@ -507,49 +507,50 @@ whole_screen:
 
   char time_str[12];
 
-  putstr("thread: ");
+  putstr("thread  : ");
   Jdb_kobject::print_uid(t, 3);
   print_thread_uid_raw(t);
-  printf("CPU %3u ", t->cpu());
+  printf("\tCPU: %u ", cxx::int_value<Cpu_number>(t->cpu()));
 
   printf("\tprio: %02x  mode: %s\n",
          t->sched()->prio(),
          t->mode() & Context::Periodic  ?
          t->mode() & Context::Nonstrict ? "Per (IRT)" : "Per (SP)" : "Con");
 
-  printf("state: %03lx ", t->state());
-  t->print_state_long();
+  printf("state   : %03lx ", t->state(false));
+  Jdb_thread::print_state_long(t);
 
-  putstr("\n\nwait for: ");
+  putstr("\nwait for: ");
   if (!t->partner())
-    putstr("--- ");
+    putstr("---  ");
   else
     Jdb_thread::print_partner(t, 4);
 
-  putstr("   polling: ");
+  putstr("\tpolling: ");
   Jdb_thread::print_snd_partner(t, 3);
 
   putstr("\trcv descr: ");
 
-  if (t->state() & Thread_ipc_receiving_mask)
+  if ((t->state(false) & Thread_ipc_mask) == Thread_receive_wait)
     printf("%08lx", t->rcv_regs()->from_spec());
   else
     putstr("        ");
 
   putstr("\n"
          "lcked by: ");
-  Jdb_kobject::print_uid(Thread::lookup(t->thread_lock()->lock_owner()), 3);
+  if (t->thread_lock()->lock_owner())
+    Jdb_kobject::print_uid(static_cast<Thread*>(t->thread_lock()->lock_owner()), 3);
 
   putstr("\t\t\ttimeout  : ");
   if (t->_timeout && t->_timeout->is_set())
     {
       Signed64 diff = (t->_timeout->get_timeout(Kip::k()->clock)) * 1000;
       if (diff < 0)
-       strcpy(time_str, "over");
+        strcpy(time_str, "over");
       else
-       Jdb::write_ll_ns(diff, time_str,
-                        11 < sizeof(time_str)-1 ? 11 : sizeof(time_str)-1,
-                        false);
+        Jdb::write_ll_ns(diff, time_str,
+                         11 < sizeof(time_str)-1 ? 11 : sizeof(time_str)-1,
+                         false);
       printf("%-13s", time_str);
     }
 
@@ -558,37 +559,37 @@ whole_screen:
                    11 < sizeof(time_str) ? 11 : sizeof(time_str), false);
   printf("%-13s", time_str);
 
-  printf("\t\ttimeslice: %llu/%llu %cs\n"
+  printf("\t\ttimeslice: %llu/%lld %cs\n"
          "pager\t: ",
-        t->sched()->left(), t->sched()->quantum(), Config::char_micro);
+         t->sched()->left(), ~0ULL/*t->sched()->quantum()*/, Config::char_micro);
   print_kobject(t, t->_pager.raw());
 
-  putstr("\ttask: ");
+  putstr("\ttask     : ");
   if (t->space() == Kernel_task::kernel_task())
     putstr(" kernel        ");
   else
     print_kobject(static_cast<Task*>(t->space()));
 
-  putstr("\tutcb: ");
-  printf("%08lx", (Mword)t->utcb());
-
   putstr("\nexc-hndl: ");
   print_kobject(t, t->_exc_handler.raw());
 
+  printf("\tUTCB     : %08lx/%08lx",
+         (Mword)t->utcb().kern(), (Mword)t->utcb().usr().get());
+
 #if 0
   putstr("\tready  lnk: ");
-  if (t->state() & Thread_ready)
+  if (t->state(false) & Thread_ready)
     {
       if (t->_ready_next)
-       Jdb_kobject::print_uid(Thread::lookup(t->_ready_next), 3);
+        Jdb_kobject::print_uid(Thread::lookup(t->_ready_next), 3);
       else if (is_current_thread)
-       putstr(" ???.??");
+        putstr(" ???.??");
       else
-       putstr("\033[31;1m???.??\033[m");
+        putstr("\033[31;1m???.??\033[m");
       if (t->_ready_prev)
-       Jdb_kobject::print_uid(Thread::lookup(t->_ready_prev), 4);
+        Jdb_kobject::print_uid(Thread::lookup(t->_ready_prev), 4);
       else if (is_current_thread)
-       putstr(" ???.??");
+        putstr(" ???.??");
       else
         putstr(" \033[31;1m???.??\033[m");
       putchar('\n');
@@ -597,34 +598,28 @@ whole_screen:
     puts("--- ---");
 #endif
 
-  putstr("\tprsent lnk: ");
-  if (t->Present_list_item::next())
-    Jdb_kobject::print_uid(static_cast<Thread*>(t->Present_list_item::next()), 3);
-  else
-    putstr("--- ");
-  if (t->Present_list_item::prev())
-    Jdb_kobject::print_uid(static_cast<Thread*>(t->Present_list_item::prev()), 4);
-  else
-    putstr("--- ");
   putchar('\n');
 
-  putstr("vCPU  st: ");
-  if (t->state() & Thread_vcpu_enabled)
+  putstr("vCPU    : ");
+  if (t->state(false) & Thread_vcpu_enabled)
     {
       char st1[7];
       char st2[7];
-      printf("c=%s s=%s e-ip=%08lx e-sp=%08lx S=",
-             vcpu_state_str(t->vcpu_state()->state, st1, sizeof(st1)),
-             vcpu_state_str(t->vcpu_state()->_saved_state, st2, sizeof(st2)),
-             t->vcpu_state()->_entry_ip, t->vcpu_state()->_entry_sp);
+      Vcpu_state *v = t->vcpu_state().kern();
+      printf("%08lx/%08lx S=", (Mword)v, (Mword)t->vcpu_state().usr().get());
       print_kobject(static_cast<Task*>(t->vcpu_user_space()));
+      putchar('\n');
+      printf("vCPU    : c=%s s=%s sf=%c e-ip=%08lx e-sp=%08lx\n",
+             vcpu_state_str(v->state, st1, sizeof(st1)),
+             vcpu_state_str(v->_saved_state, st2, sizeof(st2)),
+             (v->sticky_flags & Vcpu_state::Sf_irq_pending) ? 'P' : '-',
+             v->_entry_ip, v->_entry_sp);
     }
   else
-    putstr("---");
-  putchar('\n');
+    putstr("---\nvCPU    : ---\n");
 
   Address ksp  = is_current_thread ? ef->ksp()
-                                  : (Address)t->get_kernel_sp();
+                                   : (Address)t->get_kernel_sp();
 
 #if 0
   Address tcb  = (Address)context_of((void*)ksp);
@@ -632,7 +627,7 @@ whole_screen:
   _stack_view.init(ksp, ef, is_current_thread);
 
   if (is_current_thread)
-    print_entry_frame_regs(t->space());
+    print_entry_frame_regs(t);
 
   else if (t->space() != Kernel_task::kernel_task())
     {
@@ -647,7 +642,7 @@ whole_screen:
     {
       // kernel thread
       Jdb::cursor(15, 1);
-      printf("kernel SP="ADDR_FMT, ksp);
+      printf("kernel SP=" ADDR_FMT, ksp);
     }
 
 dump_stack:
@@ -663,123 +658,100 @@ dump_stack:
       Jdb::cursor(Jdb_screen::height(), 6);
 
       if (c == KEY_CURSOR_HOME && level > 0)
-       return GO_BACK;
+        return GO_BACK;
 
       if (!_stack_view.handle_key(c, &redraw))
-       {
-         switch (c)
-           {
-           case KEY_RETURN:
-             if (jdb_dump_addr_task && _stack_view.current.valid())
-               {
-                 if (!jdb_dump_addr_task(_stack_view.current.value(),
+        {
+          switch (c)
+            {
+            case KEY_RETURN:
+              if (jdb_dump_addr_task && _stack_view.current.valid())
+                {
+                  if (!jdb_dump_addr_task(_stack_view.current.value(),
                         _stack_view.current.is_user_value() ? t->space() : 0, level+1))
-                   return NOTHING;
-                 redraw_screen = true;
-               }
-             break;
-           case KEY_TAB:
-             //bt_start = search_bt_start(tcb, (Mword*)ksp, is_current_thread);
-             redraw = true;
-             break;
-           case ' ':
-             if (Jdb_disasm::avail() && _stack_view.current.valid())
-               {
+                    return NOTHING;
+                  redraw_screen = true;
+                }
+              break;
+            case KEY_TAB:
+              //bt_start = search_bt_start(tcb, (Mword*)ksp, is_current_thread);
+              redraw = true;
+              break;
+            case ' ':
+              if (Jdb_disasm::avail() && _stack_view.current.valid())
+                {
                   printf("V %lx\n", _stack_view.current.value());
-                 if (!Jdb_disasm::show(_stack_view.current.value(),
-                       _stack_view.current.is_user_value() ? t->space() : 0, level+1, true))
-                   return NOTHING;
-                 redraw_screen = true;
-               }
-             break;
-           case 'u':
-             if (Jdb_disasm::avail() && _stack_view.current.valid())
-               {
-                 Jdb::printf_statline("tcb", "<CR>=disassemble here",
-                                       "u[address=%08lx task=%lx] ",
-                                       _stack_view.current.value(),
-                                       Kobject_dbg::pointer_to_id(t->space()));
-                 int c1 = Jdb_core::getchar();
-                 if ((c1 != KEY_RETURN) && (c1 != ' '))
-                   {
-                     Jdb::printf_statline("tcb", 0, "u");
-                     Jdb::execute_command("u", c1);
-                     return NOTHING;
-                   }
-
-                 if (!Jdb_disasm::show(_stack_view.current.value(),
-                       _stack_view.current.is_user_value() ? t->space() : 0, level+1, true))
-                   return NOTHING;
-                 redraw_screen = true;
-               }
-             break;
+                  if (!Jdb_disasm::show(_stack_view.current.value(),
+                        _stack_view.current.is_user_value() ? t->space() : 0, level+1, true))
+                    return NOTHING;
+                  redraw_screen = true;
+                }
+              break;
+            case 'u':
+              if (Jdb_disasm::avail() && _stack_view.current.valid())
+                {
+                  Jdb::printf_statline("tcb", "<CR>=disassemble here",
+                                        "u[address=%08lx task=%lx] ",
+                                        _stack_view.current.value(),
+                                        Kobject_dbg::pointer_to_id(t->space()));
+                  int c1 = Jdb_core::getchar();
+                  if ((c1 != KEY_RETURN) && (c1 != ' '))
+                    {
+                      Jdb::printf_statline("tcb", 0, "u");
+                      Jdb::execute_command("u", c1);
+                      return NOTHING;
+                    }
+
+                  if (!Jdb_disasm::show(_stack_view.current.value(),
+                        _stack_view.current.is_user_value() ? t->space() : 0, level+1, true))
+                    return NOTHING;
+                  redraw_screen = true;
+                }
+              break;
 #if 0
-           case 'r': // ready-list
-             putstr("[n]ext/[p]revious in ready list?");
-             switch (Jdb_core::getchar())
-               {
-               case 'n':
-                 if (t->_ready_next)
-                   {
-                     t = static_cast<Thread*>(t->_ready_next);
-                     goto new_tcb;
-                   }
-                 break;
-               case 'p':
-                 if (t->_ready_prev)
-                   {
-                     t = static_cast<Thread*>(t->_ready_prev);
-                     goto new_tcb;
-                   }
-                 break;
-               }
-             break;
+            case 'r': // ready-list
+              putstr("[n]ext/[p]revious in ready list?");
+              switch (Jdb_core::getchar())
+                {
+                case 'n':
+                  if (t->_ready_next)
+                    {
+                      t = static_cast<Thread*>(t->_ready_next);
+                      goto new_tcb;
+                    }
+                  break;
+                case 'p':
+                  if (t->_ready_prev)
+                    {
+                      t = static_cast<Thread*>(t->_ready_prev);
+                      goto new_tcb;
+                    }
+                  break;
+                }
+              break;
 #endif
-           case 'p': // present-list or show_pages
-             putstr("[n]ext/[p]revious in present list?");
-             switch (c=Jdb_core::getchar()) 
-               {
-               case 'n':
-                 if (t->Present_list_item::next())
-                   {
-                     t = static_cast<Thread*>(t->Present_list_item::next());
-                     goto new_tcb;
-                   }
-                 break;
-               case 'p':
-                 if (t->Present_list_item::prev())
-                   {
-                     t = static_cast<Thread*>(t->Present_list_item::prev());
-                     goto new_tcb;
-                   }
-                 break;
-               default:
-                 Jdb::execute_command("p", c);
-                 return NOTHING;
-               }
-             break;
             case 'C':
               _stack_view.memdump_is_colored = !_stack_view.memdump_is_colored;
               redraw = true;
               break;
-           case KEY_ESC:
-             Jdb::abort_command();
-             return NOTHING;
-           default:
-             if (Jdb::is_toplevel_cmd(c))
-               return NOTHING;
-             break;
-           }
-       }
+            case KEY_ESC:
+              Jdb::abort_command();
+              return NOTHING;
+            default:
+              if (Jdb::is_toplevel_cmd(c))
+                return NOTHING;
+              break;
+            }
+        }
       if (redraw_screen)
-       goto whole_screen;
+        goto whole_screen;
       if (redraw)
-       goto dump_stack;
+        goto dump_stack;
     }
 } 
 
 /* --- original L4 screen ------------------------------------------------------
-thread: 0081 (001.01) <00020401 00080000>                              prio: 10
+thread: 0081 (001.01) <00020401 00080000>                               prio: 10
 state : 85, ready                            lists: 81                   mcp: ff
 
 wait for: --                             rcv descr: 00000000   partner: 00000000
@@ -814,19 +786,19 @@ Jdb_tcb::action(int cmd, void *&args, char const *&fmt, int &next_char)
   if (cmd == 0)
     {
       if (args == &first_char)
-       {
-         switch (first_char)
-           {
-             case '+':
-             case '-':
-               printf("%c\n", first_char);
-               auto_tcb = first_char == '+';
-               break;
-             case '?':
-               args      = &address;
-               fmt       = " addr="ADDR_FMT" => ";
-               putchar(first_char);
-               return Jdb_module::EXTRA_INPUT;
+        {
+          switch (first_char)
+            {
+              case '+':
+              case '-':
+                printf("%c\n", first_char);
+                auto_tcb = first_char == '+';
+                break;
+              case '?':
+                args      = &address;
+                fmt       = " addr=" ADDR_FMT " => ";
+                putchar(first_char);
+                return Jdb_module::EXTRA_INPUT;
               case 'a':
                 args      = &tcb_addr;
                 fmt       = " tcb=%x => ";
@@ -835,24 +807,24 @@ Jdb_tcb::action(int cmd, void *&args, char const *&fmt, int &next_char)
               case KEY_RETURN:
                 show(0, 0);
                 return NOTHING;
-             default:
-               args      = &threadid;
-               fmt       = "%q";
-               next_char = first_char;
-               return Jdb_module::EXTRA_INPUT_WITH_NEXTCHAR;
-           }
-       }
+              default:
+                args      = &threadid;
+                fmt       = "%q";
+                next_char = first_char;
+                return Jdb_module::EXTRA_INPUT_WITH_NEXTCHAR;
+            }
+        }
       else if (args == &address)
-       {
-         address &= ~(Config::thread_block_size-1);
-         Jdb_kobject::print_uid(reinterpret_cast<Thread*>(address), 3);
-         putchar('\n');
-       }
+        {
+          address &= ~(Context::Size-1);
+          Jdb_kobject::print_uid(reinterpret_cast<Thread*>(address), 3);
+          putchar('\n');
+        }
       else if (args == &tcb_addr)
-       show((Thread*)tcb_addr, 0);
+        show((Thread*)tcb_addr, 0);
       else
         {
-          Thread *t = Kobject::dcast<Thread *>(threadid);
+          Thread *t = Kobject::dcast<Thread_object *>(threadid);
           if (t)
             show(t, 0);
           else
@@ -864,10 +836,10 @@ Jdb_tcb::action(int cmd, void *&args, char const *&fmt, int &next_char)
 }
 
 PUBLIC
-Kobject *
-Jdb_tcb::follow_link(Kobject *o)
+Kobject_common *
+Jdb_tcb::follow_link(Kobject_common *o)
 {
-  Thread *t = Kobject::dcast<Thread*>(o);
+  Thread *t = Kobject::dcast<Thread_object *>(Kobject::from_dbg(o->dbg_info()));
   if (t->space() == Kernel_task::kernel_task())
     return o;
   return static_cast<Kobject*>(static_cast<Task*>(t->space()));
@@ -875,33 +847,42 @@ Jdb_tcb::follow_link(Kobject *o)
 
 PUBLIC
 bool
-Jdb_tcb::show_kobject(Kobject *o, int level)
+Jdb_tcb::show_kobject(Kobject_common *o, int level)
 {
-  Thread *t = Kobject::dcast<Thread*>(o);
+  Thread *t = Kobject::dcast<Thread_object *>(Kobject::from_dbg(o->dbg_info()));
   return show(t, level);
 }
 
+PRIVATE static
+bool
+Jdb_tcb::is_current(Thread *t)
+{
+  return t == Jdb::get_thread(t->cpu());
+}
+
 PUBLIC
 int
-Jdb_tcb::show_kobject_short(char *buf, int max, Kobject *o)
+Jdb_tcb::show_kobject_short(char *buf, int max, Kobject_common *o)
 {
-  Thread *t = Kobject::dcast<Thread*>(o);
-  Thread *cur_t = Jdb::get_current_active();
+  Thread *t = Kobject::dcast<Thread_object *>(Kobject::from_dbg(o->dbg_info()));
+  bool is_current = Jdb_tcb::is_current(t);
   int cnt = 0;
-  if (t->space() == Kernel_task::kernel_task())
+  if (t == Context::kernel_context(t->cpu()))
     {
-      cnt = snprintf(buf, max, " {KERNEL} C=%u", t->cpu());
+      cnt = snprintf(buf, max, " {KERNEL} C=%u",
+                     cxx::int_value<Cpu_number>(t->cpu()));
       max -= cnt;
       buf += cnt;
     }
   if (t->space() == Kernel_task::kernel_task())
     return cnt + snprintf(buf, max, " R=%ld%s", t->ref_cnt(),
-                          cur_t == t ? " "JDB_ANSI_COLOR(green)"current"JDB_ANSI_END : "");
+                          is_current ? " " JDB_ANSI_COLOR(green) "current" JDB_ANSI_END : "");
 
-  return cnt + snprintf(buf, max, " C=%u S=D:%lx R=%ld %s", t->cpu(),
+  return cnt + snprintf(buf, max, " C=%u S=D:%lx R=%ld %s",
+                        cxx::int_value<Cpu_number>(t->cpu()),
                         Kobject_dbg::pointer_to_id(t->space()),
                         t->ref_cnt(),
-                        cur_t == t ? " "JDB_ANSI_COLOR(green)"current"JDB_ANSI_END : "");
+                        is_current ? " " JDB_ANSI_COLOR(green) "current" JDB_ANSI_END : "");
 }
 
 PUBLIC
@@ -917,10 +898,10 @@ Jdb_tcb::cmds() const
 {
   static Cmd cs[] =
     {
-       { 0, "t", "tcb", "%C",
-         "t[<threadid>]\tshow current/given thread control block (TCB)\n"
-         "t{+|-}\tshow current thread control block at Jdb every entry\n",
-         &first_char },
+        { 0, "t", "tcb", "%C",
+          "t[<threadid>]\tshow current/given thread control block (TCB)\n"
+          "t{+|-}\tshow current thread control block at every JDB entry\n",
+          &first_char },
     };
   return cs;
 }
@@ -945,21 +926,21 @@ Jdb_tcb::print_thread_uid_raw(Thread *t)
 
 PRIVATE static
 void
-Jdb_tcb::print_kobject(Mword n)
+Jdb_tcb::print_kobject(Cap_index n)
 {
-  printf("[C:%4lx]       ", n);
+  printf("[C:%4lx]       ", cxx::int_value<Cap_index>(n));
 }
 
 PRIVATE static
 void
 Jdb_tcb::print_kobject(Kobject *o)
 {
-  printf("D:%4lx         ", o ? o->dbg_id() : 0);
+  printf("D:%4lx         ", o ? o->dbg_info()->dbg_id() : 0);
 }
 
 PRIVATE static
 void
-Jdb_tcb::print_kobject(Thread *t, Mword capidx)
+Jdb_tcb::print_kobject(Thread *t, Cap_index capidx)
 {
   Space *space = t->space();
   if (!space)
@@ -968,14 +949,15 @@ Jdb_tcb::print_kobject(Thread *t, Mword capidx)
       return;
     }
 
-  Obj_space::Capability *c = space->obj_space()->get_cap(capidx);
+  Obj_space::Capability *c = space->jdb_lookup_cap(capidx);
   if (!c || !c->valid())
     {
       print_kobject(capidx);
       return;
     }
 
-  printf("[C:%4lx] D:%4lx", capidx, c->obj()->dbg_info()->dbg_id());
+  printf("[C:%4lx] D:%4lx", cxx::int_value<Cap_index>(capidx),
+         c->obj()->dbg_info()->dbg_id());
 }
 
 //