Changeset da1bafb in mainline for kernel/arch/ia64/src
- Timestamp:
- 2010-05-24T18:57:31Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 0095368
- Parents:
- 666f492
- Location:
- kernel/arch/ia64/src
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/ia64/src/drivers/it.c
r666f492 rda1bafb 34 34 35 35 /** Interval Timer driver. */ 36 36 37 37 #include <arch/drivers/it.h> 38 38 #include <arch/interrupt.h> … … 45 45 #include <arch.h> 46 46 47 #define IT_SERVICE_CLOCKS 47 #define IT_SERVICE_CLOCKS 64 48 48 49 #define FREQ_NUMERATOR_SHIFT 50 #define FREQ_NUMERATOR_MASK 49 #define FREQ_NUMERATOR_SHIFT 32 50 #define FREQ_NUMERATOR_MASK 0xffffffff00000000ULL 51 51 52 #define FREQ_DENOMINATOR_SHIFT 53 #define FREQ_DENOMINATOR_MASK 52 #define FREQ_DENOMINATOR_SHIFT 0 53 #define FREQ_DENOMINATOR_MASK 0xffffffffULL 54 54 55 55 uint64_t it_delta; … … 63 63 void it_init(void) 64 64 { 65 cr_itv_t itv;66 67 65 if (config.cpu_active == 1) { 68 66 irq_initialize(&it_irq); … … 83 81 } 84 82 85 /* initialize Interval Timer external interrupt vector */ 83 /* Initialize Interval Timer external interrupt vector */ 84 cr_itv_t itv; 85 86 86 itv.value = itv_read(); 87 87 itv.vector = INTERRUPT_TIMER; 88 88 itv.m = 0; 89 89 itv_write(itv.value); 90 91 /* set Interval Timer Counter to zero */90 91 /* Set Interval Timer Counter to zero */ 92 92 itc_write(0); 93 93 94 /* generate first Interval Timer interrupt in IT_DELTA ticks */94 /* Generate first Interval Timer interrupt in IT_DELTA ticks */ 95 95 itm_write(IT_DELTA); 96 97 /* propagate changes */96 97 /* Propagate changes */ 98 98 srlz_d(); 99 99 } … … 104 104 * 105 105 * @return Always IRQ_ACCEPT. 106 * 106 107 */ 107 108 irq_ownership_t it_claim(irq_t *irq) … … 113 114 void it_interrupt(irq_t *irq) 114 115 { 115 int64_t c;116 int64_t m;117 118 116 eoi_write(EOI); 119 117 120 m = itm_read();118 int64_t itm = itm_read(); 121 119 122 while ( 1) {123 c = itc_read();124 c += IT_SERVICE_CLOCKS;125 126 m += IT_DELTA;127 if ( m -c < 0)120 while (true) { 121 int64_t itc = itc_read(); 122 itc += IT_SERVICE_CLOCKS; 123 124 itm += IT_DELTA; 125 if (itm - itc < 0) 128 126 CPU->missed_clock_ticks++; 129 127 else … … 131 129 } 132 130 133 itm_write( m);134 srlz_d(); /* propagate changes */135 131 itm_write(itm); 132 srlz_d(); /* Propagate changes */ 133 136 134 /* 137 135 * We are holding a lock which prevents preemption. 138 136 * Release the lock, call clock() and reacquire the lock again. 139 137 */ 140 spinlock_unlock(&irq->lock);138 irq_spinlock_unlock(&irq->lock, false); 141 139 clock(); 142 spinlock_lock(&irq->lock);140 irq_spinlock_lock(&irq->lock, false); 143 141 } 144 142 -
kernel/arch/ia64/src/interrupt.c
r666f492 rda1bafb 57 57 #include <putchar.h> 58 58 59 #define VECTORS_64_BUNDLE 20 60 #define VECTORS_16_BUNDLE 48 61 #define VECTORS_16_BUNDLE_START 0x5000 62 #define VECTOR_MAX 0x7f00 63 64 #define BUNDLE_SIZE 16 59 #define VECTORS_64_BUNDLE 20 60 #define VECTORS_16_BUNDLE 48 61 #define VECTORS_16_BUNDLE_START 0x5000 62 63 #define VECTOR_MAX 0x7f00 64 65 #define BUNDLE_SIZE 16 65 66 66 67 static const char *vector_names_64_bundle[VECTORS_64_BUNDLE] = { … … 134 135 static void dump_interrupted_context(istate_t *istate) 135 136 { 136 const char *ifa = symtab_fmt_name_lookup(istate->cr_ifa);137 const char *iipa = symtab_fmt_name_lookup(istate->cr_iipa);138 const char *iip = symtab_fmt_name_lookup(istate->cr_iip);139 140 137 putchar('\n'); 141 138 printf("Interrupted context dump:\n"); … … 149 146 istate->cr_ipsr); 150 147 151 printf("cr.iip=%#018llx, #%d\t(%s)\n", istate->cr_iip, 152 istate->cr_isr.ei, iip); 153 printf("cr.iipa=%#018llx\t(%s)\n", istate->cr_iipa, iipa); 154 printf("cr.ifa=%#018llx\t(%s)\n", istate->cr_ifa, ifa); 148 printf("cr.iip=%#018llx, #%d\t(%s)\n", istate->cr_iip, istate->cr_isr.ei, 149 symtab_fmt_name_lookup(istate->cr_iip)); 150 printf("cr.iipa=%#018llx\t(%s)\n", istate->cr_iipa, 151 symtab_fmt_name_lookup(istate->cr_iipa)); 152 printf("cr.ifa=%#018llx\t(%s)\n", istate->cr_ifa, 153 symtab_fmt_name_lookup(istate->cr_ifa)); 155 154 } 156 155 … … 218 217 istate->cr_ipsr.ri++; 219 218 } 220 219 221 220 return syscall_handler(istate->in0, istate->in1, istate->in2, 222 221 istate->in3, istate->in4, istate->in5, istate->in6); … … 234 233 static void end_of_local_irq(void) 235 234 { 236 asm volatile ("mov cr.eoi=r0;;"); 237 } 238 235 asm volatile ( 236 "mov cr.eoi=r0;;" 237 ); 238 } 239 239 240 240 void external_interrupt(uint64_t vector, istate_t *istate) 241 241 { 242 242 cr_ivr_t ivr; 243 irq_t *irq;244 243 245 244 ivr.value = ivr_read(); 246 245 srlz_d(); 247 246 247 irq_t *irq; 248 248 249 switch (ivr.vector) { 249 250 case INTERRUPT_SPURIOUS: … … 252 253 #endif 253 254 break; 254 255 255 256 #ifdef CONFIG_SMP 256 257 case VECTOR_TLB_SHOOTDOWN_IPI: … … 259 260 break; 260 261 #endif 261 262 262 263 case INTERRUPT_TIMER: 263 264 irq = irq_dispatch_and_lock(ivr.vector); 264 265 if (irq) { 265 266 irq->handler(irq); 266 spinlock_unlock(&irq->lock);267 irq_spinlock_unlock(&irq->lock, false); 267 268 } else { 268 269 panic("Unhandled Internal Timer Interrupt (%d).", … … 283 284 if (!irq->preack) 284 285 end_of_local_irq(); 285 spinlock_unlock(&irq->lock);286 irq_spinlock_unlock(&irq->lock, false); 286 287 } else { 287 288 /*
Note:
See TracChangeset
for help on using the changeset viewer.