Subversion Repositories HelenOS

Rev

Rev 2128 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2128 Rev 2465
Line 1... Line 1...
1
/*
1
/*
2
 * Copyright (c) 2003-2004 Jakub Jermar
2
 * Copyright (c) 2007 Michal Kebrt, Petr Stepan
-
 
3
 *
3
 * All rights reserved.
4
 * All rights reserved.
4
 *
5
 *
5
 * Redistribution and use in source and binary forms, with or without
6
 * Redistribution and use in source and binary forms, with or without
6
 * modification, are permitted provided that the following conditions
7
 * modification, are permitted provided that the following conditions
7
 * are met:
8
 * are met:
Line 28... Line 29...
28
 
29
 
29
/** @addtogroup arm32  
30
/** @addtogroup arm32  
30
 * @{
31
 * @{
31
 */
32
 */
32
/** @file
33
/** @file
-
 
34
 *  @brief Exception declarations.
33
 */
35
 */
34
 
36
 
35
#ifndef KERN_arm32_EXCEPTION_H_
37
#ifndef KERN_arm32_EXCEPTION_H_
36
#define KERN_arm32_EXCEPTION_H_
38
#define KERN_arm32_EXCEPTION_H_
37
 
39
 
38
#include <arch/types.h>
40
#include <arch/types.h>
-
 
41
#include <arch/regutils.h>
-
 
42
 
-
 
43
/** If defined, forces using of high exception vectors. */
-
 
44
#define HIGH_EXCEPTION_VECTORS
-
 
45
 
-
 
46
#ifdef HIGH_EXCEPTION_VECTORS
-
 
47
    #define EXC_BASE_ADDRESS    0xffff0000
-
 
48
#else
-
 
49
    #define EXC_BASE_ADDRESS    0x0
-
 
50
#endif
-
 
51
 
-
 
52
/* Exception Vectors */
-
 
53
#define EXC_RESET_VEC          (EXC_BASE_ADDRESS + 0x0)
-
 
54
#define EXC_UNDEF_INSTR_VEC    (EXC_BASE_ADDRESS + 0x4)
-
 
55
#define EXC_SWI_VEC            (EXC_BASE_ADDRESS + 0x8)
-
 
56
#define EXC_PREFETCH_ABORT_VEC (EXC_BASE_ADDRESS + 0xc)
-
 
57
#define EXC_DATA_ABORT_VEC     (EXC_BASE_ADDRESS + 0x10)
-
 
58
#define EXC_IRQ_VEC            (EXC_BASE_ADDRESS + 0x18)
-
 
59
#define EXC_FIQ_VEC            (EXC_BASE_ADDRESS + 0x1c)
-
 
60
 
-
 
61
/* Exception numbers */
-
 
62
#define EXC_RESET           0
-
 
63
#define EXC_UNDEF_INSTR     1
-
 
64
#define EXC_SWI             2
-
 
65
#define EXC_PREFETCH_ABORT  3
-
 
66
#define EXC_DATA_ABORT      4
-
 
67
#define EXC_IRQ             5
-
 
68
#define EXC_FIQ             6
-
 
69
 
-
 
70
 
-
 
71
/** Kernel stack pointer.
-
 
72
 *
-
 
73
 * It is set when thread switches to user mode,
-
 
74
 * and then used for exception handling.
-
 
75
 */
-
 
76
extern uintptr_t supervisor_sp;
-
 
77
 
-
 
78
 
-
 
79
/** Temporary exception stack pointer.
-
 
80
 *
-
 
81
 * Temporary stack is used in exceptions handling routines
-
 
82
 * before switching to thread's kernel stack.
-
 
83
 */
-
 
84
extern uintptr_t exc_stack;
-
 
85
 
39
 
86
 
-
 
87
/** Struct representing CPU state saved when an exception occurs. */
40
typedef struct {
88
typedef struct {
-
 
89
    uint32_t spsr;
-
 
90
    uint32_t sp;
-
 
91
    uint32_t lr;
-
 
92
 
-
 
93
    uint32_t r0;
-
 
94
    uint32_t r1;
-
 
95
    uint32_t r2;
41
    /* TODO */
96
    uint32_t r3;
-
 
97
    uint32_t r4;
-
 
98
    uint32_t r5;
-
 
99
    uint32_t r6;
-
 
100
    uint32_t r7;
-
 
101
    uint32_t r8;
-
 
102
    uint32_t r9;
-
 
103
    uint32_t r10;
-
 
104
    uint32_t r11;
-
 
105
    uint32_t r12;
-
 
106
 
-
 
107
    uint32_t pc;
42
} istate_t;
108
} istate_t;
43
 
109
 
-
 
110
 
-
 
111
/** Sets Program Counter member of given istate structure.
-
 
112
 *
-
 
113
 * @param istate istate structure
-
 
114
 * @param retaddr new value of istate's PC member
-
 
115
 */
44
static inline void istate_set_retaddr(istate_t *istate, uintptr_t retaddr)
116
static inline void istate_set_retaddr(istate_t *istate, uintptr_t retaddr)
45
{
117
{
46
    /* TODO */
118
    istate->pc = retaddr;
47
}
119
}
48
 
120
 
-
 
121
 
49
/** Return true if exception happened while in userspace */
122
/** Returns true if exception happened while in userspace. */
50
static inline int istate_from_uspace(istate_t *istate)
123
static inline int istate_from_uspace(istate_t *istate)
51
{
124
{
52
    /* TODO */
-
 
53
    return 0;
125
    return (istate->spsr & STATUS_REG_MODE_MASK) == USER_MODE;
54
}
126
}
-
 
127
 
-
 
128
 
-
 
129
/** Returns Program Counter member of given istate structure. */
55
static inline unative_t istate_get_pc(istate_t *istate)
130
static inline unative_t istate_get_pc(istate_t *istate)
56
{
131
{
57
    /* TODO */
-
 
58
    return 0;
132
    return istate->pc;
59
}
133
}
60
 
134
 
-
 
135
 
-
 
136
extern void install_exception_handlers(void);
-
 
137
extern void exception_init(void);
-
 
138
extern void print_istate(istate_t *istate);
-
 
139
 
-
 
140
 
61
#endif
141
#endif
62
 
142
 
63
/** @}
143
/** @}
64
 */
144
 */