1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
/* Copyright 2013 The ChromiumOS Authors
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "config.h"
#include "panic.h"
#include "stack_trace.h"
#include <assert.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void panic_assert_fail(const char *msg, const char *func, const char *fname,
int linenum)
{
fprintf(stderr, "ASSERTION FAIL: %s:%d:%s - %s\n", fname, linenum, func,
msg);
task_dump_trace();
puts("Fail!"); /* Inform test runner */
fflush(stdout);
exit(1);
}
void panic_set_reason(uint32_t reason, uint32_t info, uint8_t exception)
{
struct panic_data *const pdata = panic_get_data();
assert(pdata);
memset(pdata, 0, CONFIG_PANIC_DATA_SIZE);
pdata->magic = PANIC_DATA_MAGIC;
pdata->struct_size = CONFIG_PANIC_DATA_SIZE;
pdata->struct_version = 2;
pdata->arch = PANIC_ARCH_X86;
pdata->x86.vector = reason;
pdata->x86.error_code = info;
pdata->x86.eflags = exception;
}
void panic_get_reason(uint32_t *reason, uint32_t *info, uint8_t *exception)
{
struct panic_data *const pdata = panic_get_data();
assert(pdata);
assert(pdata->struct_version == 2);
if (reason)
*reason = pdata->x86.vector;
if (info)
*info = pdata->x86.error_code;
if (exception)
*exception = pdata->x86.eflags;
}
|