vlapic.c (260619) | vlapic.c (261170) |
---|---|
1/*- 2 * Copyright (c) 2011 NetApp, Inc. 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 * 1. Redistributions of source code must retain the above copyright --- 9 unchanged lines hidden (view full) --- 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * | 1/*- 2 * Copyright (c) 2011 NetApp, Inc. 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 * 1. Redistributions of source code must retain the above copyright --- 9 unchanged lines hidden (view full) --- 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * |
26 * $FreeBSD: head/sys/amd64/vmm/io/vlapic.c 260619 2014-01-14 01:55:58Z neel $ | 26 * $FreeBSD: head/sys/amd64/vmm/io/vlapic.c 261170 2014-01-25 20:58:05Z neel $ |
27 */ 28 29#include <sys/cdefs.h> | 27 */ 28 29#include <sys/cdefs.h> |
30__FBSDID("$FreeBSD: head/sys/amd64/vmm/io/vlapic.c 260619 2014-01-14 01:55:58Z neel $"); | 30__FBSDID("$FreeBSD: head/sys/amd64/vmm/io/vlapic.c 261170 2014-01-25 20:58:05Z neel $"); |
31 32#include <sys/param.h> 33#include <sys/lock.h> 34#include <sys/kernel.h> 35#include <sys/malloc.h> 36#include <sys/mutex.h> 37#include <sys/systm.h> 38#include <sys/smp.h> --- 1256 unchanged lines hidden (view full) --- 1295 bzero(lapic, sizeof(struct LAPIC)); 1296 1297 lapic->id = vlapic_get_id(vlapic); 1298 lapic->version = VLAPIC_VERSION; 1299 lapic->version |= (VLAPIC_MAXLVT_INDEX << MAXLVTSHIFT); 1300 lapic->dfr = 0xffffffff; 1301 lapic->svr = APIC_SVR_VECTOR; 1302 vlapic_mask_lvts(vlapic); | 31 32#include <sys/param.h> 33#include <sys/lock.h> 34#include <sys/kernel.h> 35#include <sys/malloc.h> 36#include <sys/mutex.h> 37#include <sys/systm.h> 38#include <sys/smp.h> --- 1256 unchanged lines hidden (view full) --- 1295 bzero(lapic, sizeof(struct LAPIC)); 1296 1297 lapic->id = vlapic_get_id(vlapic); 1298 lapic->version = VLAPIC_VERSION; 1299 lapic->version |= (VLAPIC_MAXLVT_INDEX << MAXLVTSHIFT); 1300 lapic->dfr = 0xffffffff; 1301 lapic->svr = APIC_SVR_VECTOR; 1302 vlapic_mask_lvts(vlapic); |
1303 vlapic_reset_tmr(vlapic); |
|
1303 1304 lapic->dcr_timer = 0; 1305 vlapic_dcr_write_handler(vlapic); 1306 1307 if (vlapic->vcpuid == 0) 1308 vlapic->boot_state = BS_RUNNING; /* BSP */ 1309 else 1310 vlapic->boot_state = BS_INIT; /* AP */ --- 141 unchanged lines hidden (view full) --- 1452 1453 if ((vlapic->msr_apicbase & APICBASE_ENABLED) != 0 && 1454 (lapic->svr & APIC_SVR_ENABLE) != 0) 1455 return (true); 1456 else 1457 return (false); 1458} 1459 | 1304 1305 lapic->dcr_timer = 0; 1306 vlapic_dcr_write_handler(vlapic); 1307 1308 if (vlapic->vcpuid == 0) 1309 vlapic->boot_state = BS_RUNNING; /* BSP */ 1310 else 1311 vlapic->boot_state = BS_INIT; /* AP */ --- 141 unchanged lines hidden (view full) --- 1453 1454 if ((vlapic->msr_apicbase & APICBASE_ENABLED) != 0 && 1455 (lapic->svr & APIC_SVR_ENABLE) != 0) 1456 return (true); 1457 else 1458 return (false); 1459} 1460 |
1461static void 1462vlapic_set_tmr(struct vlapic *vlapic, int vector, bool level) 1463{ 1464 struct LAPIC *lapic; 1465 uint32_t *tmrptr, mask; 1466 int idx; 1467 1468 lapic = vlapic->apic_page; 1469 tmrptr = &lapic->tmr0; 1470 idx = (vector / 32) * 4; 1471 mask = 1 << (vector % 32); 1472 if (level) 1473 tmrptr[idx] |= mask; 1474 else 1475 tmrptr[idx] &= ~mask; 1476 1477 if (vlapic->ops.set_tmr != NULL) 1478 (*vlapic->ops.set_tmr)(vlapic, vector, level); 1479} 1480 |
|
1460void 1461vlapic_reset_tmr(struct vlapic *vlapic) 1462{ | 1481void 1482vlapic_reset_tmr(struct vlapic *vlapic) 1483{ |
1463 struct LAPIC *lapic; | 1484 int vector; |
1464 1465 VLAPIC_CTR0(vlapic, "vlapic resetting all vectors to edge-triggered"); 1466 | 1485 1486 VLAPIC_CTR0(vlapic, "vlapic resetting all vectors to edge-triggered"); 1487 |
1467 lapic = vlapic->apic_page; 1468 lapic->tmr0 = 0; 1469 lapic->tmr1 = 0; 1470 lapic->tmr2 = 0; 1471 lapic->tmr3 = 0; 1472 lapic->tmr4 = 0; 1473 lapic->tmr5 = 0; 1474 lapic->tmr6 = 0; 1475 lapic->tmr7 = 0; | 1488 for (vector = 0; vector <= 255; vector++) 1489 vlapic_set_tmr(vlapic, vector, false); |
1476} 1477 1478void 1479vlapic_set_tmr_level(struct vlapic *vlapic, uint32_t dest, bool phys, 1480 int delmode, int vector) 1481{ | 1490} 1491 1492void 1493vlapic_set_tmr_level(struct vlapic *vlapic, uint32_t dest, bool phys, 1494 int delmode, int vector) 1495{ |
1482 struct LAPIC *lapic; 1483 uint32_t *tmrptr, mask; | |
1484 cpuset_t dmask; | 1496 cpuset_t dmask; |
1485 int idx; | |
1486 bool lowprio; 1487 1488 KASSERT(vector >= 0 && vector <= 255, ("invalid vector %d", vector)); 1489 1490 /* 1491 * A level trigger is valid only for fixed and lowprio delivery modes. 1492 */ 1493 if (delmode != APIC_DELMODE_FIXED && delmode != APIC_DELMODE_LOWPRIO) { 1494 VLAPIC_CTR1(vlapic, "Ignoring level trigger-mode for " 1495 "delivery-mode %d", delmode); 1496 return; 1497 } 1498 1499 lowprio = (delmode == APIC_DELMODE_LOWPRIO); 1500 vlapic_calcdest(vlapic->vm, &dmask, dest, phys, lowprio, false); 1501 1502 if (!CPU_ISSET(vlapic->vcpuid, &dmask)) 1503 return; 1504 | 1497 bool lowprio; 1498 1499 KASSERT(vector >= 0 && vector <= 255, ("invalid vector %d", vector)); 1500 1501 /* 1502 * A level trigger is valid only for fixed and lowprio delivery modes. 1503 */ 1504 if (delmode != APIC_DELMODE_FIXED && delmode != APIC_DELMODE_LOWPRIO) { 1505 VLAPIC_CTR1(vlapic, "Ignoring level trigger-mode for " 1506 "delivery-mode %d", delmode); 1507 return; 1508 } 1509 1510 lowprio = (delmode == APIC_DELMODE_LOWPRIO); 1511 vlapic_calcdest(vlapic->vm, &dmask, dest, phys, lowprio, false); 1512 1513 if (!CPU_ISSET(vlapic->vcpuid, &dmask)) 1514 return; 1515 |
1505 lapic = vlapic->apic_page; 1506 tmrptr = &lapic->tmr0; 1507 idx = (vector / 32) * 4; 1508 mask = 1 << (vector % 32); 1509 tmrptr[idx] |= mask; 1510 | |
1511 VLAPIC_CTR1(vlapic, "vector %d set to level-triggered", vector); | 1516 VLAPIC_CTR1(vlapic, "vector %d set to level-triggered", vector); |
1517 vlapic_set_tmr(vlapic, vector, true); |
|
1512} | 1518} |