freeze: change freeze-thaw to normal interrupt
Change-Id: Ib4dbac28f0074595e92ef316945b37ef4bc18327
This commit is contained in:
committed by
Masamichi Takagi
parent
299d47abf5
commit
ff982b8594
@ -119,6 +119,22 @@ static struct ihk_mc_interrupt_handler cpu_stop_handler = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
extern long freeze_thaw(void *nmi_ctx);
|
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)
|
static void multi_nm_interrupt_handler(void *priv)
|
||||||
{
|
{
|
||||||
extern int nmi_mode;
|
extern int nmi_mode;
|
||||||
@ -126,14 +142,6 @@ static void multi_nm_interrupt_handler(void *priv)
|
|||||||
union arm64_cpu_local_variables *clv;
|
union arm64_cpu_local_variables *clv;
|
||||||
|
|
||||||
switch (nmi_mode) {
|
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:
|
case 0:
|
||||||
/* mode == 0, for MEMDUMP NMI */
|
/* mode == 0, for MEMDUMP NMI */
|
||||||
clv = get_arm64_this_cpu_local();
|
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 = {
|
static struct ihk_mc_interrupt_handler multi_nmi_handler = {
|
||||||
.func = multi_nm_interrupt_handler,
|
.func = multi_nm_interrupt_handler,
|
||||||
.priv = NULL,
|
.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_CPU_STOP, &cpu_stop_handler);
|
||||||
ihk_mc_register_interrupt_handler(INTRID_MULTI_NMI, &multi_nmi_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_register_interrupt_handler(
|
||||||
ihk_mc_get_vector(IHK_TLB_FLUSH_IRQ_VECTOR_START),
|
ihk_mc_get_vector(IHK_TLB_FLUSH_IRQ_VECTOR_START),
|
||||||
&remote_tlb_flush_handler);
|
&remote_tlb_flush_handler);
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
/* irq.h COPYRIGHT FUJITSU LIMITED 2015-2018 */
|
/* irq.h COPYRIGHT FUJITSU LIMITED 2015-2019 */
|
||||||
|
|
||||||
#ifndef __HEADER_ARM64_IRQ_H
|
#ifndef __HEADER_ARM64_IRQ_H
|
||||||
#define __HEADER_ARM64_IRQ_H
|
#define __HEADER_ARM64_IRQ_H
|
||||||
@ -14,7 +14,8 @@
|
|||||||
#define INTRID_QUERY_FREE_MEM 2
|
#define INTRID_QUERY_FREE_MEM 2
|
||||||
#define INTRID_CPU_STOP 3
|
#define INTRID_CPU_STOP 3
|
||||||
#define INTRID_TLB_FLUSH 4
|
#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
|
#define INTRID_MULTI_NMI 7
|
||||||
|
|
||||||
/* use PPI interrupt number */
|
/* use PPI interrupt number */
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
/* interrupt.S COPYRIGHT FUJITSU LIMITED 2019 */
|
||||||
/**
|
/**
|
||||||
* \file interrupt.S
|
* \file interrupt.S
|
||||||
* License details are found in the file LICENSE.
|
* License details are found in the file LICENSE.
|
||||||
@ -91,6 +92,9 @@ vector=vector+1
|
|||||||
.endr
|
.endr
|
||||||
|
|
||||||
common_interrupt:
|
common_interrupt:
|
||||||
|
#define MULT_INTR_VECTOR 242
|
||||||
|
cmp $(MULT_INTR_VECTOR),%rdi
|
||||||
|
je 1f
|
||||||
PUSH_ALL_REGS
|
PUSH_ALL_REGS
|
||||||
movq ERROR_OFFSET(%rsp), %rdi
|
movq ERROR_OFFSET(%rsp), %rdi
|
||||||
movq %rsp, %rsi
|
movq %rsp, %rsi
|
||||||
@ -98,6 +102,23 @@ common_interrupt:
|
|||||||
POP_ALL_REGS
|
POP_ALL_REGS
|
||||||
addq $8, %rsp
|
addq $8, %rsp
|
||||||
iretq
|
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
|
.globl __page_fault_handler_address
|
||||||
__page_fault_handler_address:
|
__page_fault_handler_address:
|
||||||
@ -140,31 +161,12 @@ __freeze:
|
|||||||
.globl nmi
|
.globl nmi
|
||||||
nmi:
|
nmi:
|
||||||
#define PANICED 232
|
#define PANICED 232
|
||||||
#define PANIC_REGS 240
|
|
||||||
movq %rax,%gs:PANIC_REGS+0x00
|
movq %rax,%gs:PANIC_REGS+0x00
|
||||||
movq %rsp,%gs:PANIC_REGS+0x08
|
movq %rsp,%gs:PANIC_REGS+0x08
|
||||||
|
|
||||||
movl nmi_mode(%rip),%eax
|
movl nmi_mode(%rip),%eax
|
||||||
cmp $3,%rax
|
cmp $3,%rax
|
||||||
je 4f
|
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:
|
3:
|
||||||
movq %rbx,%gs:PANIC_REGS+0x08
|
movq %rbx,%gs:PANIC_REGS+0x08
|
||||||
movq %rcx,%gs:PANIC_REGS+0x10
|
movq %rcx,%gs:PANIC_REGS+0x10
|
||||||
|
|||||||
2
ihk
2
ihk
Submodule ihk updated: 7880d7786a...02ef2693af
@ -1,11 +1,12 @@
|
|||||||
|
/* freeze.c COPYRIGHT FUJITSU LIMITED 2019 */
|
||||||
#include <kmsg.h>
|
#include <kmsg.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <ihk/cpu.h>
|
#include <ihk/cpu.h>
|
||||||
#include <ihk/debug.h>
|
#include <ihk/debug.h>
|
||||||
#include <cls.h>
|
#include <cls.h>
|
||||||
#include <ihk/monitor.h>
|
#include <ihk/monitor.h>
|
||||||
|
#include <init.h>
|
||||||
|
|
||||||
extern int nmi_mode;
|
|
||||||
extern void mod_nmi_ctx(void *, void(*)());
|
extern void mod_nmi_ctx(void *, void(*)());
|
||||||
extern void lapic_ack();
|
extern void lapic_ack();
|
||||||
extern void __freeze();
|
extern void __freeze();
|
||||||
@ -29,7 +30,7 @@ freeze_thaw(void *nmi_ctx)
|
|||||||
{
|
{
|
||||||
struct ihk_os_cpu_monitor *monitor = cpu_local_var(monitor);
|
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 (monitor->status != IHK_OS_MONITOR_KERNEL_FROZEN) {
|
||||||
#if 1
|
#if 1
|
||||||
mod_nmi_ctx(nmi_ctx, __freeze);
|
mod_nmi_ctx(nmi_ctx, __freeze);
|
||||||
@ -48,7 +49,7 @@ freeze_thaw(void *nmi_ctx)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(nmi_mode == 2) {
|
else if (multi_intr_mode == 2) {
|
||||||
if (monitor->status == IHK_OS_MONITOR_KERNEL_FROZEN) {
|
if (monitor->status == IHK_OS_MONITOR_KERNEL_FROZEN) {
|
||||||
monitor->status = IHK_OS_MONITOR_KERNEL_THAW;
|
monitor->status = IHK_OS_MONITOR_KERNEL_THAW;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -9,6 +9,7 @@
|
|||||||
/*
|
/*
|
||||||
* HISTORY:
|
* HISTORY:
|
||||||
*/
|
*/
|
||||||
|
/* init.h COPYRIGHT FUJITSU LIMITED 2019 */
|
||||||
|
|
||||||
#ifndef INIT_H
|
#ifndef INIT_H
|
||||||
#define INIT_H
|
#define INIT_H
|
||||||
@ -38,5 +39,6 @@ extern void dynamic_debug_sysfs_setup(void);
|
|||||||
extern char *find_command_line(char *name);
|
extern char *find_command_line(char *name);
|
||||||
|
|
||||||
extern int num_processors;
|
extern int num_processors;
|
||||||
|
extern int multi_intr_mode;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -18,6 +18,7 @@
|
|||||||
* 2013/06/02 balazs resolved merge conflicts with futex code
|
* 2013/06/02 balazs resolved merge conflicts with futex code
|
||||||
* 2013/05/20 simin exchange the dcfa stuff init/exit order in mcexec
|
* 2013/05/20 simin exchange the dcfa stuff init/exit order in mcexec
|
||||||
*/
|
*/
|
||||||
|
/* init.c COPYRIGHT FUJITSU LIMITED 2019 */
|
||||||
#include <types.h>
|
#include <types.h>
|
||||||
#include <kmsg.h>
|
#include <kmsg.h>
|
||||||
#include <kmalloc.h>
|
#include <kmalloc.h>
|
||||||
@ -230,8 +231,17 @@ void monitor_init(void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int multi_intr_mode;
|
||||||
int nmi_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()
|
static void nmi_init()
|
||||||
{
|
{
|
||||||
unsigned long phys;
|
unsigned long phys;
|
||||||
@ -256,6 +266,7 @@ static void rest_init(void)
|
|||||||
|
|
||||||
ap_init();
|
ap_init();
|
||||||
cpu_local_var_init();
|
cpu_local_var_init();
|
||||||
|
multi_intr_init();
|
||||||
nmi_init();
|
nmi_init();
|
||||||
uti_init();
|
uti_init();
|
||||||
time_init();
|
time_init();
|
||||||
|
|||||||
@ -10,6 +10,7 @@
|
|||||||
* HISTORY
|
* HISTORY
|
||||||
* 2014/07: bgerofi: remote TLB flush handler
|
* 2014/07: bgerofi: remote TLB flush handler
|
||||||
*/
|
*/
|
||||||
|
/* mm.h COPYRIGHT FUJITSU LIMITED 2019 */
|
||||||
|
|
||||||
#ifndef __HEADER_GENERIC_IHK_MM_H
|
#ifndef __HEADER_GENERIC_IHK_MM_H
|
||||||
#define __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_monitor(unsigned long addr, unsigned long size);
|
||||||
int ihk_set_rusage(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_nmi_mode_addr(unsigned long addr);
|
||||||
int ihk_set_mckernel_do_futex(unsigned long addr);
|
int ihk_set_mckernel_do_futex(unsigned long addr);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user