Subversion Repositories freemyipod

Rev

Rev 242 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 242 Rev 243
Line 23... Line 23...
23
 
23
 
24
#include "global.h"
24
#include "global.h"
25
#include "panic.h"
25
#include "panic.h"
26
#include "lcd.h"
26
#include "lcd.h"
27
#include "lcdconsole.h"
27
#include "lcdconsole.h"
28
#include "console.h"
-
 
29
#include "format.h"
28
#include "format.h"
30
#include "thread.h"
-
 
31
#include "contextswitch.h"
-
 
32
 
29
 
33
 
30
 
34
extern struct scheduler_thread* scheduler_threads;
-
 
35
extern struct scheduler_thread* current_thread;
-
 
36
 
-
 
37
 
-
 
38
void handle_panic(enum panic_severity severity)
-
 
39
{
-
 
40
    int i;
-
 
41
    if (severity == PANIC_KILLTHREAD) thread_exit();
-
 
42
    else
-
 
43
    {
-
 
44
        uint32_t mode = enter_critical_section();
-
 
45
        for (i = 0; i < MAX_THREADS; i++)
-
 
46
            if (scheduler_threads[i].type == USER_THREAD)
-
 
47
                scheduler_threads[i].state = THREAD_SUSPENDED;
-
 
48
        current_thread->state = THREAD_DEFUNCT_ACK;
-
 
49
        current_thread->block_type = THREAD_DEFUNCT_PANIC;
-
 
50
        leave_critical_section(mode);
-
 
51
        context_switch();
-
 
52
    }
-
 
53
}
-
 
54
 
-
 
55
void panic(enum panic_severity severity, const char* string)
31
void panic(enum panic_severity severity, const char* string)
56
{
32
{
57
    if (severity == PANIC_FATAL)
-
 
58
    {
-
 
59
        enter_critical_section();
33
    enter_critical_section();
60
        while (!displaylcd_safe());
34
    while (!displaylcd_safe());
61
        lcdconsole_puts_noblit("\n*PANIC*\n", 0, -1);
35
    lcdconsole_puts_noblit("\n*PANIC*\n", 0, -1);
62
        lcdconsole_puts_noblit(string, 0, -1);
36
    lcdconsole_puts_noblit(string, 0, -1);
63
        lcdconsole_puts_noblit("\n", 0, -1);
37
    lcdconsole_puts_noblit("\n", 0, -1);
64
        lcdconsole_update();
38
    lcdconsole_update();
65
        hang();
39
    hang();
66
    }
-
 
67
    else
-
 
68
    {
-
 
69
        cputs(1, "\n*PANIC*\n");
-
 
70
        cputs(1, string);
-
 
71
        cputc(1, '\n');
-
 
72
        handle_panic(severity);
-
 
73
    }
-
 
74
}
40
}
75
 
41
 
76
static int pprfunc(void* ptr, unsigned char letter)
42
static int pprfunc(void* ptr, unsigned char letter)
77
{
43
{
78
    lcdconsole_putc_noblit(letter, 0, -1);
44
    lcdconsole_putc_noblit(letter, 0, -1);
Line 80... Line 46...
80
}
46
}
81
 
47
 
82
void panicf(enum panic_severity severity, const char* string, ...)
48
void panicf(enum panic_severity severity, const char* string, ...)
83
{
49
{
84
    va_list ap;
50
    va_list ap;
85
    if (severity == PANIC_FATAL)
-
 
86
    {
-
 
87
        enter_critical_section();
51
    enter_critical_section();
88
        while (!displaylcd_safe());
52
    while (!displaylcd_safe());
89
        lcdconsole_puts_noblit("\n*PANIC*\n", 0, -1);
53
    lcdconsole_puts_noblit("\n*PANIC*\n", 0, -1);
90
        va_start(ap, string);
54
    va_start(ap, string);
91
        format(pprfunc, NULL, string, ap);
55
    format(pprfunc, NULL, string, ap);
92
        va_end(ap);
56
    va_end(ap);
93
        lcdconsole_puts_noblit("\n", 0, -1);
57
    lcdconsole_puts_noblit("\n", 0, -1);
94
        lcdconsole_update();
58
    lcdconsole_update();
95
        hang();
59
    hang();
96
    }
-
 
97
    else
-
 
98
    {
-
 
99
        cputs(1, "\n*PANIC*\n");
-
 
100
        va_start(ap, string);
-
 
101
        cvprintf(1, string, ap);
-
 
102
        va_end(ap);
-
 
103
        cputc(1, '\n');
-
 
104
        handle_panic(severity);
-
 
105
    }
-
 
106
}
60
}
107
 
61
 
108
void __div0()
62
void __div0()
109
{
63
{
110
    panic(PANIC_KILLTHREAD, "Division by zero!");
64
    panic(PANIC_KILLTHREAD, "Division by zero!");