Skip to content

Commit 40dd168

Browse files
author
Wayne Ren
committed
arc: fix the bug of _arc_in_user_mode
* 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 <wei.ren@synopsys.com>
1 parent 8fd1785 commit 40dd168

File tree

3 files changed

+59
-28
lines changed

3 files changed

+59
-28
lines changed

arc/arc_util.s

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/* ------------------------------------------
2+
* Copyright (c) 2017, Synopsys, Inc. All rights reserved.
3+
4+
* Redistribution and use in source and binary forms, with or without modification,
5+
* are permitted provided that the following conditions are met:
6+
7+
* 1) Redistributions of source code must retain the above copyright notice, this
8+
* list of conditions and the following disclaimer.
9+
10+
* 2) Redistributions in binary form must reproduce the above copyright notice,
11+
* this list of conditions and the following disclaimer in the documentation and/or
12+
* other materials provided with the distribution.
13+
14+
* 3) Neither the name of the Synopsys, Inc., nor the names of its contributors may
15+
* be used to endorse or promote products derived from this software without
16+
* specific prior written permission.
17+
18+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19+
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20+
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21+
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
22+
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24+
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
25+
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27+
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28+
*
29+
--------------------------------------------- */
30+
31+
#define __ASSEMBLY__
32+
#include "arc.h"
33+
#include "arc_asm_common.h"
34+
35+
.file "arc_utils.s"
36+
37+
.text
38+
.global _arc_in_user_mode
39+
.align 4
40+
_arc_in_user_mode:
41+
lr r0, [AUX_STATUS32]
42+
bbit1 r0, 20, 1f
43+
bset r1, r0, 20
44+
bclr r1, r1, 31
45+
kflag r1
46+
lr r1, [AUX_STATUS32]
47+
bbit0 r1, 20, 2f
48+
kflag r0
49+
1:
50+
j_s.d [blink]
51+
mov r0, 0
52+
2:
53+
j_s.d [blink]
54+
mov r0, 1

inc/arc/arc.h

+5
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,11 @@ extern "C" {
473473

474474
#ifndef __ASSEMBLY__
475475
/* add type definition and function declaration here */
476+
/**
477+
* \brief check whether process is in user mode
478+
* \retval 0 kernel mode, 1 user mode
479+
*/
480+
extern unsigned int _arc_in_user_mode(void);
476481
#endif /* assembly */
477482

478483
#ifdef __cplusplus

inc/arc/arc_builtin.h

-28
Original file line numberDiff line numberDiff line change
@@ -292,34 +292,6 @@ Inline int32_t _arc_goto_main(int argc, char **argv) {
292292
return (int32_t)__ret;
293293
}
294294

295-
296-
/**
297-
* \brief check whether process is in user mode
298-
* \retval 0 kernel mode, 1 user mode
299-
*/
300-
Inline uint32_t _arc_in_user_mode(void)
301-
{
302-
uint32_t __ret;
303-
uint32_t __val = 0;
304-
305-
Asm(
306-
"lr %0,[0xa]\n"
307-
"bbit1 %0,20,1f\n" /* STATUS32.US == 1 implies Kernel mode */
308-
"bset %1,%0,20\n" /* set the US bit */
309-
"bclr %1,%0,31\n" /* clear the IE bit (no preemption) */
310-
"kflag %1\n" /* attempt to set US to 1 and IE to 0 */
311-
"lr %1,[0xa]\n"
312-
"bbit0 %1,20,2f\n" /* STATUS32.US == 0 implies User mode */
313-
"kflag %0\n" /* Kernel mode, restore STATUS32.[US,IE] */
314-
"1:\n"
315-
"mov %0,0\n" /* return 0 (not in User mode) */
316-
"2:\n"
317-
"mov %0,1\n" /* return 1 (in User mode) */
318-
: "=r"(__ret):"r"(__val));
319-
return __ret;
320-
}
321-
322-
323295
#ifdef __cplusplus
324296
}
325297
#endif

0 commit comments

Comments
 (0)