Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
a228b589
K
kernel_linux
项目概览
OpenHarmony
/
kernel_linux
上一次同步 4 年多
通知
15
Star
8
Fork
2
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
kernel_linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
a228b589
编写于
12月 18, 2011
作者:
I
Ingo Molnar
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'mce-inject' of
git://git.kernel.org/pub/scm/linux/kernel/git/ras/ras
into x86/mce
上级
715a4318
2c29d9dd
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
35 addition
and
8 deletion
+35
-8
arch/x86/include/asm/mce.h
arch/x86/include/asm/mce.h
+5
-4
arch/x86/kernel/cpu/mcheck/mce-inject.c
arch/x86/kernel/cpu/mcheck/mce-inject.c
+30
-4
未找到文件。
arch/x86/include/asm/mce.h
浏览文件 @
a228b589
...
@@ -50,10 +50,11 @@
...
@@ -50,10 +50,11 @@
#define MCJ_CTX_MASK 3
#define MCJ_CTX_MASK 3
#define MCJ_CTX(flags) ((flags) & MCJ_CTX_MASK)
#define MCJ_CTX(flags) ((flags) & MCJ_CTX_MASK)
#define MCJ_CTX_RANDOM 0
/* inject context: random */
#define MCJ_CTX_RANDOM 0
/* inject context: random */
#define MCJ_CTX_PROCESS 1
/* inject context: process */
#define MCJ_CTX_PROCESS 0x1
/* inject context: process */
#define MCJ_CTX_IRQ 2
/* inject context: IRQ */
#define MCJ_CTX_IRQ 0x2
/* inject context: IRQ */
#define MCJ_NMI_BROADCAST 4
/* do NMI broadcasting */
#define MCJ_NMI_BROADCAST 0x4
/* do NMI broadcasting */
#define MCJ_EXCEPTION 8
/* raise as exception */
#define MCJ_EXCEPTION 0x8
/* raise as exception */
#define MCJ_IRQ_BRAODCAST 0x10
/* do IRQ broadcasting */
/* Fields are zero when not available */
/* Fields are zero when not available */
struct
mce
{
struct
mce
{
...
...
arch/x86/kernel/cpu/mcheck/mce-inject.c
浏览文件 @
a228b589
...
@@ -17,6 +17,7 @@
...
@@ -17,6 +17,7 @@
#include <linux/kernel.h>
#include <linux/kernel.h>
#include <linux/string.h>
#include <linux/string.h>
#include <linux/fs.h>
#include <linux/fs.h>
#include <linux/preempt.h>
#include <linux/smp.h>
#include <linux/smp.h>
#include <linux/notifier.h>
#include <linux/notifier.h>
#include <linux/kdebug.h>
#include <linux/kdebug.h>
...
@@ -92,6 +93,18 @@ static int mce_raise_notify(unsigned int cmd, struct pt_regs *regs)
...
@@ -92,6 +93,18 @@ static int mce_raise_notify(unsigned int cmd, struct pt_regs *regs)
return
NMI_HANDLED
;
return
NMI_HANDLED
;
}
}
static
void
mce_irq_ipi
(
void
*
info
)
{
int
cpu
=
smp_processor_id
();
struct
mce
*
m
=
&
__get_cpu_var
(
injectm
);
if
(
cpumask_test_cpu
(
cpu
,
mce_inject_cpumask
)
&&
m
->
inject_flags
&
MCJ_EXCEPTION
)
{
cpumask_clear_cpu
(
cpu
,
mce_inject_cpumask
);
raise_exception
(
m
,
NULL
);
}
}
/* Inject mce on current CPU */
/* Inject mce on current CPU */
static
int
raise_local
(
void
)
static
int
raise_local
(
void
)
{
{
...
@@ -139,9 +152,10 @@ static void raise_mce(struct mce *m)
...
@@ -139,9 +152,10 @@ static void raise_mce(struct mce *m)
return
;
return
;
#ifdef CONFIG_X86_LOCAL_APIC
#ifdef CONFIG_X86_LOCAL_APIC
if
(
m
->
inject_flags
&
MCJ_NMI_BROADCAST
)
{
if
(
m
->
inject_flags
&
(
MCJ_IRQ_BRAODCAST
|
MCJ_NMI_BROADCAST
)
)
{
unsigned
long
start
;
unsigned
long
start
;
int
cpu
;
int
cpu
;
get_online_cpus
();
get_online_cpus
();
cpumask_copy
(
mce_inject_cpumask
,
cpu_online_mask
);
cpumask_copy
(
mce_inject_cpumask
,
cpu_online_mask
);
cpumask_clear_cpu
(
get_cpu
(),
mce_inject_cpumask
);
cpumask_clear_cpu
(
get_cpu
(),
mce_inject_cpumask
);
...
@@ -151,13 +165,25 @@ static void raise_mce(struct mce *m)
...
@@ -151,13 +165,25 @@ static void raise_mce(struct mce *m)
MCJ_CTX
(
mcpu
->
inject_flags
)
!=
MCJ_CTX_RANDOM
)
MCJ_CTX
(
mcpu
->
inject_flags
)
!=
MCJ_CTX_RANDOM
)
cpumask_clear_cpu
(
cpu
,
mce_inject_cpumask
);
cpumask_clear_cpu
(
cpu
,
mce_inject_cpumask
);
}
}
if
(
!
cpumask_empty
(
mce_inject_cpumask
))
if
(
!
cpumask_empty
(
mce_inject_cpumask
))
{
apic
->
send_IPI_mask
(
mce_inject_cpumask
,
NMI_VECTOR
);
if
(
m
->
inject_flags
&
MCJ_IRQ_BRAODCAST
)
{
/*
* don't wait because mce_irq_ipi is necessary
* to be sync with following raise_local
*/
preempt_disable
();
smp_call_function_many
(
mce_inject_cpumask
,
mce_irq_ipi
,
NULL
,
0
);
preempt_enable
();
}
else
if
(
m
->
inject_flags
&
MCJ_NMI_BROADCAST
)
apic
->
send_IPI_mask
(
mce_inject_cpumask
,
NMI_VECTOR
);
}
start
=
jiffies
;
start
=
jiffies
;
while
(
!
cpumask_empty
(
mce_inject_cpumask
))
{
while
(
!
cpumask_empty
(
mce_inject_cpumask
))
{
if
(
!
time_before
(
jiffies
,
start
+
2
*
HZ
))
{
if
(
!
time_before
(
jiffies
,
start
+
2
*
HZ
))
{
printk
(
KERN_ERR
printk
(
KERN_ERR
"Timeout waiting for mce inject
NMI
%lx
\n
"
,
"Timeout waiting for mce inject %lx
\n
"
,
*
cpumask_bits
(
mce_inject_cpumask
));
*
cpumask_bits
(
mce_inject_cpumask
));
break
;
break
;
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录