nuttx/boards/xtensa/esp32s2/esp32s2-saola-1/configs
Tiago Medicci Serrano d3ffeb40a7 libc/machine/xtensa: make longjmp safe against context switch
In order to turn longjmp context-switch safe, it's necessary
to disable interrupts before modifying windowbase and windowstart.
Otherwise, after a context switch, windowstart and windowbase
would be different, leading to a wrongly set windowstart bit due to
longjmp writing it based on the windowbase before the context switch.
This corrupts the registers at the next window overflow reaching
that wrongly set bit.

*Background:*
This PR is related to an issue first observed on ESP-IDF
https://github.com/espressif/esp-idf/issues/5229 and it was, then,
checked on NuttX using a test application.

*The test application:*
To check if the problem affects ESP32, ESP32-S2 and ESP32-S3 on
NuttX, it was created an application based on:
https://en.cppreference.com/w/c/program/longjmp

The application creates 16 tasks (`#define NUMBER_OF_TASKS  16`)
that implements the following daemon:

```
static int setjmp_longjmp_daemon(int argc, char *argv[])
{
  for (int i = 0; i < NUMBER_OF_TASKS * 2; i++)
    {
      jmp_buf env;

      volatile int count = 0;
      if (setjmp(env) != UINT16_MAX)
        {
          foo(&env, ++count);
        }
    }

  sem_post(&g_sem);

  return EXIT_SUCCESS;
}
```

The main function also initializes a semaphore to avoid application
exiting before tasks return successfully:

```
  sem_init(&g_sem, 0, -NUMBER_OF_TASKS);
```

Finally, the round-robin interval was lowered to 1ms to raise the
chances of the longjmp being interrupted by a context switch
(`CONFIG_RR_INTERVAL=1).

This setup was able to reproduce the problem prior to this patch
being applied.
2022-11-22 19:34:44 +01:00
..
audio sched/spawn: Rename task_spawnattr_[get|set]stack[size|addr] to posix_spawnattr_[get|set]stack[size|addr] 2022-11-01 09:51:18 +09:00
cxx esp32*: Disable CONFIG_RAW_BINARY 2022-05-27 13:41:51 +03:00
gpio esp32*: Disable CONFIG_RAW_BINARY 2022-05-27 13:41:51 +03:00
i2c esp32s2-saola-1: Add support for I2C chardev driver 2022-06-30 00:32:02 +03:00
i2schar esp32s2/i2s: implement I2S receiver module 2022-11-21 23:46:47 +08:00
mcuboot_nsh esp32*: Disable CONFIG_RAW_BINARY 2022-05-27 13:41:51 +03:00
nsh esp32*: Disable CONFIG_RAW_BINARY 2022-05-27 13:41:51 +03:00
nxlooper esp32s2/i2s: implement I2S receiver module 2022-11-21 23:46:47 +08:00
oneshot esp32*: Disable CONFIG_RAW_BINARY 2022-05-27 13:41:51 +03:00
ostest libc/machine/xtensa: make longjmp safe against context switch 2022-11-22 19:34:44 +01:00
random esp32*: Disable CONFIG_RAW_BINARY 2022-05-27 13:41:51 +03:00
timer esp32*: Disable CONFIG_RAW_BINARY 2022-05-27 13:41:51 +03:00
watchdog esp32*: Disable CONFIG_RAW_BINARY 2022-05-27 13:41:51 +03:00