Changeset 2a103b5 in mainline for kernel/arch/ia32/src/ia32.c


Ignore:
Timestamp:
2019-06-09T11:31:38Z (5 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
c48de91
Parents:
b401b33
Message:

Introduce PIC operations indirection mechanism

Some architectures switch from one interrupt controller implementation
to another during runtime. By providing a cleaner indirection mechanism,
it is possible e.g. for the ia32 IRQ 7 handler to distinguish i8259
spurious interrupts from actual IRQ 7 device interrupts, even when the
i8259 interrupt controller is no longer active.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/ia32/src/ia32.c

    rb401b33 r2a103b5  
    5858#include <genarch/multiboot/multiboot.h>
    5959#include <genarch/multiboot/multiboot2.h>
     60#include <genarch/pic/pic_ops.h>
    6061#include <arch/pm.h>
    6162#include <arch/vreg.h>
     
    112113                    (i8259_t *) I8259_PIC1_BASE, IVT_IRQBASE);
    113114
    114                 /*
    115                  * Set the enable/disable IRQs handlers.
    116                  * Set the End-of-Interrupt handler.
    117                  */
    118                 enable_irqs_function = pic_enable_irqs;
    119                 disable_irqs_function = pic_disable_irqs;
    120                 eoi_function = pic_eoi;
    121                 irqs_info = "i8259";
     115                /* Set PIC operations. */
     116                pic_ops = &i8259_pic_ops;
    122117        }
    123118}
     
    194189                        indev_t *kbrd = kbrd_wire(kbrd_instance, sink);
    195190                        i8042_wire(i8042_instance, kbrd);
    196                         trap_virtual_enable_irqs(1 << IRQ_KBD);
    197                         trap_virtual_enable_irqs(1 << IRQ_MOUSE);
     191                        pic_ops->enable_irqs(1 << IRQ_KBD);
     192                        pic_ops->enable_irqs(1 << IRQ_MOUSE);
    198193                }
    199194        }
     
    220215                        indev_t *srln = srln_wire(srln_instance, sink);
    221216                        ns16550_wire(ns16550_instance, srln);
    222                         trap_virtual_enable_irqs(1 << IRQ_NS16550);
     217                        pic_ops->enable_irqs(1 << IRQ_NS16550);
    223218                }
    224219#endif
     
    231226#endif
    232227
    233         if (irqs_info != NULL)
    234                 sysinfo_set_item_val(irqs_info, NULL, true);
     228        sysinfo_set_item_val(pic_ops->get_name(), NULL, true);
    235229}
    236230
Note: See TracChangeset for help on using the changeset viewer.