bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] Fix when enabling APIC without SMP


From: Almudena Garcia
Subject: Re: [PATCH] Fix when enabling APIC without SMP
Date: Sat, 24 Sep 2022 19:39:30 +0200

At first question: why do you want to enable APIC without SMP.
In my known, APIC is only useful when there are multiple processors. Even IOAPIC has the purpose of distribute IO inputs to multiple processors.

+++ b/i386/i386at/model_dep.c
@@ -66,6 +66,7 @@
 #include <i386/locore.h>
 #include <i386/model_dep.h>
 #include <i386/smp.h>
+#include <i386at/acpi_parse_apic.h>
 #include <i386at/autoconf.h>
 #include <i386at/biosmem.h>
 #include <i386at/elf.h>
@@ -170,10 +171,14 @@ void machine_init(void)
        hyp_init();
 #else  /* MACH_HYP */

-#if (NCPUS > 1) && defined(APIC)
-       smp_init();
+#if defined(APIC)
+       if (acpi_apic_init() != ACPI_SUCCESS) {
+               panic("APIC not found, unable to boot");
+       }
        ioapic_configure();
        lapic_enable_timer();
+#if (NCPUS > 1)
+       smp_init();

 #warning FIXME: Rather unmask them from their respective drivers
        /* kd */
@@ -183,6 +188,7 @@ void machine_init(void)
        /* com1 */
        unmask_irq(3);
 #endif /* NCPUS > 1 */
+#endif /* APIC */

 #ifdef LINUX_DEV

I don't like put this code in this function. I don't like extremely long functions, so I prefer put this in its own function, instead directly in machine_init().


El sáb, 24 sept 2022 a las 18:33, Etienne Brateau (<etienne.brateau@gmail.com>) escribió:
When we want to enable APIC, we must initialize the structure or
otherwise, it will try to access to a not initialized memory addresses.
---
 i386/i386/smp.c         | 10 ++--------
 i386/i386at/model_dep.c | 10 ++++++++--
 2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/i386/i386/smp.c b/i386/i386/smp.c
index f64fb7f7..d7523a73 100644
--- a/i386/i386/smp.c
+++ b/i386/i386/smp.c
@@ -20,7 +20,6 @@

 #include <i386/i386/apic.h>
 #include <i386/i386/smp.h>
-#include <i386/i386at/acpi_parse_apic.h>

 #include <kern/smp.h>

@@ -42,12 +41,7 @@ static void smp_data_init(void)
  */
 int smp_init(void)
 {
-    int apic_success;
+    smp_data_init();

-    apic_success = acpi_apic_init();
-    if (apic_success == ACPI_SUCCESS) {
-        smp_data_init();
-    }
-
-    return apic_success;
+    return 0;
 }
diff --git a/i386/i386at/model_dep.c b/i386/i386at/model_dep.c
index 105aedb2..1819526b 100644
--- a/i386/i386at/model_dep.c
+++ b/i386/i386at/model_dep.c
@@ -66,6 +66,7 @@
 #include <i386/locore.h>
 #include <i386/model_dep.h>
 #include <i386/smp.h>
+#include <i386at/acpi_parse_apic.h>
 #include <i386at/autoconf.h>
 #include <i386at/biosmem.h>
 #include <i386at/elf.h>
@@ -170,10 +171,14 @@ void machine_init(void)
        hyp_init();
 #else  /* MACH_HYP */

-#if (NCPUS > 1) && defined(APIC)
-       smp_init();
+#if defined(APIC)
+       if (acpi_apic_init() != ACPI_SUCCESS) {
+               panic("APIC not found, unable to boot");
+       }
        ioapic_configure();
        lapic_enable_timer();
+#if (NCPUS > 1)
+       smp_init();

 #warning FIXME: Rather unmask them from their respective drivers
        /* kd */
@@ -183,6 +188,7 @@ void machine_init(void)
        /* com1 */
        unmask_irq(3);
 #endif /* NCPUS > 1 */
+#endif /* APIC */

 #ifdef LINUX_DEV
        /*
--
2.37.3



reply via email to

[Prev in Thread] Current Thread [Next in Thread]