@@ -227,28 +227,28 @@ vlapic_id_write_handler(struct vlapic *vlapic)
227
227
static inline bool
228
228
vlapic_lvtt_oneshot (struct vlapic * vlapic )
229
229
{
230
- return ((vlapic -> apic_page -> lvt_timer & APIC_LVTT_TM )
230
+ return ((vlapic -> apic_page -> lvt [ APIC_LVT_TIMER ]. val & APIC_LVTT_TM )
231
231
== APIC_LVTT_TM_ONE_SHOT );
232
232
}
233
233
234
234
static inline bool
235
235
vlapic_lvtt_period (struct vlapic * vlapic )
236
236
{
237
- return ((vlapic -> apic_page -> lvt_timer & APIC_LVTT_TM )
237
+ return ((vlapic -> apic_page -> lvt [ APIC_LVT_TIMER ]. val & APIC_LVTT_TM )
238
238
== APIC_LVTT_TM_PERIODIC );
239
239
}
240
240
241
241
static inline bool
242
242
vlapic_lvtt_tsc_deadline (struct vlapic * vlapic )
243
243
{
244
- return ((vlapic -> apic_page -> lvt_timer & APIC_LVTT_TM )
244
+ return ((vlapic -> apic_page -> lvt [ APIC_LVT_TIMER ]. val & APIC_LVTT_TM )
245
245
== APIC_LVTT_TM_TSCDLT );
246
246
}
247
247
248
248
static inline bool
249
249
vlapic_lvtt_masked (struct vlapic * vlapic )
250
250
{
251
- return !!(vlapic -> apic_page -> lvt_timer & APIC_LVTT_M );
251
+ return !!(vlapic -> apic_page -> lvt [ APIC_LVT_TIMER ]. val & APIC_LVTT_M );
252
252
}
253
253
254
254
static void vlapic_create_timer (struct vlapic * vlapic )
@@ -416,28 +416,6 @@ vlapic_set_intr_ready(struct vlapic *vlapic, int vector, bool level)
416
416
return 1 ;
417
417
}
418
418
419
- static inline uint32_t *
420
- vlapic_get_lvtptr (struct vlapic * vlapic , uint32_t offset )
421
- {
422
- struct lapic * lapic = vlapic -> apic_page ;
423
- int i ;
424
-
425
- switch (offset ) {
426
- case APIC_OFFSET_CMCI_LVT :
427
- return & lapic -> lvt_cmci ;
428
- case APIC_OFFSET_TIMER_LVT :
429
- case APIC_OFFSET_THERM_LVT :
430
- case APIC_OFFSET_PERF_LVT :
431
- case APIC_OFFSET_LINT0_LVT :
432
- case APIC_OFFSET_LINT1_LVT :
433
- case APIC_OFFSET_ERROR_LVT :
434
- i = (offset - APIC_OFFSET_TIMER_LVT ) >> 2 ;
435
- return (& lapic -> lvt_timer ) + i ;
436
- default :
437
- panic ("vlapic_get_lvt: invalid LVT\n" );
438
- }
439
- }
440
-
441
419
static inline int
442
420
lvt_off_to_idx (uint32_t offset )
443
421
{
@@ -476,6 +454,28 @@ lvt_off_to_idx(uint32_t offset)
476
454
return index ;
477
455
}
478
456
457
+ static inline uint32_t *
458
+ vlapic_get_lvtptr (struct vlapic * vlapic , uint32_t offset )
459
+ {
460
+ struct lapic * lapic = vlapic -> apic_page ;
461
+ int i ;
462
+
463
+ switch (offset ) {
464
+ case APIC_OFFSET_CMCI_LVT :
465
+ return & lapic -> lvt_cmci ;
466
+ case APIC_OFFSET_TIMER_LVT :
467
+ case APIC_OFFSET_THERM_LVT :
468
+ case APIC_OFFSET_PERF_LVT :
469
+ case APIC_OFFSET_LINT0_LVT :
470
+ case APIC_OFFSET_LINT1_LVT :
471
+ case APIC_OFFSET_ERROR_LVT :
472
+ i = lvt_off_to_idx (offset );
473
+ return & (lapic -> lvt [i ].val );
474
+ default :
475
+ panic ("vlapic_get_lvt: invalid LVT\n" );
476
+ }
477
+ }
478
+
479
479
static inline uint32_t
480
480
vlapic_get_lvt (struct vlapic * vlapic , uint32_t offset )
481
481
{
@@ -557,22 +557,22 @@ vlapic_mask_lvts(struct vlapic *vlapic)
557
557
lapic -> lvt_cmci |= APIC_LVT_M ;
558
558
vlapic_lvt_write_handler (vlapic , APIC_OFFSET_CMCI_LVT );
559
559
560
- lapic -> lvt_timer |= APIC_LVT_M ;
560
+ lapic -> lvt [ APIC_LVT_TIMER ]. val |= APIC_LVT_M ;
561
561
vlapic_lvt_write_handler (vlapic , APIC_OFFSET_TIMER_LVT );
562
562
563
- lapic -> lvt_thermal |= APIC_LVT_M ;
563
+ lapic -> lvt [ APIC_LVT_THERMAL ]. val |= APIC_LVT_M ;
564
564
vlapic_lvt_write_handler (vlapic , APIC_OFFSET_THERM_LVT );
565
565
566
- lapic -> lvt_pcint |= APIC_LVT_M ;
566
+ lapic -> lvt [ APIC_LVT_PMC ]. val |= APIC_LVT_M ;
567
567
vlapic_lvt_write_handler (vlapic , APIC_OFFSET_PERF_LVT );
568
568
569
- lapic -> lvt_lint0 |= APIC_LVT_M ;
569
+ lapic -> lvt [ APIC_LVT_LINT0 ]. val |= APIC_LVT_M ;
570
570
vlapic_lvt_write_handler (vlapic , APIC_OFFSET_LINT0_LVT );
571
571
572
- lapic -> lvt_lint1 |= APIC_LVT_M ;
572
+ lapic -> lvt [ APIC_LVT_LINT1 ]. val |= APIC_LVT_M ;
573
573
vlapic_lvt_write_handler (vlapic , APIC_OFFSET_LINT1_LVT );
574
574
575
- lapic -> lvt_error |= APIC_LVT_M ;
575
+ lapic -> lvt [ APIC_LVT_ERROR ]. val |= APIC_LVT_M ;
576
576
vlapic_lvt_write_handler (vlapic , APIC_OFFSET_ERROR_LVT );
577
577
}
578
578
@@ -1500,10 +1500,10 @@ void vlapic_restore(struct vlapic *vlapic, struct lapic_regs *regs)
1500
1500
lapic -> tmr [i ].val = regs -> tmr [i ];
1501
1501
lapic -> svr = regs -> svr ;
1502
1502
vlapic_svr_write_handler (vlapic );
1503
- lapic -> lvt_timer = regs -> lvtt ;
1504
- lapic -> lvt_lint0 = regs -> lvt0 ;
1505
- lapic -> lvt_lint1 = regs -> lvt1 ;
1506
- lapic -> lvt_error = regs -> lvterr ;
1503
+ lapic -> lvt [ APIC_LVT_TIMER ]. val = regs -> lvtt ;
1504
+ lapic -> lvt [ APIC_LVT_LINT0 ]. val = regs -> lvt0 ;
1505
+ lapic -> lvt [ APIC_LVT_LINT1 ]. val = regs -> lvt1 ;
1506
+ lapic -> lvt [ APIC_LVT_ERROR ]. val = regs -> lvterr ;
1507
1507
lapic -> icr_timer = regs -> ticr ;
1508
1508
lapic -> ccr_timer = regs -> tccr ;
1509
1509
lapic -> dcr_timer = regs -> tdcr ;
@@ -1788,7 +1788,7 @@ static int vlapic_timer_expired(void *data)
1788
1788
1789
1789
/* inject vcpu timer interrupt if not masked */
1790
1790
if (!vlapic_lvtt_masked (vlapic ))
1791
- vlapic_intr_edge (vcpu , lapic -> lvt_timer & APIC_LVTT_VECTOR );
1791
+ vlapic_intr_edge (vcpu , lapic -> lvt [ APIC_LVT_TIMER ]. val & APIC_LVTT_VECTOR );
1792
1792
1793
1793
if (!vlapic_lvtt_period (vlapic ))
1794
1794
vlapic -> vlapic_timer .timer .fire_tsc = 0 ;
0 commit comments