mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2025-01-25 19:27:22 +08:00
9a27de92ae
This patch optimizes the user-space context handling in the ARM64 architecture, specifically improving how the context is saved and restored during system calls and interrupts. The changes make the code more efficient and easier to maintain, while ensuring proper preservation of user context during system transitions. Changes: - Introduced a parameter for context saving to improve flexibility. - Replaced hardcoded stack pointer operations with frame-relative references for better readability and code reuse. - Simplified context restoration, removing redundant operations like loading/storing floating-point registers. Signed-off-by: Shell <smokewood@qq.com>
62 lines
1.2 KiB
ArmAsm
62 lines
1.2 KiB
ArmAsm
/*
|
|
* Copyright (c) 2006-2020, RT-Thread Development Team
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*
|
|
* Change Logs:
|
|
* Date Author Notes
|
|
* 2024-03-28 Shell Move vector handling codes from context_gcc.S
|
|
*/
|
|
|
|
#ifndef __ASSEMBLY__
|
|
#define __ASSEMBLY__
|
|
#endif
|
|
|
|
#include "../include/vector_gcc.h"
|
|
#include "context_gcc.h"
|
|
|
|
#include <rtconfig.h>
|
|
#include <asm-generic.h>
|
|
#include <asm-fpu.h>
|
|
#include <armv8.h>
|
|
|
|
.section .text
|
|
|
|
vector_fiq:
|
|
.align 8
|
|
.globl vector_fiq
|
|
|
|
SAVE_IRQ_CONTEXT
|
|
bl rt_hw_trap_fiq
|
|
|
|
b rt_hw_irq_exit
|
|
|
|
.globl rt_thread_switch_interrupt_flag
|
|
.globl rt_hw_context_switch_interrupt_do
|
|
|
|
/**
|
|
* void rt_hw_vector_irq_sched(void *eframe)
|
|
* @brief do IRQ scheduling
|
|
*/
|
|
rt_hw_vector_irq_sched:
|
|
.globl rt_hw_vector_irq_sched
|
|
.align 8
|
|
|
|
/**
|
|
* if rt_thread_switch_interrupt_flag set, jump to
|
|
* rt_hw_context_switch_interrupt_do and don't return
|
|
*/
|
|
ldr x1, =rt_thread_switch_interrupt_flag
|
|
ldr x2, [x1]
|
|
cmp x2, #1
|
|
bne 1f
|
|
|
|
/* clear flag */
|
|
mov x2, #0
|
|
str x2, [x1]
|
|
|
|
bl rt_hw_context_switch_interrupt_do
|
|
|
|
1:
|
|
b rt_hw_irq_exit
|