Skip to content

Commit c754019

Browse files
wangzhi16xiaoxiang781216
authored andcommitted
Use small lock to protect resources related to irq in arch ARM.
Signed-off-by: wangzhi16 <[email protected]>
1 parent 919ed2e commit c754019

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+614
-237
lines changed

arch/arm/src/a1x/a1x_irq.c

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
#include <errno.h>
3232
#include <debug.h>
3333

34-
#include <nuttx/irq.h>
34+
#include <nuttx/spinlock.h>
3535
#include <nuttx/arch.h>
3636

3737
#include "arm_internal.h"
@@ -40,6 +40,12 @@
4040
#include "a1x_pio.h"
4141
#include "a1x_irq.h"
4242

43+
/****************************************************************************
44+
* Private Data
45+
****************************************************************************/
46+
47+
static spinlock_t g_irq_lock = SP_UNLOCKED;
48+
4349
/****************************************************************************
4450
* Private Functions
4551
****************************************************************************/
@@ -53,14 +59,10 @@
5359
****************************************************************************/
5460

5561
#if defined(CONFIG_DEBUG_IRQ_INFO)
56-
static void a1x_dumpintc(const char *msg, int irq)
62+
static void a1x_dumpintc_nolock(const char *msg, int irq)
5763
{
58-
irqstate_t flags;
59-
6064
/* Dump some relevant ARMv7 register contents */
6165

62-
flags = enter_critical_section();
63-
6466
irqinfo("ARMv7 (%s, irq=%d):\n", msg, irq);
6567
irqinfo(" CPSR: %08x SCTLR: %08x\n", flags, cp15_rdsctlr());
6668

@@ -95,10 +97,20 @@ static void a1x_dumpintc(const char *msg, int irq)
9597
getreg32(A1X_INTC_PRIO0), getreg32(A1X_INTC_PRIO1),
9698
getreg32(A1X_INTC_PRIO2), getreg32(A1X_INTC_PRIO3),
9799
getreg32(A1X_INTC_PRIO4));
100+
}
101+
102+
static void a1x_dumpintc(const char *msg, int irq)
103+
{
104+
irqstate_t flags;
105+
106+
flags = spin_lock_irqsave(&g_irq_lock);
107+
108+
a1x_dumpintc_nolock(msg, irq);
98109

99-
leave_critical_section(flags);
110+
spin_unlock_irqrestore(&g_irq_lock, flags);
100111
}
101112
#else
113+
# define a1x_dumpintc_nolock(msg, irq)
102114
# define a1x_dumpintc(msg, irq)
103115
#endif
104116

@@ -297,7 +309,7 @@ void up_disable_irq(int irq)
297309
{
298310
/* These operations must be atomic */
299311

300-
flags = enter_critical_section();
312+
flags = spin_lock_irqsave(&g_irq_lock);
301313

302314
/* Make sure that the interrupt is disabled. */
303315

@@ -313,8 +325,8 @@ void up_disable_irq(int irq)
313325
regval |= INTC_MASK(irq);
314326
putreg32(regval, regaddr);
315327

316-
a1x_dumpintc("disable", irq);
317-
leave_critical_section(flags);
328+
a1x_dumpintc_nolock("disable", irq);
329+
spin_unlock_irqrestore(&g_irq_lock, flags);
318330
}
319331

320332
#ifdef CONFIG_A1X_PIO_IRQ
@@ -345,7 +357,7 @@ void up_enable_irq(int irq)
345357
{
346358
/* These operations must be atomic */
347359

348-
flags = enter_critical_section();
360+
flags = spin_lock_irqsave(&g_irq_lock);
349361

350362
/* Make sure that the interrupt is enabled. */
351363

@@ -361,8 +373,8 @@ void up_enable_irq(int irq)
361373
regval &= ~INTC_MASK(irq);
362374
putreg32(regval, regaddr);
363375

364-
a1x_dumpintc("enable", irq);
365-
leave_critical_section(flags);
376+
a1x_dumpintc_nolock("enable", irq);
377+
spin_unlock_irqrestore(&g_irq_lock, flags);
366378
}
367379

368380
#ifdef CONFIG_A1X_PIO_IRQ
@@ -398,7 +410,7 @@ int up_prioritize_irq(int irq, int priority)
398410
{
399411
/* These operations must be atomic */
400412

401-
flags = enter_critical_section();
413+
flags = spin_lock_irqsave(&g_irq_lock);
402414

403415
/* Set the new priority */
404416

@@ -408,8 +420,8 @@ int up_prioritize_irq(int irq, int priority)
408420
regval |= INTC_PRIO(irq, priority);
409421
putreg32(regval, regaddr);
410422

411-
a1x_dumpintc("prioritize", irq);
412-
leave_critical_section(flags);
423+
a1x_dumpintc_nolock("prioritize", irq);
424+
spin_unlock_irqrestore(&g_irq_lock, flags);
413425
return OK;
414426
}
415427

arch/arm/src/am335x/am335x_irq.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,10 @@
4141
* Private Data
4242
****************************************************************************/
4343
#ifdef CONFIG_ARCH_IRQPRIO
44+
#if defined(CONFIG_DEBUG_IRQ_INFO)
4445
static spinlock_t g_irq_lock = SP_UNLOCKED;
4546
#endif
47+
#endif
4648

4749
/****************************************************************************
4850
* Public Data

arch/arm/src/at32/at32_irq.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
#include <assert.h>
3232
#include <debug.h>
3333

34-
#include <nuttx/irq.h>
34+
#include <nuttx/spinlock.h>
3535
#include <nuttx/arch.h>
3636
#include <arch/irq.h>
3737
#include <arch/armv7-m/nvicpri.h>
@@ -62,6 +62,14 @@
6262
#define NVIC_ENA_OFFSET (0)
6363
#define NVIC_CLRENA_OFFSET (NVIC_IRQ0_31_CLEAR - NVIC_IRQ0_31_ENABLE)
6464

65+
/****************************************************************************
66+
* Private Data
67+
****************************************************************************/
68+
69+
#if defined(CONFIG_DEBUG_IRQ_INFO)
70+
static spinlock_t g_irq_lock = SP_UNLOCKED;
71+
#endif
72+
6573
/****************************************************************************
6674
* Private Functions
6775
****************************************************************************/
@@ -79,7 +87,7 @@ static void at32_dumpnvic(const char *msg, int irq)
7987
{
8088
irqstate_t flags;
8189

82-
flags = enter_critical_section();
90+
flags = spin_lock_irqsave(&g_irq_lock);
8391

8492
irqinfo("NVIC (%s, irq=%d):\n", msg, irq);
8593
irqinfo(" INTCTRL: %08x VECTAB: %08x\n",
@@ -123,7 +131,7 @@ static void at32_dumpnvic(const char *msg, int irq)
123131
irqinfo(" %08x\n",
124132
getreg32(NVIC_IRQ64_67_PRIORITY));
125133

126-
leave_critical_section(flags);
134+
spin_unlock_irqrestore(&g_irq_lock, flags);
127135
}
128136
#else
129137
# define at32_dumpnvic(msg, irq)

arch/arm/src/efm32/efm32_gpioirq.c

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
#include <assert.h>
3232

3333
#include <nuttx/arch.h>
34-
#include <nuttx/irq.h>
34+
#include <nuttx/spinlock.h>
3535

3636
#include "arm_internal.h"
3737
#include "hardware/efm32_gpio.h"
@@ -44,6 +44,12 @@
4444
* Pre-processor Definitions
4545
****************************************************************************/
4646

47+
/****************************************************************************
48+
* Private Data
49+
****************************************************************************/
50+
51+
static spinlock_t g_gpioirq_lock = SP_UNLOCKED;
52+
4753
/****************************************************************************
4854
* Private Functions
4955
****************************************************************************/
@@ -198,7 +204,7 @@ void efm32_gpioirq(gpio_pinset_t pinset)
198204

199205
/* Make sure that the pin interrupt is disabled */
200206

201-
flags = enter_critical_section();
207+
flags = spin_lock_irqsave(&g_gpioirq_lock);
202208
regval = getreg32(EFM32_GPIO_IEN);
203209
regval &= ~bit;
204210
putreg32(regval, EFM32_GPIO_IEN);
@@ -248,7 +254,7 @@ void efm32_gpioirq(gpio_pinset_t pinset)
248254
}
249255

250256
putreg32(regval, EFM32_GPIO_EXTIFALL);
251-
leave_critical_section(flags);
257+
spin_unlock_irqrestore(&g_gpioirq_lock, flags);
252258
}
253259

254260
/****************************************************************************
@@ -270,11 +276,11 @@ void efm32_gpioirqenable(int irq)
270276
uint32_t regval;
271277
uint32_t bit;
272278
bit = ((uint32_t)1 << (irq - EFM32_IRQ_EXTI0));
273-
flags = enter_critical_section();
279+
flags = spin_lock_irqsave(&g_gpioirq_lock);
274280
regval = getreg32(EFM32_GPIO_IEN);
275281
regval |= bit;
276282
putreg32(regval, EFM32_GPIO_IEN);
277-
leave_critical_section(flags);
283+
spin_unlock_irqrestore(&g_gpioirq_lock, flags);
278284
#else
279285
bitband_set_peripheral(EFM32_GPIO_IEN, (irq - EFM32_IRQ_EXTI0), 1);
280286
#endif
@@ -301,11 +307,11 @@ void efm32_gpioirqdisable(int irq)
301307
uint32_t bit;
302308

303309
bit = ((uint32_t)1 << (irq - EFM32_IRQ_EXTI0));
304-
flags = enter_critical_section();
310+
flags = spin_lock_irqsave(&g_gpioirq_lock);
305311
regval = getreg32(EFM32_GPIO_IEN);
306312
regval &= ~bit;
307313
putreg32(regval, EFM32_GPIO_IEN);
308-
leave_critical_section(flags);
314+
spin_unlock_irqrestore(&g_gpioirq_lock, flags);
309315
#else
310316
bitband_set_peripheral(EFM32_GPIO_IEN, (irq - EFM32_IRQ_EXTI0), 0);
311317
#endif
@@ -332,11 +338,11 @@ void efm32_gpioirqclear(int irq)
332338
uint32_t bit;
333339

334340
bit = ((uint32_t)1 << (irq - EFM32_IRQ_EXTI0));
335-
flags = enter_critical_section();
341+
flags = spin_lock_irqsave(&g_gpioirq_lock);
336342
regval = getreg32(EFM32_GPIO_IFC);
337343
regval |= bit;
338344
putreg32(regval, EFM32_GPIO_IFC);
339-
leave_critical_section(flags);
345+
spin_unlock_irqrestore(&g_gpioirq_lock, flags);
340346
#else
341347
bitband_set_peripheral(EFM32_GPIO_IFC, (irq - EFM32_IRQ_EXTI0), 1);
342348
#endif

arch/arm/src/efm32/efm32_irq.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
#include <errno.h>
3232
#include <debug.h>
3333

34-
#include <nuttx/irq.h>
34+
#include <nuttx/spinlock.h>
3535
#include <nuttx/arch.h>
3636
#include <arch/armv7-m/nvicpri.h>
3737

@@ -61,6 +61,14 @@
6161
#define NVIC_ENA_OFFSET (0)
6262
#define NVIC_CLRENA_OFFSET (NVIC_IRQ0_31_CLEAR - NVIC_IRQ0_31_ENABLE)
6363

64+
/****************************************************************************
65+
* Private Data
66+
****************************************************************************/
67+
68+
#if defined(CONFIG_DEBUG_IRQ_INFO)
69+
static spinlock_t g_irq_lock = SP_UNLOCKED;
70+
#endif
71+
6472
/****************************************************************************
6573
* Private Function
6674
****************************************************************************/
@@ -78,7 +86,7 @@ static void efm32_dumpnvic(const char *msg, int irq)
7886
{
7987
irqstate_t flags;
8088

81-
flags = enter_critical_section();
89+
flags = spin_lock_irqsave(&g_irq_lock);
8290

8391
irqinfo("NVIC (%s, irq=%d):\n", msg, irq);
8492
irqinfo(" INTCTRL: %08x VECTAB: %08x\n",
@@ -126,7 +134,7 @@ static void efm32_dumpnvic(const char *msg, int irq)
126134
#endif
127135
#endif
128136

129-
leave_critical_section(flags);
137+
spin_unlock_irqrestore(&g_irq_lock, flags);
130138
}
131139
#else
132140
# define efm32_dumpnvic(msg, irq)

arch/arm/src/eoss3/eoss3_irq.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
#include <errno.h>
3232
#include <debug.h>
3333

34-
#include <nuttx/irq.h>
34+
#include <nuttx/spinlock.h>
3535
#include <nuttx/arch.h>
3636
#include <arch/armv7-m/nvicpri.h>
3737

@@ -60,6 +60,14 @@
6060
#define NVIC_ENA_OFFSET (0)
6161
#define NVIC_CLRENA_OFFSET (NVIC_IRQ0_31_CLEAR - NVIC_IRQ0_31_ENABLE)
6262

63+
/****************************************************************************
64+
* Private Data
65+
****************************************************************************/
66+
67+
#if defined(CONFIG_DEBUG_IRQ_INFO)
68+
static spinlock_t g_irq_lock = SP_UNLOCKED;
69+
#endif
70+
6371
/****************************************************************************
6472
* Private Functions
6573
****************************************************************************/
@@ -77,7 +85,7 @@ static void eoss3_dumpnvic(const char *msg, int irq)
7785
{
7886
irqstate_t flags;
7987

80-
flags = enter_critical_section();
88+
flags = spin_lock_irqsave(&g_irq_lock);
8189

8290
irqinfo("NVIC (%s, irq=%d):\n", msg, irq);
8391
irqinfo(" INTCTRL: %08x VECTAB: %08x\n",
@@ -107,7 +115,7 @@ static void eoss3_dumpnvic(const char *msg, int irq)
107115
getreg32(NVIC_IRQ24_27_PRIORITY),
108116
getreg32(NVIC_IRQ28_31_PRIORITY));
109117

110-
leave_critical_section(flags);
118+
spin_unlock_irqrestore(&g_irq_lock, flags);
111119
}
112120
#else
113121
# define eoss3_dumpnvic(msg, irq)

arch/arm/src/gd32f4/gd32f4xx_irq.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
#include <assert.h>
3232
#include <debug.h>
3333

34-
#include <nuttx/irq.h>
34+
#include <nuttx/spinlock.h>
3535
#include <nuttx/arch.h>
3636
#include <arch/irq.h>
3737
#include <arch/armv7-m/nvicpri.h>
@@ -62,6 +62,14 @@
6262
#define NVIC_ENA_OFFSET (0)
6363
#define NVIC_CLRENA_OFFSET (NVIC_IRQ0_31_CLEAR - NVIC_IRQ0_31_ENABLE)
6464

65+
/****************************************************************************
66+
* Private Data
67+
****************************************************************************/
68+
69+
#if defined(CONFIG_DEBUG_IRQ_INFO)
70+
static spinlock_t g_irq_lock = SP_UNLOCKED;
71+
#endif
72+
6573
/****************************************************************************
6674
* Private Functions
6775
****************************************************************************/
@@ -79,7 +87,7 @@ static void gd32_dumpnvic(const char *msg, int irq)
7987
{
8088
irqstate_t flags;
8189

82-
flags = enter_critical_section();
90+
flags = spin_lock_irqsave(&g_irq_lock);
8391

8492
irqinfo("NVIC (%s, irq=%d):\n", msg, irq);
8593
irqinfo(" INTCTRL: %08x VECTAB: %08x\n",
@@ -133,7 +141,7 @@ static void gd32_dumpnvic(const char *msg, int irq)
133141
getreg32(NVIC_IRQ92_95_PRIORITY));
134142
#endif
135143

136-
leave_critical_section(flags);
144+
spin_unlock_irqrestore(&g_irq_lock, flags);
137145
}
138146
#else
139147
# define gd32_dumpnvic(msg, irq)

0 commit comments

Comments
 (0)