[SeaBIOS] [PATCH 1/3] Halt if number of started cpus are more then expected

Igor Mammedov imammedo at redhat.com
Mon Mar 12 14:09:02 CET 2012


On 03/12/2012 11:14 AM, Gleb Natapov wrote:
> On Mon, Mar 12, 2012 at 10:52:18AM +0100, Igor Mammedov wrote:
>> On 03/11/2012 11:36 AM, Gleb Natapov wrote:
>>> On Sat, Mar 10, 2012 at 12:47:26PM +0100, Igor Mammedov wrote:
>>>> Reduce amount of consumed cpu time (i.e. don't spin forever) if
>>>> number of started cpus are more then expected. And print a bug
>>>> message into debug port.
>>>>
>>>> Signed-off-by: Igor Mammedov<imammedo at redhat.com>
>>>> ---
>>>>   src/smp.c |    8 +++++++-
>>>>   1 files changed, 7 insertions(+), 1 deletions(-)
>>>>
>>>> diff --git a/src/smp.c b/src/smp.c
>>>> index 8c077a1..9933ac6 100644
>>>> --- a/src/smp.c
>>>> +++ b/src/smp.c
>>>> @@ -115,8 +115,14 @@ smp_probe(void)
>>>>           msleep(10);
>>>>       } else {
>>>>           u8 cmos_smp_count = inb_cmos(CMOS_BIOS_SMP_COUNT);
>>>> -        while (cmos_smp_count + 1 != readl(&CountCPUs))
>>>> +        while (cmos_smp_count + 1 != readl(&CountCPUs)) {
>>>> +            if (cmos_smp_count + 1<   readl(&CountCPUs)) {
>>>> +                dprintf(1, "BUG: Expected %d cpu(s) but %d cpus started\n",
>>>> +                        cmos_smp_count + 1, readl(&CountCPUs));
>>> Shouldn't we print it to the console too?
>> I'm not sure if it's possible to print at this stage, but I'll try and
>> re-post if it works.
>>
> If it is not possible currently may be we should move smp detection to
> later stage. Or do not hlt here and report error later. The easier for a
> user to see this error the easier it is for us to debug user's problems.

It looks safe to move vga_setup() right after pci_setup() in post().
However I can't tell what structures various option roms might access so
I'm not completely sure if it right thing to do.

Does something like this look good to you?
(kvm guest boots without any issue and error prints as well if condition is met)

diff --git a/src/post.c b/src/post.c
index 43523dd..9358b49 100644
--- a/src/post.c
+++ b/src/post.c
@@ -208,6 +208,9 @@ post(void)
      pci_setup();
      smm_init();

+    // Run vga option rom
+    vga_setup();
+
      // Initialize internal tables
      boot_setup();
      drive_setup();
@@ -227,9 +230,6 @@ post(void)
      mouse_setup();
      init_bios_tables();

-    // Run vga option rom
-    vga_setup();
-
      // Do hardware initialization (if running synchronously)
      if (!CONFIG_THREADS || !CONFIG_THREAD_OPTIONROMS) {
          init_hw();
diff --git a/src/smp.c b/src/smp.c
index 42184a4..b11cb95 100644
--- a/src/smp.c
+++ b/src/smp.c
@@ -138,8 +138,9 @@ smp_probe(void)

          while (cmos_smp_count + 1 != readl(&CountCPUs)) {
              if (cmos_smp_count + 1 < readl(&CountCPUs)) {
-                dprintf(1, "BUG: Expected %d cpu(s) but %d cpus started\n",
+                printf("ERROR: Expected %d cpu(s) but %d cpus started.\n",
                          cmos_smp_count + 1, readl(&CountCPUs));
+                printf("Machine halted.\n");
                  hlt();
              }
              yield();



-- 
-----
  Igor



More information about the SeaBIOS mailing list