From 1d34167488e56e36ad702627b17be7ac18a9db9c Mon Sep 17 00:00:00 2001 From: Damien Zammit Date: Sun, 10 Nov 2019 16:27:42 +0100 Subject: simplify interrupt handling We have removed spl levels, now remove the machinery to manage different PIC masks according to levels. Only keep machinery to disable interrupts whatever the level. * i386/i386/pic.c (pic_mask): Remove array. (picinit): Do not form PIC mask. Set initial PIC mask to 0. (form_pic_mask): Remove function. * i386/i386/pic.h (form_pic_mask, pic_mask): Remove declarations. * i386/i386/spl.S (SETMASK): Remove macro. (XEN_SETMASK): Add macro, containing the Xen version of SETMASK. (spl0, splx_cli, spl) [MACH_XEN]: Call XEN_SETMASK instead of SETMASK. * i386/i386/pit.c (clkstart): Do not call form_pic_mask. * i386/i386at/autoconf.c (take_dev_irq, take_ctlr_irq): Likewise. * i386/i386at/kd_mouse.c (kd_mouse_open, kd_mouse_close): Likewise. * linux/dev/arch/i386/kernel/irq.c (mask_irq, unmask_irq): Directly update curr_pic_mask without using pic_mask array. (init_IRQ, restore_IRQ): do not call form_pic_mask. * linux/dev/include/asm-i386/system.h: Include . (__save_flags, __restore_flags): Use curr_ipl and splx instead of hardware flags. * linux/dev/init/main.c (linux_init): Do not call cli. * linux/dev/kernel/sched.c (linux_timer_intr): Do not use pic_mask. * linux/src/drivers/block/ide.c (try_to_identify): Disable irq probing. * linux/src/drivers/scsi/NCR53c406a.c (NCR53c406a_detect): Disable irq probing. --- linux/dev/arch/i386/kernel/irq.c | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) (limited to 'linux/dev/arch/i386/kernel') diff --git a/linux/dev/arch/i386/kernel/irq.c b/linux/dev/arch/i386/kernel/irq.c index a02e9582..596dae6b 100644 --- a/linux/dev/arch/i386/kernel/irq.c +++ b/linux/dev/arch/i386/kernel/irq.c @@ -128,18 +128,15 @@ linux_intr (int irq) static inline void mask_irq (unsigned int irq_nr) { - int i; - - for (i = 0; i < intpri[irq_nr]; i++) - pic_mask[i] |= 1 << irq_nr; + int new_pic_mask = curr_pic_mask | 1 << irq_nr; - if (curr_pic_mask != pic_mask[curr_ipl]) + if (curr_pic_mask != new_pic_mask) { - curr_pic_mask = pic_mask[curr_ipl]; + curr_pic_mask = new_pic_mask; if (irq_nr < 8) - outb (curr_pic_mask & 0xff, PIC_MASTER_OCW); + outb (curr_pic_mask & 0xff, PIC_MASTER_OCW); else - outb (curr_pic_mask >> 8, PIC_SLAVE_OCW); + outb (curr_pic_mask >> 8, PIC_SLAVE_OCW); } } @@ -149,18 +146,18 @@ mask_irq (unsigned int irq_nr) static inline void unmask_irq (unsigned int irq_nr) { - int mask, i; + int mask; + int new_pic_mask; mask = 1 << irq_nr; if (irq_nr >= 8) mask |= 1 << 2; - for (i = 0; i < intpri[irq_nr]; i++) - pic_mask[i] &= ~mask; + new_pic_mask = curr_pic_mask & ~mask; - if (curr_pic_mask != pic_mask[curr_ipl]) + if (curr_pic_mask != new_pic_mask) { - curr_pic_mask = pic_mask[curr_ipl]; + curr_pic_mask = new_pic_mask; if (irq_nr < 8) outb (curr_pic_mask & 0xff, PIC_MASTER_OCW); else @@ -737,8 +734,6 @@ init_IRQ (void) } } - form_pic_mask (); - /* * Enable interrupts. */ @@ -777,6 +772,5 @@ restore_IRQ (void) */ ivect[0] = old_clock_handler; intpri[0] = old_clock_pri; - form_pic_mask (); } -- cgit v1.2.3