Update akaros to hook in the new topology stuff
authorKevin Klues <klueska@cs.berkeley.edu>
Mon, 14 Sep 2015 21:04:50 +0000 (14:04 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 15 Sep 2015 18:04:35 +0000 (14:04 -0400)
To test the topology you can kfunc print_cpu_topology

[brho: touched up a foo(void) ]

14 files changed:
kern/arch/x86/Kbuild
kern/arch/x86/apic.c
kern/arch/x86/console.c
kern/arch/x86/coreid.h [deleted file]
kern/arch/x86/entry64.S
kern/arch/x86/mpacpi.c
kern/arch/x86/smp.c
kern/arch/x86/smp_boot.c
kern/arch/x86/topology.h
kern/arch/x86/trap.h
kern/drivers/dev/acpi.c
kern/include/acpi.h
kern/include/smp.h
kern/src/init.c

index f847663..ae25726 100644 (file)
@@ -30,4 +30,5 @@ obj-y                                         += time.o
 obj-y                                          += trap.o trap64.o
 obj-y                                          += trapentry64.o
 obj-y                                          += usb.o
+obj-y                                          += topology.o
 obj-y                                          += vmm/
index fdd31b6..b0550e7 100644 (file)
@@ -13,7 +13,7 @@
 #include <assert.h>
 #include <stdio.h>
 #include <bitmask.h>
-#include <arch/coreid.h>
+#include <arch/topology.h>
 
 bool lapic_check_spurious(int trap_nr)
 {
index 218899f..59503ee 100644 (file)
@@ -9,7 +9,7 @@
 #include <assert.h>
 #include <stdio.h>
 #include <sys/queue.h>
-#include <arch/coreid.h>
+#include <arch/topology.h>
 
 #include <ros/memlayout.h>
 
diff --git a/kern/arch/x86/coreid.h b/kern/arch/x86/coreid.h
deleted file mode 100644 (file)
index c3333aa..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-#ifndef ROS_ARCH_COREID_H
-#define ROS_ARCH_COREID_H
-
-#include <ros/common.h>
-#include <arch/apic.h>
-
-static inline int get_hw_coreid(uint32_t coreid) __attribute__((always_inline));
-static inline int hw_core_id(void) __attribute__((always_inline));
-static inline int get_os_coreid(int hw_coreid) __attribute__((always_inline));
-static inline int core_id(void) __attribute__((always_inline));
-static inline int numa_id(void) __attribute__((always_inline));
-static inline int core_id_early(void) __attribute__((always_inline));
-
-/* declared in smp.c */
-extern int hw_coreid_lookup[MAX_NUM_CORES];
-extern int os_coreid_lookup[MAX_NUM_CORES];
-
-/* os_coreid -> hw_coreid */
-static inline int get_hw_coreid(uint32_t coreid)
-{
-       return hw_coreid_lookup[coreid];
-}
-
-static inline int hw_core_id(void)
-{
-       return lapic_get_id();
-}
-
-/* hw_coreid -> os_coreid */
-static inline int get_os_coreid(int hw_coreid)
-{
-       return os_coreid_lookup[hw_coreid];
-}
-
-static inline int numa_id(void)
-{
-       return 0;
-}
-
-static inline int core_id(void)
-{
-       int coreid;
-       /* assuming we're right after stacktop.  gs base is the pcpui struct, but we
-        * don't have access to the pcpui struct or to the extern per_cpu_info here,
-        * due to include loops. */
-       asm volatile ("movl %%gs:8, %0" : "=r"(coreid));
-       return coreid;
-}
-
-/* Tracks whether it is safe to execute core_id() or not. */
-extern bool core_id_ready;
-static inline int core_id_early(void)
-{
-       if (!core_id_ready)
-               return 0;
-       return core_id();
-}
-
-#endif /* ROS_ARCH_COREID_H */
index a69398d..e71629f 100644 (file)
@@ -382,12 +382,7 @@ long_mode:
        mov             %ax, %gs
        lldt    %ax
        # paging is on, and our code is still running at 0x00100000.
-       # do some miscellaneous OS setup.  the coreid stuff is so we can call
-       # core_id() before smp_boot. 
-       movabs  $(os_coreid_lookup), %rax
-       movl    $0x0, (%rax)
-       movabs  $(hw_coreid_lookup), %rax
-       movl    $0x0, (%rax)
+       # do some miscellaneous OS setup.
        # set up gs to point to our pcpu info (both GS base and KERN GS base)
        movabs  $(per_cpu_info), %rdx
        movq    %rdx, %rax
index 8548a4b..acccc43 100644 (file)
@@ -20,7 +20,7 @@
 #include <ip.h>
 #include <acpi.h>
 #include <arch/ioapic.h>
-#include <arch/coreid.h>
+#include <arch/topology.h>
 
 extern struct Madt *apics;
 
index 55e2817..d576bb0 100644 (file)
@@ -5,6 +5,7 @@
  */
 
 #include <arch/arch.h>
+#include <arch/topology.h>
 #include <bitmask.h>
 #include <smp.h>
 
 #include <env.h>
 #include <trap.h>
 
-/* Lookup table for core_id and per_cpu_inf, indexed by real __core_id() */
-int hw_coreid_lookup[MAX_NUM_CORES] = {[0 ... (MAX_NUM_CORES - 1)] -1};
-int os_coreid_lookup[MAX_NUM_CORES] = {[0 ... (MAX_NUM_CORES - 1)] -1};
-
 /*************************** IPI Wrapper Stuff ********************************/
 // checklists to protect the global interrupt_handlers for 0xf0, f1, f2, f3, f4
 // need to be global, since there is no function that will always exist for them
index 25b08c8..7f6f4d9 100644 (file)
@@ -26,7 +26,6 @@
 #include "vmm/vmm.h"
 
 extern handler_wrapper_t handler_wrappers[NUM_HANDLER_WRAPPERS];
-int num_cores = 1;
 int x86_num_cores_booted = 1;
 uintptr_t smp_stack_top;
 barrier_t generic_barrier;
@@ -78,17 +77,7 @@ static void setup_rdtscp(int coreid)
 /* TODO: consider merging __arch_pcpu with parts of this (sync with RISCV) */
 void smp_final_core_init(void)
 {
-       /* It is possible that the non-0 cores will wake up before the broadcast
-        * ipi.  this can be due to spurious IRQs or some such.  anyone other than
-        * core 0 that comes in here will wait til core 0 has set everything up.
-        * those other cores might have come up before core 0 remapped the coreids,
-        * so we can only look at the HW coreid, which is only 0 for core 0. */
-       static bool wait = TRUE;
-       if (hw_core_id() == 0)
-               wait = FALSE;
-       while (wait)
-               cpu_relax();
-       /* at this point, it is safe to get the OS coreid */
+       /* Set the coreid in pcpui for fast access to it through TLS. */
        int coreid = get_os_coreid(hw_core_id());
        struct per_cpu_info *pcpui = &per_cpu_info[coreid];
        pcpui->coreid = coreid;
@@ -97,13 +86,10 @@ void smp_final_core_init(void)
        /* don't need this for the kernel anymore, but userspace can still use it */
        setup_rdtscp(coreid);
        /* After this point, all cores have set up their segmentation and whatnot to
-        * be able to do a proper core_id().  As a note to posterity, using the
-        * LAPIC coreid (like get_hw_coreid()) needs the LAPIC set up, which happens
-        * by the end of vm_init() */
+        * be able to do a proper core_id(). */
        waiton_barrier(&generic_barrier);
-       if (hw_core_id() == 0) {
+       if (coreid == 0)
                core_id_ready = TRUE;
-       }
        /* being paranoid with this, it's all a bit ugly */
        waiton_barrier(&generic_barrier);
        setup_default_mtrrs(&generic_barrier);
@@ -134,35 +120,11 @@ static void __spin_bootlock_raw(void)
                      "jne 1b;" : : "m"(*bootlock) : "eax", "cc", "memory");
 }
 
-/* hw_coreid_lookup will get packed, but keep it's hw values.  
- * os_coreid_lookup will remain sparse, but it's values will be consecutive.
- * for both arrays, -1 means an empty slot.  hw_step tracks the next valid entry
- * in hw_coreid_lookup, jumping over gaps of -1's. */
-static void smp_remap_coreids(void)
-{
-       for (int i = 0, hw_step = 0; i < num_cores; i++, hw_step++) {
-               if (hw_coreid_lookup[i] == -1) {
-                       while (hw_coreid_lookup[hw_step] == -1) {
-                               hw_step++;
-                               if (hw_step == MAX_NUM_CORES)
-                                       panic("Mismatch in num_cores and hw_step");
-                       }
-                       hw_coreid_lookup[i] = hw_coreid_lookup[hw_step];
-                       hw_coreid_lookup[hw_step] = -1;
-                       os_coreid_lookup[hw_step] = i;
-               }
-       }
-}
-
 void smp_boot(void)
 {
        struct per_cpu_info *pcpui0 = &per_cpu_info[0];
-       /* set core0's mappings */
-       assert(lapic_get_id() == 0);
-       os_coreid_lookup[0] = 0;
-       hw_coreid_lookup[0] = 0;
-
        page_t *smp_stack;
+
        // NEED TO GRAB A LOWMEM FREE PAGE FOR AP BOOTUP CODE
        // page1 (2nd page) is reserved, hardcoded in pmap.c
        memset(KADDR(trampoline_pg), 0, PGSIZE);
@@ -216,7 +178,6 @@ void smp_boot(void)
        assert(!(num_cores % 2));
        printk("Using only %d Idlecores (SMT Disabled)\n", num_cores >> 1);
 #endif /* CONFIG_DISABLE_SMT */
-       smp_remap_coreids();
 
        /* cleans up the trampoline page, and any other low boot mem mappings */
        x86_cleanup_bootmem();
@@ -262,10 +223,6 @@ uintptr_t smp_main(void)
                cprintf("I am an Application Processor\n");
        cprintf("Num_Cores: %d\n\n", num_cores);
        */
-       /* set up initial mappings.  core0 will adjust it later */
-       unsigned long my_hw_id = lapic_get_id();
-       os_coreid_lookup[my_hw_id] = my_hw_id;
-       hw_coreid_lookup[my_hw_id] = my_hw_id;
 
        // Get a per-core kernel stack
        uintptr_t my_stack_top = get_kstack();
index 7bb0e64..90680d4 100644 (file)
@@ -40,4 +40,44 @@ extern int *os_coreid_lookup;
 void topology_init();
 void print_cpu_topology();
 
+static inline int get_hw_coreid(uint32_t coreid)
+{
+       return cpu_topology_info.core_list[coreid].apic_id;
+}
+
+static inline int hw_core_id(void)
+{
+       return lapic_get_id();
+}
+
+static inline int get_os_coreid(int hw_coreid)
+{
+       return os_coreid_lookup[hw_coreid];
+}
+
+static inline int numa_id(void)
+{
+       int os_coreid = os_coreid_lookup[lapic_get_id()];
+       return cpu_topology_info.core_list[os_coreid].numa_id;
+}
+
+static inline int core_id(void)
+{
+       int coreid;
+       /* assuming we're right after stacktop.  gs base is the pcpui struct, but we
+        * don't have access to the pcpui struct or to the extern per_cpu_info here,
+        * due to include loops. */
+       asm volatile ("movl %%gs:8, %0" : "=r"(coreid));
+       return coreid;
+}
+
+/* Tracks whether it is safe to execute core_id() or not. */
+static inline int core_id_early(void)
+{
+       extern bool core_id_ready;
+       if (!core_id_ready)
+               return 0;
+       return core_id();
+}
+
 #endif /* AKAROS_ARCH_TOPOLOGY_H */
index 4366181..fbe5c1f 100644 (file)
 #include <ros/trapframe.h>
 #include <arch/pci.h>
 #include <arch/pic.h>
-#include <arch/coreid.h>
+#include <arch/topology.h>
 #include <arch/io.h>
 
 struct irq_handler {
index fda4525..21baff7 100644 (file)
@@ -86,7 +86,7 @@ static struct Xsdt *xsdt;             /* XSDT table */
 static struct Atable *tfirst;  /* loaded DSDT/SSDT/... tables */
 static struct Atable *tlast;   /* pointer to last table */
 struct Madt *apics;                            /* APIC info */
-static struct Srat *srat;              /* System resource affinity, used by physalloc */
+struct Srat *srat;                             /* System resource affinity, used by physalloc */
 static struct Slit *slit;              /* System locality information table used by the scheduler */
 static struct Msct *msct;              /* Maximum system characteristics table */
 static struct Reg *reg;                        /* region used for I/O */
index 62e138d..0c46678 100644 (file)
@@ -388,5 +388,6 @@ extern uintptr_t acpimblocksize(uintptr_t, int *);
 int acpiinit(void);
 struct Atable *new_acpi_table(uint8_t *p);
 extern struct Madt *apics;
+extern struct Srat *srat;
 
 #endif /* ROS_KERN_ACPI_H */
index d7e47cd..a125592 100644 (file)
@@ -84,9 +84,7 @@ struct per_cpu_info {
 #define current_ctx per_cpu_info[core_id()].cur_ctx
 
 typedef struct per_cpu_info  per_cpu_info_t;
-
 extern per_cpu_info_t per_cpu_info[MAX_NUM_CORES];
-extern int num_cores;
 
 /* SMP bootup functions */
 void smp_boot(void);
index be24026..a795119 100644 (file)
@@ -5,6 +5,7 @@
 #else
 
 #include <arch/arch.h>
+#include <arch/topology.h>
 #include <arch/console.h>
 #include <multiboot.h>
 #include <stab.h>
@@ -72,6 +73,7 @@ void kernel_init(multiboot_info_t *mboot_info)
        cache_color_alloc_init();       // Inits data structs
        colored_page_alloc_init();      // Allocates colors for agnostic processes
        acpiinit();
+       topology_init();
        kthread_init();                                 /* might need to tweak when this happens */
        vmr_init();
        file_init();