xref: /optee_os/core/kernel/spin_lock_debug.c (revision ec8359423fe52f358a39c77c270fc231a81289e8)
1*ec835942SMarouene Boubakri // SPDX-License-Identifier: BSD-2-Clause
2*ec835942SMarouene Boubakri /*
3*ec835942SMarouene Boubakri  * Copyright (c) 2016, Linaro Limited
4*ec835942SMarouene Boubakri  */
5*ec835942SMarouene Boubakri 
6*ec835942SMarouene Boubakri #include <assert.h>
7*ec835942SMarouene Boubakri #include <compiler.h>
8*ec835942SMarouene Boubakri #include <kernel/spinlock.h>
9*ec835942SMarouene Boubakri 
spinlock_count_incr(void)10*ec835942SMarouene Boubakri void spinlock_count_incr(void)
11*ec835942SMarouene Boubakri {
12*ec835942SMarouene Boubakri 	struct thread_core_local *l = thread_get_core_local();
13*ec835942SMarouene Boubakri 
14*ec835942SMarouene Boubakri 	l->locked_count++;
15*ec835942SMarouene Boubakri 	assert(l->locked_count);
16*ec835942SMarouene Boubakri }
17*ec835942SMarouene Boubakri 
spinlock_count_decr(void)18*ec835942SMarouene Boubakri void spinlock_count_decr(void)
19*ec835942SMarouene Boubakri {
20*ec835942SMarouene Boubakri 	struct thread_core_local *l = thread_get_core_local();
21*ec835942SMarouene Boubakri 
22*ec835942SMarouene Boubakri 	assert(l->locked_count);
23*ec835942SMarouene Boubakri 	l->locked_count--;
24*ec835942SMarouene Boubakri }
25*ec835942SMarouene Boubakri 
have_spinlock(void)26*ec835942SMarouene Boubakri bool __nostackcheck have_spinlock(void)
27*ec835942SMarouene Boubakri {
28*ec835942SMarouene Boubakri 	struct thread_core_local *l;
29*ec835942SMarouene Boubakri 
30*ec835942SMarouene Boubakri 	if (!thread_foreign_intr_disabled()) {
31*ec835942SMarouene Boubakri 		/*
32*ec835942SMarouene Boubakri 		 * Normally we can't be holding a spinlock since doing so would
33*ec835942SMarouene Boubakri 		 * imply foreign interrupts are disabled (or the spinlock
34*ec835942SMarouene Boubakri 		 * logic is flawed).
35*ec835942SMarouene Boubakri 		 */
36*ec835942SMarouene Boubakri 		return false;
37*ec835942SMarouene Boubakri 	}
38*ec835942SMarouene Boubakri 
39*ec835942SMarouene Boubakri 	l = thread_get_core_local();
40*ec835942SMarouene Boubakri 
41*ec835942SMarouene Boubakri 	return !!l->locked_count;
42*ec835942SMarouene Boubakri }
43