On 09/17/08 18:02, Li, Aubrey wrote:
> Bill.Holler wrote:
>
>   
>> On 09/17/08 13:25, Bill Holler wrote:
>>     
>>> On 09/17/08 13:08, Bill Holler wrote:
>>>
>>>       
>>>> On 09/17/08 02:41, Li, Aubrey wrote:
>>>>
>>>>
>>>>         
>>>>> Hi Bill,
>>>>>
>>>>> Bill.Holler wrote:
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>           
>>>>>> updated 3301 Should check for HPET support before enabling Deep
>>>>>>
>>>>>>
>>>>>>
>>>>>>             
>>>>> It doesn't work on my side.
>>>>> In case something wrong in hpet gate, I uses onnv_97 as my kernel
>>>>> build. And I got:
>>>>> ======================================================= $ cat
>>>>> mdb/cpi_xmaxeax.txt 
>>>>>           
>>>>>>> walk cpu | ::print cpu_t cpu_m | ::print -t "struct
>>>>>>>               
>> machcpu" mcpu_cpi
>>     
>>>>>>>> print -t "struct cpuid_info" cpi_xmaxeax
>>>>>>>>                 
>>>>> $ cat mdb/cpi_xmaxeax.txt | pfexec mdb -k
>>>>> uint_t cpi_xmaxeax = 0
>>>>> uint_t cpi_xmaxeax = 0
>>>>> uint_t cpi_xmaxeax = 0
>>>>> uint_t cpi_xmaxeax = 0
>>>>> uint_t cpi_xmaxeax = 0
>>>>> uint_t cpi_xmaxeax = 0
>>>>> uint_t cpi_xmaxeax = 0
>>>>> uint_t cpi_xmaxeax = 0
>>>>> =======================================================
>>>>> This is weird, because on onnv_95, cpi_xmaxeax = 0x80000008 on my
>>>>> side. I also tried the head(Rev7623) of onnv-gate, this issue
>>>>> remains. I posted it here to see if it's a known bug.
>>>>>
>>>>> Thanks,
>>>>> -Aubrey
>>>>> _______________________________________________
>>>>> tesla-dev mailing list
>>>>> tesla-dev at opensolaris.org
>>>>> http://mail.opensolaris.org/mailman/listinfo/tesla-dev
>>>>>
>>>>>
>>>>>
>>>>>           
>>>> Something stepped on cpi_xmaxeax.  :-(
>>>> A memory write breakpoint on cpuid_info0.cpi_xmaxeax fires
>>>> in boot in cpuid_pass2:
>>>> [0]> :c
>>>> kmdb: stop on write of [cpuid_info0+0xc0, cpuid_info0+0xc1)
>>>> kmdb: target stopped at:
>>>> cpuid_pass2+0x23a:      movl   $0x0,0x8(%r12)
>>>>
>>>> Instruction cpuid_pass2+0x232 triggered the breakpoint.
>>>> mdb reports the instruction *after* the instruction that hit
>>>> triggered the break point. 
>>>>
>>>> cpuid_pass2+0x22c:              jne    +0x10b   <cpuid_pass2+0x33d>
>>>> cpuid_pass2+0x232:              movl   $0xb,(%r12)
>>>> cpuid_pass2+0x23a:              movl   $0x0,0x8(%r12)
>>>>
>>>> %r12 contains the address of cpi_xmaxeax.
>>>>
>>>> None of the C source for cpuid_pass2 writes to cpi_xmaxeax.
>>>> I am looking into the assembly to match this line with the C code.
>>>>
>>>>
>>>> It looks like we also need to add code in cpuid_pass1's extended-
>>>> cpuid section to get 0x80000007 TSC info.
>>>>
>>>> Regards,
>>>> Bill
>>>> _______________________________________________
>>>> tesla-dev mailing list
>>>> tesla-dev at opensolaris.org
>>>> http://mail.opensolaris.org/mailman/listinfo/tesla-dev
>>>>
>>>>
>>>>         
>>> This code in cpuid_pass2() steps on cpi->xmaxeax:
>>>
>>>         if (cpi->cpi_maxeax >= 0xB && cpi->cpi_vendor ==
>>>                 X86_VENDOR_Intel) { cp->cp_eax = 0xB;
>>>                 cp->cp_ecx = 0;
>>>
>>>                 (void) __cpuid_insn(cp);
>>>
>>>
>>> Apparently we walked off the end of the cpi->cpi_std[] array.
>>> Here is the code above that went too far:
>>>
>>>         if ((nmax = cpi->cpi_maxeax + 1) > NMAX_CPI_STD)
>>>                 nmax = NMAX_CPI_STD;
>>>         /*
>>>          * (We already handled n == 0 and n == 1 in pass 1)         
>>>         */ for (n = 2, cp = &cpi->cpi_std[2]; n < nmax; n++, cp++) {
>>>                 cp->cp_eax = n;
>>>
>>>             ...
>>>         }
>>>
>>> When this for loop is done, cp is pointing at
>>> &cpi->cpi_std[NMAX_CPI_STD]. But the array is only NMAX_CPI_STD
>>> elements, so this points at xmaxeax instead of a valid array
>>> element.  :-( 
>>>
>>> Regards,
>>> Bill
>>>
>>>
>>> _______________________________________________
>>> tesla-dev mailing list
>>> tesla-dev at opensolaris.org
>>> http://mail.opensolaris.org/mailman/listinfo/tesla-dev
>>>
>>>       
>> A possible fix is to have this clause in cpuid_pass2(0 allocate a
>> struct cpuid_regs and point cp at it instead of using the stale cp
>> pointer which points one passed the end of cpi->cpi_std[].
>> It does not look like this clause cares to save the results from
>> cpuid after parsing it. 
>>
>>        if (cpi->cpi_maxeax >= 0xB && cpi->cpi_vendor ==
>> X86_VENDOR_Intel) { 
>>
>>                struct cpuid_regs regs;      <--- possible fix
>>
>>                cp = &regs;                        <--- possible fix
>>                cp->cp_eax = 0xB;
>>                cp->cp_ecx = 0;
>>
>>                (void) __cpuid_insn(cp);
>>
>>                /*
>>                 * Check CPUID.EAX=0BH, ECX=0H:EBX is non-zero, which
>>                 * indicates that the extended topology
>> enumeration leaf is
>>                 * available.
>>                 */
>>                if (cp->cp_ebx) {
>>                        uint32_t x2apic_id;
>>                        uint_t coreid_shift = 0;
>>                        uint_t ncpu_per_core = 1;
>>                        uint_t chipid_shift = 0;
>>                        uint_t ncpu_per_chip = 1;
>>                        uint_t i;
>>                        uint_t level;
>>
>>                        for (i = 0; i < CPI_FNB_ECX_MAX; i++) {
>>                                cp->cp_eax = 0xB;
>>                                cp->cp_ecx = i;
>>
>>                                (void) __cpuid_insn(cp);
>>                                level = CPI_CPU_LEVEL_TYPE(cp);
>>
>>                                if (level == 1) {
>>                                        x2apic_id = cp->cp_edx;
>>                                        coreid_shift = BITX(cp->cp_eax,
>> 4, 0);
>>                                        ncpu_per_core =
>> BITX(cp->cp_ebx, 15, 0);
>>                                } else if (level == 2) {
>>                                        x2apic_id = cp->cp_edx;
>>                                        chipid_shift = BITX(cp->cp_eax,
>> 4, 0);
>>                                        ncpu_per_chip =
>> BITX(cp->cp_ebx, 15, 0);
>>                                }
>>                        }
>>
>>                        cpi->cpi_apicid = x2apic_id;
>>                        cpi->cpi_ncpu_per_chip = ncpu_per_chip;
>>                        cpi->cpi_ncore_per_chip = ncpu_per_chip /
>>                            ncpu_per_core;
>>                        cpi->cpi_chipid = x2apic_id >> chipid_shift;
>>                        cpi->cpi_clogid = x2apic_id & ((1 <<
>>                        chipid_shift) - 1); cpi->cpi_coreid =
>>                        x2apic_id >> coreid_shift; cpi->cpi_pkgcoreid
>>                = cpi->cpi_clogid >> coreid_shift; }
>>        }
>>
>>
>> I will file a CR against this.
>>
>>     
> We probably need to fix this first in our gate? Or just fix it locally
> to make the test further?
>
> Thanks,
> -Aubrey
>   

Can I push the fix into hpet_pcplusmp along with the fix to
properly check/initialize the hpet?

Bill

Reply via email to