summaryrefslogtreecommitdiff
path: root/src/cpu.c
diff options
context:
space:
mode:
authorguo <[email protected]>2022-12-03 12:07:44 +0800
committerGitHub <[email protected]>2022-12-03 12:07:44 +0800
commitecf2d8215961ca7c539132b62a72df6072cc3e14 (patch)
tree59005f0f74f2593c0435059264f624c862a89f55 /src/cpu.c
parentaaf5462c6d4ae9466a0a8cd2a4bb00cfe1fef2f2 (diff)
sync branch rt-smart. (#6641)
* Synchronize the code of the rt mart branch to the master branch. * TTY device * Add lwP code from rt-smart * Add vnode in DFS, but DFS will be re-write for rt-smart * There are three libcpu for rt-smart: * arm/cortex-a, arm/aarch64 * riscv64 Co-authored-by: Rbb666 <[email protected]> Co-authored-by: zhkag <[email protected]>
Diffstat (limited to 'src/cpu.c')
-rw-r--r--src/cpu.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/src/cpu.c b/src/cpu.c
index 2371ec2e5b..5ac6ce82ca 100644
--- a/src/cpu.c
+++ b/src/cpu.c
@@ -10,6 +10,10 @@
#include <rthw.h>
#include <rtthread.h>
+#ifdef RT_USING_USERSPACE
+#include <lwp.h>
+#endif
+
#ifdef RT_USING_SMP
static struct rt_cpu _cpus[RT_CPUS_NR];
rt_hw_spinlock_t _cpus_lock;
@@ -64,6 +68,7 @@ static void _cpu_preempt_enable(void)
/* enable interrupt */
rt_hw_local_irq_enable(level);
}
+#endif /* RT_USING_SMP */
/**
* @brief Initialize a static spinlock object.
@@ -72,7 +77,9 @@ static void _cpu_preempt_enable(void)
*/
void rt_spin_lock_init(struct rt_spinlock *lock)
{
+#ifdef RT_USING_SMP
rt_hw_spin_lock_init(&lock->lock);
+#endif
}
RTM_EXPORT(rt_spin_lock_init)
@@ -86,8 +93,12 @@ RTM_EXPORT(rt_spin_lock_init)
*/
void rt_spin_lock(struct rt_spinlock *lock)
{
+#ifdef RT_USING_SMP
_cpu_preempt_disable();
rt_hw_spin_lock(&lock->lock);
+#else
+ rt_enter_critical();
+#endif
}
RTM_EXPORT(rt_spin_lock)
@@ -98,8 +109,12 @@ RTM_EXPORT(rt_spin_lock)
*/
void rt_spin_unlock(struct rt_spinlock *lock)
{
+#ifdef RT_USING_SMP
rt_hw_spin_unlock(&lock->lock);
_cpu_preempt_enable();
+#else
+ rt_exit_critical();
+#endif
}
RTM_EXPORT(rt_spin_unlock)
@@ -115,6 +130,7 @@ RTM_EXPORT(rt_spin_unlock)
*/
rt_base_t rt_spin_lock_irqsave(struct rt_spinlock *lock)
{
+#ifdef RT_USING_SMP
unsigned long level;
_cpu_preempt_disable();
@@ -123,6 +139,9 @@ rt_base_t rt_spin_lock_irqsave(struct rt_spinlock *lock)
rt_hw_spin_lock(&lock->lock);
return level;
+#else
+ return rt_hw_interrupt_disable();
+#endif
}
RTM_EXPORT(rt_spin_lock_irqsave)
@@ -135,10 +154,14 @@ RTM_EXPORT(rt_spin_lock_irqsave)
*/
void rt_spin_unlock_irqrestore(struct rt_spinlock *lock, rt_base_t level)
{
+#ifdef RT_USING_SMP
rt_hw_spin_unlock(&lock->lock);
rt_hw_local_irq_enable(level);
_cpu_preempt_enable();
+#else
+ rt_hw_interrupt_enable(level);
+#endif
}
RTM_EXPORT(rt_spin_unlock_irqrestore)
@@ -223,6 +246,9 @@ void rt_cpus_lock_status_restore(struct rt_thread *thread)
{
struct rt_cpu* pcpu = rt_cpu_self();
+#ifdef RT_USING_USERSPACE
+ lwp_mmu_switch(thread);
+#endif
pcpu->current_thread = thread;
if (!thread->cpus_lock_nest)
{
@@ -230,5 +256,3 @@ void rt_cpus_lock_status_restore(struct rt_thread *thread)
}
}
RTM_EXPORT(rt_cpus_lock_status_restore);
-
-#endif /* RT_USING_SMP */