diff --git a/include/kvm/interrupt.h b/include/kvm/interrupt.h index 95d294f..b24e3fd 100644 --- a/include/kvm/interrupt.h +++ b/include/kvm/interrupt.h @@ -11,10 +11,11 @@ struct ivt_entry { uint16_t segment; } __attribute__((packed)); -void ivt_reset(void); -void ivt_copy_table(void *dst, unsigned int size); -struct ivt_entry * const ivt_get_entry(unsigned int n); -void ivt_set_entry(struct ivt_entry e, unsigned int n); -void ivt_set_all(struct ivt_entry e); +struct interrupt_table { + struct ivt_entry entries[IVT_VECTORS]; +}; + +void interrupt_table__copy(struct interrupt_table *self, void *dst, unsigned int size); +void interrupt_table__setup(struct interrupt_table *self, struct ivt_entry e); #endif /* KVM__INTERRUPT_H */ diff --git a/include/kvm/kvm.h b/include/kvm/kvm.h index f46b32c..1022177 100644 --- a/include/kvm/kvm.h +++ b/include/kvm/kvm.h @@ -1,6 +1,8 @@ #ifndef KVM__KVM_H #define KVM__KVM_H +#include "kvm/interrupt.h" + #include /* for struct kvm_regs */ #include @@ -21,6 +23,8 @@ struct kvm { struct kvm_regs regs; struct kvm_sregs sregs; + + struct interrupt_table interrupt_table; }; struct kvm *kvm__init(void); diff --git a/interrupt.c b/interrupt.c index 0d4ba99..de8d8a1 100644 --- a/interrupt.c +++ b/interrupt.c @@ -4,38 +4,18 @@ #include -static struct ivt_entry ivt_table[IVT_VECTORS]; - -void ivt_reset(void) +void interrupt_table__copy(struct interrupt_table *self, void *dst, unsigned int size) { - memset(ivt_table, 0x0, sizeof(ivt_table)); -} - -void ivt_copy_table(void *dst, unsigned int size) -{ - if (size < sizeof(ivt_table)) + if (size < sizeof(self->entries)) die("An attempt to overwrite host memory"); - memcpy(dst, ivt_table, sizeof(ivt_table)); + + memcpy(dst, self->entries, sizeof(self->entries)); } -struct ivt_entry * const ivt_get_entry(unsigned int n) -{ - struct ivt_entry *v = NULL; - if (n < IVT_VECTORS) - v = &ivt_table[n]; - return (struct ivt_entry * const)v; -} - -void ivt_set_entry(struct ivt_entry e, unsigned int n) -{ - if (n < IVT_VECTORS) - ivt_table[n] = e; -} - -void ivt_set_all(struct ivt_entry e) +void interrupt_table__setup(struct interrupt_table *self, struct ivt_entry e) { unsigned int i; for (i = 0; i < IVT_VECTORS; i++) - ivt_table[i] = e; + self->entries[i] = e; } diff --git a/kvm.c b/kvm.c index a6d5f4e..638441d 100644 --- a/kvm.c +++ b/kvm.c @@ -261,9 +261,9 @@ static bool load_bzimage(struct kvm *self, int fd, const char *kernel_cmdline) .segment = nr >> 4, .offset = (nr - (nr & ~0xf)), }; - ivt_set_all(real_mode_irq); + interrupt_table__setup(&self->interrupt_table, real_mode_irq); p = guest_flat_to_host(self, 0); - ivt_copy_table(p, IVT_VECTORS * sizeof(real_mode_irq)); + interrupt_table__copy(&self->interrupt_table, p, IVT_VECTORS * sizeof(real_mode_irq)); return true; }