Changeset 13074 in vbox
- Timestamp:
- Oct 8, 2008 12:16:57 PM (16 years ago)
- Location:
- trunk
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/pdmdev.h
r13020 r13074 996 996 * @returns VBox status code. 997 997 * @param pDevIns Device instance of the APIC. 998 * @param i CpuTarget CPU.998 * @param idCpu Target CPU. 999 999 * @param u32Reg MSR to write. 1000 1000 * @param u64Value Value to write. 1001 1001 */ 1002 DECLR3CALLBACKMEMBER(uint32_t, pfnWriteMSRR3, (PPDMDEVINS pDevIns, VMCPUID i Cpu, uint32_t u32Reg, uint64_t u64Value));1002 DECLR3CALLBACKMEMBER(uint32_t, pfnWriteMSRR3, (PPDMDEVINS pDevIns, VMCPUID idCpu, uint32_t u32Reg, uint64_t u64Value)); 1003 1003 1004 1004 /** … … 1007 1007 * @returns VBox status code. 1008 1008 * @param pDevIns Device instance of the APIC. 1009 * @param i CpuTarget CPU.1009 * @param idCpu Target CPU. 1010 1010 * @param u32Reg MSR to read. 1011 1011 * @param pu64Value Value read. 1012 1012 */ 1013 DECLR3CALLBACKMEMBER(uint32_t, pfnReadMSRR3, (PPDMDEVINS pDevIns, VMCPUID i Cpu, uint32_t u32Reg, uint64_t *pu64Value));1013 DECLR3CALLBACKMEMBER(uint32_t, pfnReadMSRR3, (PPDMDEVINS pDevIns, VMCPUID idCpu, uint32_t u32Reg, uint64_t *pu64Value)); 1014 1014 1015 1015 /** -
trunk/src/VBox/Devices/PC/DevAPIC.cpp
r13020 r13074 44 44 #define MSR_IA32_APICBASE_BSP (1<<8) 45 45 #define MSR_IA32_APICBASE_ENABLE (1<<11) 46 #ifdef VBOX 47 #define MSR_IA32_APICBASE_X2ENABLE (1<<10) 48 #endif 46 49 #define MSR_IA32_APICBASE_BASE (0xfffff<<12) 47 50 … … 180 183 #ifdef VBOX 181 184 #define APIC_MAX_PATCH_ATTEMPTS 100 185 186 typedef uint32_t PhysApicId; 187 typedef uint32_t LogApicId; 182 188 #endif 183 189 … … 187 193 #endif /* !VBOX */ 188 194 uint32_t apicbase; 195 #ifdef VBOX 196 /* Task priority register (interrupt level) */ 197 uint32_t tpr; 198 /* Logical APIC id */ 199 LogApicId id; 200 /* Physical APIC id */ 201 PhysApicId phys_id; 202 /** @todo: is it logical or physical? Not really used anyway now. */ 203 PhysApicId arb_id; 204 #else 205 uint8_t tpr; 189 206 uint8_t id; 190 207 uint8_t arb_id; 191 #ifdef VBOX192 uint32_t tpr;193 #else194 uint8_t tpr;195 208 #endif 196 209 uint32_t spurious_vec; … … 203 216 uint32_t esr; /* error register */ 204 217 uint32_t icr[2]; 205 206 218 uint32_t divide_conf; 207 219 int count_shift; … … 289 301 RTRCPTR pLapicsRC; 290 302 291 /** A lignment*/292 uint32_t Alignment0;303 /** APIC specification version in this virtual hardware configuration. */ 304 PDMAPICVERSION enmVersion; 293 305 294 306 /** Number of attempts made to optimize TPR accesses. */ … … 307 319 } APICDeviceInfo; 308 320 321 static void apic_eoi(APICDeviceInfo *dev, APICState* s); 322 static void apic_deliver(APICDeviceInfo* dev, APICState *s, 323 uint8_t dest, uint8_t dest_mode, 324 uint8_t delivery_mode, uint8_t vector_num, 325 uint8_t polarity, uint8_t trigger_mode); 326 static void apic_timer_update(APICDeviceInfo* dev, APICState *s, 327 int64_t current_time); 328 static int apic_get_arb_pri(APICState *s); 329 static int apic_get_ppr(APICState *s); 330 static uint32_t apic_get_current_count(APICDeviceInfo* dev, APICState *s); 331 332 309 333 DECLINLINE(APICState*) getLapicById(APICDeviceInfo* dev, VMCPUID id) 310 334 { … … 322 346 DECLINLINE(VMCPUID) getCpuFromLapic(APICDeviceInfo* dev, APICState *s) 323 347 { 324 /* for now we assume LAPIC id == CPU id */325 return VMCPUID(s-> id);348 /* for now we assume LAPIC physical id == CPU id */ 349 return VMCPUID(s->phys_id); 326 350 } 327 351 … … 338 362 } 339 363 364 DECLINLINE(uint32_t) getApicEnableBits(APICDeviceInfo* dev) 365 { 366 switch (dev->enmVersion) 367 { 368 case PDMAPICVERSION_NONE: 369 return 0; 370 case PDMAPICVERSION_APIC: 371 return MSR_IA32_APICBASE_ENABLE; 372 case PDMAPICVERSION_X2APIC: 373 return MSR_IA32_APICBASE_ENABLE | MSR_IA32_APICBASE_X2ENABLE ; 374 default: 375 AssertMsgFailed(("Unsuported APIC version %d\n", dev->enmVersion)); 376 return 0; 377 } 378 } 379 380 DECLINLINE(PDMAPICVERSION) getApicMode(APICState *apic) 381 { 382 switch (((apic->apicbase) >> 10) & 0x3) 383 { 384 case 0: 385 return PDMAPICVERSION_NONE; 386 case 1: 387 default: 388 /* Invalid */ 389 return PDMAPICVERSION_NONE; 390 case 2: 391 return PDMAPICVERSION_APIC; 392 case 3: 393 return PDMAPICVERSION_X2APIC; 394 } 395 } 340 396 341 397 #endif /* VBOX */ … … 399 455 if (d >= 0) 400 456 { 401 APICState* apic = LAPIC_BASE(dev) + d;457 APICState* apic = getLapicById(dev, d); 402 458 apic_set_irq(dev, apic, vector_num, trigger_mode); 403 459 } … … 480 536 /* APIC_LOCK_VOID(dev, VERR_INTERNAL_ERROR); */ 481 537 /** @todo If this change is valid immediately, then we should change the MMIO registration! */ 482 s->apicbase = (val & 0xfffff000) | 483 (s->apicbase & (MSR_IA32_APICBASE_BSP | MSR_IA32_APICBASE_ENABLE)); 484 /* if disabled, cannot be enabled again (until reset) */ 485 if (!(val & MSR_IA32_APICBASE_ENABLE)) { 486 s->apicbase &= ~MSR_IA32_APICBASE_ENABLE; 487 s->spurious_vec &= ~APIC_SV_ENABLE; 488 489 /* Clear any pending APIC interrupt action flag. */ 490 cpuClearInterrupt(dev, s); 491 dev->CTX_SUFF(pApicHlp)->pfnChangeFeature(pDevIns, PDMAPICVERSION_NONE); 538 /* We cannot change if this CPU is BSP or not by writing to MSR - it's hardwired */ 539 PDMAPICVERSION oldMode = getApicMode(s); 540 s->apicbase = 541 (val & 0xfffff000) | /* base */ 542 (val & getApicEnableBits(dev)) | /* mode */ 543 (s->apicbase & MSR_IA32_APICBASE_BSP) /* keep BSP bit */; 544 PDMAPICVERSION newMode = getApicMode(s); 545 546 if (oldMode != newMode) 547 { 548 switch (newMode) 549 { 550 case PDMAPICVERSION_NONE: 551 { 552 s->spurious_vec &= ~APIC_SV_ENABLE; 553 /* Clear any pending APIC interrupt action flag. */ 554 cpuClearInterrupt(dev, s); 555 /** @todo: why do we do that? */ 556 dev->CTX_SUFF(pApicHlp)->pfnChangeFeature(pDevIns, PDMAPICVERSION_NONE); 557 break; 558 } 559 case PDMAPICVERSION_APIC: 560 /** @todo: map MMIO ranges, if needed */ 561 break; 562 case PDMAPICVERSION_X2APIC: 563 /** @todo: unmap MMIO ranges of this APIC, according to the spec */ 564 break; 565 default: 566 break; 567 } 492 568 } 493 569 /* APIC_UNLOCK(dev); */ … … 581 657 } 582 658 583 PDMBOTHCBDECL(uint32_t) apicWriteMSR(PPDMDEVINS pDevIns, VMCPUID i Cpu, uint32_t u32Reg, uint64_t u64Value)659 PDMBOTHCBDECL(uint32_t) apicWriteMSR(PPDMDEVINS pDevIns, VMCPUID idCpu, uint32_t u32Reg, uint64_t u64Value) 584 660 { 585 661 APICDeviceInfo *dev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *); 586 u32Reg -= MSR_IA32_APIC_START; 587 LogRel(("nike: WRMSR on %d: to %x written %llx\n", iCpu, u32Reg, u64Value)); 588 return 0; 589 } 590 PDMBOTHCBDECL(uint32_t) apicReadMSR(PPDMDEVINS pDevIns, VMCPUID iCpu, uint32_t u32Reg, uint64_t *pu64Value) 662 663 if (dev->enmVersion < PDMAPICVERSION_X2APIC) 664 return VERR_EM_INTERPRETER; 665 666 uint32_t index = (u32Reg - MSR_IA32_APIC_START) & 0xff; 667 //LogRel(("nike: WRMSR on %d: to %x written %llx\n", idCpu, index, u64Value)); 668 669 APICState* apic = getLapicById(dev, idCpu); 670 671 switch (index) 672 { 673 case 0x02: 674 apic->id = (u64Value >> 24); 675 break; 676 case 0x03: 677 break; 678 case 0x08: 679 apic_update_tpr(dev, apic, u64Value); 680 break; 681 case 0x09: case 0x0a: 682 Log(("apicWriteMSR: write to read-only register %d ignored\n", index)); 683 break; 684 case 0x0b: /* EOI */ 685 apic_eoi(dev, apic); 686 break; 687 case 0x0d: 688 apic->log_dest = u64Value >> 24; 689 break; 690 case 0x0e: 691 apic->dest_mode = u64Value >> 28; 692 break; 693 case 0x0f: 694 apic->spurious_vec = u64Value & 0x1ff; 695 apic_update_irq(dev, apic); 696 break; 697 case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: 698 case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f: 699 case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: 700 case 0x28: 701 Log(("apicWriteMSR: write to read-only register %d ignored\n", index)); 702 break; 703 704 case 0x30: 705 /* Here one of the differences with regular APIC: ICR is single 64-bit register */ 706 apic->icr[0] = (uint32_t)u64Value; 707 apic->icr[1] = (uint32_t)(u64Value >> 32); 708 apic_deliver(dev, apic, (apic->icr[1] >> 24) & 0xff, (apic->icr[0] >> 11) & 1, 709 (apic->icr[0] >> 8) & 7, (apic->icr[0] & 0xff), 710 (apic->icr[0] >> 14) & 1, (apic->icr[0] >> 15) & 1); 711 break; 712 case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: 713 { 714 int n = index - 0x32; 715 apic->lvt[n] = u64Value; 716 if (n == APIC_LVT_TIMER) 717 apic_timer_update(dev, apic, TMTimerGet(apic->CTX_SUFF(pTimer))); 718 } 719 break; 720 case 0x38: 721 apic->initial_count = u64Value; 722 apic->initial_count_load_time = TMTimerGet(apic->CTX_SUFF(pTimer)); 723 apic_timer_update(dev, apic, apic->initial_count_load_time); 724 break; 725 case 0x39: 726 Log(("apicWriteMSR: write to read-only register %d ignored\n", index)); 727 break; 728 case 0x3e: 729 { 730 int v; 731 apic->divide_conf = u64Value & 0xb; 732 v = (apic->divide_conf & 3) | ((apic->divide_conf >> 1) & 4); 733 apic->count_shift = (v + 1) & 7; 734 break; 735 } 736 case 0x3f: 737 { 738 /* Self IPI, see x2APIC book 2.4.5 */ 739 int vector = u64Value & 0xff; 740 apic_bus_deliver(dev, 741 1 << getLapicById(dev, idCpu)->id /* Self */, 742 0 /* Delivery mode - fixed */, 743 vector, 744 0 /* Polarity - conform to the bus */, 745 0 /* Trigger mode - edge */); 746 break; 747 } 748 default: 749 AssertMsgFailed(("apicWriteMSR: unknown index %x\n", index)); 750 apic->esr |= ESR_ILLEGAL_ADDRESS; 751 break; 752 } 753 754 return VINF_SUCCESS; 755 } 756 PDMBOTHCBDECL(uint32_t) apicReadMSR(PPDMDEVINS pDevIns, VMCPUID idCpu, uint32_t u32Reg, uint64_t *pu64Value) 591 757 { 592 758 APICDeviceInfo *dev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *); 593 u32Reg -= MSR_IA32_APIC_START; 594 LogRel(("nike: RDMSR on %d: read from %x\n", iCpu, u32Reg)); 595 *pu64Value = 0; 596 return 0; 759 760 if (dev->enmVersion < PDMAPICVERSION_X2APIC) 761 return VERR_EM_INTERPRETER; 762 763 uint32_t index = (u32Reg - MSR_IA32_APIC_START) & 0xff; 764 //LogRel(("nike: RDMSR on %d: read from %x\n", idCpu, index)); 765 APICState* apic = getLapicById(dev, idCpu); 766 uint64_t val; 767 768 switch (index) 769 { 770 case 0x02: /* id */ 771 val = apic->id << 24; 772 break; 773 case 0x03: /* version */ 774 val = 0x11 | ((APIC_LVT_NB - 1) << 16); /* version 0x11 */ 775 break; 776 case 0x08: 777 val = apic->tpr; 778 break; 779 case 0x09: 780 val = apic_get_arb_pri(apic); 781 break; 782 case 0x0a: 783 /* ppr */ 784 val = apic_get_ppr(apic); 785 break; 786 case 0x0b: 787 val = 0; 788 break; 789 case 0x0d: 790 val = apic->log_dest << 24; 791 break; 792 case 0x0e: 793 /* Bottom 28 bits are always 1 */ 794 val = (apic->dest_mode << 28) | 0xfffffff; 795 break; 796 case 0x0f: 797 val = apic->spurious_vec; 798 break; 799 case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: 800 val = apic->isr[index & 7]; 801 break; 802 case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f: 803 val = apic->tmr[index & 7]; 804 break; 805 case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: 806 val = apic->irr[index & 7]; 807 break; 808 case 0x28: 809 val = apic->esr; 810 break; 811 case 0x30: 812 /* Here one of the differences with regular APIC: ICR is single 64-bit register */ 813 val = ((uint64_t)apic->icr[0x31] << 32) | apic->icr[0x30]; 814 break; 815 case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: 816 val = apic->lvt[index - 0x32]; 817 break; 818 case 0x38: 819 val = apic->initial_count; 820 break; 821 case 0x39: 822 val = apic_get_current_count(dev, apic); 823 break; 824 case 0x3e: 825 val = apic->divide_conf; 826 break; 827 case 0x3f: 828 /* Self IPI register is write only */ 829 Log(("apicReadMSR: read from write-only register %d ignored\n", index)); 830 break; 831 default: 832 AssertMsgFailed(("apicReadMSR: unknown index %x\n", index)); 833 apic->esr |= ESR_ILLEGAL_ADDRESS; 834 val = 0; 835 break; 836 } 837 *pu64Value = val; 838 return VINF_SUCCESS; 597 839 } 598 840 … … 1305 1547 1306 1548 qemu_put_be32s(f, &s->apicbase); 1549 #ifdef VBOX 1550 qemu_put_be32s(f, &s->id); 1551 qemu_put_be32s(f, &s->phys_id); 1552 qemu_put_be32s(f, &s->arb_id); 1553 qemu_put_be32s(f, &s->tpr); 1554 #else 1307 1555 qemu_put_8s(f, &s->id); 1308 1556 qemu_put_8s(f, &s->arb_id); 1309 #ifdef VBOX1310 qemu_put_be32s(f, &s->tpr);1311 #else1312 1557 qemu_put_8s(f, &s->tpr); 1313 1558 #endif … … 1342 1587 int i; 1343 1588 1344 if (version_id != 1)1589 if (version_id != 2) 1345 1590 return -EINVAL; 1346 1591 1347 1592 /* XXX: what if the base changes? (registered memory regions) */ 1348 1593 qemu_get_be32s(f, &s->apicbase); 1594 #ifdef VBOX 1595 qemu_get_be32s(f, &s->id); 1596 qemu_get_be32s(f, &s->phys_id); 1597 qemu_get_be32s(f, &s->arb_id); 1598 qemu_get_be32s(f, &s->tpr); 1599 #else 1349 1600 qemu_get_8s(f, &s->id); 1350 1601 qemu_get_8s(f, &s->arb_id); 1351 #ifdef VBOX1352 qemu_get_be32s(f, &s->tpr);1353 #else1354 1602 qemu_get_8s(f, &s->tpr); 1355 1603 #endif … … 1855 2103 s->arb_id = 0; 1856 2104 /* Reset should re-enable the APIC. */ 1857 s->apicbase = 0xfee00000 | MSR_IA32_APICBASE_BSP | MSR_IA32_APICBASE_ENABLE; 1858 dev->pApicHlpR3->pfnChangeFeature(dev->pDevInsR3, PDMAPICVERSION_APIC); 2105 s->apicbase = 0xfee00000 | MSR_IA32_APICBASE_ENABLE; 2106 if (s->phys_id == 0) 2107 s->apicbase |= MSR_IA32_APICBASE_BSP; 2108 dev->pApicHlpR3->pfnChangeFeature(dev->pDevInsR3, dev->enmVersion); 1859 2109 /* Clear any pending APIC interrupt action flag. */ 1860 2110 cpuClearInterrupt(dev, s); … … 1882 2132 int i; 1883 2133 memset(apic, 0, sizeof(*apic)); 1884 apic->apicbase = UINT32_C(0xfee00000) | MSR_IA32_APICBASE_BSP | MSR_IA32_APICBASE_ENABLE; 2134 apic->apicbase = UINT32_C(0xfee00000) | MSR_IA32_APICBASE_ENABLE; 2135 /* Mark first CPU as BSP */ 2136 if (id == 0) 2137 apic->apicbase |= MSR_IA32_APICBASE_BSP; 1885 2138 for (i = 0; i < APIC_LVT_NB; i++) 1886 2139 apic->lvt[i] = 1 << 16; /* mask LVT */ 1887 2140 apic->spurious_vec = 0xff; 1888 apic-> id = id;2141 apic->phys_id = apic->id = id; 1889 2142 } 1890 2143 … … 1944 2197 * Init the data. 1945 2198 */ 1946 pThis->pDevInsR3 = pDevIns; 1947 pThis->pDevInsR0 = PDMDEVINS_2_R0PTR(pDevIns); 1948 pThis->pDevInsRC = PDMDEVINS_2_RCPTR(pDevIns); 1949 pThis->cCpus = cCpus; 2199 pThis->pDevInsR3 = pDevIns; 2200 pThis->pDevInsR0 = PDMDEVINS_2_R0PTR(pDevIns); 2201 pThis->pDevInsRC = PDMDEVINS_2_RCPTR(pDevIns); 2202 pThis->cCpus = cCpus; 2203 /* Use PDMAPICVERSION_X2APIC to activate x2APIC mode */ 2204 pThis->enmVersion = PDMAPICVERSION_APIC; 1950 2205 1951 2206 PVM pVM = PDMDevHlpGetVM(pDevIns); … … 2045 2300 { 2046 2301 LogRel(("Activating Local APIC\n")); 2047 pThis->pApicHlpR3->pfnChangeFeature(pDevIns, PDMAPICVERSION_APIC);2302 pThis->pApicHlpR3->pfnChangeFeature(pDevIns, pThis->enmVersion); 2048 2303 } 2049 2304 } … … 2094 2349 * Saved state. 2095 2350 */ 2096 rc = PDMDevHlpSSMRegister(pDevIns, pDevIns->pDevReg->szDeviceName, iInstance, 1/* version */,2351 rc = PDMDevHlpSSMRegister(pDevIns, pDevIns->pDevReg->szDeviceName, iInstance, 2 /* version */, 2097 2352 sizeof(*pThis), NULL, apicSaveExec, NULL, NULL, apicLoadExec, NULL); 2098 2353 if (RT_FAILURE(rc)) -
trunk/src/VBox/VMM/PDMInternal.h
r13020 r13074 410 410 DECLR3CALLBACKMEMBER(uint8_t, pfnGetTPRR3,(PPDMDEVINS pDevIns)); 411 411 /** @copydoc PDMAPICREG::pfnWriteMSRR3 */ 412 DECLR3CALLBACKMEMBER(uint32_t, pfnWriteMSRR3, (PPDMDEVINS pDevIns, VMCPUID i Cpu, uint32_t u32Reg, uint64_t u64Value));412 DECLR3CALLBACKMEMBER(uint32_t, pfnWriteMSRR3, (PPDMDEVINS pDevIns, VMCPUID idCpu, uint32_t u32Reg, uint64_t u64Value)); 413 413 /** @copydoc PDMAPICREG::pfnReadMSRR3 */ 414 DECLR3CALLBACKMEMBER(uint32_t, pfnReadMSRR3, (PPDMDEVINS pDevIns, VMCPUID i Cpu, uint32_t u32Reg, uint64_t *pu64Value));414 DECLR3CALLBACKMEMBER(uint32_t, pfnReadMSRR3, (PPDMDEVINS pDevIns, VMCPUID idCpu, uint32_t u32Reg, uint64_t *pu64Value)); 415 415 /** @copydoc PDMAPICREG::pfnBusDeliverR3 */ 416 416 DECLR3CALLBACKMEMBER(void, pfnBusDeliverR3,(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode, uint8_t u8DeliveryMode, … … 432 432 DECLR0CALLBACKMEMBER(uint8_t, pfnGetTPRR0,(PPDMDEVINS pDevIns)); 433 433 /** @copydoc PDMAPICREG::pfnWriteMSRR3 */ 434 DECLR0CALLBACKMEMBER(uint32_t, pfnWriteMSRR0, (PPDMDEVINS pDevIns, VMCPUID i Cpu, uint32_t u32Reg, uint64_t u64Value));434 DECLR0CALLBACKMEMBER(uint32_t, pfnWriteMSRR0, (PPDMDEVINS pDevIns, VMCPUID idCpu, uint32_t u32Reg, uint64_t u64Value)); 435 435 /** @copydoc PDMAPICREG::pfnReadMSRR3 */ 436 DECLR0CALLBACKMEMBER(uint32_t, pfnReadMSRR0, (PPDMDEVINS pDevIns, VMCPUID i Cpu, uint32_t u32Reg, uint64_t *pu64Value));436 DECLR0CALLBACKMEMBER(uint32_t, pfnReadMSRR0, (PPDMDEVINS pDevIns, VMCPUID idCpu, uint32_t u32Reg, uint64_t *pu64Value)); 437 437 /** @copydoc PDMAPICREG::pfnBusDeliverR3 */ 438 438 DECLR0CALLBACKMEMBER(void, pfnBusDeliverR0,(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode, uint8_t u8DeliveryMode, … … 454 454 DECLRCCALLBACKMEMBER(uint8_t, pfnGetTPRRC,(PPDMDEVINS pDevIns)); 455 455 /** @copydoc PDMAPICREG::pfnWriteMSRR3 */ 456 DECLRCCALLBACKMEMBER(uint32_t, pfnWriteMSRRC, (PPDMDEVINS pDevIns, VMCPUID i Cpu, uint32_t u32Reg, uint64_t u64Value));456 DECLRCCALLBACKMEMBER(uint32_t, pfnWriteMSRRC, (PPDMDEVINS pDevIns, VMCPUID idCpu, uint32_t u32Reg, uint64_t u64Value)); 457 457 /** @copydoc PDMAPICREG::pfnReadMSRR3 */ 458 DECLRCCALLBACKMEMBER(uint32_t, pfnReadMSRRC, (PPDMDEVINS pDevIns, VMCPUID i Cpu, uint32_t u32Reg, uint64_t *pu64Value));458 DECLRCCALLBACKMEMBER(uint32_t, pfnReadMSRRC, (PPDMDEVINS pDevIns, VMCPUID idCpu, uint32_t u32Reg, uint64_t *pu64Value)); 459 459 /** @copydoc PDMAPICREG::pfnBusDeliverR3 */ 460 460 DECLRCCALLBACKMEMBER(void, pfnBusDeliverRC,(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode, uint8_t u8DeliveryMode,
Note:
See TracChangeset
for help on using the changeset viewer.