[coreboot] [PATCH] Seabios on Virtutech Simics x86-440bx model

Magnus Christensson mch at virtutech.com
Thu Nov 5 14:02:09 CET 2009


On 11/05/2009 11:49 AM, Gleb Natapov wrote:
> On Thu, Nov 05, 2009 at 11:24:17AM +0100, Magnus Christensson wrote:
>    
>> On 11/05/2009 10:54 AM, Gleb Natapov wrote:
>>      
>>> On Thu, Nov 05, 2009 at 10:30:49AM +0100, Magnus Christensson wrote:
>>>        
>>>> On 11/04/2009 03:40 PM, Gleb Natapov wrote:
>>>>          
>>>>> On Tue, Nov 03, 2009 at 10:30:12PM -0500, Kevin O'Connor wrote:
>>>>>            
>>>>>> On Tue, Nov 03, 2009 at 04:31:32PM +0100, Magnus Christensson wrote:
>>>>>>              
>>>>>>> I'm attaching patches for seabios to make it work on the Virtutech
>>>>>>> Simics x86-440bx model. Please let me know if there is some other list
>>>>>>> that is preferred for seabios patches.
>>>>>>>
>>>>>>> Patches 1-6 and 9 are not really related to the Virtutech model at all,
>>>>>>> so those would be prime candidates to be included in the mainline
>>>>>>> version.
>>>>>>>                
>>>>> l>    Thanks Magnus.
>>>>>            
>>>>>> Gleb I'm not sure if you're on the coreboot mailing list - can you
>>>>>> take a look at these patches as well?  A URL is at:
>>>>>>
>>>>>> http://permalink.gmane.org/gmane.linux.bios/55487
>>>>>>
>>>>>>              
>>>>> Can I get them in a mbox format somewhere? Want to tested them to be
>>>>> sure. From review:
>>>>> 1:
>>>>>   OK
>>>>>
>>>>> 2:
>>>>>   What is the reason for this? x86info --mptable on my 4 core AMD shows
>>>>> MP Table:
>>>>> #       APIC ID Version State           Family  Model   Step    Flags
>>>>> #        0       0x10    BSP, usable     16      4       1     0x178bfbff
>>>>> #        1       0x10    AP, usable      16      4       1     0x178bfbff
>>>>> #        2       0x10    AP, usable      16      4       1     0x178bfbff
>>>>> #        3       0x10    AP, usable      16      4       1     0x178bfbff
>>>>>            
>>>> I can think of two reasons for only listing one CPU per package. The
>>>> first would be performance, in that the OS needs to be aware of
>>>> multi-threading in order not to slow down high priority tasks with
>>>> stuff that is usually free when running on multiple processors (like
>>>> spinlocks). The second reason would be that logical CPUs in the same
>>>> package share some MSRs, and an OS that isn't aware of that may
>>>> cease to work in such an environment.
>>>>
>>>> Related link:
>>>>
>>>> http://software.intel.com/en-us/articles/hyper-threading-implications-and-setup-on-microsoft-operating-systems/
>>>>
>>>>          
>>> This list talks about HT. Why not add entry for each core though? I am
>>> not aware of any MSRs shared between cores
>>>        
>> Some MSRs are shared between cores, for example lots of the memory
>> check MSRs in Nehalem, although an OS that knows about MCs would
>> probably also know something about how they are shared. Adding
>> multiple cores to the MPS tables would probably not break anything.
>> One reason why they are still filtered out in at least some cases
>> could be that multiple cores and threads are flagged with the same
>> bit (the HTT bit).
>>
>>      
> OK. I don't think it is very important for modern guests anyway.
>    
Right. Anything modern should look at the ACPI tables.

>    
>>>        
>>>>>  From a41c206097e801de29668f99ae9b9342614c716d Mon Sep 17 00:00:00 2001
>>>>>            
>>>> From: Magnus Christensson<mch at virtutech.com>
>>>> Date: Tue, 3 Nov 2009 12:50:09 +0100
>>>> Subject: [PATCH 2/8] Only add the first logical CPU in each physical CPU to the MPS tables.
>>>>
>>>> ---
>>>>   src/mptable.c |   26 ++++++++++++++++++++++----
>>>>   1 files changed, 22 insertions(+), 4 deletions(-)
>>>>
>>>> diff --git a/src/mptable.c b/src/mptable.c
>>>> index 805fe1b..525188d 100644
>>>> --- a/src/mptable.c
>>>> +++ b/src/mptable.c
>>>> @@ -44,16 +44,32 @@ mptable_init(void)
>>>>       config->spec = 4;
>>>>       memcpy(config->oemid, CONFIG_CPUNAME8, sizeof(config->oemid));
>>>>       memcpy(config->productid, "0.1         ", sizeof(config->productid));
>>>> -    config->entrycount = MaxCountCPUs + 2 + 16;
>>>>       config->lapic = BUILD_APIC_ADDR;
>>>>
>>>>       // CPU definitions.
>>>>       u32 cpuid_signature, ebx, ecx, cpuid_features;
>>>>       cpuid(1,&cpuid_signature,&ebx,&ecx,&cpuid_features);
>>>>       struct mpt_cpu *cpus = (void*)&config[1];
>>>> -    int i;
>>>> -    for (i = 0; i<   MaxCountCPUs; i++) {
>>>> +    int i, actual_cpu_count;
>>>> +    for (i = 0, actual_cpu_count = 0; i<   MaxCountCPUs; i++) {
>>>>           struct mpt_cpu *cpu =&cpus[i];
>>>> +        int log_cpus = (ebx>>   16)&   0xff;
>>>> +
>>>> +        /* Only populate the MPS tables with the first logical CPU in each
>>>> +           package */
>>>> +        if ((cpuid_features&   (1<<   28))&&
>>>> +            log_cpus>   1&&
>>>> +            ((log_cpus<= 2&&   (i&   1) != 0) ||
>>>> +             (log_cpus<= 4&&   (i&   3) != 0) ||
>>>> +             (log_cpus<= 8&&   (i&   7) != 0) ||
>>>> +             (log_cpus<= 16&&   (i&   15) != 0) ||
>>>> +             (log_cpus<= 32&&   (i&   31) != 0) ||
>>>> +             (log_cpus<= 64&&   (i&   63) != 0) ||
>>>> +             (log_cpus<= 128&&   (i&   127) != 0)))
>>>> +            continue;
>>>> +
>>>>          
>>> Isn't this the same as (i&   (log_cpus - 1) != 0)?
>>>        
>> Yes, as long as log_cpus is a power of 2. But not if it's for example 3.
>>
>>      
> How about this:
>
> static inline unsigned long fls(unsigned long word)
> {
>          asm("bsr %1,%0"
>              : "=r" (word)
>              : "rm" (word));
>          return word + 1;
> }
>
> log_cpus = 1UL<<  fls(atoi(log_cpus) - 1)
>
> (i&  (log_cpus - 1) != 0)
>    
Why atoi? Other than that it looks correct (assuming that the inline asm 
syntax is correct which I'm not fluent in).

M.





More information about the coreboot mailing list