]> Zhao Yanbai Git Server - minix.git/commitdiff
Kernel: introduce vm_check_range
authorDavid van Moolenbroek <david@minix3.org>
Sun, 8 Jan 2012 23:38:29 +0000 (00:38 +0100)
committerDavid van Moolenbroek <david@minix3.org>
Sat, 24 Mar 2012 18:51:13 +0000 (19:51 +0100)
kernel/arch/i386/memory.c
kernel/proto.h

index 9fceb45aca4a6d272a8af59db28a4b4b4aa49e0c..ba369bcb4ee43261ec576aaeb774ed4c5006c802 100644 (file)
@@ -531,6 +531,34 @@ PRIVATE void vm_suspend(struct proc *caller, const struct proc *target,
        vmrequest = caller;
 }
 
+/*===========================================================================*
+ *                             vm_check_range                               *
+ *===========================================================================*/
+PUBLIC int vm_check_range(struct proc *caller, struct proc *target,
+       vir_bytes vir_addr, size_t bytes)
+{
+       /* Public interface to vm_suspend(), for use by kernel calls. On behalf
+        * of 'caller', call into VM to check linear virtual address range of
+        * process 'target', starting at 'vir_addr', for 'bytes' bytes. This
+        * function assumes that it will called twice if VM returned an error
+        * the first time (since nothing has changed in that case), and will
+        * then return the error code resulting from the first call. Upon the
+        * first call, a non-success error code is returned as well.
+        */
+       int r;
+
+       if (!vm_running)
+               return EFAULT;
+
+       if ((caller->p_misc_flags & MF_KCALL_RESUME) &&
+                       (r = caller->p_vmrequest.vmresult) != OK)
+               return r;
+
+       vm_suspend(caller, target, vir_addr, bytes, VMSTYPE_KERNELCALL);
+
+       return VMSUSPEND;
+}
+
 /*===========================================================================*
  *                              delivermsg                                *
  *===========================================================================*/
index 4ba3328b38e0b97dd94d725c0926a718f1957d6f..764341e7451d0df3590cf9ee1fcbd71bdc895cad 100644 (file)
@@ -211,6 +211,8 @@ _PROTOTYPE( void proc_stacktrace, (struct proc *proc)                );
 _PROTOTYPE( int vm_lookup, (const struct proc *proc, vir_bytes virtual, phys_bytes *result, u32_t *ptent));
 _PROTOTYPE( size_t vm_lookup_range, (const struct proc *proc,
        vir_bytes vir_addr, phys_bytes *phys_addr, size_t bytes)        );
+_PROTOTYPE( int vm_check_range, (struct proc *caller,
+       struct proc *target, vir_bytes vir_addr, size_t bytes)          );
 _PROTOTYPE( void delivermsg, (struct proc *target));
 _PROTOTYPE( void arch_do_syscall, (struct proc *proc)                  );
 _PROTOTYPE( int arch_phys_map, (int index, phys_bytes *addr,