x86: Show the interrupt pointer with 'irqinfo'
It is useful for this command to show the address of the interrupt table. Add support for this. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
parent
8bcfb7917a
commit
a0ed800376
|
@ -180,16 +180,11 @@ struct idt_entry {
|
|||
u16 base_high;
|
||||
} __packed;
|
||||
|
||||
struct desc_ptr {
|
||||
unsigned short size;
|
||||
unsigned long address;
|
||||
} __packed;
|
||||
|
||||
struct idt_entry idt[256] __aligned(16);
|
||||
|
||||
struct desc_ptr idt_ptr;
|
||||
struct idt_ptr idt_ptr;
|
||||
|
||||
static inline void load_idt(const struct desc_ptr *dtr)
|
||||
static inline void load_idt(const struct idt_ptr *dtr)
|
||||
{
|
||||
asm volatile("cs lidt %0" : : "m" (*dtr));
|
||||
}
|
||||
|
@ -232,6 +227,11 @@ int cpu_init_interrupts(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void interrupt_read_idt(struct idt_ptr *ptr)
|
||||
{
|
||||
asm volatile("sidt %0" : : "m" (*ptr));
|
||||
}
|
||||
|
||||
void *x86_get_idt(void)
|
||||
{
|
||||
return &idt_ptr;
|
||||
|
|
|
@ -38,6 +38,16 @@ enum x86_exception {
|
|||
EXC_VE
|
||||
};
|
||||
|
||||
/**
|
||||
* struct idt_ptr - Holds the IDT (Interrupt Descriptor Table)
|
||||
*
|
||||
* @size: Size of IDT in bytes
|
||||
*/
|
||||
struct idt_ptr {
|
||||
unsigned short size;
|
||||
unsigned long address;
|
||||
} __packed;
|
||||
|
||||
/* arch/x86/cpu/interrupts.c */
|
||||
void set_vector(u8 intnum, void *routine);
|
||||
|
||||
|
@ -61,4 +71,11 @@ void configure_irq_trigger(int int_num, bool is_level_triggered);
|
|||
|
||||
void *x86_get_idt(void);
|
||||
|
||||
/**
|
||||
* interrupt_read_idt() - Read the IDT
|
||||
*
|
||||
* @ptr: Place to put IDT contents
|
||||
*/
|
||||
void interrupt_read_idt(struct idt_ptr *ptr);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -131,8 +131,11 @@ void do_irq(int hw_irq)
|
|||
int do_irqinfo(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
|
||||
{
|
||||
#if !CONFIG_IS_ENABLED(X86_64)
|
||||
struct idt_ptr ptr;
|
||||
int irq;
|
||||
|
||||
interrupt_read_idt(&ptr);
|
||||
printf("IDT at %lx, size %x\n", ptr.address, ptr.size);
|
||||
printf("Spurious IRQ: %u, last unknown IRQ: %d\n",
|
||||
spurious_irq_cnt, spurious_irq);
|
||||
|
||||
|
|
Loading…
Reference in New Issue