Skip to content

Commit 6ffbd5e

Browse files
committed
Add option to disable unprivileged critical sections
This commit introduces a new config configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS which enables developers to prevent critical sections from unprivileged tasks. It defaults to 1 for backward compatibility. Application should set it to 0 to disable critical sections from unprivileged tasks. Signed-off-by: Gaurav Aggarwal <aggarg@amazon.com>
1 parent 526be52 commit 6ffbd5e

File tree

4 files changed

+92
-8
lines changed

4 files changed

+92
-8
lines changed

portable/GCC/ARM_CM3_MPU/port.c

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@
5252
#define portNVIC_SYSTICK_CLK ( 0 )
5353
#endif
5454

55+
#ifndef configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS
56+
#warning "configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS is not defined. We recommend defining it to 0 in FreeRTOSConfig.h for better security."
57+
#define configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS 1
58+
#endif
59+
5560
/* Constants required to access and manipulate the NVIC. */
5661
#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) )
5762
#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) )
@@ -162,12 +167,20 @@ void vResetPrivilege( void ) __attribute__( ( naked ) );
162167
/**
163168
* @brief Enter critical section.
164169
*/
165-
void vPortEnterCritical( void ) FREERTOS_SYSTEM_CALL;
170+
#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 )
171+
void vPortEnterCritical( void ) FREERTOS_SYSTEM_CALL;
172+
#else
173+
void vPortEnterCritical( void ) PRIVILEGED_FUNCTION;
174+
#endif
166175

167176
/**
168177
* @brief Exit from critical section.
169178
*/
170-
void vPortExitCritical( void ) FREERTOS_SYSTEM_CALL;
179+
#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 )
180+
void vPortExitCritical( void ) FREERTOS_SYSTEM_CALL;
181+
#else
182+
void vPortExitCritical( void ) PRIVILEGED_FUNCTION;
183+
#endif
171184
/*-----------------------------------------------------------*/
172185

173186
/* Each task maintains its own interrupt status in the critical nesting
@@ -480,20 +493,26 @@ void vPortEndScheduler( void )
480493

481494
void vPortEnterCritical( void )
482495
{
496+
#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 )
483497
BaseType_t xRunningPrivileged;
484498
xPortRaisePrivilege( xRunningPrivileged );
499+
#endif
485500

486501
portDISABLE_INTERRUPTS();
487502
uxCriticalNesting++;
488503

504+
#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 )
489505
vPortResetPrivilege( xRunningPrivileged );
506+
#endif
490507
}
491508
/*-----------------------------------------------------------*/
492509

493510
void vPortExitCritical( void )
494511
{
512+
#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 )
495513
BaseType_t xRunningPrivileged;
496514
xPortRaisePrivilege( xRunningPrivileged );
515+
#endif
497516

498517
configASSERT( uxCriticalNesting );
499518
uxCriticalNesting--;
@@ -503,7 +522,9 @@ void vPortExitCritical( void )
503522
portENABLE_INTERRUPTS();
504523
}
505524

525+
#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 )
506526
vPortResetPrivilege( xRunningPrivileged );
527+
#endif
507528
}
508529
/*-----------------------------------------------------------*/
509530

portable/GCC/ARM_CM4_MPU/port.c

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,11 @@
5656
#define portNVIC_SYSTICK_CLK ( 0 )
5757
#endif
5858

59+
#ifndef configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS
60+
#warning "configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS is not defined. We recommend defining it to 0 in FreeRTOSConfig.h for better security."
61+
#define configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS 1
62+
#endif
63+
5964
/* Constants required to access and manipulate the NVIC. */
6065
#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) )
6166
#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) )
@@ -175,12 +180,20 @@ void vResetPrivilege( void ) __attribute__( ( naked ) );
175180
/**
176181
* @brief Enter critical section.
177182
*/
178-
void vPortEnterCritical( void ) FREERTOS_SYSTEM_CALL;
183+
#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 )
184+
void vPortEnterCritical( void ) FREERTOS_SYSTEM_CALL;
185+
#else
186+
void vPortEnterCritical( void ) PRIVILEGED_FUNCTION;
187+
#endif
179188

180189
/**
181190
* @brief Exit from critical section.
182191
*/
183-
void vPortExitCritical( void ) FREERTOS_SYSTEM_CALL;
192+
#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 )
193+
void vPortExitCritical( void ) FREERTOS_SYSTEM_CALL;
194+
#else
195+
void vPortExitCritical( void ) PRIVILEGED_FUNCTION;
196+
#endif
184197
/*-----------------------------------------------------------*/
185198

186199
/* Each task maintains its own interrupt status in the critical nesting
@@ -516,20 +529,26 @@ void vPortEndScheduler( void )
516529

517530
void vPortEnterCritical( void )
518531
{
532+
#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 )
519533
BaseType_t xRunningPrivileged;
520534
xPortRaisePrivilege( xRunningPrivileged );
535+
#endif
521536

522537
portDISABLE_INTERRUPTS();
523538
uxCriticalNesting++;
524539

540+
#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 )
525541
vPortResetPrivilege( xRunningPrivileged );
542+
#endif
526543
}
527544
/*-----------------------------------------------------------*/
528545

529546
void vPortExitCritical( void )
530547
{
548+
#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 )
531549
BaseType_t xRunningPrivileged;
532550
xPortRaisePrivilege( xRunningPrivileged );
551+
#endif
533552

534553
configASSERT( uxCriticalNesting );
535554
uxCriticalNesting--;
@@ -539,7 +558,9 @@ void vPortExitCritical( void )
539558
portENABLE_INTERRUPTS();
540559
}
541560

561+
#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 )
542562
vPortResetPrivilege( xRunningPrivileged );
563+
#endif
543564
}
544565
/*-----------------------------------------------------------*/
545566

portable/IAR/ARM_CM4F_MPU/port.c

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@
6363
#define portNVIC_SYSTICK_CLK_BIT ( 0 )
6464
#endif
6565

66+
#ifndef configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS
67+
#warning "configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS is not defined. We recommend defining it to 0 in FreeRTOSConfig.h for better security."
68+
#define configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS 1
69+
#endif
70+
6671
/* Constants required to manipulate the core. Registers first... */
6772
#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) )
6873
#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) )
@@ -188,12 +193,20 @@ extern void vPortRestoreContextOfFirstTask( void ) PRIVILEGED_FUNCTION;
188193
/**
189194
* @brief Enter critical section.
190195
*/
191-
void vPortEnterCritical( void ) FREERTOS_SYSTEM_CALL;
196+
#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 )
197+
void vPortEnterCritical( void ) FREERTOS_SYSTEM_CALL;
198+
#else
199+
void vPortEnterCritical( void ) PRIVILEGED_FUNCTION;
200+
#endif
192201

193202
/**
194203
* @brief Exit from critical section.
195204
*/
196-
void vPortExitCritical( void ) FREERTOS_SYSTEM_CALL;
205+
#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 )
206+
void vPortExitCritical( void ) FREERTOS_SYSTEM_CALL;
207+
#else
208+
void vPortExitCritical( void ) PRIVILEGED_FUNCTION;
209+
#endif
197210
/*-----------------------------------------------------------*/
198211

199212
/* Each task maintains its own interrupt status in the critical nesting
@@ -444,8 +457,10 @@ void vPortEndScheduler( void )
444457

445458
void vPortEnterCritical( void )
446459
{
460+
#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 )
447461
BaseType_t xRunningPrivileged;
448462
xPortRaisePrivilege( xRunningPrivileged );
463+
#endif
449464

450465
portDISABLE_INTERRUPTS();
451466
uxCriticalNesting++;
@@ -460,14 +475,18 @@ void vPortEnterCritical( void )
460475
configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );
461476
}
462477

478+
#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 )
463479
vPortResetPrivilege( xRunningPrivileged );
480+
#endif
464481
}
465482
/*-----------------------------------------------------------*/
466483

467484
void vPortExitCritical( void )
468485
{
486+
#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 )
469487
BaseType_t xRunningPrivileged;
470488
xPortRaisePrivilege( xRunningPrivileged );
489+
#endif
471490

472491
configASSERT( uxCriticalNesting );
473492

@@ -478,7 +497,9 @@ void vPortExitCritical( void )
478497
portENABLE_INTERRUPTS();
479498
}
480499

500+
#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 )
481501
vPortResetPrivilege( xRunningPrivileged );
502+
#endif
482503
}
483504
/*-----------------------------------------------------------*/
484505

portable/RVDS/ARM_CM4_MPU/port.c

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@
4545

4646
#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE
4747

48+
#ifndef configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS
49+
#warning "configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS is not defined. We recommend defining it to 0 in FreeRTOSConfig.h for better security."
50+
#define configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS 1
51+
#endif
52+
4853
/* Constants required to access and manipulate the NVIC. */
4954
#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) )
5055
#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) )
@@ -189,12 +194,20 @@ void vResetPrivilege( void );
189194
/**
190195
* @brief Enter critical section.
191196
*/
192-
void vPortEnterCritical( void ) FREERTOS_SYSTEM_CALL;
197+
#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 )
198+
void vPortEnterCritical( void ) FREERTOS_SYSTEM_CALL;
199+
#else
200+
void vPortEnterCritical( void ) PRIVILEGED_FUNCTION;
201+
#endif
193202

194203
/**
195204
* @brief Exit from critical section.
196205
*/
197-
void vPortExitCritical( void ) FREERTOS_SYSTEM_CALL;
206+
#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 )
207+
void vPortExitCritical( void ) FREERTOS_SYSTEM_CALL;
208+
#else
209+
void vPortExitCritical( void ) PRIVILEGED_FUNCTION;
210+
#endif
198211
/*-----------------------------------------------------------*/
199212

200213
/*
@@ -519,20 +532,26 @@ void vPortEndScheduler( void )
519532

520533
void vPortEnterCritical( void )
521534
{
535+
#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 )
522536
BaseType_t xRunningPrivileged;
523537
xPortRaisePrivilege( xRunningPrivileged );
538+
#endif
524539

525540
portDISABLE_INTERRUPTS();
526541
uxCriticalNesting++;
527542

543+
#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 )
528544
vPortResetPrivilege( xRunningPrivileged );
545+
#endif
529546
}
530547
/*-----------------------------------------------------------*/
531548

532549
void vPortExitCritical( void )
533550
{
551+
#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 )
534552
BaseType_t xRunningPrivileged;
535553
xPortRaisePrivilege( xRunningPrivileged );
554+
#endif
536555

537556
configASSERT( uxCriticalNesting );
538557
uxCriticalNesting--;
@@ -542,7 +561,9 @@ void vPortExitCritical( void )
542561
portENABLE_INTERRUPTS();
543562
}
544563

564+
#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 )
545565
vPortResetPrivilege( xRunningPrivileged );
566+
#endif
546567
}
547568
/*-----------------------------------------------------------*/
548569

0 commit comments

Comments
 (0)