Changeset 73281 in vbox for trunk/src/VBox/VMM
- Timestamp:
- Jul 20, 2018 7:55:33 PM (7 years ago)
- svn:sync-xref-src-repo-rev:
- 123888
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/APICAll.cpp
r72486 r73281 2171 2171 2172 2172 /** 2173 * Resets the APIC base MSR. 2174 * 2175 * @param pVCpu The cross context virtual CPU structure. 2176 */ 2177 static void apicResetBaseMsr(PVMCPU pVCpu) 2178 { 2179 /* 2180 * Initialize the APIC base MSR. The APIC enable-bit is set upon power-up or reset[1]. 2181 * 2182 * A Reset (in xAPIC and x2APIC mode) brings up the local APIC in xAPIC mode. 2183 * An INIT IPI does -not- cause a transition between xAPIC and x2APIC mode[2]. 2184 * 2185 * [1] See AMD spec. 14.1.3 "Processor Initialization State" 2186 * [2] See Intel spec. 10.12.5.1 "x2APIC States". 2187 */ 2188 VMCPU_ASSERT_EMT_OR_NOT_RUNNING(pVCpu); 2189 2190 /* Construct. */ 2191 PAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpu); 2192 PAPIC pApic = VM_TO_APIC(pVCpu->CTX_SUFF(pVM)); 2193 uint64_t uApicBaseMsr = MSR_IA32_APICBASE_ADDR; 2194 if (pVCpu->idCpu == 0) 2195 uApicBaseMsr |= MSR_IA32_APICBASE_BSP; 2196 2197 /* If the VM was configured with no APIC, don't enable xAPIC mode, obviously. */ 2198 if (pApic->enmMaxMode != PDMAPICMODE_NONE) 2199 { 2200 uApicBaseMsr |= MSR_IA32_APICBASE_EN; 2201 2202 /* 2203 * While coming out of a reset the APIC is enabled and in xAPIC mode. If software had previously 2204 * disabled the APIC (which results in the CPUID bit being cleared as well) we re-enable it here. 2205 * See Intel spec. 10.12.5.1 "x2APIC States". 2206 */ 2207 if (CPUMSetGuestCpuIdPerCpuApicFeature(pVCpu, true /*fVisible*/) == false) 2208 LogRel(("APIC%u: Resetting mode to xAPIC\n", pVCpu->idCpu)); 2209 } 2210 2211 /* Commit. */ 2212 ASMAtomicWriteU64(&pApicCpu->uApicBaseMsr, uApicBaseMsr); 2213 } 2214 2215 2216 /** 2217 * Initializes per-VCPU APIC to the state following an INIT reset 2218 * ("Wait-for-SIPI" state). 2219 * 2220 * @param pVCpu The cross context virtual CPU structure. 2221 */ 2222 void apicInitIpi(PVMCPU pVCpu) 2223 { 2224 VMCPU_ASSERT_EMT_OR_NOT_RUNNING(pVCpu); 2225 PXAPICPAGE pXApicPage = VMCPU_TO_XAPICPAGE(pVCpu); 2226 2227 /* 2228 * See Intel spec. 10.4.7.3 "Local APIC State After an INIT Reset (Wait-for-SIPI State)" 2229 * and AMD spec 16.3.2 "APIC Registers". 2230 * 2231 * The reason we don't simply zero out the entire APIC page and only set the non-zero members 2232 * is because there are some registers that are not touched by the INIT IPI (e.g. version) 2233 * operation and this function is only a subset of the reset operation. 2234 */ 2235 RT_ZERO(pXApicPage->irr); 2236 RT_ZERO(pXApicPage->irr); 2237 RT_ZERO(pXApicPage->isr); 2238 RT_ZERO(pXApicPage->tmr); 2239 RT_ZERO(pXApicPage->icr_hi); 2240 RT_ZERO(pXApicPage->icr_lo); 2241 RT_ZERO(pXApicPage->ldr); 2242 RT_ZERO(pXApicPage->tpr); 2243 RT_ZERO(pXApicPage->ppr); 2244 RT_ZERO(pXApicPage->timer_icr); 2245 RT_ZERO(pXApicPage->timer_ccr); 2246 RT_ZERO(pXApicPage->timer_dcr); 2247 2248 pXApicPage->dfr.u.u4Model = XAPICDESTFORMAT_FLAT; 2249 pXApicPage->dfr.u.u28ReservedMb1 = UINT32_C(0xfffffff); 2250 2251 /** @todo CMCI. */ 2252 2253 RT_ZERO(pXApicPage->lvt_timer); 2254 pXApicPage->lvt_timer.u.u1Mask = 1; 2255 2256 #if XAPIC_HARDWARE_VERSION == XAPIC_HARDWARE_VERSION_P4 2257 RT_ZERO(pXApicPage->lvt_thermal); 2258 pXApicPage->lvt_thermal.u.u1Mask = 1; 2259 #endif 2260 2261 RT_ZERO(pXApicPage->lvt_perf); 2262 pXApicPage->lvt_perf.u.u1Mask = 1; 2263 2264 RT_ZERO(pXApicPage->lvt_lint0); 2265 pXApicPage->lvt_lint0.u.u1Mask = 1; 2266 2267 RT_ZERO(pXApicPage->lvt_lint1); 2268 pXApicPage->lvt_lint1.u.u1Mask = 1; 2269 2270 RT_ZERO(pXApicPage->lvt_error); 2271 pXApicPage->lvt_error.u.u1Mask = 1; 2272 2273 RT_ZERO(pXApicPage->svr); 2274 pXApicPage->svr.u.u8SpuriousVector = 0xff; 2275 2276 /* The self-IPI register is reset to 0. See Intel spec. 10.12.5.1 "x2APIC States" */ 2277 PX2APICPAGE pX2ApicPage = VMCPU_TO_X2APICPAGE(pVCpu); 2278 RT_ZERO(pX2ApicPage->self_ipi); 2279 2280 /* Clear the pending-interrupt bitmaps. */ 2281 PAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpu); 2282 RT_BZERO(&pApicCpu->ApicPibLevel, sizeof(APICPIB)); 2283 RT_BZERO(pApicCpu->CTX_SUFF(pvApicPib), sizeof(APICPIB)); 2284 2285 /* Clear the interrupt line states for LINT0 and LINT1 pins. */ 2286 pApicCpu->fActiveLint0 = false; 2287 pApicCpu->fActiveLint1 = false; 2288 } 2289 2290 2291 /** 2292 * Initializes per-VCPU APIC to the state following a power-up or hardware 2293 * reset. 2294 * 2295 * @param pVCpu The cross context virtual CPU structure. 2296 * @param fResetApicBaseMsr Whether to reset the APIC base MSR. 2297 */ 2298 void apicResetCpu(PVMCPU pVCpu, bool fResetApicBaseMsr) 2299 { 2300 VMCPU_ASSERT_EMT_OR_NOT_RUNNING(pVCpu); 2301 2302 LogFlow(("APIC%u: apicR3ResetCpu: fResetApicBaseMsr=%RTbool\n", pVCpu->idCpu, fResetApicBaseMsr)); 2303 2304 #ifdef VBOX_STRICT 2305 /* Verify that the initial APIC ID reported via CPUID matches our VMCPU ID assumption. */ 2306 uint32_t uEax, uEbx, uEcx, uEdx; 2307 uEax = uEbx = uEcx = uEdx = UINT32_MAX; 2308 CPUMGetGuestCpuId(pVCpu, 1, 0, &uEax, &uEbx, &uEcx, &uEdx); 2309 Assert(((uEbx >> 24) & 0xff) == pVCpu->idCpu); 2310 #endif 2311 2312 /* 2313 * The state following a power-up or reset is a superset of the INIT state. 2314 * See Intel spec. 10.4.7.3 "Local APIC State After an INIT Reset ('Wait-for-SIPI' State)" 2315 */ 2316 apicInitIpi(pVCpu); 2317 2318 /* 2319 * The APIC version register is read-only, so just initialize it here. 2320 * It is not clear from the specs, where exactly it is initialized. 2321 * The version determines the number of LVT entries and size of the APIC ID (8 bits for P4). 2322 */ 2323 PXAPICPAGE pXApicPage = VMCPU_TO_XAPICPAGE(pVCpu); 2324 #if XAPIC_HARDWARE_VERSION == XAPIC_HARDWARE_VERSION_P4 2325 pXApicPage->version.u.u8MaxLvtEntry = XAPIC_MAX_LVT_ENTRIES_P4 - 1; 2326 pXApicPage->version.u.u8Version = XAPIC_HARDWARE_VERSION_P4; 2327 AssertCompile(sizeof(pXApicPage->id.u8ApicId) >= XAPIC_APIC_ID_BIT_COUNT_P4 / 8); 2328 #else 2329 # error "Implement Pentium and P6 family APIC architectures" 2330 #endif 2331 2332 /** @todo It isn't clear in the spec. where exactly the default base address 2333 * is (re)initialized, atm we do it here in Reset. */ 2334 if (fResetApicBaseMsr) 2335 apicResetBaseMsr(pVCpu); 2336 2337 /* 2338 * Initialize the APIC ID register to xAPIC format. 2339 */ 2340 ASMMemZero32(&pXApicPage->id, sizeof(pXApicPage->id)); 2341 pXApicPage->id.u8ApicId = pVCpu->idCpu; 2342 } 2343 2344 2345 /** 2173 2346 * Sets the APIC base MSR. 2174 2347 * 2175 * @returns Strict VBox status code. 2348 * @returns VBox status code - no informational ones, esp. not 2349 * VINF_CPUM_R3_MSR_WRITE. Only the following two: 2176 2350 * @retval VINF_SUCCESS 2177 * @retval VINF_CPUM_R3_MSR_WRITE2178 2351 * @retval VERR_CPUM_RAISE_GP_0 2179 2352 * … … 2181 2354 * @param u64BaseMsr The value to set. 2182 2355 */ 2183 VMM_INT_DECL( VBOXSTRICTRC) APICSetBaseMsr(PVMCPU pVCpu, uint64_t u64BaseMsr)2356 VMM_INT_DECL(int) APICSetBaseMsr(PVMCPU pVCpu, uint64_t u64BaseMsr) 2184 2357 { 2185 2358 Assert(pVCpu); 2186 2359 2187 #ifdef IN_RING32188 2360 PAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpu); 2189 2361 PAPIC pApic = VM_TO_APIC(pVCpu->CTX_SUFF(pVM)); … … 2213 2385 if (pApic->enmMaxMode == PDMAPICMODE_NONE) 2214 2386 { 2215 LogRel(("APIC%u: Disallowing APIC base MSR write as the VM is configured with APIC disabled!\n", 2216 pVCpu->idCpu)); 2387 LogRel(("APIC%u: Disallowing APIC base MSR write as the VM is configured with APIC disabled!\n", pVCpu->idCpu)); 2217 2388 return apicMsrAccessError(pVCpu, MSR_IA32_APICBASE, APICMSRACCESS_WRITE_DISALLOWED_CONFIG); 2218 2389 } … … 2237 2408 * need to update the CPUID leaf ourselves. 2238 2409 */ 2239 apicR 3ResetCpu(pVCpu, false /* fResetApicBaseMsr */);2410 apicResetCpu(pVCpu, false /* fResetApicBaseMsr */); 2240 2411 uBaseMsr &= ~(MSR_IA32_APICBASE_EN | MSR_IA32_APICBASE_EXTD); 2241 2412 CPUMSetGuestCpuIdPerCpuApicFeature(pVCpu, false /*fVisible*/); … … 2308 2479 ASMAtomicWriteU64(&pApicCpu->uApicBaseMsr, uBaseMsr); 2309 2480 return VINF_SUCCESS; 2310 2311 #else /* !IN_RING3 */2312 RT_NOREF_PV(pVCpu);2313 RT_NOREF_PV(u64BaseMsr);2314 return VINF_CPUM_R3_MSR_WRITE;2315 #endif /* IN_RING3 */2316 2481 } 2317 2482 -
trunk/src/VBox/VMM/VMMAll/NEMAllNativeTemplate-win.cpp.h
r73186 r73281 1021 1021 Log7(("NEM/%u: MSR APICBase changed %RX64 -> %RX64 (%RX64)\n", 1022 1022 pVCpu->idCpu, uOldBase, aValues[iReg].Reg64, aValues[iReg].Reg64 ^ uOldBase)); 1023 VBOXSTRICTRCrc2 = APICSetBaseMsr(pVCpu, aValues[iReg].Reg64);1024 AssertLogRelMsg(rc2 == VINF_SUCCESS, ("%Rrc %RX64\n", VBOXSTRICTRC_VAL(rc2), aValues[iReg].Reg64));1023 int rc2 = APICSetBaseMsr(pVCpu, aValues[iReg].Reg64); 1024 AssertLogRelMsg(rc2 == VINF_SUCCESS, ("%Rrc %RX64\n", rc2, aValues[iReg].Reg64)); 1025 1025 } 1026 1026 iReg++; -
trunk/src/VBox/VMM/VMMR0/NEMR0Native-win.cpp
r73097 r73281 1990 1990 Log7(("NEM/%u: MSR APICBase changed %RX64 -> %RX64 (%RX64)\n", 1991 1991 pVCpu->idCpu, uOldBase, paValues[iReg].Reg64, paValues[iReg].Reg64 ^ uOldBase)); 1992 VBOXSTRICTRC rc2 = APICSetBaseMsr(pVCpu, paValues[iReg].Reg64); 1992 int rc2 = APICSetBaseMsr(pVCpu, paValues[iReg].Reg64); 1993 /** @todo fix me VINF_CPUM_R3_MSR_WRITE / APICSetBaseMsr */ 1993 1994 if (rc2 == VINF_CPUM_R3_MSR_WRITE) 1994 1995 { … … 1997 1998 } 1998 1999 else 1999 AssertLogRelMsg(rc2 == VINF_SUCCESS, ("rc2=%Rrc [%#RX64]\n", VBOXSTRICTRC_VAL(rc2), paValues[iReg].Reg64));2000 AssertLogRelMsg(rc2 == VINF_SUCCESS, ("rc2=%Rrc [%#RX64]\n", rc2, paValues[iReg].Reg64)); 2000 2001 } 2001 2002 iReg++; -
trunk/src/VBox/VMM/VMMR3/APIC.cpp
r71280 r73281 175 175 176 176 /** 177 * Initializes per-VCPU APIC to the state following an INIT reset178 * ("Wait-for-SIPI" state).179 *180 * @param pVCpu The cross context virtual CPU structure.181 */182 static void apicR3InitIpi(PVMCPU pVCpu)183 {184 VMCPU_ASSERT_EMT_OR_NOT_RUNNING(pVCpu);185 PXAPICPAGE pXApicPage = VMCPU_TO_XAPICPAGE(pVCpu);186 187 /*188 * See Intel spec. 10.4.7.3 "Local APIC State After an INIT Reset (Wait-for-SIPI State)"189 * and AMD spec 16.3.2 "APIC Registers".190 *191 * The reason we don't simply zero out the entire APIC page and only set the non-zero members192 * is because there are some registers that are not touched by the INIT IPI (e.g. version)193 * operation and this function is only a subset of the reset operation.194 */195 RT_ZERO(pXApicPage->irr);196 RT_ZERO(pXApicPage->irr);197 RT_ZERO(pXApicPage->isr);198 RT_ZERO(pXApicPage->tmr);199 RT_ZERO(pXApicPage->icr_hi);200 RT_ZERO(pXApicPage->icr_lo);201 RT_ZERO(pXApicPage->ldr);202 RT_ZERO(pXApicPage->tpr);203 RT_ZERO(pXApicPage->ppr);204 RT_ZERO(pXApicPage->timer_icr);205 RT_ZERO(pXApicPage->timer_ccr);206 RT_ZERO(pXApicPage->timer_dcr);207 208 pXApicPage->dfr.u.u4Model = XAPICDESTFORMAT_FLAT;209 pXApicPage->dfr.u.u28ReservedMb1 = UINT32_C(0xfffffff);210 211 /** @todo CMCI. */212 213 RT_ZERO(pXApicPage->lvt_timer);214 pXApicPage->lvt_timer.u.u1Mask = 1;215 216 #if XAPIC_HARDWARE_VERSION == XAPIC_HARDWARE_VERSION_P4217 RT_ZERO(pXApicPage->lvt_thermal);218 pXApicPage->lvt_thermal.u.u1Mask = 1;219 #endif220 221 RT_ZERO(pXApicPage->lvt_perf);222 pXApicPage->lvt_perf.u.u1Mask = 1;223 224 RT_ZERO(pXApicPage->lvt_lint0);225 pXApicPage->lvt_lint0.u.u1Mask = 1;226 227 RT_ZERO(pXApicPage->lvt_lint1);228 pXApicPage->lvt_lint1.u.u1Mask = 1;229 230 RT_ZERO(pXApicPage->lvt_error);231 pXApicPage->lvt_error.u.u1Mask = 1;232 233 RT_ZERO(pXApicPage->svr);234 pXApicPage->svr.u.u8SpuriousVector = 0xff;235 236 /* The self-IPI register is reset to 0. See Intel spec. 10.12.5.1 "x2APIC States" */237 PX2APICPAGE pX2ApicPage = VMCPU_TO_X2APICPAGE(pVCpu);238 RT_ZERO(pX2ApicPage->self_ipi);239 240 /* Clear the pending-interrupt bitmaps. */241 PAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpu);242 RT_BZERO(&pApicCpu->ApicPibLevel, sizeof(APICPIB));243 RT_BZERO(pApicCpu->pvApicPibR3, sizeof(APICPIB));244 245 /* Clear the interrupt line states for LINT0 and LINT1 pins. */246 pApicCpu->fActiveLint0 = false;247 pApicCpu->fActiveLint1 = false;248 }249 250 251 /**252 177 * Sets the CPUID feature bits for the APIC mode. 253 178 * … … 281 206 282 207 /** 283 * Resets the APIC base MSR.284 *285 * @param pVCpu The cross context virtual CPU structure.286 */287 static void apicR3ResetBaseMsr(PVMCPU pVCpu)288 {289 /*290 * Initialize the APIC base MSR. The APIC enable-bit is set upon power-up or reset[1].291 *292 * A Reset (in xAPIC and x2APIC mode) brings up the local APIC in xAPIC mode.293 * An INIT IPI does -not- cause a transition between xAPIC and x2APIC mode[2].294 *295 * [1] See AMD spec. 14.1.3 "Processor Initialization State"296 * [2] See Intel spec. 10.12.5.1 "x2APIC States".297 */298 VMCPU_ASSERT_EMT_OR_NOT_RUNNING(pVCpu);299 300 /* Construct. */301 PAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpu);302 PAPIC pApic = VM_TO_APIC(pVCpu->CTX_SUFF(pVM));303 uint64_t uApicBaseMsr = MSR_IA32_APICBASE_ADDR;304 if (pVCpu->idCpu == 0)305 uApicBaseMsr |= MSR_IA32_APICBASE_BSP;306 307 /* If the VM was configured with no APIC, don't enable xAPIC mode, obviously. */308 if (pApic->enmMaxMode != PDMAPICMODE_NONE)309 {310 uApicBaseMsr |= MSR_IA32_APICBASE_EN;311 312 /*313 * While coming out of a reset the APIC is enabled and in xAPIC mode. If software had previously314 * disabled the APIC (which results in the CPUID bit being cleared as well) we re-enable it here.315 * See Intel spec. 10.12.5.1 "x2APIC States".316 */317 if (CPUMSetGuestCpuIdPerCpuApicFeature(pVCpu, true /*fVisible*/) == false)318 LogRel(("APIC%u: Resetting mode to xAPIC\n", pVCpu->idCpu));319 }320 321 /* Commit. */322 ASMAtomicWriteU64(&pApicCpu->uApicBaseMsr, uApicBaseMsr);323 }324 325 326 /**327 * Initializes per-VCPU APIC to the state following a power-up or hardware328 * reset.329 *330 * @param pVCpu The cross context virtual CPU structure.331 * @param fResetApicBaseMsr Whether to reset the APIC base MSR.332 */333 VMMR3_INT_DECL(void) apicR3ResetCpu(PVMCPU pVCpu, bool fResetApicBaseMsr)334 {335 VMCPU_ASSERT_EMT_OR_NOT_RUNNING(pVCpu);336 337 LogFlow(("APIC%u: apicR3ResetCpu: fResetApicBaseMsr=%RTbool\n", pVCpu->idCpu, fResetApicBaseMsr));338 339 #ifdef VBOX_STRICT340 /* Verify that the initial APIC ID reported via CPUID matches our VMCPU ID assumption. */341 uint32_t uEax, uEbx, uEcx, uEdx;342 uEax = uEbx = uEcx = uEdx = UINT32_MAX;343 CPUMGetGuestCpuId(pVCpu, 1, 0, &uEax, &uEbx, &uEcx, &uEdx);344 Assert(((uEbx >> 24) & 0xff) == pVCpu->idCpu);345 #endif346 347 /*348 * The state following a power-up or reset is a superset of the INIT state.349 * See Intel spec. 10.4.7.3 "Local APIC State After an INIT Reset ('Wait-for-SIPI' State)"350 */351 apicR3InitIpi(pVCpu);352 353 /*354 * The APIC version register is read-only, so just initialize it here.355 * It is not clear from the specs, where exactly it is initialized.356 * The version determines the number of LVT entries and size of the APIC ID (8 bits for P4).357 */358 PXAPICPAGE pXApicPage = VMCPU_TO_XAPICPAGE(pVCpu);359 #if XAPIC_HARDWARE_VERSION == XAPIC_HARDWARE_VERSION_P4360 pXApicPage->version.u.u8MaxLvtEntry = XAPIC_MAX_LVT_ENTRIES_P4 - 1;361 pXApicPage->version.u.u8Version = XAPIC_HARDWARE_VERSION_P4;362 AssertCompile(sizeof(pXApicPage->id.u8ApicId) >= XAPIC_APIC_ID_BIT_COUNT_P4 / 8);363 #else364 # error "Implement Pentium and P6 family APIC architectures"365 #endif366 367 /** @todo It isn't clear in the spec. where exactly the default base address368 * is (re)initialized, atm we do it here in Reset. */369 if (fResetApicBaseMsr)370 apicR3ResetBaseMsr(pVCpu);371 372 /*373 * Initialize the APIC ID register to xAPIC format.374 */375 ASMMemZero32(&pXApicPage->id, sizeof(pXApicPage->id));376 pXApicPage->id.u8ApicId = pVCpu->idCpu;377 }378 379 380 /**381 208 * Receives an INIT IPI. 382 209 * … … 387 214 VMCPU_ASSERT_EMT(pVCpu); 388 215 LogFlow(("APIC%u: APICR3InitIpi\n", pVCpu->idCpu)); 389 apic R3InitIpi(pVCpu);216 apicInitIpi(pVCpu); 390 217 } 391 218 … … 1343 1170 TMTimerStop(pApicCpu->pTimerR3); 1344 1171 1345 apicR 3ResetCpu(pVCpuDest, true /* fResetApicBaseMsr */);1172 apicResetCpu(pVCpuDest, true /* fResetApicBaseMsr */); 1346 1173 1347 1174 /* Clear the interrupt pending force flag. */ … … 1545 1372 /* Initialize the virtual-APIC state. */ 1546 1373 RT_BZERO(pApicCpu->pvApicPageR3, pApicCpu->cbApicPage); 1547 apicR 3ResetCpu(pVCpu, true /* fResetApicBaseMsr */);1374 apicResetCpu(pVCpu, true /* fResetApicBaseMsr */); 1548 1375 1549 1376 #ifdef DEBUG_ramshankar -
trunk/src/VBox/VMM/VMMR3/NEMR3Native-win.cpp
r73182 r73281 1675 1675 { 1676 1676 LogFlow(("nemR3NativeRunGC: calling APICSetBaseMsr(,%RX64)...\n", pVCpu->nem.s.uPendingApicBase)); 1677 VBOXSTRICTRCrc2 = APICSetBaseMsr(pVCpu, pVCpu->nem.s.uPendingApicBase);1678 AssertLogRelMsg(rc2 == VINF_SUCCESS, ("rc2=%Rrc [%#RX64]\n", VBOXSTRICTRC_VAL(rc2), pVCpu->nem.s.uPendingApicBase));1677 int rc2 = APICSetBaseMsr(pVCpu, pVCpu->nem.s.uPendingApicBase); 1678 AssertLogRelMsg(rc2 == VINF_SUCCESS, ("rc2=%Rrc [%#RX64]\n", rc2, pVCpu->nem.s.uPendingApicBase)); 1679 1679 pVCpu->nem.s.uPendingApicBase = UINT64_MAX; 1680 1680 } -
trunk/src/VBox/VMM/include/APICInternal.h
r69111 r73281 1449 1449 VMM_INT_DECL(void) apicSetInterruptFF(PVMCPU pVCpu, PDMAPICIRQ enmType); 1450 1450 VMM_INT_DECL(void) apicClearInterruptFF(PVMCPU pVCpu, PDMAPICIRQ enmType); 1451 1452 #ifdef IN_RING3 1453 VMMR3_INT_DECL(void) apicR3ResetCpu(PVMCPU pVCpu, bool fResetApicBaseMsr); 1451 void apicInitIpi(PVMCPU pVCpu); 1452 void apicResetCpu(PVMCPU pVCpu, bool fResetApicBaseMsr); 1453 1454 RT_C_DECLS_END 1455 1456 /** @} */ 1457 1454 1458 #endif 1455 1459 1456 RT_C_DECLS_END1457 1458 /** @} */1459 1460 #endif1461
Note:
See TracChangeset
for help on using the changeset viewer.