Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 163046
b: refs/heads/master
c: bf783f9
h: refs/heads/master
v: v3
  • Loading branch information
Huang Ying authored and H. Peter Anvin committed Aug 10, 2009
1 parent cb64d22 commit 8ead3c6
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 12 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 5be9ed251f58881dfc3dd6742a81ff9ad1a7bb04
refs/heads/master: bf783f9f7d33576815bc89f9f1856a7309ea2f17
75 changes: 64 additions & 11 deletions trunk/arch/x86/kernel/cpu/mcheck/mce.c
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,9 @@ static void print_mce_tail(void)

static atomic_t mce_paniced;

static int fake_panic;
static atomic_t mce_fake_paniced;

/* Panic in progress. Enable interrupts and wait for final IPI */
static void wait_for_panic(void)
{
Expand All @@ -221,15 +224,21 @@ static void mce_panic(char *msg, struct mce *final, char *exp)
{
int i;

/*
* Make sure only one CPU runs in machine check panic
*/
if (atomic_inc_return(&mce_paniced) > 1)
wait_for_panic();
barrier();
if (!fake_panic) {
/*
* Make sure only one CPU runs in machine check panic
*/
if (atomic_inc_return(&mce_paniced) > 1)
wait_for_panic();
barrier();

bust_spinlocks(1);
console_verbose();
bust_spinlocks(1);
console_verbose();
} else {
/* Don't log too much for fake panic */
if (atomic_inc_return(&mce_fake_paniced) > 1)
return;
}
print_mce_head();
/* First print corrected ones that are still unlogged */
for (i = 0; i < MCE_LOG_LEN; i++) {
Expand All @@ -256,9 +265,12 @@ static void mce_panic(char *msg, struct mce *final, char *exp)
print_mce_tail();
if (exp)
printk(KERN_EMERG "Machine check: %s\n", exp);
if (panic_timeout == 0)
panic_timeout = mce_panic_timeout;
panic(msg);
if (!fake_panic) {
if (panic_timeout == 0)
panic_timeout = mce_panic_timeout;
panic(msg);
} else
printk(KERN_EMERG "Fake kernel panic: %s\n", msg);
}

/* Support code for software error injection */
Expand Down Expand Up @@ -2015,4 +2027,45 @@ struct dentry *mce_get_debugfs_dir(void)

return dmce;
}

static void mce_reset(void)
{
cpu_missing = 0;
atomic_set(&mce_fake_paniced, 0);
atomic_set(&mce_executing, 0);
atomic_set(&mce_callin, 0);
atomic_set(&global_nwo, 0);
}

static int fake_panic_get(void *data, u64 *val)
{
*val = fake_panic;
return 0;
}

static int fake_panic_set(void *data, u64 val)
{
mce_reset();
fake_panic = val;
return 0;
}

DEFINE_SIMPLE_ATTRIBUTE(fake_panic_fops, fake_panic_get,
fake_panic_set, "%llu\n");

static int __init mce_debugfs_init(void)
{
struct dentry *dmce, *ffake_panic;

dmce = mce_get_debugfs_dir();
if (!dmce)
return -ENOMEM;
ffake_panic = debugfs_create_file("fake_panic", 0444, dmce, NULL,
&fake_panic_fops);
if (!ffake_panic)
return -ENOMEM;

return 0;
}
late_initcall(mce_debugfs_init);
#endif

0 comments on commit 8ead3c6

Please sign in to comment.