]> Zhao Yanbai Git Server - minix.git/commitdiff
Added do_mapdma.
authorPhilip Homburg <philip@cs.vu.nl>
Fri, 22 Feb 2008 10:51:37 +0000 (10:51 +0000)
committerPhilip Homburg <philip@cs.vu.nl>
Fri, 22 Feb 2008 10:51:37 +0000 (10:51 +0000)
kernel/system/Makefile
kernel/system/do_mapdma.c [new file with mode: 0644]

index fa1462e30b154cabe73ece1393d4e4f924710bf0..c6a4a0f6628a8e9d2791abb8cd91cde32decfe0b 100644 (file)
@@ -54,7 +54,8 @@ OBJECTS       = \
        $(SYSTEM)(do_vm_setbuf.o) \
        $(SYSTEM)(do_sprofile.o) \
        $(SYSTEM)(do_cprofile.o) \
-       $(SYSTEM)(do_profbuf.o)
+       $(SYSTEM)(do_profbuf.o) \
+       $(SYSTEM)(do_mapdma.o) 
 
 build $(SYSTEM):       $(OBJECTS)
        aal cr $@ *.o
@@ -168,3 +169,6 @@ $(SYSTEM)(do_cprofile.o):       do_cprofile.c
 
 $(SYSTEM)(do_profbuf.o):        do_profbuf.c
        $(CC) do_profbuf.c
+
+$(SYSTEM)(do_mapdma.o):        do_mapdma.c
+       $(CC) do_mapdma.c
diff --git a/kernel/system/do_mapdma.c b/kernel/system/do_mapdma.c
new file mode 100644 (file)
index 0000000..47f0c43
--- /dev/null
@@ -0,0 +1,44 @@
+/* The kernel call implemented in this file:
+ *   m_type:   SYS_MAPDMA
+ *
+ * The parameters for this kernel call are:
+ *    m5_l1:   CP_SRC_ADDR     (virtual address)       
+ *    m5_l3:   CP_NR_BYTES     (size of datastructure)         
+ */
+
+#include "../system.h"
+
+/*==========================================================================*
+ *                             do_mapdma                                   *
+ *==========================================================================*/
+PUBLIC int do_mapdma(m_ptr)
+register message *m_ptr;       /* pointer to request message */
+{
+       int r;
+       endpoint_t proc_e;
+       int proc_p;
+       vir_bytes base, size;
+       phys_bytes phys_base;
+       struct proc *proc;
+       message m;
+
+       proc_e = m_ptr->CP_SRC_ENDPT;
+       base= m_ptr->CP_SRC_ADDR;
+       size= m_ptr->CP_NR_BYTES;
+
+       if (!isokendpt(proc_e, &proc_p))
+               return(EINVAL);
+
+       proc = proc_addr(proc_p);
+
+       phys_base= umap_local(proc, D, base, size);
+       if (!phys_base)
+       {
+               kprintf("do_mapdma: umap_local failed\n");
+               return EFAULT;
+       }
+
+       m_ptr->CP_DST_ADDR = phys_base;
+       return OK;
+}
+