minix/kernel/arch/earm/klib.S
Lionel Sambuc b36292e232 ARM: Fix interrupt management
Interrupts where not correctly masked while in kernel, which
breaks one of the current main assumptions.

Also remove some duplication on ARM asm files, and add a function
to check the status of ARM irqs (not compiled by default)

Change-Id: I3c25d2b388f93fd8fe423998b94b3c4f140ba831
2013-02-18 09:07:55 +01:00

95 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(intr_enable)
ENTRY(interrupts_enable)
dsb
cpsie if
bx lr
ENTRY(intr_disable)
ENTRY(interrupts_disable)
dsb
cpsid if
bx lr