Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

arm/armv7-a/r: set the default CPU mode to System #5734

Merged
merged 1 commit into from Mar 14, 2022

Conversation

anchao
Copy link
Contributor

@anchao anchao commented Mar 14, 2022

Summary

In SVC mode, the banked register will be inconsistent with the user mode register:

arch/arm/src/armv7-a/arm_vectors.S

 276   .globl  arm_syscall
 277   .globl  arm_vectorsvc
 278   .type arm_vectorsvc, %function
 279
 280 arm_vectorsvc:
...
 286   sub   sp, sp, #XCPTCONTEXT_SIZE        **// < SVC mode SP**
...
 308   stmia   r0, {r13, r14}^                **// < USR mode SP/LR**
...
[    2.200000] [ 4] [ ALERT] SYSCALL Entry: regs: 0x80202708 cmd: 4
[    2.200000] [ 4] [ ALERT]   R0: 00000004 80001229 00000001 80202018 00000000 00000000 00000000 802027d0
[    2.200000] [ 4] [ ALERT]   R8: 00000000 00000000 00000000 00000000 00000000 802027d0 1080f710 1080f710
[    2.200000] [ 4] [ ALERT] CPSR: 00000073
[    2.200000] [ 4] [ ALERT] SYSCALL Exit: regs: 0x80202708
[    2.200000] [ 4] [ ALERT]   R0: 1 80202018 1 80202018 0 0 0 802027d0
[    2.200000] [ 4] [ ALERT]   R8: 0 0 0 0 0 802027d0 1080f710 80001229
[    2.200000] [ 4] [ ALERT] CPSR: 00000070

SVC SP is 0x80202708
USR SP is 0x802027d0
0x802027d0 - 0x80202708 should be XCPTCONTEXT_SIZE

[    2.200000] [ 4] [ ALERT] SYSCALL Entry: regs: 0x80202708 cmd: 51
[    2.200000] [ 4] [ ALERT]   R0: 00000033 00000000 80202780 00000000 00000000 00000000 00000000 80202710
[    2.200000] [ 4] [ ALERT]   R8: 00000000 00000000 00000000 00000000 00000000 80202710 800039d5 800039b2
[    2.200000] [ 4] [ ALERT] CPSR: 00000070
[    2.200000] [ 4] [ ALERT] SYSCALL Exit: regs: 0x80202708
[    2.200000] [ 4] [ ALERT]   R0: 2b 0 80202780 0 0 0 0 80202710
[    2.200000] [ 4] [ ALERT]   R8: 0 0 0 0 0 10843d80 800039d5 10801425
[    2.200000] [ 4] [ ALERT] CPSR: 00000073

SVC SP is 0x80202708
USR SP is 0x80202710
SP overlap in SVC and USR mode

This commit change the default CPU mode to System and ensure the consistency of SP/LR in USR/SYS mode during syscall.

img_v2_b567d2d3-25c1-4807-bfc8-61be68f21ael

Signed-off-by: chao.an anchao@xiaomi.com

Impact

armv7-a/r: PSR_MODE_SVC -> PSR_MODE_SYS

Testing

sabre-6quad/netknsh (/mnt/nfs/bin/getprime)
sabre-6quad/smp(ostest)

arch/arm/src/armv7-r/arm_vectors.S Outdated Show resolved Hide resolved
arch/arm/src/armv7-a/arm_vectors.S Outdated Show resolved Hide resolved
arch/arm/src/armv7-a/arm_vectors.S Outdated Show resolved Hide resolved
arch/arm/src/arm/arm_vectors.S Outdated Show resolved Hide resolved
arch/arm/src/armv7-a/arm_vectors.S Outdated Show resolved Hide resolved
arch/arm/src/arm/arm_vectors.S Show resolved Hide resolved
arch/arm/src/arm/arm_vectors.S Outdated Show resolved Hide resolved
arch/arm/src/arm/arm_vectors.S Outdated Show resolved Hide resolved
In SVC mode, the banked register will be inconsistent with the user mode register:

arch/arm/src/armv7-a/arm_vectors.S

 276   .globl  arm_syscall
 277   .globl  arm_vectorsvc
 278   .type arm_vectorsvc, %function
 279
 280 arm_vectorsvc:
...
 286   sub   sp, sp, #XCPTCONTEXT_SIZE        // < SVC mode SP
...
 308   stmia   r0, {r13, r14}^                // < USR mode SP/LR
...

[    2.200000] [ 4] [ ALERT] SYSCALL Entry: regs: 0x80202708 cmd: 4
[    2.200000] [ 4] [ ALERT]   R0: 00000004 80001229 00000001 80202018 00000000 00000000 00000000 802027d0
[    2.200000] [ 4] [ ALERT]   R8: 00000000 00000000 00000000 00000000 00000000 802027d0 1080f710 1080f710
[    2.200000] [ 4] [ ALERT] CPSR: 00000073
[    2.200000] [ 4] [ ALERT] SYSCALL Exit: regs: 0x80202708
[    2.200000] [ 4] [ ALERT]   R0: 1 80202018 1 80202018 0 0 0 802027d0
[    2.200000] [ 4] [ ALERT]   R8: 0 0 0 0 0 802027d0 1080f710 80001229
[    2.200000] [ 4] [ ALERT] CPSR: 00000070

SVC SP is 0x80202708
USR SP is 0x802027d0
0x802027d0 - 0x80202708 should be XCPTCONTEXT_SIZE

[    2.200000] [ 4] [ ALERT] SYSCALL Entry: regs: 0x80202708 cmd: 51
[    2.200000] [ 4] [ ALERT]   R0: 00000033 00000000 80202780 00000000 00000000 00000000 00000000 80202710
[    2.200000] [ 4] [ ALERT]   R8: 00000000 00000000 00000000 00000000 00000000 80202710 800039d5 800039b2
[    2.200000] [ 4] [ ALERT] CPSR: 00000070
[    2.200000] [ 4] [ ALERT] SYSCALL Exit: regs: 0x80202708
[    2.200000] [ 4] [ ALERT]   R0: 2b 0 80202780 0 0 0 0 80202710
[    2.200000] [ 4] [ ALERT]   R8: 0 0 0 0 0 10843d80 800039d5 10801425
[    2.200000] [ 4] [ ALERT] CPSR: 00000073

SVC SP is 0x80202708
USR SP is 0x80202710
SP overlap in SVC and USR mode

This commit change the default CPU mode to System and ensure the consistency of SP/LR in USR/SYS mode during syscall.

Signed-off-by: chao.an <anchao@xiaomi.com>
Copy link
Contributor

@pkarashchenko pkarashchenko left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

@xiaoxiang781216
Copy link
Contributor

@masayuki2009 let's merge this patch?

@masayuki2009 masayuki2009 merged commit 7c02432 into apache:master Mar 14, 2022
@jerpelea jerpelea added this to To-Add in Release Notes - 10.3.0 Mar 15, 2022
@jerpelea jerpelea moved this from To-Add to In Progress in Release Notes - 10.3.0 Mar 17, 2022
@jerpelea jerpelea moved this from In Progress to added in Release Notes - 10.3.0 Mar 22, 2022
@masayuki2009
Copy link
Contributor

@xiaoxiang781216 @anchao

Did you test this PR with your Cortex-A-based boards?
I noticed that this PR does not work with the sabre-6quad dev board (QEMU works fine though)

@masayuki2009
Copy link
Contributor

@anchao

I noticed that this PR does not work with the sabre-6quad dev board (QEMU works fine though)

sabre-6quad:nsh dev board with debug build

ABDGHIJKPQ
[    0.000000] arm_prefetchabort: Prefetch abort. PC: 1080180c IFAR: 1080180c IFSR: 0000000d
[    0.000000] up_assert: Assertion failed at file:armv7-a/arm_prefetchabort.c line: 134 task: Idle Task
[    0.000000] arm_registerdump: R0: 00000000 R1: 00000000 R2: 00000000  R3: 00000000
[    0.000000] arm_registerdump: R4: 00000000 R5: 00000000 R6: 00000000  FP: 00000000
[    0.000000] arm_registerdump: R8: 00000000 SB: 00000000 SL: 00000000 R11: 00000000
[    0.000000] arm_registerdump: IP: 00000000 SP: 10824a38 LR: 00000000  PC: 1080180c
[    0.000000] arm_registerdump: CPSR: 00000010
[    0.000000] arm_dump_stack: IRQ Stack:
[    0.000000] arm_dump_stack: sp:     10824930
[    0.000000] arm_dump_stack:   base: 10820988
[    0.000000] arm_dump_stack:   size: 00000800
[    0.000000] arm_dump_stack: ERROR: IRQ Stack pointer is not within the stack
[    0.000000] arm_stackdump: 10820980: 00000000 deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 108209a0: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 108209c0: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 108209e0: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820a00: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820a20: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820a40: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820a60: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820a80: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820aa0: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820ac0: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820ae0: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820b00: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820b20: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820b40: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820b60: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820b80: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820ba0: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820bc0: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820be0: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820c00: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820c20: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820c40: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820c60: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820c80: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820ca0: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820cc0: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820ce0: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820d00: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820d20: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820d40: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820d60: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820d80: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820da0: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820dc0: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820de0: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820e00: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820e20: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820e40: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820e60: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820e80: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820ea0: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820ec0: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820ee0: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820f00: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820f20: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820f40: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820f60: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820f80: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820fa0: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820fc0: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10820fe0: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10821000: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10821020: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10821040: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10821060: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10821080: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 108210a0: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 108210c0: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 108210e0: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10821100: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10821120: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10821140: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10821160: deadbeef deadbeef 10823e68 108232a4 0000015f 10800b89 10821184 10800294
[    0.000000] arm_dump_stack: User Stack:
[    0.000000] arm_dump_stack: sp:     10824a38
[    0.000000] arm_dump_stack:   base: 10822fa8
[    0.000000] arm_dump_stack:   size: 000003e8
[    0.000000] arm_dump_stack: ERROR: User Stack pointer is not within the stack
[    0.000000] arm_stackdump: 10822fa0: 00000000 00000000 deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10822fc0: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10822fe0: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10823000: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10823020: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10823040: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10823060: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10823080: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 108230a0: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 108230c0: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 108230e0: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10823100: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10823120: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10823140: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10823160: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10823180: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 108231a0: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 108231c0: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 108231e0: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10823200: deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef deadbeef
[    0.000000] arm_stackdump: 10823220: deadbeef deadbeef 00000000 10823390 1082094a 00000000 10823d40 10801dfb
[    0.000000] arm_stackdump: 10823240: 00000006 00000000 00000000 10802ef1 00000000 10820138 00000010 1082329c
[    0.000000] arm_stackdump: 10823260: 00000000 108030f7 108232ac 00000010 00000000 10823390 1082094a 00000000
[    0.000000] arm_stackdump: 10823280: 10823d40 10801dfb 00000009 00000000 00000000 10802ef1 00000000 10820138
[    0.000000] arm_stackdump: 108232a0: 00000012 00000002 10821c0c 10823e68 10821c0c 10821b94 0000015f 10821d14
[    0.000000] arm_stackdump: 108232c0: 10821b8c 276006fc 00000000 275ffd3e 00000000 00000003 1082336c 10801365
[    0.000000] arm_stackdump: 108232e0: 10805724 000001ff 00000000 68736e00 69616d5f 0000006e 10824a40 1080d693
[    0.000000] arm_stackdump: 10823300: 00000000 10821b94 10824a40 108056d3 10824a40 0000015f 00000064 10801807
[    0.000000] arm_stackdump: 10823320: 10824d40 00000002 10824a40 10801487 00000800 10805979 00000000 00000000
[    0.000000] arm_stackdump: 10823340: 00000000 10821d04 10823df0 10821b94 10821d14 10821d14 10821b8c 108055af
[    0.000000] arm_stackdump: 10823360: 10821b94 0000015f 10821d14 10801365 10821b94 10821d04 10821d00 108011a7
[    0.000000] arm_showtasks:    PID    PRI      USED     STACK   FILLED    COMMAND
[    0.000000] arm_showtasks:   ----   ----        32      2048     1.5%    irq
[    0.000000] arm_dump_task:      0      0       360      1000    36.0%    Idle Task
[    0.000000] arm_dump_task:      1    192       620      2016    30.7%    hpwork
[    0.000000] arm_dump_task:      2    100         0      2024     0.0%    nsh_main

@anchao
Copy link
Contributor Author

anchao commented Mar 24, 2022

I noticed that this PR does not work with the sabre-6quad dev board (QEMU works fine though)

@masayuki2009 san,
I need some time to confirm this issue, I will reply you later.

@anchao
Copy link
Contributor Author

anchao commented Mar 28, 2022

I noticed that this PR does not work with the sabre-6quad dev board (QEMU works fine though)

@masayuki2009 san, I need some time to confirm this issue, I will reply you later.

@masayuki2009 san, could you plz try this PR?
#5896

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
No open projects
Development

Successfully merging this pull request may close these issues.

None yet

4 participants