minix/kernel/arch/earm/klib.S
Lionel Sambuc b1c4ba4ab6 ARM updates
Due to the ABI we are using we have to use the earm architecture
moniker for the build system to behave correctly. This involves
then some headers to move around.

There is also a few related Makefile updates as well as minor
source code corrections.
2013-01-17 10:03:58 +01:00

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