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 | */ |