RISCV/SPARC: send_ipi() takes a vector
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 13 Nov 2012 21:52:07 +0000 (13:52 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 21 Nov 2012 23:41:17 +0000 (15:41 -0800)
We could either make an arch-function that is "send a kernel message
IPI", which is what the current versions are doing, or extend send_ipi()
to take other vectors.

Since we might have other IPI vectors in the future, I went with this.
If it's something that is completely impossible for these architectures,
then we can do something else.

Haven't compiled this btw - I still can't run the RISCV compiler on my
machine.

kern/arch/riscv/riscv.h
kern/arch/riscv/smp.c
kern/arch/riscv/trap.c
kern/arch/riscv/trap.h
kern/arch/sparc/sparc.h
kern/arch/sparc/trap.c
kern/arch/sparc/trap.h

index 7be96e8..29e5cc3 100644 (file)
@@ -24,7 +24,7 @@ read_pc(void)
 }
 
 static __inline void
-send_ipi(uint32_t who)
+send_ipi(uint32_t who, uint8_t vector)
 {
        mtpcr(PCR_SEND_IPI, who);
 }
index d3502c2..0a0445f 100644 (file)
@@ -18,7 +18,7 @@ smp_boot(void)
        printd("Cores, report in!\n");
 
        for(uint32_t i = 1; i < num_cpus; i++)
-               send_ipi(i);
+               send_ipi(i, 0); /* meaningless IRQ vector */
        
        while(num_cpus_booted < num_cpus);
 
index 44e714b..10d9641 100644 (file)
@@ -63,7 +63,7 @@ uint32_t send_kernel_message(uint32_t dst, amr_t pc, long arg0, long arg1,
        }
        /* 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(dst);
+               send_ipi(dst, I_KERNEL_MSG);
        return 0;
 }
 
index f8e7372..f39934c 100644 (file)
@@ -12,6 +12,9 @@
 #include <ros/arch/trapframe.h>
 #include <arch/arch.h>
 
+/* Kernel message interrupt vector.  ignored, for the most part */
+#define I_KERNEL_MSG 255
+
 static inline bool in_kernel(struct trapframe *tf)
 {
        return tf->sr & SR_PS;
index a1132ac..89afc33 100644 (file)
@@ -38,7 +38,7 @@ static __inline void write_mmu_reg(uint32_t which, uint32_t val) __attribute__((
 static __inline void write_fsr(uint32_t val) __attribute__((always_inline));
 static __inline uint32_t memsize_mb(void) __attribute__((always_inline));
 static __inline uint32_t mmu_probe(uint32_t va) __attribute__((always_inline));
-static __inline uint32_t send_ipi(uint32_t dst) __attribute__((always_inline));
+static __inline uint32_t send_ipi(uint32_t dst, uint8_t vector) __attribute__((always_inline));
 
 void flush_windows();
 
@@ -160,7 +160,7 @@ load_iobus(uint32_t device, uint32_t addr)
 }
 
 static __inline uint32_t
-send_ipi(uint32_t dst)
+send_ipi(uint32_t dst, uint8_t vector)
 {
        store_iobus(2,dst<<10,0);
        return 0;
index adb47da..d1a186e 100644 (file)
@@ -72,7 +72,7 @@ uint32_t send_kernel_message(uint32_t dst, amr_t pc, long arg0, long arg1,
        }
        /* 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(dst);
+               send_ipi(dst, I_KERNEL_MSG);
        return 0;
 }
 
index 89b8bf8..30dc789 100644 (file)
@@ -11,6 +11,9 @@
 #include <arch/ros/arch.h>
 #include <arch/sparc.h>
 
+/* Kernel message interrupt vector.  ignored, for the most part */
+#define I_KERNEL_MSG 255
+
 /* These are the stacks the kernel will load when it receives a trap from user
  * space. */
 uintptr_t core_stacktops[MAX_NUM_CPUS];