Deleted Added
full compact
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}