diff options
| author | guo <[email protected]> | 2022-12-03 12:07:44 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2022-12-03 12:07:44 +0800 |
| commit | ecf2d8215961ca7c539132b62a72df6072cc3e14 (patch) | |
| tree | 59005f0f74f2593c0435059264f624c862a89f55 /src/cpu.c | |
| parent | aaf5462c6d4ae9466a0a8cd2a4bb00cfe1fef2f2 (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.c | 28 |
1 files changed, 26 insertions, 2 deletions
@@ -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 */ |
