]> Zhao Yanbai Git Server - minix.git/commitdiff
Message type for SYS_UMAP{,_REMOTE}
authorLionel Sambuc <lionel@minix3.org>
Wed, 21 May 2014 15:54:35 +0000 (17:54 +0200)
committerLionel Sambuc <lionel@minix3.org>
Mon, 28 Jul 2014 15:05:47 +0000 (17:05 +0200)
Change-Id: Id46df10aee6189a0d3673013b498c7cc79edcc7e

include/minix/com.h
include/minix/ipc.h
kernel/system/do_umap.c
kernel/system/do_umap_remote.c
lib/libsys/arch/i386/sys_umap_remote.c
lib/libsys/sys_umap.c

index 12b01271f5cac28180436799c83d6957feec7bac..c2823b693fe8bee973bf7c36edb26968afd736a4 100644 (file)
 #  define IRQ_WORD      0x200  /* word values */
 #  define IRQ_LONG      0x400  /* long values */
 
-/* Field names for _UMAP, _VIRCOPY, _PHYSCOPY. */
-#define CP_SRC_ENDPT   m5_i1   /* process to copy from */
-#define CP_SRC_ADDR    m5_l1   /* address where data come from */
-#define CP_DST_ENDPT   m5_i2   /* process to copy to */
-#define CP_DST_ADDR    m5_l2   /* address where data go to */
-#define CP_NR_BYTES    m5_l3   /* number of bytes to copy */
-#define CP_FLAGS       m5_s2   /* number of bytes to copy */
-
 #define CP_FLAG_TRY    0x01    /* do not transparently map */
 
-#define UMAP_SEG       m5_s1
-
 /* Field names for SYS_VUMAP. */
 #define VUMAP_ENDPT    m10_i1  /* grant owner, or SELF for local addresses */
 #define VUMAP_VADDR    m10_l1  /* address of virtual (input) vector */
index 5978b4eedc65af6f62d113c98e44a6cae1b9f858..edaa36bd14cf06ed0ce9216f0c084e480a0a4eec 100644 (file)
@@ -764,6 +764,24 @@ typedef struct {
 } mess_lsys_krn_sys_setalarm;
 _ASSERT_MSG_SIZE(mess_lsys_krn_sys_setalarm);
 
+typedef struct {
+       endpoint_t src_endpt;
+       int segment;
+       vir_bytes src_addr;
+       endpoint_t dst_endpt;
+       int nr_bytes;
+
+       uint8_t padding[36];
+} mess_lsys_krn_sys_umap;
+_ASSERT_MSG_SIZE(mess_lsys_krn_sys_umap);
+
+typedef struct {
+       phys_bytes dst_addr;
+
+       uint8_t padding[52];
+} mess_krn_lsys_sys_umap;
+_ASSERT_MSG_SIZE(mess_krn_lsys_sys_umap);
+
 typedef struct {
        int request;
        int vec_size;
@@ -1431,6 +1449,7 @@ typedef struct {
 
                mess_krn_lsys_schedule  m_krn_lsys_schedule;
                mess_krn_lsys_sys_irqctl m_krn_lsys_sys_irqctl;
+               mess_krn_lsys_sys_umap  m_krn_lsys_sys_umap;
 
                mess_fs_vfs_breadwrite  m_fs_vfs_breadwrite;
                mess_fs_vfs_chmod       m_fs_vfs_chmod;
@@ -1514,6 +1533,7 @@ typedef struct {
                mess_lsys_krn_sys_memset m_lsys_krn_sys_memset;
                mess_lsys_krn_sys_sdevio m_lsys_krn_sys_sdevio;
                mess_lsys_krn_sys_setalarm m_lsys_krn_sys_setalarm;
+               mess_lsys_krn_sys_umap  m_lsys_krn_sys_umap;
                mess_lsys_krn_sys_vdevio m_lsys_krn_sys_vdevio;
 
                mess_lsys_pci_busc_get_bar m_lsys_pci_busc_get_bar;
index 32c1ff3a8b6fb1e30fa3adffc2fc6a8ae0896ba9..9c0128bf9fd56c0dbe41fab5cbf3c0a35d2fd383 100755 (executable)
@@ -2,11 +2,11 @@
  *   m_type:   SYS_UMAP
  *
  * The parameters for this kernel call are:
- *    m5_i1:   CP_SRC_PROC_NR  (process number)
- *    m5_s1:   UMAP_SEG        (segment where address is: T, D, or S)
- *    m5_l1:   CP_SRC_ADDR     (virtual address)
- *    m5_l2:   CP_DST_ADDR     (returns physical address)
- *    m5_l3:   CP_NR_BYTES     (size of datastructure)
+ *   m_lsys_krn_sys_umap.src_endpt     (process number)
+ *   m_lsys_krn_sys_umap.segment       (segment where address is: T, D, or S)
+ *   m_lsys_krn_sys_umap.src_addr      (virtual address)
+ *   m_krn_lsys_sys_umap.dst_addr      (returns physical address)
+ *   m_lsys_krn_sys_umap.nr_bytes      (size of datastructure)
  */
 
 #include "kernel/system.h"
  *==========================================================================*/
 int do_umap(struct proc * caller, message * m_ptr)
 {
-  int seg_index = m_ptr->UMAP_SEG & SEGMENT_INDEX;
-  int endpt = (int) m_ptr->CP_SRC_ENDPT;
+  int seg_index = m_ptr->m_lsys_krn_sys_umap.segment & SEGMENT_INDEX;
+  int endpt = m_ptr->m_lsys_krn_sys_umap.src_endpt;
 
   /* This call is a subset of umap_remote, it allows mapping virtual addresses
    * in the caller's address space and grants where the caller is specified as
    * grantee; after the security check we simply invoke do_umap_remote
    */
   if (seg_index != MEM_GRANT && endpt != SELF) return EPERM;
-  m_ptr->CP_DST_ENDPT = SELF;
+  m_ptr->m_lsys_krn_sys_umap.dst_endpt = SELF;
   return do_umap_remote(caller, m_ptr);
 }
 
index 7e9c10fc18d4c54e39fc74dbff5f441c6cd6eb27..8ebe78d28f59739f0dc14bcf80f0dccede7bc771 100644 (file)
@@ -2,12 +2,12 @@
  *   m_type:   SYS_UMAP_REMOTE
  *
  * The parameters for this kernel call are:
- *    m5_i1:   CP_SRC_PROC_NR  (process number)
- *    m5_s1:   UMAP_SEG        (segment where address is: T, D, or S)
- *    m5_l1:   CP_SRC_ADDR     (virtual address)
- *    m5_i2:   CP_DST_ENDPT    (process number of grantee to check access for)
- *    m5_l2:   CP_DST_ADDR     (returns physical address)
- *    m5_l3:   CP_NR_BYTES     (size of datastructure)
+ *   m_lsys_krn_sys_umap.src_endpt     (process number)
+ *   m_lsys_krn_sys_umap.segment       (segment where address is: T, D, or S)
+ *   m_lsys_krn_sys_umap.src_addr      (virtual address)
+ *   m_lsys_krn_sys_umap.dst_endpt     (process number of grantee to check access for)
+ *   m_krn_lsys_sys_umap.dst_addr      (returns physical address)
+ *   m_lsys_krn_sys_umap.nr_bytes      (size of datastructure)
  */
 
 #include "kernel/system.h"
 int do_umap_remote(struct proc * caller, message * m_ptr)
 {
 /* Map virtual address to physical, for non-kernel processes. */
-  int seg_type = m_ptr->UMAP_SEG & SEGMENT_TYPE;
-  int seg_index = m_ptr->UMAP_SEG & SEGMENT_INDEX;
-  vir_bytes offset = m_ptr->CP_SRC_ADDR;
-  int count = m_ptr->CP_NR_BYTES;
-  int endpt = (int) m_ptr->CP_SRC_ENDPT;
-  endpoint_t grantee = (endpoint_t) m_ptr->CP_DST_ENDPT;
+  int seg_type = m_ptr->m_lsys_krn_sys_umap.segment & SEGMENT_TYPE;
+  int seg_index = m_ptr->m_lsys_krn_sys_umap.segment & SEGMENT_INDEX;
+  vir_bytes offset = m_ptr->m_lsys_krn_sys_umap.src_addr;
+  int count = m_ptr->m_lsys_krn_sys_umap.nr_bytes;
+  endpoint_t endpt = m_ptr->m_lsys_krn_sys_umap.src_endpt;
+  endpoint_t grantee = m_ptr->m_lsys_krn_sys_umap.dst_endpt;
   int proc_nr, proc_nr_grantee;
   phys_bytes phys_addr = 0, lin_addr = 0;
   struct proc *targetpr;
@@ -108,7 +108,7 @@ int do_umap_remote(struct proc * caller, message * m_ptr)
        return EFAULT;
   }
 
-  m_ptr->CP_DST_ADDR = phys_addr;
+  m_ptr->m_krn_lsys_sys_umap.dst_addr = phys_addr;
   if(phys_addr == 0) {
          printf("kernel: umap 0x%x done by %d / %s, pc 0x%lx, 0x%lx -> 0x%lx\n",
                seg_type, caller->p_endpoint, caller->p_name,
index 2adda8ec4cb19ddb2d8a882f598116307987c2aa..06f8d8259f6d16b675003c068df708909f368e83 100644 (file)
@@ -22,14 +22,14 @@ phys_bytes *phys_addr;                      /* placeholder for result */
      * - In all other cases, should be a valid endpoint (neither ANY nor NONE).
      */
 
-    m.CP_SRC_ENDPT = proc_ep;
-    m.CP_DST_ENDPT = grantee;
-    m.UMAP_SEG = seg;
-    m.CP_SRC_ADDR = vir_addr;
-    m.CP_NR_BYTES = bytes;
+    m.m_lsys_krn_sys_umap.src_endpt = proc_ep;
+    m.m_lsys_krn_sys_umap.dst_endpt = grantee;
+    m.m_lsys_krn_sys_umap.segment = seg;
+    m.m_lsys_krn_sys_umap.src_addr = vir_addr;
+    m.m_lsys_krn_sys_umap.nr_bytes = bytes;
 
     result = _kernel_call(SYS_UMAP_REMOTE, &m);
-    *phys_addr = m.CP_DST_ADDR;
+    *phys_addr = m.m_krn_lsys_sys_umap.dst_addr;
     return(result);
 }
 
index e2e3ce467c7598de2818a9e429cf6db4a9b11032..c970ed0ec59590cf7ecfa48e771dc611e65bdf4f 100644 (file)
@@ -13,13 +13,13 @@ phys_bytes *phys_addr;                      /* placeholder for result */
     message m;
     int result;
 
-    m.CP_SRC_ENDPT = proc_ep;
-    m.UMAP_SEG = seg;
-    m.CP_SRC_ADDR = vir_addr;
-    m.CP_NR_BYTES = bytes;
+    m.m_lsys_krn_sys_umap.src_endpt = proc_ep;
+    m.m_lsys_krn_sys_umap.segment = seg;
+    m.m_lsys_krn_sys_umap.src_addr = vir_addr;
+    m.m_lsys_krn_sys_umap.nr_bytes = bytes;
 
     result = _kernel_call(SYS_UMAP, &m);
-    *phys_addr = m.CP_DST_ADDR;
+    *phys_addr = m.m_krn_lsys_sys_umap.dst_addr;
     return(result);
 }