Rev 2608 | Rev 3657 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 431 | jermar | 1 | /* |
| 2071 | jermar | 2 | * Copyright (c) 2005 Jakub Jermar |
| 431 | jermar | 3 | * All rights reserved. |
| 4 | * |
||
| 5 | * Redistribution and use in source and binary forms, with or without |
||
| 6 | * modification, are permitted provided that the following conditions |
||
| 7 | * are met: |
||
| 8 | * |
||
| 9 | * - Redistributions of source code must retain the above copyright |
||
| 10 | * notice, this list of conditions and the following disclaimer. |
||
| 11 | * - Redistributions in binary form must reproduce the above copyright |
||
| 12 | * notice, this list of conditions and the following disclaimer in the |
||
| 13 | * documentation and/or other materials provided with the distribution. |
||
| 14 | * - The name of the author may not be used to endorse or promote products |
||
| 15 | * derived from this software without specific prior written permission. |
||
| 16 | * |
||
| 17 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
||
| 18 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
||
| 19 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
||
| 20 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
||
| 21 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
||
| 22 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||
| 23 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||
| 24 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||
| 25 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
||
| 26 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||
| 27 | */ |
||
| 28 | |||
| 1888 | jermar | 29 | /** @addtogroup ia64interrupt |
| 1702 | cejka | 30 | * @{ |
| 31 | */ |
||
| 32 | /** @file |
||
| 33 | */ |
||
| 34 | |||
| 1888 | jermar | 35 | #ifndef KERN_ia64_INTERRUPT_H_ |
| 36 | #define KERN_ia64_INTERRUPT_H_ |
||
| 431 | jermar | 37 | |
| 470 | jermar | 38 | #include <arch/types.h> |
| 472 | jermar | 39 | #include <arch/register.h> |
| 470 | jermar | 40 | |
| 1942 | jermar | 41 | /** ia64 has 256 INRs. */ |
| 42 | #define INR_COUNT 256 |
||
| 1265 | jermar | 43 | |
| 1942 | jermar | 44 | /* |
| 45 | * We need to keep this just to compile. |
||
| 46 | * We might eventually move interrupt/ stuff |
||
| 47 | * to genarch. |
||
| 48 | */ |
||
| 49 | #define IVT_ITEMS 0 |
||
| 50 | #define IVT_FIRST 0 |
||
| 51 | |||
| 472 | jermar | 52 | /** External Interrupt vectors. */ |
| 3626 | vana | 53 | |
| 54 | #define VECTOR_TLB_SHOOTDOWN_IPI 0xf0 |
||
| 2064 | vana | 55 | #define INTERRUPT_TIMER 255 |
| 2516 | vana | 56 | #define IRQ_KBD 241 |
| 57 | #define IRQ_MOUSE 252 |
||
| 433 | jermar | 58 | #define INTERRUPT_SPURIOUS 15 |
| 59 | |||
| 472 | jermar | 60 | /** General Exception codes. */ |
| 61 | #define GE_ILLEGALOP 0 |
||
| 62 | #define GE_PRIVOP 1 |
||
| 63 | #define GE_PRIVREG 2 |
||
| 64 | #define GE_RESREGFLD 3 |
||
| 65 | #define GE_DISBLDISTRAN 4 |
||
| 66 | #define GE_ILLEGALDEP 8 |
||
| 67 | |||
| 435 | jermar | 68 | #define EOI 0 /**< The actual value doesn't matter. */ |
| 69 | |||
| 2089 | decky | 70 | typedef struct { |
| 71 | uint128_t f2; |
||
| 72 | uint128_t f3; |
||
| 73 | uint128_t f4; |
||
| 74 | uint128_t f5; |
||
| 75 | uint128_t f6; |
||
| 76 | uint128_t f7; |
||
| 77 | uint128_t f8; |
||
| 78 | uint128_t f9; |
||
| 79 | uint128_t f10; |
||
| 80 | uint128_t f11; |
||
| 81 | uint128_t f12; |
||
| 82 | uint128_t f13; |
||
| 83 | uint128_t f14; |
||
| 84 | uint128_t f15; |
||
| 85 | uint128_t f16; |
||
| 86 | uint128_t f17; |
||
| 87 | uint128_t f18; |
||
| 88 | uint128_t f19; |
||
| 89 | uint128_t f20; |
||
| 90 | uint128_t f21; |
||
| 91 | uint128_t f22; |
||
| 92 | uint128_t f23; |
||
| 93 | uint128_t f24; |
||
| 94 | uint128_t f25; |
||
| 95 | uint128_t f26; |
||
| 96 | uint128_t f27; |
||
| 97 | uint128_t f28; |
||
| 98 | uint128_t f29; |
||
| 99 | uint128_t f30; |
||
| 100 | uint128_t f31; |
||
| 1265 | jermar | 101 | |
| 1780 | jermar | 102 | uintptr_t ar_bsp; |
| 103 | uintptr_t ar_bspstore; |
||
| 104 | uintptr_t ar_bspstore_new; |
||
| 105 | uint64_t ar_rnat; |
||
| 106 | uint64_t ar_ifs; |
||
| 107 | uint64_t ar_pfs; |
||
| 108 | uint64_t ar_rsc; |
||
| 109 | uintptr_t cr_ifa; |
||
| 472 | jermar | 110 | cr_isr_t cr_isr; |
| 1780 | jermar | 111 | uintptr_t cr_iipa; |
| 921 | jermar | 112 | psr_t cr_ipsr; |
| 1780 | jermar | 113 | uintptr_t cr_iip; |
| 114 | uint64_t pr; |
||
| 115 | uintptr_t sp; |
||
| 921 | jermar | 116 | |
| 117 | /* |
||
| 2608 | jermar | 118 | * The following variables are defined only for break_instruction |
| 119 | * handler. |
||
| 921 | jermar | 120 | */ |
| 1780 | jermar | 121 | uint64_t in0; |
| 122 | uint64_t in1; |
||
| 123 | uint64_t in2; |
||
| 124 | uint64_t in3; |
||
| 125 | uint64_t in4; |
||
| 2608 | jermar | 126 | uint64_t in5; |
| 127 | uint64_t in6; |
||
| 2089 | decky | 128 | } istate_t; |
| 431 | jermar | 129 | |
| 1780 | jermar | 130 | static inline void istate_set_retaddr(istate_t *istate, uintptr_t retaddr) |
| 1288 | jermar | 131 | { |
| 1295 | jermar | 132 | istate->cr_iip = retaddr; |
| 133 | istate->cr_ipsr.ri = 0; /* return to instruction slot #0 */ |
||
| 1288 | jermar | 134 | } |
| 135 | |||
| 1780 | jermar | 136 | static inline unative_t istate_get_pc(istate_t *istate) |
| 1595 | palkovsky | 137 | { |
| 138 | return istate->cr_iip; |
||
| 139 | } |
||
| 1888 | jermar | 140 | |
| 1595 | palkovsky | 141 | static inline int istate_from_uspace(istate_t *istate) |
| 142 | { |
||
| 1942 | jermar | 143 | return (istate->cr_iip) < 0xe000000000000000ULL; |
| 1595 | palkovsky | 144 | } |
| 145 | |||
| 470 | jermar | 146 | extern void *ivt; |
| 147 | |||
| 1780 | jermar | 148 | extern void general_exception(uint64_t vector, istate_t *istate); |
| 149 | extern int break_instruction(uint64_t vector, istate_t *istate); |
||
| 150 | extern void universal_handler(uint64_t vector, istate_t *istate); |
||
| 151 | extern void nop_handler(uint64_t vector, istate_t *istate); |
||
| 152 | extern void external_interrupt(uint64_t vector, istate_t *istate); |
||
| 153 | extern void disabled_fp_register(uint64_t vector, istate_t *istate); |
||
| 470 | jermar | 154 | |
| 431 | jermar | 155 | #endif |
| 1702 | cejka | 156 | |
| 1888 | jermar | 157 | /** @} |
| 1702 | cejka | 158 | */ |