diff --git a/arch/arm64/kernel/cpu.c b/arch/arm64/kernel/cpu.c index 7de26fbd..84ad30e3 100644 --- a/arch/arm64/kernel/cpu.c +++ b/arch/arm64/kernel/cpu.c @@ -119,6 +119,22 @@ static struct ihk_mc_interrupt_handler cpu_stop_handler = { }; extern long freeze_thaw(void *nmi_ctx); +static void multi_interrupt_handler(void *priv) +{ + switch (multi_intr_mode) { + case 1: + case 2: /* mode == 1or2, for FREEZER intr */ + dkprintf("%s: freeze mode intr catch. (multi_intr_mode=%d)\n", + __func__, multi_intr_mode); + freeze_thaw(NULL); + break; + default: + ekprintf("%s: Unknown multi-intr-mode(%d) detected.\n", + __func__, multi_intr_mode); + break; + } +} + static void multi_nm_interrupt_handler(void *priv) { extern int nmi_mode; @@ -126,14 +142,6 @@ static void multi_nm_interrupt_handler(void *priv) union arm64_cpu_local_variables *clv; switch (nmi_mode) { - case 1: - case 2: - /* mode == 1or2, for FREEZER NMI */ - dkprintf("%s: freeze mode NMI catch. (nmi_mode=%d)\n", - __func__, nmi_mode); - freeze_thaw(NULL); - break; - case 0: /* mode == 0, for MEMDUMP NMI */ clv = get_arm64_this_cpu_local(); @@ -164,6 +172,11 @@ static void multi_nm_interrupt_handler(void *priv) } } +static struct ihk_mc_interrupt_handler multi_intr_handler = { + .func = multi_interrupt_handler, + .priv = NULL, +}; + static struct ihk_mc_interrupt_handler multi_nmi_handler = { .func = multi_nm_interrupt_handler, .priv = NULL, @@ -428,6 +441,8 @@ void ihk_mc_init_ap(void) ihk_mc_register_interrupt_handler(INTRID_CPU_STOP, &cpu_stop_handler); ihk_mc_register_interrupt_handler(INTRID_MULTI_NMI, &multi_nmi_handler); + ihk_mc_register_interrupt_handler(INTRID_MULTI_INTR, + &multi_intr_handler); ihk_mc_register_interrupt_handler( ihk_mc_get_vector(IHK_TLB_FLUSH_IRQ_VECTOR_START), &remote_tlb_flush_handler); diff --git a/arch/arm64/kernel/include/irq.h b/arch/arm64/kernel/include/irq.h index 704960e6..7d43216a 100644 --- a/arch/arm64/kernel/include/irq.h +++ b/arch/arm64/kernel/include/irq.h @@ -1,4 +1,4 @@ -/* irq.h COPYRIGHT FUJITSU LIMITED 2015-2018 */ +/* irq.h COPYRIGHT FUJITSU LIMITED 2015-2019 */ #ifndef __HEADER_ARM64_IRQ_H #define __HEADER_ARM64_IRQ_H @@ -14,7 +14,8 @@ #define INTRID_QUERY_FREE_MEM 2 #define INTRID_CPU_STOP 3 #define INTRID_TLB_FLUSH 4 -#define INTRID_STACK_TRACE 6 +#define INTRID_STACK_TRACE 5 +#define INTRID_MULTI_INTR 6 #define INTRID_MULTI_NMI 7 /* use PPI interrupt number */ diff --git a/arch/x86_64/kernel/interrupt.S b/arch/x86_64/kernel/interrupt.S index 59802ccf..3d07ea79 100644 --- a/arch/x86_64/kernel/interrupt.S +++ b/arch/x86_64/kernel/interrupt.S @@ -1,3 +1,4 @@ +/* interrupt.S COPYRIGHT FUJITSU LIMITED 2019 */ /** * \file interrupt.S * License details are found in the file LICENSE. @@ -91,6 +92,9 @@ vector=vector+1 .endr common_interrupt: +#define MULT_INTR_VECTOR 242 + cmp $(MULT_INTR_VECTOR),%rdi + je 1f PUSH_ALL_REGS movq ERROR_OFFSET(%rsp), %rdi movq %rsp, %rsi @@ -98,6 +102,23 @@ common_interrupt: POP_ALL_REGS addq $8, %rsp iretq +1: +#define PANIC_REGS 240 + movq %rax,%gs:PANIC_REGS+0x00 + movq %rsp,%gs:PANIC_REGS+0x08 + cld + movq %gs:PANIC_REGS+0x00,%rax + PUSH_ALL_REGS + subq $40, %rsp + movq %rsp,%gs:PANIC_REGS+0x10 + movq %rsp, %rdi + call freeze_thaw + cmpq $0, %rax + jnz 2f + addq $40, %rsp +2: + POP_ALL_REGS + iretq .globl __page_fault_handler_address __page_fault_handler_address: @@ -140,31 +161,12 @@ __freeze: .globl nmi nmi: #define PANICED 232 -#define PANIC_REGS 240 movq %rax,%gs:PANIC_REGS+0x00 movq %rsp,%gs:PANIC_REGS+0x08 movl nmi_mode(%rip),%eax cmp $3,%rax je 4f - cmp $1,%rax - je 1f - cmp $2,%rax - jne 3f -1: - cld - movq %gs:PANIC_REGS+0x00,%rax - PUSH_ALL_REGS - subq $40, %rsp - movq %rsp,%gs:PANIC_REGS+0x10 - movq %rsp, %rdi - call freeze_thaw - cmpq $0, %rax - jnz 2f - addq $40, %rsp -2: - POP_ALL_REGS - iretq 3: movq %rbx,%gs:PANIC_REGS+0x08 movq %rcx,%gs:PANIC_REGS+0x10 diff --git a/ihk b/ihk index 7880d778..02ef2693 160000 --- a/ihk +++ b/ihk @@ -1 +1 @@ -Subproject commit 7880d7786a39bde6bd7f195a8142928b29a95170 +Subproject commit 02ef2693af4d66b74f70b8c9a60667c241b291c7 diff --git a/kernel/freeze.c b/kernel/freeze.c index b97ee005..30da050c 100644 --- a/kernel/freeze.c +++ b/kernel/freeze.c @@ -1,11 +1,12 @@ +/* freeze.c COPYRIGHT FUJITSU LIMITED 2019 */ #include #include #include #include #include #include +#include -extern int nmi_mode; extern void mod_nmi_ctx(void *, void(*)()); extern void lapic_ack(); extern void __freeze(); @@ -29,7 +30,7 @@ freeze_thaw(void *nmi_ctx) { struct ihk_os_cpu_monitor *monitor = cpu_local_var(monitor); - if (nmi_mode == 1) { + if (multi_intr_mode == 1) { if (monitor->status != IHK_OS_MONITOR_KERNEL_FROZEN) { #if 1 mod_nmi_ctx(nmi_ctx, __freeze); @@ -48,7 +49,7 @@ freeze_thaw(void *nmi_ctx) #endif } } - else if(nmi_mode == 2) { + else if (multi_intr_mode == 2) { if (monitor->status == IHK_OS_MONITOR_KERNEL_FROZEN) { monitor->status = IHK_OS_MONITOR_KERNEL_THAW; } diff --git a/kernel/include/init.h b/kernel/include/init.h index 400438c2..80952fef 100644 --- a/kernel/include/init.h +++ b/kernel/include/init.h @@ -9,6 +9,7 @@ /* * HISTORY: */ +/* init.h COPYRIGHT FUJITSU LIMITED 2019 */ #ifndef INIT_H #define INIT_H @@ -38,5 +39,6 @@ extern void dynamic_debug_sysfs_setup(void); extern char *find_command_line(char *name); extern int num_processors; +extern int multi_intr_mode; #endif diff --git a/kernel/init.c b/kernel/init.c index 9ee3b425..8781c127 100644 --- a/kernel/init.c +++ b/kernel/init.c @@ -18,6 +18,7 @@ * 2013/06/02 balazs resolved merge conflicts with futex code * 2013/05/20 simin exchange the dcfa stuff init/exit order in mcexec */ +/* init.c COPYRIGHT FUJITSU LIMITED 2019 */ #include #include #include @@ -230,8 +231,17 @@ void monitor_init(void) return; } +int multi_intr_mode; int nmi_mode; +static void multi_intr_init(void) +{ + unsigned long phys; + + phys = virt_to_phys(&multi_intr_mode); + ihk_set_multi_intr_mode_addr(phys); +} + static void nmi_init() { unsigned long phys; @@ -256,6 +266,7 @@ static void rest_init(void) ap_init(); cpu_local_var_init(); + multi_intr_init(); nmi_init(); uti_init(); time_init(); diff --git a/lib/include/ihk/mm.h b/lib/include/ihk/mm.h index 5a68378a..58fba77f 100644 --- a/lib/include/ihk/mm.h +++ b/lib/include/ihk/mm.h @@ -10,6 +10,7 @@ * HISTORY * 2014/07: bgerofi: remote TLB flush handler */ +/* mm.h COPYRIGHT FUJITSU LIMITED 2019 */ #ifndef __HEADER_GENERIC_IHK_MM_H #define __HEADER_GENERIC_IHK_MM_H @@ -229,6 +230,7 @@ char *ihk_get_kargs(void); int ihk_set_monitor(unsigned long addr, unsigned long size); int ihk_set_rusage(unsigned long addr, unsigned long size); +int ihk_set_multi_intr_mode_addr(unsigned long addr); int ihk_set_nmi_mode_addr(unsigned long addr); int ihk_set_mckernel_do_futex(unsigned long addr);