Loading Documentation/filesystems/efivarfs.txt +7 −0 Original line number Diff line number Diff line Loading @@ -14,3 +14,10 @@ filesystem. efivarfs is typically mounted like this, mount -t efivarfs none /sys/firmware/efi/efivars Due to the presence of numerous firmware bugs where removing non-standard UEFI variables causes the system firmware to fail to POST, efivarfs files that are not well-known standardized variables are created as immutable files. This doesn't prevent removal - "chattr -i" will work - but it does prevent this kind of failure from being accomplished accidentally. Makefile +1 −1 Original line number Diff line number Diff line VERSION = 4 PATCHLEVEL = 4 SUBLEVEL = 3 SUBLEVEL = 5 EXTRAVERSION = NAME = Blurry Fish Butt Loading arch/arc/include/asm/irqflags-arcv2.h +11 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ #define AUX_IRQ_CTRL 0x00E #define AUX_IRQ_ACT 0x043 /* Active Intr across all levels */ #define AUX_IRQ_LVL_PEND 0x200 /* Pending Intr across all levels */ #define AUX_IRQ_HINT 0x201 /* For generating Soft Interrupts */ #define AUX_IRQ_PRIORITY 0x206 #define ICAUSE 0x40a #define AUX_IRQ_SELECT 0x40b Loading Loading @@ -112,6 +113,16 @@ static inline int arch_irqs_disabled(void) return arch_irqs_disabled_flags(arch_local_save_flags()); } static inline void arc_softirq_trigger(int irq) { write_aux_reg(AUX_IRQ_HINT, irq); } static inline void arc_softirq_clear(int irq) { write_aux_reg(AUX_IRQ_HINT, 0); } #else .macro IRQ_DISABLE scratch Loading arch/arc/kernel/entry-arcv2.S +24 −6 Original line number Diff line number Diff line Loading @@ -45,11 +45,12 @@ VECTOR reserved ; Reserved slots VECTOR handle_interrupt ; (16) Timer0 VECTOR handle_interrupt ; unused (Timer1) VECTOR handle_interrupt ; unused (WDT) VECTOR handle_interrupt ; (19) ICI (inter core interrupt) VECTOR handle_interrupt VECTOR handle_interrupt VECTOR handle_interrupt VECTOR handle_interrupt ; (23) End of fixed IRQs VECTOR handle_interrupt ; (19) Inter core Interrupt (IPI) VECTOR handle_interrupt ; (20) perf Interrupt VECTOR handle_interrupt ; (21) Software Triggered Intr (Self IPI) VECTOR handle_interrupt ; unused VECTOR handle_interrupt ; (23) unused # End of fixed IRQs .rept CONFIG_ARC_NUMBER_OF_INTERRUPTS - 8 VECTOR handle_interrupt Loading Loading @@ -211,7 +212,11 @@ debug_marker_syscall: ; (since IRQ NOT allowed in DS in ARCv2, this can only happen if orig ; entry was via Exception in DS which got preempted in kernel). ; ; IRQ RTIE won't reliably restore DE bit and/or BTA, needs handling ; IRQ RTIE won't reliably restore DE bit and/or BTA, needs workaround ; ; Solution is return from Intr w/o any delay slot quirks into a kernel trampoline ; and from pure kernel mode return to delay slot which handles DS bit/BTA correctly .Lintr_ret_to_delay_slot: debug_marker_ds: Loading @@ -222,18 +227,23 @@ debug_marker_ds: ld r2, [sp, PT_ret] ld r3, [sp, PT_status32] ; STAT32 for Int return created from scratch ; (No delay dlot, disable Further intr in trampoline) bic r0, r3, STATUS_U_MASK|STATUS_DE_MASK|STATUS_IE_MASK|STATUS_L_MASK st r0, [sp, PT_status32] mov r1, .Lintr_ret_to_delay_slot_2 st r1, [sp, PT_ret] ; Orig exception PC/STAT32 safekept @orig_r0 and @event stack slots st r2, [sp, 0] st r3, [sp, 4] b .Lisr_ret_fast_path .Lintr_ret_to_delay_slot_2: ; Trampoline to restore orig exception PC/STAT32/BTA/AUX_USER_SP sub sp, sp, SZ_PT_REGS st r9, [sp, -4] Loading @@ -243,11 +253,19 @@ debug_marker_ds: ld r9, [sp, 4] sr r9, [erstatus] ; restore AUX_USER_SP if returning to U mode bbit0 r9, STATUS_U_BIT, 1f ld r9, [sp, PT_sp] sr r9, [AUX_USER_SP] 1: ld r9, [sp, 8] sr r9, [erbta] ld r9, [sp, -4] add sp, sp, SZ_PT_REGS ; return from pure kernel mode to delay slot rtie END(ret_from_exception) arch/arc/kernel/mcip.c +15 −0 Original line number Diff line number Diff line Loading @@ -11,9 +11,12 @@ #include <linux/smp.h> #include <linux/irq.h> #include <linux/spinlock.h> #include <asm/irqflags-arcv2.h> #include <asm/mcip.h> #include <asm/setup.h> #define SOFTIRQ_IRQ 21 static char smp_cpuinfo_buf[128]; static int idu_detected; Loading @@ -22,6 +25,7 @@ static DEFINE_RAW_SPINLOCK(mcip_lock); static void mcip_setup_per_cpu(int cpu) { smp_ipi_irq_setup(cpu, IPI_IRQ); smp_ipi_irq_setup(cpu, SOFTIRQ_IRQ); } static void mcip_ipi_send(int cpu) Loading @@ -29,6 +33,12 @@ static void mcip_ipi_send(int cpu) unsigned long flags; int ipi_was_pending; /* ARConnect can only send IPI to others */ if (unlikely(cpu == raw_smp_processor_id())) { arc_softirq_trigger(SOFTIRQ_IRQ); return; } /* * NOTE: We must spin here if the other cpu hasn't yet * serviced a previous message. This can burn lots Loading Loading @@ -63,6 +73,11 @@ static void mcip_ipi_clear(int irq) unsigned long flags; unsigned int __maybe_unused copy; if (unlikely(irq == SOFTIRQ_IRQ)) { arc_softirq_clear(irq); return; } raw_spin_lock_irqsave(&mcip_lock, flags); /* Who sent the IPI */ Loading Loading
Documentation/filesystems/efivarfs.txt +7 −0 Original line number Diff line number Diff line Loading @@ -14,3 +14,10 @@ filesystem. efivarfs is typically mounted like this, mount -t efivarfs none /sys/firmware/efi/efivars Due to the presence of numerous firmware bugs where removing non-standard UEFI variables causes the system firmware to fail to POST, efivarfs files that are not well-known standardized variables are created as immutable files. This doesn't prevent removal - "chattr -i" will work - but it does prevent this kind of failure from being accomplished accidentally.
Makefile +1 −1 Original line number Diff line number Diff line VERSION = 4 PATCHLEVEL = 4 SUBLEVEL = 3 SUBLEVEL = 5 EXTRAVERSION = NAME = Blurry Fish Butt Loading
arch/arc/include/asm/irqflags-arcv2.h +11 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ #define AUX_IRQ_CTRL 0x00E #define AUX_IRQ_ACT 0x043 /* Active Intr across all levels */ #define AUX_IRQ_LVL_PEND 0x200 /* Pending Intr across all levels */ #define AUX_IRQ_HINT 0x201 /* For generating Soft Interrupts */ #define AUX_IRQ_PRIORITY 0x206 #define ICAUSE 0x40a #define AUX_IRQ_SELECT 0x40b Loading Loading @@ -112,6 +113,16 @@ static inline int arch_irqs_disabled(void) return arch_irqs_disabled_flags(arch_local_save_flags()); } static inline void arc_softirq_trigger(int irq) { write_aux_reg(AUX_IRQ_HINT, irq); } static inline void arc_softirq_clear(int irq) { write_aux_reg(AUX_IRQ_HINT, 0); } #else .macro IRQ_DISABLE scratch Loading
arch/arc/kernel/entry-arcv2.S +24 −6 Original line number Diff line number Diff line Loading @@ -45,11 +45,12 @@ VECTOR reserved ; Reserved slots VECTOR handle_interrupt ; (16) Timer0 VECTOR handle_interrupt ; unused (Timer1) VECTOR handle_interrupt ; unused (WDT) VECTOR handle_interrupt ; (19) ICI (inter core interrupt) VECTOR handle_interrupt VECTOR handle_interrupt VECTOR handle_interrupt VECTOR handle_interrupt ; (23) End of fixed IRQs VECTOR handle_interrupt ; (19) Inter core Interrupt (IPI) VECTOR handle_interrupt ; (20) perf Interrupt VECTOR handle_interrupt ; (21) Software Triggered Intr (Self IPI) VECTOR handle_interrupt ; unused VECTOR handle_interrupt ; (23) unused # End of fixed IRQs .rept CONFIG_ARC_NUMBER_OF_INTERRUPTS - 8 VECTOR handle_interrupt Loading Loading @@ -211,7 +212,11 @@ debug_marker_syscall: ; (since IRQ NOT allowed in DS in ARCv2, this can only happen if orig ; entry was via Exception in DS which got preempted in kernel). ; ; IRQ RTIE won't reliably restore DE bit and/or BTA, needs handling ; IRQ RTIE won't reliably restore DE bit and/or BTA, needs workaround ; ; Solution is return from Intr w/o any delay slot quirks into a kernel trampoline ; and from pure kernel mode return to delay slot which handles DS bit/BTA correctly .Lintr_ret_to_delay_slot: debug_marker_ds: Loading @@ -222,18 +227,23 @@ debug_marker_ds: ld r2, [sp, PT_ret] ld r3, [sp, PT_status32] ; STAT32 for Int return created from scratch ; (No delay dlot, disable Further intr in trampoline) bic r0, r3, STATUS_U_MASK|STATUS_DE_MASK|STATUS_IE_MASK|STATUS_L_MASK st r0, [sp, PT_status32] mov r1, .Lintr_ret_to_delay_slot_2 st r1, [sp, PT_ret] ; Orig exception PC/STAT32 safekept @orig_r0 and @event stack slots st r2, [sp, 0] st r3, [sp, 4] b .Lisr_ret_fast_path .Lintr_ret_to_delay_slot_2: ; Trampoline to restore orig exception PC/STAT32/BTA/AUX_USER_SP sub sp, sp, SZ_PT_REGS st r9, [sp, -4] Loading @@ -243,11 +253,19 @@ debug_marker_ds: ld r9, [sp, 4] sr r9, [erstatus] ; restore AUX_USER_SP if returning to U mode bbit0 r9, STATUS_U_BIT, 1f ld r9, [sp, PT_sp] sr r9, [AUX_USER_SP] 1: ld r9, [sp, 8] sr r9, [erbta] ld r9, [sp, -4] add sp, sp, SZ_PT_REGS ; return from pure kernel mode to delay slot rtie END(ret_from_exception)
arch/arc/kernel/mcip.c +15 −0 Original line number Diff line number Diff line Loading @@ -11,9 +11,12 @@ #include <linux/smp.h> #include <linux/irq.h> #include <linux/spinlock.h> #include <asm/irqflags-arcv2.h> #include <asm/mcip.h> #include <asm/setup.h> #define SOFTIRQ_IRQ 21 static char smp_cpuinfo_buf[128]; static int idu_detected; Loading @@ -22,6 +25,7 @@ static DEFINE_RAW_SPINLOCK(mcip_lock); static void mcip_setup_per_cpu(int cpu) { smp_ipi_irq_setup(cpu, IPI_IRQ); smp_ipi_irq_setup(cpu, SOFTIRQ_IRQ); } static void mcip_ipi_send(int cpu) Loading @@ -29,6 +33,12 @@ static void mcip_ipi_send(int cpu) unsigned long flags; int ipi_was_pending; /* ARConnect can only send IPI to others */ if (unlikely(cpu == raw_smp_processor_id())) { arc_softirq_trigger(SOFTIRQ_IRQ); return; } /* * NOTE: We must spin here if the other cpu hasn't yet * serviced a previous message. This can burn lots Loading Loading @@ -63,6 +73,11 @@ static void mcip_ipi_clear(int irq) unsigned long flags; unsigned int __maybe_unused copy; if (unlikely(irq == SOFTIRQ_IRQ)) { arc_softirq_clear(irq); return; } raw_spin_lock_irqsave(&mcip_lock, flags); /* Who sent the IPI */ Loading