printf("Registers (before debug entry from %s mode):\n"
"[0] %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n"
"[8] %08lx %08lx %08lx %08lx %08lx %08lx %08lx %s%08lx\033[m\n"
- "sp = %08lx upsr = %08lx\n",
+ "upsr = %08lx\n",
from_user ? "user" : "kernel",
ef->r[0], ef->r[1],ef->r[2], ef->r[3],
ef->r[4], ef->r[5],ef->r[6], ef->r[7],
ef->r[8], ef->r[9],ef->r[10], ef->r[11],
- ef->r[12], ef->usp,ef->ulr, Jdb::esc_iret, ef->pc,
- ef->r[13], ef->psr);
+ ef->r[12], ef->usp, ef->ulr, Jdb::esc_iret, ef->pc,
+ ef->psr);
}
-
+
IMPLEMENT
void
Jdb_tcb::info_thread_state(Thread *t)
Jdb_tcb_ptr current((Address)t->get_kernel_sp());
printf("PC=%s%08lx\033[m USP=%08lx\n",
- Jdb::esc_emph, current.top_value(-2), current.top_value(-5));
+ Jdb::esc_emph, current.top_value(-2), current.top_value(-5));
printf("[0] %08lx %08lx %08lx %08lx [4] %08lx %08lx %08lx %08lx\n",
- current.top_value(-18), current.top_value(-17),
- current.top_value(-16), current.top_value(-15),
- current.top_value(-14), current.top_value(-13),
- current.top_value(-12), current.top_value(-11));
+ current.top_value(-18), current.top_value(-17),
+ current.top_value(-16), current.top_value(-15),
+ current.top_value(-14), current.top_value(-13),
+ current.top_value(-12), current.top_value(-11));
printf("[8] %08lx %08lx %08lx %08lx [c] %08lx %08lx %08lx %08lx\n",
- current.top_value(-10), current.top_value(-9),
- current.top_value(-8), current.top_value(-7),
- current.top_value(-6), current.top_value(-4),
- current.top_value(-3), current.top_value(-1));
+ current.top_value(-10), current.top_value(-9),
+ current.top_value(-8), current.top_value(-7),
+ current.top_value(-6), current.top_value(-4),
+ current.top_value(-3), current.top_value(-1));
}
IMPLEMENT
return data;
}
+PRIVATE inline NEEDS["lock_guard.h"]
+void
+Io_apic::modify(int reg, Mword set_bits, Mword del_bits)
+{
+ register Mword tmp;
+ Lock_guard<Spin_lock> g(&_l);
+ adr = reg;
+ asm volatile ("": : :"memory");
+ tmp = data;
+ tmp &= ~del_bits;
+ tmp |= set_bits;
+ data = tmp;
+}
+
PRIVATE inline NEEDS["lock_guard.h"]
void
Io_apic::write(int reg, Mword value)
}
-PUBLIC inline NEEDS["kdb_ke.h"]
+PUBLIC inline NEEDS["kdb_ke.h", Io_apic::write]
void
Io_apic::write_entry(unsigned i, Io_apic_entry const &e)
{
Io_apic::active()
{ return _apic; }
-PUBLIC static inline NEEDS["kdb_ke.h", Io_apic::read,Io_apic::write]
+PUBLIC static inline NEEDS["kdb_ke.h", Io_apic::modify]
void
Io_apic::mask(unsigned irq)
{
//assert_kdb(irq <= _apic->num_entries());
- _apic->write(0x10 + irq * 2, _apic->read(0x10 + irq * 2) | (1UL << 16));
+ _apic->modify(0x10 + irq * 2, 1UL << 16, 0);
}
-PUBLIC static inline NEEDS["kdb_ke.h", Io_apic::read,Io_apic::write]
+PUBLIC static inline NEEDS["kdb_ke.h", Io_apic::modify]
void
Io_apic::unmask(unsigned irq)
{
//assert_kdb(irq <= _apic->num_entries());
- _apic->write(0x10 + irq * 2, _apic->read(0x10 + irq * 2) & ~(1UL << 16));
+ _apic->modify(0x10 + irq * 2, 0, 1UL << 16);
}
PUBLIC static inline NEEDS["kdb_ke.h", Io_apic::read]
return _apic->read(0x10 + irq * 2) & (1UL << 16);
}
-PUBLIC static inline NEEDS["kdb_ke.h", Io_apic::read,Io_apic::write]
+PUBLIC static inline NEEDS[Io_apic::read]
+void
+Io_apic::sync()
+{
+ (void)_apic->data;
+}
+
+PUBLIC static inline NEEDS["kdb_ke.h", Io_apic::modify]
void
Io_apic::set_dest(unsigned irq, Mword dst)
{
//assert_kdb(irq <= _apic->num_entries());
- _apic->write(0x11 + irq * 2, (_apic->read(0x11 + irq * 2) & ~(~0UL << 24)) | (dst & (~0UL << 24)));
+ _apic->modify(0x11 + irq * 2, dst & (~0UL << 24), ~0UL << 24);
}
PUBLIC static inline NEEDS[Io_apic::num_entries]