Kernel: introduce vm_check_range
This commit is contained in:
parent
08af3f672b
commit
2a395dd8b4
2 changed files with 30 additions and 0 deletions
|
@ -531,6 +531,34 @@ PRIVATE void vm_suspend(struct proc *caller, const struct proc *target,
|
||||||
vmrequest = caller;
|
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 *
|
* delivermsg *
|
||||||
*===========================================================================*/
|
*===========================================================================*/
|
||||||
|
|
|
@ -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( 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,
|
_PROTOTYPE( size_t vm_lookup_range, (const struct proc *proc,
|
||||||
vir_bytes vir_addr, phys_bytes *phys_addr, size_t bytes) );
|
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 delivermsg, (struct proc *target));
|
||||||
_PROTOTYPE( void arch_do_syscall, (struct proc *proc) );
|
_PROTOTYPE( void arch_do_syscall, (struct proc *proc) );
|
||||||
_PROTOTYPE( int arch_phys_map, (int index, phys_bytes *addr,
|
_PROTOTYPE( int arch_phys_map, (int index, phys_bytes *addr,
|
||||||
|
|
Loading…
Reference in a new issue