I not sure is this is right place to ask questions like this, but i'll try.
I'm writing a code which enumerate cpu topology. I'm not sure do I fully understood Intel 64 Architecture Processor Topology Enumeration manual.
The x2APIC ID is divide into three bitfields(Package, core, logical procesor IDs). According to this manual to obtain this three sub IDs I must do as follows
SMT_Mask_Width = CPUID.(EAX=11, ECX=0):EAX[4:0] if CPUID.(EAX=11, ECX=0):ECX[15:8] is 1
SMT_Select_Mask = ~((-1) << SMT_Mask_Width )
SMT_ID = x2APIC_ID & SMT_Select_Mask
CorePlus_Mask_Width = CPUID.(EAX=11,ECX=1):EAX[4:0] if CPUID.(EAX=11, ECX=1):ECX[15:8] is 2
CoreOnly_Select_Mask = (~((-1) << CorePlus_Mask_Width ) ) ^ SMT_Select_Mask.
Core_ID = (x2APIC_ID & CoreOnly_Select_Mask) >> SMT_Mask_Width
Pkg_Select_Mask = (-1) << CorePlus_Mask_Width
Pkg_ID = (x2APIC_ID & Pkg_Select_Mask) >> CorePlus_Mask_Width
Could some explain me why to get CoreOnly_Select_Mask I need to (~((-1) << CorePlus_Mask_Width)) raise to the power of SMT_Select_Mask. I'm not sure is it realy reset SMT_Select_Mask. I think to reset SMT_Select_Mask I would only substract this mask form (~((-1) <<CorePlus_Mask_Width))
Or I did not understand something right? If some could give an example of decomposing of x2APIC ID. Showed how it looks like on a test x2APIC.
sorry for my english.
thanks in advance.