2323 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2424 */
2525#include <acpi_ktf.h>
26+ #include <cpu.h>
2627#include <ioapic.h>
27- #include <percpu.h>
2828#include <setup.h>
2929#include <string.h>
3030
@@ -46,10 +46,6 @@ static const char *madt_int_trigger_names[] = {
4646 [ACPI_MADT_INT_TRIGGER_LT ] = "Level" ,
4747};
4848
49- static unsigned nr_cpus ;
50-
51- unsigned acpi_get_nr_cpus (void ) { return nr_cpus ; }
52-
5349#ifndef KTF_ACPICA
5450#include <errno.h>
5551#include <page.h>
@@ -232,7 +228,7 @@ static int process_fadt(void) {
232228 return 0 ;
233229}
234230
235- static int process_madt_entries (unsigned bsp_cpu_id ) {
231+ static int process_madt_entries (void ) {
236232 acpi_madt_t * madt = (acpi_madt_t * ) acpi_find_table (MADT_SIGNATURE );
237233 acpi_madt_entry_t * entry ;
238234 bus_t * isa_bus = NULL ;
@@ -257,23 +253,23 @@ static int process_madt_entries(unsigned bsp_cpu_id) {
257253 switch (entry -> type ) {
258254 case ACPI_MADT_TYPE_LAPIC : {
259255 acpi_madt_processor_t * madt_cpu = (acpi_madt_processor_t * ) entry -> data ;
260- percpu_t * percpu ;
261256 bool enabled ;
262257
263258 /* Some systems report all CPUs, marked as disabled */
264259 enabled = !!(madt_cpu -> flags & 0x1 );
265260 if (!enabled )
266261 break ;
267262
268- percpu = get_percpu_page (madt_cpu -> apic_proc_id );
263+ cpu_t * cpu = get_cpu (madt_cpu -> apic_proc_id )
264+ ?: add_cpu (madt_cpu -> apic_proc_id , false, enabled );
265+ cpu -> enabled = enabled ;
266+
267+ percpu_t * percpu = cpu -> percpu ;
269268 percpu -> cpu_id = madt_cpu -> apic_proc_id ;
270269 percpu -> apic_id = madt_cpu -> apic_id ;
271- percpu -> bsp = !!(madt_cpu -> apic_proc_id == bsp_cpu_id );
272- percpu -> enabled = enabled ;
273270
274- nr_cpus ++ ;
275271 printk ("ACPI: [MADT] APIC Processor ID: %u, APIC ID: %u, Flags: %08x\n" ,
276- madt_cpu -> apic_proc_id , madt_cpu -> apic_id , madt_cpu -> flags );
272+ cpu -> id , percpu -> apic_id , madt_cpu -> flags );
277273 break ;
278274 }
279275 case ACPI_MADT_TYPE_IOAPIC : {
@@ -383,7 +379,7 @@ acpi_table_t *acpi_find_table(uint32_t signature) {
383379 return NULL ;
384380}
385381
386- int init_acpi (unsigned bsp_cpu_id ) {
382+ int init_acpi (void ) {
387383 unsigned acpi_nr_tables ;
388384 rsdt_t * rsdt = NULL ;
389385 xsdt_t * xsdt = NULL ;
@@ -437,7 +433,7 @@ int init_acpi(unsigned bsp_cpu_id) {
437433 if (rc < 0 )
438434 return rc ;
439435
440- return process_madt_entries (bsp_cpu_id );
436+ return process_madt_entries ();
441437}
442438#else /* KTF_ACPICA */
443439#include "acpi.h"
@@ -486,24 +482,22 @@ static void madt_parser(ACPI_SUBTABLE_HEADER *entry, void *arg) {
486482 switch (entry -> Type ) {
487483 case ACPI_MADT_TYPE_LOCAL_APIC : {
488484 ACPI_MADT_LOCAL_APIC * lapic = (ACPI_MADT_LOCAL_APIC * ) entry ;
489- uint32_t bsp_cpu_id = (uint32_t ) _ul (arg );
490- percpu_t * percpu ;
491485 bool enabled ;
492486
493487 /* Some systems report all CPUs, marked as disabled */
494488 enabled = !!(lapic -> LapicFlags & 0x1 );
495489 if (!enabled )
496490 break ;
497491
498- percpu = get_percpu_page (lapic -> ProcessorId );
499- percpu -> cpu_id = lapic -> ProcessorId ;
492+ cpu_t * cpu =
493+ get_cpu (lapic -> ProcessorId ) ?: add_cpu (lapic -> ProcessorId , false, enabled );
494+ cpu -> enabled = enabled ;
495+
496+ percpu_t * percpu = cpu -> percpu ;
500497 percpu -> apic_id = lapic -> Id ;
501- percpu -> bsp = !!(lapic -> ProcessorId == bsp_cpu_id );
502- percpu -> enabled = enabled ;
503498
504- nr_cpus ++ ;
505- printk ("ACPI: [MADT] APIC Processor ID: %u, APIC ID: %u, Flags: %08x\n" ,
506- percpu -> cpu_id , percpu -> apic_id , lapic -> LapicFlags );
499+ printk ("ACPI: [MADT] APIC Processor ID: %u, APIC ID: %u, Flags: %08x\n" , cpu -> id ,
500+ percpu -> apic_id , lapic -> LapicFlags );
507501 break ;
508502 }
509503 case ACPI_MADT_TYPE_IO_APIC : {
@@ -597,25 +591,23 @@ static void madt_parser(ACPI_SUBTABLE_HEADER *entry, void *arg) {
597591 }
598592 case ACPI_MADT_TYPE_LOCAL_SAPIC : {
599593 ACPI_MADT_LOCAL_SAPIC * slapic = (ACPI_MADT_LOCAL_SAPIC * ) entry ;
600- percpu_t * percpu = get_percpu_page (slapic -> ProcessorId );
601- uint32_t bsp_cpu_id = (uint32_t ) _ul (arg );
594+ bool enabled = !!(slapic -> LapicFlags & 0x1 );
595+ cpu_t * cpu =
596+ get_cpu (slapic -> ProcessorId ) ?: add_cpu (slapic -> ProcessorId , false, enabled );
602597
603- percpu -> cpu_id = slapic -> ProcessorId ;
598+ cpu -> enabled = enabled ;
599+
600+ percpu_t * percpu = cpu -> percpu ;
604601 percpu -> sapic_id = slapic -> Id ;
605602 percpu -> sapic_eid = slapic -> Eid ;
606-
607603 percpu -> sapic_uid = slapic -> Uid ;
608604 percpu -> sapic_uid_str [0 ] = slapic -> UidString [0 ];
609605
610- percpu -> bsp = !!(slapic -> ProcessorId == bsp_cpu_id );
611- percpu -> enabled = !!(slapic -> LapicFlags & 0x1 );
612-
613- if (percpu -> enabled ) {
614- nr_cpus ++ ;
606+ if (cpu -> enabled ) {
615607 printk ("ACPI: [MADT] SAPIC Processor ID: %u, SAPIC ID: %u, SAPIC EID: %u, "
616608 "SAPIC UID: %u, SAPIC UID Str: %c Flags: %08x\n" ,
617- percpu -> cpu_id , slapic -> Id , slapic -> Eid , slapic -> Uid ,
618- slapic -> UidString [ 0 ], slapic -> LapicFlags );
609+ cpu -> id , slapic -> Id , slapic -> Eid , slapic -> Uid , slapic -> UidString [ 0 ] ,
610+ slapic -> LapicFlags );
619611 }
620612 break ;
621613 }
@@ -625,18 +617,17 @@ static void madt_parser(ACPI_SUBTABLE_HEADER *entry, void *arg) {
625617 }
626618 case ACPI_MADT_TYPE_LOCAL_X2APIC : {
627619 ACPI_MADT_LOCAL_X2APIC * x2lapic = (ACPI_MADT_LOCAL_X2APIC * ) entry ;
628- percpu_t * percpu = get_percpu_page (x2lapic -> Uid );
629- uint32_t bsp_cpu_id = (uint32_t ) _ul (arg );
620+ bool enabled = !!(x2lapic -> LapicFlags & 0x1 );
621+ cpu_t * cpu = get_cpu (x2lapic -> Uid ) ?: add_cpu (x2lapic -> Uid , false, enabled );
622+
623+ cpu -> enabled = enabled ;
630624
631- percpu -> cpu_id = x2lapic -> Uid ;
625+ percpu_t * percpu = cpu -> percpu ;
632626 percpu -> apic_id = x2lapic -> LocalApicId ;
633- percpu -> bsp = !!(x2lapic -> Uid == bsp_cpu_id );
634- percpu -> enabled = !!(x2lapic -> LapicFlags & 0x1 );
635627
636- if (percpu -> enabled ) {
637- nr_cpus ++ ;
628+ if (cpu -> enabled ) {
638629 printk ("ACPI: [MADT] X2APIC Processor ID: %u, APIC ID: %u, Flags: %08x\n" ,
639- percpu -> cpu_id , percpu -> apic_id , x2lapic -> LapicFlags );
630+ cpu -> id , percpu -> apic_id , x2lapic -> LapicFlags );
640631 }
641632 break ;
642633 }
@@ -703,7 +694,7 @@ static ACPI_STATUS init_fadt(void) {
703694 return AE_OK ;
704695}
705696
706- static ACPI_STATUS init_madt (unsigned bsp_cpu_id ) {
697+ static ACPI_STATUS init_madt (void ) {
707698 ACPI_TABLE_MADT * madt = acpi_find_table (ACPI_SIG_MADT );
708699 ACPI_SUBTABLE_HEADER * subtbl = (void * ) madt + sizeof (* madt );
709700
@@ -712,7 +703,7 @@ static ACPI_STATUS init_madt(unsigned bsp_cpu_id) {
712703
713704 uint32_t length = madt -> Header .Length - sizeof (* madt );
714705
715- acpi_walk_subtables (subtbl , length , madt_parser , ( void * ) _ul ( bsp_cpu_id ) );
706+ acpi_walk_subtables (subtbl , length , madt_parser , NULL );
716707 return AE_OK ;
717708}
718709
@@ -733,7 +724,7 @@ void acpi_walk_subtables(ACPI_SUBTABLE_HEADER *entry, uint32_t length,
733724 }
734725}
735726
736- ACPI_STATUS init_acpi (unsigned bsp_cpu_id ) {
727+ ACPI_STATUS init_acpi (void ) {
737728 ACPI_STATUS status ;
738729
739730 printk ("Initializing ACPI support\n" );
@@ -746,7 +737,7 @@ ACPI_STATUS init_acpi(unsigned bsp_cpu_id) {
746737 if (status != AE_OK )
747738 return status ;
748739
749- status = init_madt (bsp_cpu_id );
740+ status = init_madt ();
750741 return status ;
751742}
752743
0 commit comments