diff --git a/arc/arc_util.s b/arc/arc_util.s new file mode 100644 index 000000000..488c8f31d --- /dev/null +++ b/arc/arc_util.s @@ -0,0 +1,54 @@ +/* ------------------------------------------ + * Copyright (c) 2017, Synopsys, Inc. All rights reserved. + + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + + * 1) Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * 2) Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + + * 3) Neither the name of the Synopsys, Inc., nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * +--------------------------------------------- */ + +#define __ASSEMBLY__ +#include "arc.h" +#include "arc_asm_common.h" + + .file "arc_utils.s" + + .text + .global _arc_in_user_mode + .align 4 +_arc_in_user_mode: + lr r0, [AUX_STATUS32] + bbit1 r0, 20, 1f + bset r1, r0, 20 + bclr r1, r1, 31 + kflag r1 + lr r1, [AUX_STATUS32] + bbit0 r1, 20, 2f + kflag r0 +1: + j_s.d [blink] + mov r0, 0 +2: + j_s.d [blink] + mov r0, 1 diff --git a/inc/arc/arc.h b/inc/arc/arc.h index a0bacdbe7..871a76d99 100644 --- a/inc/arc/arc.h +++ b/inc/arc/arc.h @@ -473,6 +473,11 @@ extern "C" { #ifndef __ASSEMBLY__ /* add type definition and function declaration here */ +/** + * \brief check whether process is in user mode + * \retval 0 kernel mode, 1 user mode + */ +extern unsigned int _arc_in_user_mode(void); #endif /* assembly */ #ifdef __cplusplus diff --git a/inc/arc/arc_builtin.h b/inc/arc/arc_builtin.h index f6ac1ed70..a2df589ad 100644 --- a/inc/arc/arc_builtin.h +++ b/inc/arc/arc_builtin.h @@ -292,34 +292,6 @@ Inline int32_t _arc_goto_main(int argc, char **argv) { return (int32_t)__ret; } - -/** - * \brief check whether process is in user mode - * \retval 0 kernel mode, 1 user mode - */ -Inline uint32_t _arc_in_user_mode(void) -{ - uint32_t __ret; - uint32_t __val = 0; - - Asm( - "lr %0,[0xa]\n" - "bbit1 %0,20,1f\n" /* STATUS32.US == 1 implies Kernel mode */ - "bset %1,%0,20\n" /* set the US bit */ - "bclr %1,%0,31\n" /* clear the IE bit (no preemption) */ - "kflag %1\n" /* attempt to set US to 1 and IE to 0 */ - "lr %1,[0xa]\n" - "bbit0 %1,20,2f\n" /* STATUS32.US == 0 implies User mode */ - "kflag %0\n" /* Kernel mode, restore STATUS32.[US,IE] */ - "1:\n" - "mov %0,0\n" /* return 0 (not in User mode) */ - "2:\n" - "mov %0,1\n" /* return 1 (in User mode) */ - : "=r"(__ret):"r"(__val)); - return __ret; -} - - #ifdef __cplusplus } #endif