Skip to content

Commit

Permalink
arc: fix the bug of _arc_in_user_mode
Browse files Browse the repository at this point in the history
* add arc_utils.s to contain the arc util functions in assembly
* fix the bug in _arc_in_user_mode

Signed-off-by: Wayne Ren <[email protected]>
  • Loading branch information
Wayne Ren committed Jan 29, 2018
1 parent 8fd1785 commit 40dd168
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 28 deletions.
54 changes: 54 additions & 0 deletions arc/arc_util.s
Original file line number Diff line number Diff line change
@@ -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
5 changes: 5 additions & 0 deletions inc/arc/arc.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
28 changes: 0 additions & 28 deletions inc/arc/arc_builtin.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 40dd168

Please sign in to comment.