test_cache_disabled.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <freertos/FreeRTOS.h>
  5. #include <freertos/task.h>
  6. #include <freertos/semphr.h>
  7. #include <unity.h>
  8. #include <esp_spi_flash.h>
  9. #include <esp_attr.h>
  10. #include <esp_flash_encrypt.h>
  11. #include "../cache_utils.h"
  12. static QueueHandle_t result_queue;
  13. static IRAM_ATTR void cache_test_task(void *arg)
  14. {
  15. bool do_disable = (bool)arg;
  16. bool result;
  17. if(do_disable) {
  18. spi_flash_disable_interrupts_caches_and_other_cpu();
  19. }
  20. result = spi_flash_cache_enabled();
  21. if (do_disable) {
  22. spi_flash_enable_interrupts_caches_and_other_cpu();
  23. }
  24. TEST_ASSERT( xQueueSendToBack(result_queue, &result, 0) );
  25. vTaskDelete(NULL);
  26. }
  27. TEST_CASE("spi_flash_cache_enabled() works on both CPUs", "[spi_flash][esp_flash]")
  28. {
  29. result_queue = xQueueCreate(1, sizeof(bool));
  30. for(int cpu = 0; cpu < portNUM_PROCESSORS; cpu++) {
  31. for(int disable = 0; disable <= 1; disable++) {
  32. bool do_disable = disable;
  33. bool result;
  34. printf("Testing cpu %d disabled %d\n", cpu, do_disable);
  35. xTaskCreatePinnedToCore(cache_test_task, "cache_check_task",
  36. 2048, (void *)do_disable, configMAX_PRIORITIES-1, NULL, cpu);
  37. TEST_ASSERT( xQueueReceive(result_queue, &result, 2) );
  38. TEST_ASSERT_EQUAL(!do_disable, result);
  39. }
  40. }
  41. vQueueDelete(result_queue);
  42. }
  43. static const uint32_t s_in_rodata[] = { 0x12345678, 0xfedcba98 };
  44. static void IRAM_ATTR cache_access_test_func(void* arg)
  45. {
  46. spi_flash_disable_interrupts_caches_and_other_cpu();
  47. volatile uint32_t* src = (volatile uint32_t*) s_in_rodata;
  48. uint32_t v1 = src[0];
  49. uint32_t v2 = src[1];
  50. bool cache_enabled = spi_flash_cache_enabled();
  51. spi_flash_enable_interrupts_caches_and_other_cpu();
  52. printf("%d %x %x\n", cache_enabled, v1, v2);
  53. vTaskDelete(NULL);
  54. }
  55. // These tests works properly if they resets the chip with the
  56. // "Cache disabled but cached memory region accessed" reason and the correct CPU is logged.
  57. TEST_CASE("invalid access to cache raises panic (PRO CPU)", "[spi_flash][ignore]")
  58. {
  59. xTaskCreatePinnedToCore(&cache_access_test_func, "ia", 2048, NULL, 5, NULL, 0);
  60. vTaskDelay(1000/portTICK_PERIOD_MS);
  61. }
  62. #ifndef CONFIG_FREERTOS_UNICORE
  63. TEST_CASE("invalid access to cache raises panic (APP CPU)", "[spi_flash][ignore]")
  64. {
  65. xTaskCreatePinnedToCore(&cache_access_test_func, "ia", 2048, NULL, 5, NULL, 1);
  66. vTaskDelay(1000/portTICK_PERIOD_MS);
  67. }
  68. #endif