mirror of
				https://github.com/espressif/esp-idf.git
				synced 2025-10-31 04:59:55 +00:00 
			
		
		
		
	 66fb5a29bb
			
		
	
	66fb5a29bb
	
	
	
		
			
			Apply the pre-commit hook whitespace fixes to all files in the repo. (Line endings, blank lines at end of file, trailing whitespace)
		
			
				
	
	
		
			45 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			45 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include "sdkconfig.h"
 | |
| #include "unity.h"
 | |
| #include "esp_intr_alloc.h"
 | |
| 
 | |
| #if defined(__XTENSA__) && CONFIG_FREERTOS_CORETIMER_0
 | |
| #include "xtensa/config/core-isa.h"
 | |
| #include "xtensa/hal.h"
 | |
| #if defined(XCHAL_HAVE_WINDOWED)
 | |
| /* Regression test for a0 register being corrupted in _xt_context_save.
 | |
|  *
 | |
|  * The idea in this test is to have a function which recursively calls itself
 | |
|  * with call4, eventually filling up all the register windows. At that point,
 | |
|  * it does some lengthy operation. If an interrupt occurs at that point, and
 | |
|  * corrupts a0 register of one of the windows, this will cause an exception
 | |
|  * when the recursive function returns.
 | |
|  */
 | |
| 
 | |
| 
 | |
| /* See test_context_save_clober_func.S */
 | |
| extern void test_context_save_clober_func(void);
 | |
| 
 | |
| static void int_timer_handler(void *arg)
 | |
| {
 | |
|     xthal_set_ccompare(1, xthal_get_ccount() + 10000);
 | |
|     (*(int*) arg)++;
 | |
| }
 | |
| 
 | |
| TEST_CASE("context save doesn't corrupt return address register", "[freertos]")
 | |
| {
 | |
|     /* set up an interrupt */
 | |
|     intr_handle_t ih;
 | |
|     int int_triggered = 0;
 | |
|     TEST_ESP_OK(esp_intr_alloc(ETS_INTERNAL_TIMER1_INTR_SOURCE, 0, int_timer_handler, &int_triggered, &ih));
 | |
|     xthal_set_ccompare(1, xthal_get_ccount() + 10000);
 | |
| 
 | |
|     /* fill all the windows and delay a bit, waiting for an interrupt to happen */
 | |
|     test_context_save_clober_func();
 | |
| 
 | |
|     esp_intr_free(ih);
 | |
|     TEST_ASSERT_GREATER_THAN(0, int_triggered);
 | |
| }
 | |
| 
 | |
| #endif // XCHAL_HAVE_WINDOWED
 | |
| #endif // __XTENSA__ && CONFIG_FREERTOS_CORETIMER_0
 |