source: soft/giet_vm/sys/exc_handler.c @ 232

Last change on this file since 232 was 232, checked in by meunier, 11 years ago

Ajout du malloc dans le Giet.

File size: 3.8 KB
RevLine 
[158]1///////////////////////////////////////////////////////////////////////////////////
2// File     : exc_handler.c
3// Date     : 01/04/2012
4// Author   : alain greiner and joel porquet
5// Copyright (c) UPMC-LIP6
6///////////////////////////////////////////////////////////////////////////////////
7// The exc_handler.c and exc_handler.h files are part of the GIET nano-kernel.
8// They contains the exception handler code.
9///////////////////////////////////////////////////////////////////////////////////
10
11#include <exc_handler.h>
[199]12#include <ctx_handler.h>
[158]13#include <sys_handler.h>
14#include <drivers.h>
15#include <common.h>
16
17///////////////////////////////////////////////////////////////////////////////////
18// Prototypes of exception handlers.
19///////////////////////////////////////////////////////////////////////////////////
20
21static void _cause_ukn();
22static void _cause_adel();
23static void _cause_ades();
24static void _cause_ibe();
25static void _cause_dbe();
26static void _cause_bp();
27static void _cause_ri();
28static void _cause_cpu();
29static void _cause_ovf();
30
31extern void _int_handler();
32extern void _sys_handler();
33
34///////////////////////////////////////////////////////////////////////////////////
[189]35// Initialize the exception vector indexed by the CR XCODE field
[158]36///////////////////////////////////////////////////////////////////////////////////
37const _exc_func_t _cause_vector[16] = {
38    &_int_handler,  /* 0000 : external interrupt */
39    &_cause_ukn,    /* 0001 : undefined exception */
40    &_cause_ukn,    /* 0010 : undefined exception */
41    &_cause_ukn,    /* 0011 : undefined exception */
42    &_cause_adel,   /* 0100 : illegal address read exception */
43    &_cause_ades,   /* 0101 : illegal address write exception */
44    &_cause_ibe,    /* 0110 : instruction bus error exception */
45    &_cause_dbe,    /* 0111 : data bus error exception */
46    &_sys_handler,  /* 1000 : system call */
47    &_cause_bp,     /* 1001 : breakpoint exception */
48    &_cause_ri,     /* 1010 : illegal codop exception */
49    &_cause_cpu,    /* 1011 : illegal coprocessor access */
50    &_cause_ovf,    /* 1100 : arithmetic overflow exception */
51    &_cause_ukn,    /* 1101 : undefined exception */
52    &_cause_ukn,    /* 1110 : undefined exception */
53    &_cause_ukn,    /* 1111 : undefined exception */
54};
55
[228]56static const char * exc_type[] = {
[199]57    "strange unknown cause",
58    "illegal read address",
59    "illegal write address",
60    "inst bus error",
61    "data bus error",
62    "breakpoint",
63    "reserved instruction",
[228]64    "illegal coproc access",
[199]65    "arithmetic overflow",
[158]66};
67
[228]68
69static void _display_cause(unsigned int type) {
[218]70    _get_lock(&_tty_put_lock);
[199]71    _puts("\n[GIET] Exception for task ");
[232]72    _putd(_get_proc_task_id());
[199]73    _puts(" on processor ");
[228]74    _putd(_procid());
[199]75    _puts(" at cycle ");
[228]76    _putd(_proctime());
[199]77    _puts("\n - type      : ");
[228]78    _puts((char *) exc_type[type]);
[189]79    _puts("\n - EPC       : ");
[228]80    _putx(_get_epc());
[189]81    _puts("\n - BVAR      : ");
[228]82    _putx(_get_bvar());
[158]83    _puts("\n");
[218]84    _puts("...Task desactivated\n");
85    _release_lock(&_tty_put_lock);
[199]86
87    // goes to sleeping state
[232]88    unsigned int task_id = _get_proc_task_id();
[228]89    _set_context_slot( task_id, CTX_RUN_ID, 0);
90
[199]91    // deschedule
92    _ctx_switch();
[158]93}
94
[199]95static void _cause_ukn()  { _display_cause(0); }
96static void _cause_adel() { _display_cause(1); }
97static void _cause_ades() { _display_cause(2); }
98static void _cause_ibe()  { _display_cause(3); }
99static void _cause_dbe()  { _display_cause(4); }
100static void _cause_bp()   { _display_cause(5); }
101static void _cause_ri()   { _display_cause(6); }
102static void _cause_cpu()  { _display_cause(7); }
103static void _cause_ovf()  { _display_cause(8); }
[158]104
[228]105// Local Variables:
106// tab-width: 4
107// c-basic-offset: 4
108// c-file-offsets:((innamespace . 0)(inline-open . 0))
109// indent-tabs-mode: nil
110// End:
111// vim: filetype=c:expandtab:shiftwidth=4:tabstop=4:softtabstop=4
112
Note: See TracBrowser for help on using the repository browser.