diff --git a/headers/private/kernel/smp.h b/headers/private/kernel/smp.h index b6fec7ad5e..4736183d4a 100644 --- a/headers/private/kernel/smp.h +++ b/headers/private/kernel/smp.h @@ -55,10 +55,15 @@ public: inline bool GetBit(int32 cpu) const; + inline bool Matches(const CPUSet& mask) const; + inline CPUSet And(const CPUSet& mask) const; + inline bool IsEmpty() const; + inline uint32 Bits(uint32 index) const { return fBitmap[index];} private: - static const int kArraySize = ROUNDUP(SMP_MAX_CPUS, 32) / 32; + static const int kArrayBits = 32; + static const int kArraySize = ROUNDUP(SMP_MAX_CPUS, kArrayBits) / kArrayBits; uint32 fBitmap[kArraySize]; }; @@ -125,40 +130,62 @@ CPUSet::SetAll() inline void CPUSet::SetBit(int32 cpu) { - int32* element = (int32*)&fBitmap[cpu % kArraySize]; - *element |= 1u << (cpu / kArraySize); + int32* element = (int32*)&fBitmap[cpu / kArrayBits]; + *element |= 1u << (cpu % kArrayBits); } inline void CPUSet::ClearBit(int32 cpu) { - int32* element = (int32*)&fBitmap[cpu % kArraySize]; - *element &= ~uint32(1u << (cpu / kArraySize)); + int32* element = (int32*)&fBitmap[cpu / kArrayBits]; + *element &= ~uint32(1u << (cpu % kArrayBits)); } inline void CPUSet::SetBitAtomic(int32 cpu) { - int32* element = (int32*)&fBitmap[cpu % kArraySize]; - atomic_or(element, 1u << (cpu / kArraySize)); + int32* element = (int32*)&fBitmap[cpu / kArrayBits]; + atomic_or(element, 1u << (cpu % kArrayBits)); } inline void CPUSet::ClearBitAtomic(int32 cpu) { - int32* element = (int32*)&fBitmap[cpu % kArraySize]; - atomic_and(element, ~uint32(1u << (cpu / kArraySize))); + int32* element = (int32*)&fBitmap[cpu / kArrayBits]; + atomic_and(element, ~uint32(1u << (cpu % kArrayBits))); } inline bool CPUSet::GetBit(int32 cpu) const { - int32* element = (int32*)&fBitmap[cpu % kArraySize]; - return ((uint32)atomic_get(element) & (1u << (cpu / kArraySize))) != 0; + int32* element = (int32*)&fBitmap[cpu / kArrayBits]; + return ((uint32)atomic_get(element) & (1u << (cpu % kArrayBits))) != 0; +} + + +inline CPUSet +CPUSet::And(const CPUSet& mask) const +{ + CPUSet andSet; + for (int i = 0; i < kArraySize; i++) + andSet.fBitmap[i] = fBitmap[i] & mask.fBitmap[i]; + return andSet; +} + + +inline bool +CPUSet::Matches(const CPUSet& mask) const +{ + for (int i = 0; i < kArraySize; i++) { + if ((fBitmap[i] & mask.fBitmap[i]) != 0) + return true; + } + + return false; }