x86: send_ipi takes an OS coreid
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 13 Nov 2012 21:07:35 +0000 (13:07 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 21 Nov 2012 23:41:17 +0000 (15:41 -0800)
Instead of a hw_coreid, making like the other architectures.

kern/arch/i686/apic.h
kern/arch/i686/arch.h
kern/arch/i686/smp.c
kern/arch/i686/trap.c
kern/src/testing.c

index 46fa3d6..7194427 100644 (file)
@@ -145,9 +145,9 @@ static inline void send_startup_ipi(uint8_t vector);
 static inline void send_self_ipi(uint8_t vector);
 static inline void send_broadcast_ipi(uint8_t vector);
 static inline void send_all_others_ipi(uint8_t vector);
-static inline void send_ipi(uint8_t hw_coreid, uint8_t vector);
+static inline void __send_ipi(uint8_t hw_coreid, uint8_t vector);
 static inline void send_group_ipi(uint8_t hw_groupid, uint8_t vector);
-static inline void __send_nmi(uint8_t os_coreid);
+static inline void __send_nmi(uint8_t hw_coreid);
 
 #define mask_lapic_lvt(entry) \
        write_mmreg32(entry, read_mmreg32(entry) | LAPIC_LVT_MASK)
@@ -263,16 +263,6 @@ static inline void __send_ipi(uint8_t hw_coreid, uint8_t vector)
        lapic_wait_to_send();
 }
 
-static inline void send_ipi(uint8_t hw_coreid, uint8_t vector)
-{
-       /* 255 is a broadcast, which should use send_broadcast_ipi, and it is also
-        * what would come in if you tried sending an IPI to an os_coreid that
-        * doesn't exist (since they are initialized to -1). */
-       if (hw_coreid == 255)
-               return;
-       __send_ipi(hw_coreid, vector);
-}
-
 static inline void send_group_ipi(uint8_t hw_groupid, uint8_t vector)
 {
        write_mmreg32(LAPIC_IPI_ICR_UPPER, hw_groupid << 24);
index 335fca2..f5cdc70 100644 (file)
@@ -27,13 +27,16 @@ static __inline void cpu_relax(void) __attribute__((always_inline));
 static __inline void cpu_halt(void) __attribute__((always_inline));
 static __inline void clflush(uintptr_t* addr) __attribute__((always_inline));
 static __inline int irq_is_enabled(void) __attribute__((always_inline));
-static __inline int get_hw_coreid(int coreid);
+static __inline int get_hw_coreid(uint32_t coreid);
 static __inline int hw_core_id(void) __attribute__((always_inline));
 static __inline int get_os_coreid(int hw_coreid);
 static __inline int core_id(void) __attribute__((always_inline));
 static __inline void cache_flush(void) __attribute__((always_inline));
 static __inline void reboot(void) __attribute__((always_inline)) __attribute__((noreturn));
 
+/* in trap.c */
+void send_ipi(uint32_t os_coreid, uint8_t vector);
+/* in cpuinfo.c */
 void print_cpuinfo(void);
 void show_mapping(uintptr_t start, size_t size);
 
@@ -153,7 +156,7 @@ irq_is_enabled(void)
 
 /* os_coreid -> hw_coreid */
 static __inline int
-get_hw_coreid(int coreid)
+get_hw_coreid(uint32_t coreid)
 {
        return hw_coreid_lookup[coreid];
 }
index 1655cdf..a3d8555 100644 (file)
@@ -131,7 +131,7 @@ static int smp_call_function(uint8_t type, uint32_t dest, poly_isr_t handler, TV
                        send_all_others_ipi(wrapper->vector);
                        break;
                case 4: // physical mode
-                       send_ipi(get_hw_coreid(dest), wrapper->vector);
+                       send_ipi(dest, wrapper->vector);
                        break;
                case 5: // logical mode
                        send_group_ipi(dest, wrapper->vector);
index 500586a..66f3234 100644 (file)
@@ -525,6 +525,17 @@ void sysenter_callwrapper(struct trapframe *tf)
        proc_restartcore();
 }
 
+/* Declared in i686/arch.h */
+void send_ipi(uint32_t os_coreid, uint8_t vector)
+{
+       int hw_coreid = get_hw_coreid(os_coreid);
+       if (hw_coreid == -1) {
+               warn("Unmapped OS coreid!\n");
+               return;
+       }
+       __send_ipi(hw_coreid, vector);
+}
+
 struct kmem_cache *kernel_msg_cache;
 void kernel_msg_init(void)
 {
@@ -599,7 +610,7 @@ uint32_t send_kernel_message(uint32_t dst, amr_t pc, long arg0, long arg1,
         * need an wmb_f() */
        /* if we're sending a routine message locally, we don't want/need an IPI */
        if ((dst != k_msg->srcid) || (type == KMSG_IMMEDIATE))
-               send_ipi(get_hw_coreid(dst), I_KERNEL_MSG);
+               send_ipi(dst, I_KERNEL_MSG);
        return 0;
 }
 
index a84ebe7..05c60a0 100644 (file)
@@ -62,16 +62,16 @@ void test_ipi_sending(void)
        send_self_ipi(I_TESTING);
        udelay(3000000);
        cprintf("\nCORE 0 sending ipi to physical 1\n");
-       send_ipi(get_hw_coreid(0x01), I_TESTING);
+       send_ipi(0x01, I_TESTING);
        udelay(3000000);
        cprintf("\nCORE 0 sending ipi to physical 2\n");
-       send_ipi(get_hw_coreid(0x02), I_TESTING);
+       send_ipi(0x02, I_TESTING);
        udelay(3000000);
        cprintf("\nCORE 0 sending ipi to physical 3\n");
-       send_ipi(get_hw_coreid(0x03), I_TESTING);
+       send_ipi(0x03, I_TESTING);
        udelay(3000000);
        cprintf("\nCORE 0 sending ipi to physical 15\n");
-       send_ipi(get_hw_coreid(0x0f), I_TESTING);
+       send_ipi(0x0f, I_TESTING);
        udelay(3000000);
        cprintf("\nCORE 0 sending ipi to logical 2\n");
        send_group_ipi(0x02, I_TESTING);
@@ -558,7 +558,7 @@ void test_lapic_status_bit(void)
        atomic_set(&a,0);
        printk("IPIs received (should be 0): %d\n", a);
        for(int i = 0; i < NUM_IPI; i++) {
-               send_ipi(get_hw_coreid(7), I_TESTING);
+               send_ipi(7, I_TESTING);
                lapic_wait_to_send();
        }
        // need to wait a bit to let those IPIs get there
@@ -1451,7 +1451,7 @@ void test_abort_halt(void)
        /* wait 1 sec, enough time to for core 1 to be in its KMSG */
        udelay(1000000);
        /* Send an IPI */
-       send_ipi(get_hw_coreid(0x01), I_TESTING);
+       send_ipi(0x01, I_TESTING);
        printk("Core 0 sent the IPI\n");
 #endif /* __i386__ */
 }