re-Deputized some things and added Deputy polymorphic types to active messages
authorZach Anderson <zra@zra-intrepid.(none)>
Thu, 10 Sep 2009 23:18:19 +0000 (16:18 -0700)
committerZach Anderson <zra@zra-intrepid.(none)>
Thu, 10 Sep 2009 23:18:19 +0000 (16:18 -0700)
13 files changed:
kern/arch/i386/page_alloc.c
kern/arch/i386/smp_boot.c
kern/arch/i386/trap.c
kern/include/env.h
kern/include/ros/noivy.h
kern/include/smp.h
kern/include/trap.h
kern/include/workqueue.h
kern/src/env.c
kern/src/manager.c
kern/src/syscall.c
kern/src/testing.c
kern/src/workqueue.c

index 71fb695..4fb6049 100644 (file)
@@ -9,10 +9,6 @@
 #pragma nosharc
 #endif
 
-#ifdef __DEPUTY__
-//#pragma nodeputy
-#endif
-
 #include <sys/queue.h>
 #include <page_alloc.h>
 #include <pmap.h>
index 95373b8..f1ae7f5 100644 (file)
@@ -8,10 +8,6 @@
 #pragma nosharc
 #endif
 
-#ifdef __IVY__
-#pragma nodeputy
-#endif
-
 #include <arch/x86.h>
 #include <arch/arch.h>
 #include <smp.h>
@@ -60,7 +56,7 @@ static void init_smp_call_function(void)
 
 /******************************************************************************/
 
-static void smp_mtrr_handler(trapframe_t *tf, TV(t) data)
+static void smp_mtrr_handler(trapframe_t *tf, barrier_t *data)
 {
        setup_default_mtrrs(data);
 }
index e0c77cb..b084a8d 100644 (file)
@@ -367,8 +367,8 @@ void sysenter_callwrapper(struct Trapframe *tf)
        proc_startcore(current, tf);
 }
 
-uint32_t send_active_message(uint32_t dst, amr_t pc, uint32_t arg0,
-                             uint32_t arg1, uint32_t arg2)
+uint32_t send_active_message(uint32_t dst, amr_t pc,
+                             TV(a0t) arg0, TV(a1t) arg1, TV(a2t) arg2)
 {
        error_t retval = -EBUSY;
        spin_lock_irqsave(&per_cpu_info[dst].amsg_lock);
@@ -402,7 +402,7 @@ uint32_t send_active_message(uint32_t dst, amr_t pc, uint32_t arg0,
  * currently disabled for this gate. */
 void __active_message(trapframe_t *tf)
 {
-       struct per_cpu_info *myinfo = &per_cpu_info[core_id()];
+       per_cpu_info_t *myinfo = &per_cpu_info[core_id()];
        active_message_t amsg;
 
        lapic_send_eoi();
index 1180680..4eb5a4b 100644 (file)
@@ -114,6 +114,6 @@ void        env_pop_tf(trapframe_t *tf) __attribute__((noreturn));
 
 
 /* Helper handler for smp_call to dispatch jobs to other cores */
-void run_env_handler(trapframe_t *tf, TV(t) data);
+void run_env_handler(trapframe_t *tf, env_t * data);
 
 #endif // !ROS_KERN_ENV_H
index 0d09e8d..82a27b7 100644 (file)
@@ -95,6 +95,8 @@
 
 #define TV(x)           void *
 #define TP(x)           
+#define NTP(n,x)
+#define NTPTV(n)
 
 /* Sharc Stuff */
 
index 36be0bb..ce7a971 100644 (file)
 struct per_cpu_info {
        spinlock_t lock;
        bool preempt_pending;
-       struct workqueue TP(void*) workqueue;
+       struct workqueue NTPTV(t) workqueue;
 #ifdef __i386__
        spinlock_t amsg_lock;
        unsigned amsg_current;
        active_message_t active_msgs[NUM_ACTIVE_MESSAGES];
 #endif
 };
-extern struct per_cpu_info per_cpu_info[MAX_NUM_CPUS];
+
+typedef struct per_cpu_info NTPTV(t) NTPTV(a0t) NTPTV(a1t) NTPTV(a2t) per_cpu_info_t;
+
+extern per_cpu_info_t per_cpu_info[MAX_NUM_CPUS];
 extern volatile uint8_t num_cpus;
 
 /* SMP bootup functions */
index 9af6fac..93c0b51 100644 (file)
@@ -42,24 +42,27 @@ extern void sysenter_handler();
  * messages require a unique message.  Also for now, but it might be like that
  * for a while on x86. */
 
-typedef void (*amr_t)(trapframe_t* tf, uint32_t srcid, uint32_t a0, uint32_t a1,
-                      uint32_t a2);
-typedef struct
+typedef void (*amr_t)(trapframe_t* tf, uint32_t srcid,
+                      TV(a0t) a0, TV(a1t) a1, TV(a2t) a2);
+
+struct active_message
 {
        uint32_t srcid;
        amr_t pc;
-       uint32_t arg0;
-       uint32_t arg1;
-       uint32_t arg2;
+       TV(a0t) arg0;
+       TV(a1t) arg1;
+       TV(a2t) arg2;
        uint32_t pad;
-} active_message_t;
+};
+typedef struct active_message NTPTV(a0t) NTPTV(a1t) NTPTV(a2t) active_message_t;
 
-uint32_t send_active_message(uint32_t dst, amr_t pc, uint32_t arg0,
-                             uint32_t arg1, uint32_t arg2);
+uint32_t send_active_message(uint32_t dst, amr_t pc,
+                             TV(a0t) arg0, TV(a1t) arg1, TV(a2t) arg2);
 
 /* Spins til the active message is sent.  Could block in the future. */
-static inline void send_active_msg_sync(uint32_t dst, amr_t pc, uint32_t arg0,
-                                        uint32_t arg1, uint32_t arg2)
+static inline void
+send_active_msg_sync(uint32_t dst, amr_t pc,
+                     TV(a0t) arg0, TV(a1t) arg1, TV(a2t) arg2)
 {
        while (send_active_message(dst, pc, arg0, arg1, arg2))
                cpu_relax();
index c5c5fd2..ebff971 100644 (file)
@@ -30,6 +30,6 @@ struct workqueue {
 
 void process_workqueue(void);
 // For now, the caller should free their struct work after this call
-int enqueue_work(struct workqueue *queue, struct work *job);
+int enqueue_work(struct workqueue TP(TV(t)) *queue, struct work TP(TV(t)) *job);
 
 #endif /* ROS_KERN_WORKQUEUE_H */
index 87a0056..7b9023a 100644 (file)
@@ -4,10 +4,6 @@
 #pragma nosharc
 #endif
 
-#ifdef __IVY__
-#pragma nodeputy
-#endif
-
 #include <arch/arch.h>
 #include <arch/mmu.h>
 #include <elf.h>
@@ -497,13 +493,22 @@ type SLOCKED(name##_lock) *\
  *
  * Note this is rather old, and meant to run a RUNNABLE_S on a worker core.
  */
-void run_env_handler(trapframe_t *tf, TV(t) data)
+void run_env_handler(trapframe_t *tf, env_t * data)
 {
        assert(data);
-       struct work TP(TV(t)) job;
-       struct workqueue TP(void*) *workqueue = &per_cpu_info[core_id()].workqueue;
+       struct work TP(env_t *) job;
+       struct workqueue TP(env_t *) *CT(1) workqueue =
+           TC(&per_cpu_info[core_id()].workqueue);
        // this doesn't work, and making it a TP(env_t) is wrong
+       // zra: When you want to use other types, let me know, and I can help
+    // make something that Ivy is happy with. We'll have to use some tagged
+    // unions for the elements of the work queue, and for the args to this
+    // function.
+#ifndef __IVY__
        job.func = (func_t)proc_run;
+#else
+       job.func = proc_run;
+#endif
        job.data = data;
        if (enqueue_work(workqueue, &job))
                panic("Failed to enqueue work!");
index 23d9199..3dbf9ce 100644 (file)
@@ -8,10 +8,6 @@
 #pragma nosharc
 #endif
 
-#ifdef __IVY__
-#pragma nodeputy
-#endif
-
 #include <ros/common.h>
 #include <smp.h>
 
index 6b747b1..c29d02e 100644 (file)
@@ -4,10 +4,6 @@
 #pragma nosharc
 #endif
 
-#ifdef __IVY__
-#pragma nodeputy
-#endif
-
 #include <ros/common.h>
 #include <arch/arch.h>
 #include <arch/mmu.h>
@@ -374,10 +370,11 @@ intreg_t syscall(env_t* e, uintreg_t syscallno, uintreg_t a1, uintreg_t a2,
                case SYS_mmap:
                        // we only have 4 parameters from sysenter currently, need to copy
                        // in the others.  if we stick with this, we can make a func for it.
-               args = user_mem_assert(e, (void*)a4, 3*sizeof(_a4), PTE_USER_RW);
-                       _a4 = *(args++);
-                       _a5 = *(args++);
-                       _a6 = *(args++);
+               args = user_mem_assert(e, (void*DANGEROUS)a4,
+                                              3*sizeof(_a4), PTE_USER_RW);
+                       _a4 = args[0];
+                       _a5 = args[1];
+                       _a6 = args[2];
                        return (intreg_t) mmap(e, a1, a2, a3, _a4, _a5, _a6);
                case SYS_brk:
                        printk("brk not implemented yet\n");
index e092637..0c4693b 100644 (file)
@@ -3,10 +3,6 @@
 #pragma nosharc
 #endif
 
-#ifdef __IVY__
-#pragma nodeputy
-#endif
-
 #include <arch/mmu.h>
 #include <arch/arch.h>
 #include <smp.h>
@@ -347,7 +343,7 @@ void test_checklists(void)
 
 atomic_t a, b, c;
 
-void test_incrementer_handler(trapframe_t *tf, void *data)
+void test_incrementer_handler(trapframe_t *tf, atomic_t *data)
 {
        assert(data);
        atomic_inc(data);
@@ -681,9 +677,9 @@ void test_barrier_handler(trapframe_t *tf, void* data)
        //cprintf("Round 4: Core %d\n", core_id());
 }
 
-static void test_waiting_handler(trapframe_t *tf, void *data)
+static void test_waiting_handler(trapframe_t *tf, atomic_t *data)
 {
-       {HANDLER_ATOMIC atomic_dec(data);}
+       atomic_dec(data);
 }
 
 #ifdef __i386__
index 86a32fc..e7027c5 100644 (file)
@@ -22,8 +22,8 @@
  */
 void process_workqueue()
 {
-       struct work TP(void*) work;
-       struct per_cpu_info *cpuinfo = &per_cpu_info[core_id()];
+       struct work TP(TV(t)) work;
+       per_cpu_info_t *cpuinfo = &per_cpu_info[core_id()];
 
        // copy the work in, since we may never return to this stack frame
        spin_lock_irqsave(&cpuinfo->lock);
@@ -39,10 +39,10 @@ void process_workqueue()
        }
 }
 
-int enqueue_work(struct workqueue TP(void*) *queue, struct work TP(TV(t)) *job)
+int enqueue_work(struct workqueue TP(TV(t)) *queue, struct work TP(TV(t)) *job)
 {
        error_t retval = 0;
-       struct per_cpu_info *cpuinfo = &per_cpu_info[core_id()];
+       per_cpu_info_t *cpuinfo = &per_cpu_info[core_id()];
 
        spin_lock_irqsave(&cpuinfo->lock);
        printd("Enqueuing func 0x%08x and data 0x%08x on core %d.\n",