arch: use up_current_regs/up_set_current_regs replace CURRENT_REGS

reason:
1 On different architectures, we can utilize more optimized strategies
  to implement up_current_regs/up_set_current_regs.
eg. use interrupt registersor percpu registers.

code size
before
    text    data     bss     dec     hex filename
 262848   49985   63893  376726   5bf96 nuttx

after
       text    data     bss     dec     hex filename
 262844   49985   63893  376722   5bf92 nuttx

size change -4

Configuring NuttX and compile:
$ ./tools/configure.sh -l qemu-armv8a:nsh_smp
$ make
Running with qemu
$ qemu-system-aarch64 -cpu cortex-a53 -smp 4 -nographic \
   -machine virt,virtualization=on,gic-version=3 \
   -net none -chardev stdio,id=con,mux=on -serial chardev:con \
   -mon chardev=con,mode=readline -kernel ./nuttx

Signed-off-by: hujun5 <hujun5@xiaomi.com>
This commit is contained in:
hujun5
2024-09-13 10:57:38 +08:00
committed by Xiang Xiao
parent 222840e135
commit 908df725ad
207 changed files with 1304 additions and 1134 deletions
@@ -370,7 +370,7 @@ void board_crashdump(uintptr_t sp, struct tcb_s *tcb,
* fault.
*/
pdump->info.current_regs = (uintptr_t) g_current_regs;
pdump->info.current_regs = (uintptr_t)up_current_regs();
/* Save Context */
@@ -385,12 +385,12 @@ void board_crashdump(uintptr_t sp, struct tcb_s *tcb,
* the users context
*/
if (g_current_regs)
if (up_current_regs())
{
pdump->info.stacks.interrupt.sp = sp;
pdump->info.flags |= (REGS_PRESENT | USERSTACK_PRESENT | \
pdump->info.flags |= (REGS_PRESENT | USERSTACK_PRESENT |
INTSTACK_PRESENT);
memcpy((uint8_t *)pdump->info.regs, (void *)g_current_regs,
memcpy((uint8_t *)pdump->info.regs, up_current_regs(),
sizeof(pdump->info.regs));
pdump->info.stacks.user.sp = pdump->info.regs[REG_SP];
}
@@ -368,7 +368,7 @@ void board_crashdump(uintptr_t sp, struct tcb_s *tcb,
* fault.
*/
pdump->info.current_regs = (uintptr_t) g_current_regs;
pdump->info.current_regs = (uintptr_t)up_current_regs();
/* Save Context */
@@ -383,12 +383,12 @@ void board_crashdump(uintptr_t sp, struct tcb_s *tcb,
* the users context
*/
if (g_current_regs)
if (up_current_regs())
{
pdump->info.stacks.interrupt.sp = sp;
pdump->info.flags |= (REGS_PRESENT | USERSTACK_PRESENT | \
pdump->info.flags |= (REGS_PRESENT | USERSTACK_PRESENT |
INTSTACK_PRESENT);
memcpy((uint8_t *)pdump->info.regs, (void *)g_current_regs,
memcpy((uint8_t *)pdump->info.regs, up_current_regs(),
sizeof(pdump->info.regs));
pdump->info.stacks.user.sp = pdump->info.regs[REG_SP];
}