1#include "sync/tests/test_internal.h"
2
3#include <asm.h>
4#include <sync/raw_spinlock.h>
5
6TEST_GROUP_DECLARE(raw_spinlock);
7
8TEST_DECLARE_UNIT(raw_spinlock, physical_operations) {
9 struct raw_spinlock lock = RAW_SPINLOCK_INIT;
10
11 raw_spin_lock(lock: &lock);
12 bool rejected_while_held = !raw_spin_trylock(lock: &lock);
13 raw_spin_unlock(lock: &lock);
14
15 bool acquired_after_release = raw_spin_trylock(lock: &lock);
16 raw_spin_unlock(lock: &lock);
17
18 TEST_ASSERT(rejected_while_held);
19 TEST_ASSERT(acquired_after_release);
20 return TEST_SUCCESS;
21}
22
23TEST_DECLARE_UNIT(raw_spinlock, irq_restore) {
24 struct raw_spinlock lock = RAW_SPINLOCK_INIT;
25 bool entry_irqs_enabled = are_interrupts_enabled();
26
27 bool saved_irqs_enabled = raw_spin_lock_irq_disable(lock: &lock);
28 bool disabled_while_held = !are_interrupts_enabled();
29 raw_spin_unlock_irq_restore(lock: &lock, irqs_were_enabled: saved_irqs_enabled);
30 bool restored_entry_state = are_interrupts_enabled() == entry_irqs_enabled;
31
32 disable_interrupts();
33 bool saved_disabled_state = raw_spin_lock_irq_disable(lock: &lock);
34 raw_spin_unlock_irq_restore(lock: &lock, irqs_were_enabled: saved_disabled_state);
35 bool remained_disabled = !are_interrupts_enabled();
36
37 if (entry_irqs_enabled)
38 enable_interrupts();
39
40 TEST_ASSERT_EQ(saved_irqs_enabled, entry_irqs_enabled);
41 TEST_ASSERT(disabled_while_held);
42 TEST_ASSERT(restored_entry_state);
43 TEST_ASSERT(!saved_disabled_state);
44 TEST_ASSERT(remained_disabled);
45 return TEST_SUCCESS;
46}
47