94 lines
2.7 KiB
ArmAsm
94 lines
2.7 KiB
ArmAsm
|
/* sections */
|
||
|
|
||
|
|
||
|
#include <minix/config.h>
|
||
|
#include <minix/const.h>
|
||
|
#include <machine/asm.h>
|
||
|
#include <machine/interrupt.h>
|
||
|
#include <machine/vm.h>
|
||
|
#include "archconst.h"
|
||
|
#include "kernel/const.h"
|
||
|
#include "sconst.h"
|
||
|
#include <machine/multiboot.h>
|
||
|
|
||
|
|
||
|
/*===========================================================================*/
|
||
|
/* copy_msg_from_user */
|
||
|
/*===========================================================================*/
|
||
|
/*
|
||
|
* int copy_msg_from_user(message * user_mbuf, message * dst);
|
||
|
*
|
||
|
* Copies a message of 36 bytes from user process space to a kernel buffer. This
|
||
|
* function assumes that the process address space is installed (cr3 loaded).
|
||
|
*
|
||
|
* This function from the callers point of view either succeeds or returns an
|
||
|
* error which gives the caller a chance to respond accordingly. In fact it
|
||
|
* either succeeds or if it generates a pagefault, general protection or other
|
||
|
* exception, the trap handler has to redirect the execution to
|
||
|
* __user_copy_msg_pointer_failure where the error is reported to the caller
|
||
|
* without resolving the pagefault. It is not kernel's problem to deal with
|
||
|
* wrong pointers from userspace and the caller should return an error to
|
||
|
* userspace as if wrong values or request were passed to the kernel
|
||
|
*/
|
||
|
ENTRY(copy_msg_from_user)
|
||
|
push {r4-r10, lr}
|
||
|
/* load the source pointer */
|
||
|
mov r9, r0
|
||
|
/* load the destination pointer */
|
||
|
mov r10, r1
|
||
|
/* do the copy */
|
||
|
ldm r9, {r0-r8}
|
||
|
stm r10, {r0-r8}
|
||
|
|
||
|
LABEL(__copy_msg_from_user_end)
|
||
|
pop {r4-r10, lr}
|
||
|
mov r0, #0
|
||
|
bx lr
|
||
|
|
||
|
/*===========================================================================*/
|
||
|
/* copy_msg_to_user */
|
||
|
/*===========================================================================*/
|
||
|
/*
|
||
|
* void copy_msg_to_user(message * src, message * user_mbuf);
|
||
|
*
|
||
|
* Copies a message of 36 bytes to user process space from a kernel buffer.
|
||
|
*
|
||
|
* All the other copy_msg_from_user() comments apply here as well!
|
||
|
*/
|
||
|
ENTRY(copy_msg_to_user)
|
||
|
push {r4-r10, lr}
|
||
|
/* load the source pointer */
|
||
|
mov r9, r0
|
||
|
/* load the destination pointer */
|
||
|
mov r10, r1
|
||
|
/* do the copy */
|
||
|
ldm r9, {r0-r8}
|
||
|
stm r10, {r0-r8}
|
||
|
|
||
|
LABEL(__copy_msg_to_user_end)
|
||
|
pop {r4-r10, lr}
|
||
|
mov r0, #0
|
||
|
bx lr
|
||
|
|
||
|
/*
|
||
|
* if a function from a selected set of copies from or to userspace fails, it is
|
||
|
* because of a wrong pointer supplied by the userspace. We have to clean up and
|
||
|
* and return -1 to indicated that something wrong has happend. The place it was
|
||
|
* called from has to handle this situation. The exception handler redirect us
|
||
|
* here to continue, clean up and report the error
|
||
|
*/
|
||
|
ENTRY(__user_copy_msg_pointer_failure)
|
||
|
pop {r4-r10, lr}
|
||
|
mov r0, #-1
|
||
|
bx lr
|
||
|
|
||
|
ENTRY(interrupts_enable)
|
||
|
dsb
|
||
|
cpsie i
|
||
|
bx lr
|
||
|
|
||
|
ENTRY(interrupts_disable)
|
||
|
dsb
|
||
|
cpsid i
|
||
|
bx lr
|