Changeset 40740 in vbox
- Timestamp:
- Apr 2, 2012 11:54:41 AM (13 years ago)
- svn:sync-xref-src-repo-rev:
- 77217
- Location:
- trunk
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/sup.h
r40667 r40740 208 208 /** The max CPU ID (RTMpGetMaxCpuId). */ 209 209 RTCPUID idCpuMax; 210 /** Padding to 8 byte alignment. */ 211 uint16_t au16Padding1[2]; 212 /** Spinlock protecting the GIP array members. */ 213 RTSPINLOCK Spinlock; /* 144 */ 210 214 211 215 /** Padding / reserved space for future data. */ 212 uint32_t au32Padding1[2 9];216 uint32_t au32Padding1[26]; 213 217 214 218 /** Table indexed by the CPU APIC ID to get the CPU table index. */ -
trunk/include/VBox/sup.mac
r36262 r40740 63 63 .u16Padding0 resw 1 64 64 .idCpuMax resd 1 65 .au32Padding1 resd 29 65 .au16Padding1 resw 2 66 .Spinlock RTR0PTR_RES 1 67 .au32Padding1 resd 26 66 68 .aiCpuFromApicId resw 256 67 69 .aiCpuFromCpuSetIdx resw 256 -
trunk/src/VBox/HostDrivers/Support/SUPDrv.c
r40649 r40740 4908 4908 supdrvGipInit(pDevExt, pGip, HCPhysGip, RTTimeSystemNanoTS(), 1000000000 / u32Interval /*=Hz*/, cCpus); 4909 4909 4910 rc = RTSpinlockCreate(&pGip->Spinlock); 4911 if (RT_FAILURE(rc)) 4912 { 4913 supdrvGipDestroy(pDevExt); 4914 return rc; 4915 } 4916 4910 4917 /* 4911 4918 * Create the timer. … … 4976 4983 { 4977 4984 supdrvGipTerm(pDevExt->pGip); 4985 if (pDevExt->pGip->Spinlock) 4986 { 4987 RTSpinlockDestroy(pDevExt->pGip->Spinlock); 4988 pDevExt->pGip->Spinlock = NIL_RTSPINLOCK; 4989 } 4990 4978 4991 pDevExt->pGip = NULL; 4979 4992 } … … 5096 5109 uint32_t i = 0; 5097 5110 uint64_t u64NanoTS = 0; 5111 RTSPINLOCKTMP SpinlockTmp = RTSPINLOCKTMP_INITIALIZER; 5098 5112 5099 5113 AssertRelease(idCpu == RTMpCpuId()); 5100 5114 Assert(pGip->cPossibleCpus == RTMpGetCount()); 5115 5116 /* 5117 * Do this behind a spinlock with interrupts disabled as this can fire 5118 * on all CPUs simultaneously, see #6110. 5119 */ 5120 RTSpinlockAcquireNoInts(pGip->Spinlock, &SpinlockTmp); 5101 5121 5102 5122 /* … … 5132 5152 /* commit it */ 5133 5153 ASMAtomicWriteSize(&pGip->aCPUs[i].enmState, SUPGIPCPUSTATE_ONLINE); 5154 5155 RTSpinlockReleaseNoInts(pGip->Spinlock, &SpinlockTmp); 5134 5156 } 5135 5157 … … 5147 5169 int iCpuSet; 5148 5170 unsigned i; 5171 5172 RTSPINLOCKTMP SpinlockTmp = RTSPINLOCKTMP_INITIALIZER; 5173 RTSpinlockAcquireNoInts(pGip->Spinlock, &SpinlockTmp); 5149 5174 5150 5175 iCpuSet = RTMpCpuIdToSetIndex(idCpu); … … 5160 5185 /* commit it */ 5161 5186 ASMAtomicWriteSize(&pGip->aCPUs[i].enmState, SUPGIPCPUSTATE_OFFLINE); 5187 5188 RTSpinlockReleaseNoInts(pGip->Spinlock, &SpinlockTmp); 5162 5189 } 5163 5190 … … 5469 5496 pGip->cPossibleCpus = RTMpGetCount(); 5470 5497 pGip->idCpuMax = RTMpGetMaxCpuId(); 5498 pGip->Spinlock = NULL; 5471 5499 for (i = 0; i < RT_ELEMENTS(pGip->aiCpuFromApicId); i++) 5472 5500 pGip->aiCpuFromApicId[i] = 0;
Note:
See TracChangeset
for help on using the changeset viewer.