Changeset 24082 in vbox for trunk/src/VBox/Devices/PC
- Timestamp:
- Oct 26, 2009 3:06:19 PM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 53958
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/PC/DevAPIC.cpp
r23993 r24082 57 57 #endif 58 58 59 /** The current saved state version.*/ 60 #define APIC_SAVED_STATE_VERSION 3 61 /** The saved state version used by VirtualBox v3 and earlier. 62 * This does not include the config. */ 63 #define APIC_SAVED_STATE_VERSION_VBOX_30 2 64 /** Some ancient version... */ 65 #define APIC_SAVED_STATE_VERSION_ANCIENT 1 66 67 59 68 /** @def APIC_LOCK 60 69 * Acquires the PDM lock. */ … … 97 106 uint32_t i; \ 98 107 APICState *apic = (dev)->CTX_SUFF(paLapics); \ 99 for (i = 0; i < dev->cCpus; i++) \108 for (i = 0; i < (dev)->cCpus; i++) \ 100 109 { \ 101 110 if (mask & (1 << (apic->id))) \ … … 338 347 /** Number of CPUs on the system (same as LAPIC count). */ 339 348 uint32_t cCpus; 340 /** Struct size and statistics alignment padding. */ 341 uint32_t u32Alignment0; 349 /** Whether we've got an IO APIC or not. */ 350 bool fIoApic; 351 /** Alignment padding. */ 352 bool afPadding[3]; 342 353 343 354 # ifdef VBOX_WITH_STATISTICS … … 1864 1875 1865 1876 #ifdef VBOX 1866 if ((version_id < 1) || (version_id > 2))1867 return -EINVAL;1868 1869 1877 /* XXX: what if the base changes? (registered memory regions) */ 1870 1878 qemu_get_be32s(f, &s->apicbase); … … 1872 1880 switch (version_id) 1873 1881 { 1874 case 1:1882 case APIC_SAVED_STATE_VERSION_ANCIENT: 1875 1883 { 1876 1884 uint8_t val = 0; … … 1883 1891 break; 1884 1892 } 1885 case 2: 1893 case APIC_SAVED_STATE_VERSION: 1894 case APIC_SAVED_STATE_VERSION_VBOX_30: 1886 1895 qemu_get_be32s(f, &s->id); 1887 1896 qemu_get_be32s(f, &s->phys_id); 1888 1897 qemu_get_be32s(f, &s->arb_id); 1889 1898 break; 1899 default: 1900 return VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION; 1890 1901 } 1891 1902 qemu_get_be32s(f, &s->tpr); … … 2414 2425 { 2415 2426 uint32_t val; 2416 static const char *dmodes[] = { "Fixed ", "Reserved", "SMI", "Reserved", 2427 static const char *dmodes[] = { "Fixed ", "Reserved", "SMI", "Reserved", 2417 2428 "NMI", "INIT", "Reserved", "ExtINT" }; 2418 2429 … … 2478 2489 lapicInfoBasic(dev, lapic, pHlp); 2479 2490 } 2480 else if (!strcmp(pszArgs, "lvt")) 2491 else if (!strcmp(pszArgs, "lvt")) 2481 2492 { 2482 2493 lapicInfoLVT(dev, lapic, pHlp); 2483 2494 } 2484 else if (!strcmp(pszArgs, "timer")) 2495 else if (!strcmp(pszArgs, "timer")) 2485 2496 { 2486 2497 lapicInfoTimer(dev, lapic, pHlp); … … 2493 2504 2494 2505 /** 2506 * @copydoc FNSSMDEVLIVEEXEC 2507 */ 2508 static DECLCALLBACK(int) apicLiveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uPass) 2509 { 2510 APICDeviceInfo *pThis = PDMINS_2_DATA(pDevIns, APICDeviceInfo *); 2511 2512 SSMR3PutU32( pSSM, pThis->cCpus); 2513 SSMR3PutBool(pSSM, pThis->fIoApic); 2514 SSMR3PutU32( pSSM, pThis->enmVersion); 2515 AssertCompile(PDMAPICVERSION_APIC == 2); 2516 2517 return VINF_SSM_DONT_CALL_AGAIN; 2518 } 2519 2520 /** 2495 2521 * @copydoc FNSSMDEVSAVEEXEC 2496 2522 */ 2497 static DECLCALLBACK(int) apicSaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM Handle)2523 static DECLCALLBACK(int) apicSaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM) 2498 2524 { 2499 2525 APICDeviceInfo *dev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *); 2500 2526 2527 /* config */ 2528 apicLiveExec(pDevIns, pSSM, SSM_PASS_FINAL); 2529 2501 2530 /* save all APICs data, @todo: is it correct? */ 2502 foreach_apic(dev, 0xffffffff, apic_save(pSSM Handle, apic));2531 foreach_apic(dev, 0xffffffff, apic_save(pSSM, apic)); 2503 2532 2504 2533 return VINF_SUCCESS; … … 2508 2537 * @copydoc FNSSMDEVLOADEXEC 2509 2538 */ 2510 static DECLCALLBACK(int) apicLoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSMHandle, uint32_t uVersion, uint32_t uPass) 2511 { 2512 APICDeviceInfo *dev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *); 2513 Assert(uPass == SSM_PASS_FINAL); NOREF(uPass); 2539 static DECLCALLBACK(int) apicLoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass) 2540 { 2541 APICDeviceInfo *pThis = PDMINS_2_DATA(pDevIns, APICDeviceInfo *); 2542 2543 if ( uVersion != APIC_SAVED_STATE_VERSION 2544 && uVersion != APIC_SAVED_STATE_VERSION_VBOX_30 2545 && uVersion != APIC_SAVED_STATE_VERSION_ANCIENT) 2546 return VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION; 2547 2548 /* config */ 2549 if (uVersion > APIC_SAVED_STATE_VERSION_VBOX_30) { 2550 uint32_t cCpus; 2551 int rc = SSMR3GetU32(pSSM, &cCpus); AssertRCReturn(rc, rc); 2552 if (cCpus != pThis->cCpus) 2553 { 2554 LogRel(("APIC: Config mismatch - cCpus: saved=%#x config=%#x\n", cCpus, pThis->cCpus)); 2555 return VERR_SSM_LOAD_CONFIG_MISMATCH; 2556 } 2557 bool fIoApic; 2558 rc = SSMR3GetBool(pSSM, &fIoApic); AssertRCReturn(rc, rc); 2559 if (fIoApic != pThis->fIoApic) 2560 { 2561 LogRel(("APIC: Config mismatch - fIoApic: saved=%RTbool config=%RTbool\n", fIoApic, pThis->fIoApic)); 2562 return VERR_SSM_LOAD_CONFIG_MISMATCH; 2563 } 2564 uint32_t uApicVersion; 2565 rc = SSMR3GetU32(pSSM, &uApicVersion); AssertRCReturn(rc, rc); 2566 if (uApicVersion != (uint32_t)pThis->enmVersion) 2567 { 2568 LogRel(("APIC: Config mismatch - uApicVersion: saved=%#x config=%#x\n", uApicVersion, pThis->enmVersion)); 2569 return VERR_SSM_LOAD_CONFIG_MISMATCH; 2570 } 2571 } 2572 2573 if (uPass != SSM_PASS_FINAL) 2574 return VINF_SUCCESS; 2514 2575 2515 2576 /* load all APICs data */ /** @todo: is it correct? */ 2516 foreach_apic(dev, 0xffffffff, 2517 if (apic_load(pSSMHandle, apic, uVersion)) 2518 { 2577 foreach_apic(pThis, 0xffffffff, 2578 if (apic_load(pSSM, apic, uVersion)) { 2519 2579 AssertFailed(); 2520 2580 return VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION; … … 2555 2615 cpuClearInterrupt(dev, pApic); 2556 2616 } 2617 /** @todo r=bird: Why is this done everytime, while the constructor first 2618 * checks the CPUID? Who is right? */ 2557 2619 dev->pApicHlpR3->pfnChangeFeature(dev->pDevInsR3, dev->enmVersion); 2558 2620 … … 2596 2658 int rc; 2597 2659 uint32_t i; 2598 bool fI OAPIC;2660 bool fIoApic; 2599 2661 bool fGCEnabled; 2600 2662 bool fR0Enabled; … … 2617 2679 return VERR_PDM_DEVINS_UNKNOWN_CFG_VALUES; 2618 2680 2619 rc = CFGMR3QueryBoolDef(pCfgHandle, "IOAPIC", &fI OAPIC, true);2681 rc = CFGMR3QueryBoolDef(pCfgHandle, "IOAPIC", &fIoApic, true); 2620 2682 if (RT_FAILURE(rc)) 2621 2683 return PDMDEV_SET_ERROR(pDevIns, rc, … … 2637 2699 N_("Configuration error: Failed to query integer value \"NumCPUs\"")); 2638 2700 2639 Log(("APIC: cCpus=%d fR0Enabled=%RTbool fGCEnabled=%RTbool fIOAPIC=%RTbool\n", cCpus, fR0Enabled, fGCEnabled, fIOAPIC)); 2640 2641 /* TODO: Current implementation is limited to 32 CPUs due to the use of 32 bits bitmasks. */ 2701 Log(("APIC: cCpus=%d fR0Enabled=%RTbool fGCEnabled=%RTbool fIoApic=%RTbool\n", cCpus, fR0Enabled, fGCEnabled, fIoApic)); 2702 2703 /** @todo Current implementation is limited to 32 CPUs due to the use of 32 2704 * bits bitmasks. */ 2642 2705 if (cCpus > 32) 2643 2706 return PDMDEV_SET_ERROR(pDevIns, rc, … … 2651 2714 pThis->pDevInsRC = PDMDEVINS_2_RCPTR(pDevIns); 2652 2715 pThis->cCpus = cCpus; 2716 pThis->fIoApic = fIoApic; 2653 2717 /* Use PDMAPICVERSION_X2APIC to activate x2APIC mode */ 2654 2718 pThis->enmVersion = PDMAPICVERSION_APIC; … … 2731 2795 * The the CPUID feature bit. 2732 2796 */ 2797 /** @todo r=bird: See remark in the apicReset. */ 2733 2798 uint32_t u32Eax, u32Ebx, u32Ecx, u32Edx; 2734 2799 PDMDevHlpGetCpuId(pDevIns, 0, &u32Eax, &u32Ebx, &u32Ecx, &u32Edx); 2735 2800 if (u32Eax >= 1) { 2736 if ( fI OAPIC/* If IOAPIC is enabled, enable Local APIC in any case */2801 if ( fIoApic /* If IOAPIC is enabled, enable Local APIC in any case */ 2737 2802 || ( u32Ebx == X86_CPUID_VENDOR_INTEL_EBX 2738 2803 && u32Ecx == X86_CPUID_VENDOR_INTEL_ECX … … 2793 2858 * Saved state. 2794 2859 */ 2795 rc = PDMDevHlpSSMRegister(pDevIns, 2 /* version */, sizeof(*pThis), apicSaveExec, apicLoadExec); 2860 rc = PDMDevHlpSSMRegister3(pDevIns, APIC_SAVED_STATE_VERSION, sizeof(*pThis), 2861 apicLiveExec, apicSaveExec, apicLoadExec); 2796 2862 if (RT_FAILURE(rc)) 2797 2863 return rc; … … 2983 3049 for (i = 0; i <= max_redir; ++i) 2984 3050 { 2985 static const char *dmodes[] = { "Fixed ", "LowPri", "SMI ", "Resrvd", 3051 static const char *dmodes[] = { "Fixed ", "LowPri", "SMI ", "Resrvd", 2986 3052 "NMI ", "INIT ", "Resrvd", "ExtINT" }; 2987 3053 2988 pHlp->pfnPrintf(pHlp, " %02d %s %02X %d %s %d %s %s %s %3d (%016llX)\n", 2989 i, 3054 pHlp->pfnPrintf(pHlp, " %02d %s %02X %d %s %d %s %s %s %3d (%016llX)\n", 3055 i, 2990 3056 s->ioredtbl[i] & (1 << 11) ? "log " : "phys", /* dest mode */ 2991 3057 (int)(s->ioredtbl[i] >> 56), /* dest addr */ … … 3005 3071 * @copydoc FNSSMDEVSAVEEXEC 3006 3072 */ 3007 static DECLCALLBACK(int) ioapicSaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM Handle)3073 static DECLCALLBACK(int) ioapicSaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM) 3008 3074 { 3009 3075 IOAPICState *s = PDMINS_2_DATA(pDevIns, IOAPICState *); 3010 ioapic_save(pSSM Handle, s);3076 ioapic_save(pSSM, s); 3011 3077 return VINF_SUCCESS; 3012 3078 } … … 3015 3081 * @copydoc FNSSMDEVLOADEXEC 3016 3082 */ 3017 static DECLCALLBACK(int) ioapicLoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM Handle, uint32_t uVersion, uint32_t uPass)3083 static DECLCALLBACK(int) ioapicLoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass) 3018 3084 { 3019 3085 IOAPICState *s = PDMINS_2_DATA(pDevIns, IOAPICState *); 3020 3086 3021 if (ioapic_load(pSSM Handle, s, uVersion)) {3087 if (ioapic_load(pSSM, s, uVersion)) { 3022 3088 AssertFailed(); 3023 3089 return VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION;
Note:
See TracChangeset
for help on using the changeset viewer.