Перехват исключений на Xtensa (ESP32, ESP32-S2 и ESP32-S3)

Добрый день.

Вчере игрался с делением на ноль, вернее, с его перехватом. Да, оказалось это можно сделать, запретив программе повисать при делении на ноль. Для чего это было нужно мне - у меня есть программа, которая делит на ноль умышленно. Это все для нее. Для антиотладки.

Для чего это нужно еще кому-то: как пример перехвата и обработки исключений: без ассемблерных инструкций, без каких либо вызовов ESP-IDF API.

Скетч ниже выводит число деленое на ноль. Ну, вернее, выводит-то он undefined data, но не повисает. Описание того, что происходит - в коде скетча, в комментариях.

#include <Arduino.h>  // а то оффтпик же!


// Номер исключения, которое мы хотим поймать.
// Всего исключений аж 64 штуки, но мы будем играться с делением на ноль
//
#define DIV0_EXC_NUMBER 6


// Структура, указатель на которую передается функции-обработчику исключений.
// В структуру можно писать, таким образом меня состояние процессора
//
struct  exc_frame {
  uint32_t unknown0;         // Не знаю
  uint32_t pc;               // Указатель на текущую инструкцию (Program Counter Register)
  uint32_t known[20];        // Пучок регистров от а0 до а15, немного специальных регистров
};


// Таблица указателей на обработчики исключений, на каждое ядро - своя, 64 указателя на каждое ядро.
// Таблица устанавливается при старте системы
//
// Обработчики вызываются ядром при возникновении исключительных ситуаций.
// Почти все исключения обрабатываются одной и той же функцией, которая в конце-концов
// вызывает panic() и мы видим "Guru Meditation" и дамп регистров. Мы повисли.
//
// Некоторые исключения обрабатываются ядром молча - например, невыровненный доступ к 
// памяти: исключение исправит доступ и продрлжит исполнение
//
typedef void (*funcptr_t)(struct exc_frame *);

extern funcptr_t _xt_exception_table[];


// Наш новый обработчик деления на ноль: просто пропускаем инструкцию.
// Инструкция деления на Xtensa - 3 байта
//
// Параметр функции - указатель на Exception stack frame - структуру в 
// памяти, в которой содержится россыпь регистров на момент исключения и
// указатель на текущую инструкцию, вызвавшую исключение (->pc)
//
// Мы исправляем PC так, чтобы он указывал на следующую инструкцию и возвращаемся.
// Результат деления будет неопределен, но программа продолжит выполнение
//
// В этом обработчике нельзя дергать функции типа delay() и прочее, связанное с шедулером
//
// Печатать на экран можно, но осторожно - через extern ets_rom_printf(const char *, ...)
//
static void div0_handler(struct exc_frame *f) {

  f->pc += 3;
}


// Делитель
volatile int j = 1;

void setup() {

  Serial.begin(115200);

  // Перехватываем обработку деления на ноль, записывая в таблицу обработчиков адрес нашего.
  // Для обоих ядер!
  // Закоментируете обе строчки и скетч будет повисать, как и должен.
  //
  _xt_exception_table[DIV0_EXC_NUMBER * portNUM_PROCESSORS + 0] = div0_handler;  
#if portNUM_PROCESSORS > 1
  _xt_exception_table[DIV0_EXC_NUMBER * portNUM_PROCESSORS + 1] = div0_handler;  
#endif

  // Закладываем бонбу
  j = 0;
}



// Момент истины. В цикле.
//
void loop() {

  delay(1000);

  // Грохнемся или нет?
  for (int i = 0x61; i < 0x6e; i++)
    Serial.printf("%% %x\r\n", i / j);

}

Когда ваш софт падает с вот таким сообщением привычным:

Guru Meditation Error: Core  1 panic'ed (IntegerDivideByZero). Exception was unhandled.

Core  1 register dump:
PC      : 0x42001d07  PS      : 0x00060030  A0      : 0x82004a93  A1      : 0x3fcec0f0
A2      : 0x00000001  A3      : 0x0000002c  A4      : 0x0000002b  A5      : 0xffffffff
A6      : 0x00000000  A7      : 0x00000061  A8      : 0x3fc93c00  A9      : 0x3fcec0d0
A10     : 0x3fc976c0  A11     : 0x3c030120  A12     : 0x00000000  A13     : 0x0000002b
A14     : 0x420050bf  A15     : 0x3fcec0ac  SAR     : 0x00000002  EXCCAUSE: 0x00000006
EXCVADDR: 0x00000000  LBEG    : 0x400556d5  LEND    : 0x400556e5  LCOUNT  : 0xfffffff5

вы можете посмотреть на циферку в регистре EXCCAUSE - это и будет интересующий вас номер исключения. И таким образом поймать интересующее вас. Списка “название=номер“ для исключений я что-то не нашел. Может фигово искал.

ЗЫЖ Только сейчас заметил, что объявил exception table просто как extern , без extern “C“ а оно один фиг работает. Интересно.

3 лайка

а это не оно?

Поправка - это не для ЕСП32, а для 8266

1 лайк

ух ты похоже оно

не, это для ЕСП8266

Циферки совпадают некоторые, я бегло глянул.

Вот. Круто. Из интересного - можно перехватывать чтение\запись в несуществующую память, а так же можно перехватывать illegal instruction. :). Вирутальную машину можно писать, через исключения будет работать, на нелегальных инструкциях :))

Одна из моих любимых ошибок.

1 лайк

Ага, особенно про канарейку.

/*
Интересных не много:

  
  EXCCAUSE_Syscall,                   // исключение, через которое сделан системный вызов SYSCALL

  EXCCAUSE_IntegerDivideByZero,       // Деление на ноль целочисленное.

  EXCCAUSE_IllegalInstruction,        // неправильный опкод инструкции
  EXCCAUSE_InstrFetchProhibited,      // Какие-то опять проблемы с PC.
  EXCCAUSE_InstructionFetchError,     // PC указывает на какой-то мусор или не на Instruction Memory.

  EXCCAUSE_LoadProhibited,            // Попытка прочитать "не ту" память
  EXCCAUSE_StoreProhibited,           // Попытка записать "не ту" память. В NULL, например
  EXCCAUSE_LoadStoreError,            
*/

typedef enum {

  EXCCAUSE_IllegalInstruction = 0,    // неправильный опкод инструкции
  EXCCAUSE_Syscall,                   // исключение, через которое сделан системный вызов SYSCALL
  EXCCAUSE_InstructionFetchError,     // PC указывает на какой-то мусор или не на Instruction Memory.
                                      // (Вызов функции по неправильному адресу. Вызов функции по адресу 0.
                                      // процессор попытался выудить очередную инструкцию из памяти на исполнение, но памяти такой - не существует. Или существует, но недоступна ((flash memory с выключенными прерываниями))
  EXCCAUSE_LoadStoreError,            // ??
  EXCCAUSE_Level1Interrupt,           // Прерывания 1-го левела обрабатываются как исключения.
  EXCCAUSE_Alloca,                    // Стек кончился.
                                      // При попытке alloca() из вашего кода или сам ESP32 помер, потому, 
                                      // что ему не хватило места в стеке, чтобы разместить там регистры
                                      // кое-какие для личных нужд
  EXCCAUSE_IntegerDivideByZero,       // Деление на ноль целочисленное.
  EXCCAUSE_PCValue,                   // Не знаю :(
  EXCCAUSE_Privileged,                // На Ардуине не встречается. Нарушение привелегий, когда CPU работает в режиме разделения на kernel/user
  EXCCAUSE_LoadStoreAlignment,        // Невыровненный доступ к памяти. Обрабатывается ESP-IDF, лучше его не трогать
  EXCCAUSE_10,                        // Зарезервированно
  EXCCAUSE_11,                        // Зарезервированно
  EXCCAUSE_InstrPDAddrError,          // Во фреймворке Arduino такого не добиться
  EXCCAUSE_LoadStorePIFDataError,     // --
  EXCCAUSE_InstrPIFAddrError,         // --
  EXCCAUSE_LoadStorePIFAddrError,     // --
  EXCCAUSE_InstTLBMiss,                // --
  EXCCAUSE_InstTLBMultiHit,             // --
  EXCCAUSE_InstFetchPrivilege,         // --
  EXCCAUSE_19,                         // Зарезервированно
  EXCCAUSE_InstrFetchProhibited,       // Какие-то опять проблемы с PC.
  EXCCAUSE_21,                         // Зарезервированно
  EXCCAUSE_22,                         // Зарезервированно
  EXCCAUSE_23,                         // Зарезервированно
  EXCCAUSE_LoadStoreTLBMiss,           // Во фреймворке Arduino такого не добиться
  EXCCAUSE_LoadStoreTLBMultihit,       // --
  EXCCAUSE_LoadStorePrivilege,         // --
  EXCCAUSE_27,                         // Зарезервированно
  EXCCAUSE_LoadProhibited,             // Попытка прочитать "не ту" память. NULL, например
  EXCCAUSE_StoreProhibited,            // Попытка записать "не ту" память. В NULL, например
  EXCCAUSE_30,                         // Зарезервированно
  EXCCAUSE_31,                         // Зарезервированно
  EXCCAUSE_Cp0Dis,                     // ??
  EXCCAUSE_Cp1Dis,                     // ??
  EXCCAUSE_Cp2Dis,                     // ??
  EXCCAUSE_Cp3Dis,                     // ??
  EXCCAUSE_Cp4Dis,                     // ??
  EXCCAUSE_Cp5Dis,                     // ??
  EXCCAUSE_Cp6Dis,                     // ??
  EXCCAUSE_Cp7Dis,                     // ??

} exception_code_t;

vvb333007 а нельзя создать какую то свою программу со своей логикой в psram ?
у которой нет никаких ограничений, и она выдаст все секреты esp32 )))

Можно. И со своей и с чужой.

В ESP-IDF есть примеры. Называется “что-то там PSRAM XIP”. Примеры есть, которые загружают .elf в PSRAM и исполняют его там

vvb333007 я нашел что то интересное ? или это хрень полная ?)))

  0x3FF4F020 = 0x00001820
  0x3FF4F024 = 0x00000040
  0x3FF4F060 = 0x00000100
  0x3FF4F068 = 0x00000800
  0x3FF4F06C = 0x80000000
  0x3FF4F070 = 0x80000000
  0x3FF4F074 = 0x00000810
  0x3FF4F080 = 0x80007FFF
  0x3FF4F084 = 0x000A0500
  0x3FF4F088 = 0x000502A4
  0x3FF4F08C = 0x08A80339
  0x3FF4F090 = 0xA0178A05
  0x3FF4F094 = 0x00000028
  0x3FF4F0A0 = 0x00000089
  0x3FF4F0A4 = 0x0000000A
  0x3FF4F0A8 = 0x00000020
  0x3FF4F0AC = 0x00000004
  0x3FF4F0B0 = 0x00410186
  0x3FF4F0B4 = 0x01550020
  0x3FF4F0B8 = 0x000F01B9
  0x3FF4F0BC = 0x00000001
  0x3FF4F0FC = 0x01604201
  0x3FF4F120 = 0x00001820
  0x3FF4F124 = 0x00000040
  0x3FF4F160 = 0x00000100
  0x3FF4F168 = 0x00000800
  0x3FF4F16C = 0x80000000
  0x3FF4F170 = 0x80000000
  0x3FF4F174 = 0x00000810
  0x3FF4F180 = 0x80007FFF
  0x3FF4F184 = 0x000A0500
  0x3FF4F188 = 0x000502A4
  0x3FF4F18C = 0x08A80339
  0x3FF4F190 = 0xA0178A05
  0x3FF4F194 = 0x00000028
  0x3FF4F1A0 = 0x00000089
  0x3FF4F1A4 = 0x0000000A
  0x3FF4F1A8 = 0x00000020
  0x3FF4F1AC = 0x00000004
  0x3FF4F1B0 = 0x00410186
  0x3FF4F1B4 = 0x01550020
  0x3FF4F1B8 = 0x000F01B9
  0x3FF4F1BC = 0x00000001
  0x3FF4F1FC = 0x01604201
  0x3FF4F220 = 0x00001820
  0x3FF4F224 = 0x00000040
  0x3FF4F260 = 0x00000100
  0x3FF4F268 = 0x00000800
  0x3FF4F26C = 0x80000000
  0x3FF4F270 = 0x80000000
  0x3FF4F274 = 0x00000810
  0x3FF4F280 = 0x80007FFF
  0x3FF4F284 = 0x000A0500
  0x3FF4F288 = 0x000502A4
  0x3FF4F28C = 0x08A80339
  0x3FF4F290 = 0xA0178A05
  0x3FF4F294 = 0x00000028
  0x3FF4F2A0 = 0x00000089
  0x3FF4F2A4 = 0x0000000A
  0x3FF4F2A8 = 0x00000020
  0x3FF4F2AC = 0x00000004
  0x3FF4F2B0 = 0x00410186
  0x3FF4F2B4 = 0x01550020
  0x3FF4F2B8 = 0x000F01B9
  0x3FF4F2BC = 0x00000001
  0x3FF4F2FC = 0x01604201
  0x3FF4F320 = 0x00001820
  0x3FF4F324 = 0x00000040
  0x3FF4F360 = 0x00000100
  0x3FF4F368 = 0x00000800
  0x3FF4F36C = 0x80000000
  0x3FF4F370 = 0x80000000
  0x3FF4F374 = 0x00000810
  0x3FF4F380 = 0x80007FFF
  0x3FF4F384 = 0x000A0500
  0x3FF4F388 = 0x000502A4
  0x3FF4F38C = 0x08A80339
  0x3FF4F390 = 0xA0178A05
  0x3FF4F394 = 0x00000028
  0x3FF4F3A0 = 0x00000089
  0x3FF4F3A4 = 0x0000000A
  0x3FF4F3A8 = 0x00000020
  0x3FF4F3AC = 0x00000004
  0x3FF4F3B0 = 0x00410186
  0x3FF4F3B4 = 0x01550020
  0x3FF4F3B8 = 0x000F01B9
  0x3FF4F3BC = 0x00000001
  0x3FF4F3FC = 0x01604201
  0x3FF4F420 = 0x00001820
  0x3FF4F424 = 0x00000040
  0x3FF4F460 = 0x00000100
  0x3FF4F468 = 0x00000800
  0x3FF4F46C = 0x80000000
  0x3FF4F470 = 0x80000000
  0x3FF4F474 = 0x00000810
  0x3FF4F480 = 0x80007FFF
  0x3FF4F484 = 0x000A0500
  0x3FF4F488 = 0x000502A4
  0x3FF4F48C = 0x08A80339
  0x3FF4F490 = 0xA0178A05
  0x3FF4F494 = 0x00000028
  0x3FF4F4A0 = 0x00000089
  0x3FF4F4A4 = 0x0000000A
  0x3FF4F4A8 = 0x00000020
  0x3FF4F4AC = 0x00000004
  0x3FF4F4B0 = 0x00410186
  0x3FF4F4B4 = 0x01550020
  0x3FF4F4B8 = 0x000F01B9
  0x3FF4F4BC = 0x00000001
  0x3FF4F4FC = 0x01604201
  0x3FF4F520 = 0x00001820
  0x3FF4F524 = 0x00000040
  0x3FF4F560 = 0x00000100
  0x3FF4F568 = 0x00000800
  0x3FF4F56C = 0x80000000
  0x3FF4F570 = 0x80000000
  0x3FF4F574 = 0x00000810
  0x3FF4F580 = 0x80007FFF
  0x3FF4F584 = 0x000A0500
  0x3FF4F588 = 0x000502A4
  0x3FF4F58C = 0x08A80339
  0x3FF4F590 = 0xA0178A05
  0x3FF4F594 = 0x00000028
  0x3FF4F5A0 = 0x00000089
  0x3FF4F5A4 = 0x0000000A
  0x3FF4F5A8 = 0x00000020
  0x3FF4F5AC = 0x00000004
  0x3FF4F5B0 = 0x00410186
  0x3FF4F5B4 = 0x01550020
  0x3FF4F5B8 = 0x000F01B9
  0x3FF4F5BC = 0x00000001
  0x3FF4F5FC = 0x01604201
  0x3FF4F620 = 0x00001820
  0x3FF4F624 = 0x00000040
  0x3FF4F660 = 0x00000100
  0x3FF4F668 = 0x00000800
  0x3FF4F66C = 0x80000000
  0x3FF4F670 = 0x80000000
  0x3FF4F674 = 0x00000810
  0x3FF4F680 = 0x80007FFF
  0x3FF4F684 = 0x000A0500
  0x3FF4F688 = 0x000502A4
  0x3FF4F68C = 0x08A80339
  0x3FF4F690 = 0xA0178A05
  0x3FF4F694 = 0x00000028
  0x3FF4F6A0 = 0x00000089
  0x3FF4F6A4 = 0x0000000A
  0x3FF4F6A8 = 0x00000020
  0x3FF4F6AC = 0x00000004
  0x3FF4F6B0 = 0x00410186
  0x3FF4F6B4 = 0x01550020
  0x3FF4F6B8 = 0x000F01B9
  0x3FF4F6BC = 0x00000001
  0x3FF4F6FC = 0x01604201
  0x3FF4F720 = 0x00001820
  0x3FF4F724 = 0x00000040
  0x3FF4F760 = 0x00000100
  0x3FF4F768 = 0x00000800
  0x3FF4F76C = 0x80000000
  0x3FF4F770 = 0x80000000
  0x3FF4F774 = 0x00000810
  0x3FF4F780 = 0x80007FFF
  0x3FF4F784 = 0x000A0500
  0x3FF4F788 = 0x000502A4
  0x3FF4F78C = 0x08A80339
  0x3FF4F790 = 0xA0178A05
  0x3FF4F794 = 0x00000028
  0x3FF4F7A0 = 0x00000089
  0x3FF4F7A4 = 0x0000000A
  0x3FF4F7A8 = 0x00000020
  0x3FF4F7AC = 0x00000004
  0x3FF4F7B0 = 0x00410186
  0x3FF4F7B4 = 0x01550020
  0x3FF4F7B8 = 0x000F01B9
  0x3FF4F7BC = 0x00000001
  0x3FF4F7FC = 0x01604201
  0x3FF4F820 = 0x00001820
  0x3FF4F824 = 0x00000040
  0x3FF4F860 = 0x00000100
  0x3FF4F868 = 0x00000800
  0x3FF4F86C = 0x80000000
  0x3FF4F870 = 0x80000000
  0x3FF4F874 = 0x00000810
  0x3FF4F880 = 0x80007FFF
  0x3FF4F884 = 0x000A0500
  0x3FF4F888 = 0x000502A4
  0x3FF4F88C = 0x08A80339
  0x3FF4F890 = 0xA0178A05
  0x3FF4F894 = 0x00000028
  0x3FF4F8A0 = 0x00000089
  0x3FF4F8A4 = 0x0000000A
  0x3FF4F8A8 = 0x00000020
  0x3FF4F8AC = 0x00000004
  0x3FF4F8B0 = 0x00410186
  0x3FF4F8B4 = 0x01550020
  0x3FF4F8B8 = 0x000F01B9
  0x3FF4F8BC = 0x00000001
  0x3FF4F8FC = 0x01604201
  0x3FF4F920 = 0x00001820
  0x3FF4F924 = 0x00000040
  0x3FF4F960 = 0x00000100
  0x3FF4F968 = 0x00000800
  0x3FF4F96C = 0x80000000
  0x3FF4F970 = 0x80000000
  0x3FF4F974 = 0x00000810
  0x3FF4F980 = 0x80007FFF
  0x3FF4F984 = 0x000A0500
  0x3FF4F988 = 0x000502A4
  0x3FF4F98C = 0x08A80339
  0x3FF4F990 = 0xA0178A05
  0x3FF4F994 = 0x00000028
  0x3FF4F9A0 = 0x00000089
  0x3FF4F9A4 = 0x0000000A
  0x3FF4F9A8 = 0x00000020
  0x3FF4F9AC = 0x00000004
  0x3FF4F9B0 = 0x00410186
  0x3FF4F9B4 = 0x01550020
  0x3FF4F9B8 = 0x000F01B9
  0x3FF4F9BC = 0x00000001
  0x3FF4F9FC = 0x01604201
  0x3FF4FA20 = 0x00001820
  0x3FF4FA24 = 0x00000040
  0x3FF4FA60 = 0x00000100
  0x3FF4FA68 = 0x00000800
  0x3FF4FA6C = 0x80000000
  0x3FF4FA70 = 0x80000000
  0x3FF4FA74 = 0x00000810
  0x3FF4FA80 = 0x80007FFF
  0x3FF4FA84 = 0x000A0500
  0x3FF4FA88 = 0x000502A4
  0x3FF4FA8C = 0x08A80339
  0x3FF4FA90 = 0xA0178A05
  0x3FF4FA94 = 0x00000028
  0x3FF4FAA0 = 0x00000089
  0x3FF4FAA4 = 0x0000000A
  0x3FF4FAA8 = 0x00000020
  0x3FF4FAAC = 0x00000004
  0x3FF4FAB0 = 0x00410186
  0x3FF4FAB4 = 0x01550020
  0x3FF4FAB8 = 0x000F01B9
  0x3FF4FABC = 0x00000001
  0x3FF4FAFC = 0x01604201
  0x3FF4FB20 = 0x00001820
  0x3FF4FB24 = 0x00000040
  0x3FF4FB60 = 0x00000100
  0x3FF4FB68 = 0x00000800
  0x3FF4FB6C = 0x80000000
  0x3FF4FB70 = 0x80000000
  0x3FF4FB74 = 0x00000810
  0x3FF4FB80 = 0x80007FFF
  0x3FF4FB84 = 0x000A0500
  0x3FF4FB88 = 0x000502A4
  0x3FF4FB8C = 0x08A80339
  0x3FF4FB90 = 0xA0178A05
  0x3FF4FB94 = 0x00000028
  0x3FF4FBA0 = 0x00000089
  0x3FF4FBA4 = 0x0000000A
  0x3FF4FBA8 = 0x00000020
  0x3FF4FBAC = 0x00000004
  0x3FF4FBB0 = 0x00410186
  0x3FF4FBB4 = 0x01550020
  0x3FF4FBB8 = 0x000F01B9
  0x3FF4FBBC = 0x00000001
  0x3FF4FBFC = 0x01604201
  0x3FF4FC20 = 0x00001820
  0x3FF4FC24 = 0x00000040
  0x3FF4FC60 = 0x00000100
  0x3FF4FC68 = 0x00000800
  0x3FF4FC6C = 0x80000000
  0x3FF4FC70 = 0x80000000
  0x3FF4FC74 = 0x00000810
  0x3FF4FC80 = 0x80007FFF
  0x3FF4FC84 = 0x000A0500
  0x3FF4FC88 = 0x000502A4
  0x3FF4FC8C = 0x08A80339
  0x3FF4FC90 = 0xA0178A05
  0x3FF4FC94 = 0x00000028
  0x3FF4FCA0 = 0x00000089
  0x3FF4FCA4 = 0x0000000A
  0x3FF4FCA8 = 0x00000020
  0x3FF4FCAC = 0x00000004
  0x3FF4FCB0 = 0x00410186
  0x3FF4FCB4 = 0x01550020
  0x3FF4FCB8 = 0x000F01B9
  0x3FF4FCBC = 0x00000001
  0x3FF4FCFC = 0x01604201
  0x3FF4FD20 = 0x00001820
  0x3FF4FD24 = 0x00000040
  0x3FF4FD60 = 0x00000100
  0x3FF4FD68 = 0x00000800
  0x3FF4FD6C = 0x80000000
  0x3FF4FD70 = 0x80000000
  0x3FF4FD74 = 0x00000810
  0x3FF4FD80 = 0x80007FFF
  0x3FF4FD84 = 0x000A0500
  0x3FF4FD88 = 0x000502A4
  0x3FF4FD8C = 0x08A80339
  0x3FF4FD90 = 0xA0178A05
  0x3FF4FD94 = 0x00000028
  0x3FF4FDA0 = 0x00000089
  0x3FF4FDA4 = 0x0000000A
  0x3FF4FDA8 = 0x00000020
  0x3FF4FDAC = 0x00000004
  0x3FF4FDB0 = 0x00410186
  0x3FF4FDB4 = 0x01550020
  0x3FF4FDB8 = 0x000F01B9
  0x3FF4FDBC = 0x00000001
  0x3FF4FDFC = 0x01604201
  0x3FF4FE20 = 0x00001820
  0x3FF4FE24 = 0x00000040
  0x3FF4FE60 = 0x00000100
  0x3FF4FE68 = 0x00000800
  0x3FF4FE6C = 0x80000000
  0x3FF4FE70 = 0x80000000
  0x3FF4FE74 = 0x00000810
  0x3FF4FE80 = 0x80007FFF
  0x3FF4FE84 = 0x000A0500
  0x3FF4FE88 = 0x000502A4
  0x3FF4FE8C = 0x08A80339
  0x3FF4FE90 = 0xA0178A05
  0x3FF4FE94 = 0x00000028
  0x3FF4FEA0 = 0x00000089
  0x3FF4FEA4 = 0x0000000A
  0x3FF4FEA8 = 0x00000020
  0x3FF4FEAC = 0x00000004
  0x3FF4FEB0 = 0x00410186
  0x3FF4FEB4 = 0x01550020
  0x3FF4FEB8 = 0x000F01B9
  0x3FF4FEBC = 0x00000001
  0x3FF4FEFC = 0x01604201
  0x3FF4FF20 = 0x00001820
  0x3FF4FF24 = 0x00000040
  0x3FF4FF60 = 0x00000100
  0x3FF4FF68 = 0x00000800
  0x3FF4FF6C = 0x80000000
  0x3FF4FF70 = 0x80000000
  0x3FF4FF74 = 0x00000810
  0x3FF4FF80 = 0x80007FFF
  0x3FF4FF84 = 0x000A0500
  0x3FF4FF88 = 0x000502A4
  0x3FF4FF8C = 0x08A80339
  0x3FF4FF90 = 0xA0178A05
  0x3FF4FF94 = 0x00000028
  0x3FF4FFA0 = 0x00000089
  0x3FF4FFA4 = 0x0000000A
  0x3FF4FFA8 = 0x00000020
  0x3FF4FFAC = 0x00000004
  0x3FF4FFB0 = 0x00410186
  0x3FF4FFB4 = 0x01550020
  0x3FF4FFB8 = 0x000F01B9
  0x3FF4FFBC = 0x00000001
  0x3FF4FFFC = 0x01604201

Ты нашел дамп памяти :). С какими-то данными. А я вот вчера вечером перед сном нашел адрес, в котором сохраняется адрес повисания (± километр) если повисание было.

Он тоже в недокументированной области памяти лежит. Туда процессор (вернее, даже некий супервизор, называется Debug Assist) пишет адрес перед гибелью. После перезагрузки его можно прочитать.

Но я вчера как его нашел, так же и потерял. Найду - напишу.

Когда еспшка перезагружается, можно увидеть такой вот текст:

ESP-ROM:esp32s3-20210327
Build:Mar 27 2021
rst:0xc (RTC_SW_CPU_RST),boot:0x8 (SPI_FAST_FLASH_BOOT)
Saved PC:0x4037edd1
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fce2820,len:0x10cc
load:0x403c8700,len:0xc2c
load:0x403cb700,len:0x30c0
entry 0x403c88b8

Там сверху есть неприметное “Saved PC:“. Это вот как раз оно и есть - адрес незадолго перед гибелью. Не точное место, где повисло, а примерно :). Плюс-минус функция :slight_smile:

а нет ли правильных слов что бы пристыдить мой ии ?))) он у меня только после этого начинает работать…

0x3FF4F020	0x00001820	I2S0_CONF_REG - конфигурация (документирован)
0x3FF4F024	0x00000040	I2S0_CLKM_CONF_REG - тактирование (документирован)
0x3FF4F060	0x00000100	I2S0_RXEOF_NUM_REG - размер RX буфера
0x3FF4F068	0x00000800	Вероятно, порог прерывания RX
0x3FF4F06C	0x80000000	I2S0_RX_START (бит 31) - включение RX
0x3FF4F070	0x80000000	I2S0_TX_START (бит 31) - включение TX
0x3FF4F074	0x00000810	Размер DMA буфера?
0x3FF4F080	0x80007FFF	I2S0_RX_SLAVE_MOD - режим slave
0x3FF4F084	0x000A0500	Частота дискретизации (2560?)
0x3FF4F088	0x000502A4	Делитель частоты
0x3FF4F08C	0x08A80339	НЕДОКУМЕНТИРОВАН - вероятно, тайминги
0x3FF4F090	0xA0178A05	НЕДОКУМЕНТИРОВАН - "волшебное" число
0x3FF4F094	0x00000028	НЕДОКУМЕНТИРОВАН - задержка (40 тактов)
0x3FF4F0A0	0x00000089	НЕДОКУМЕНТИРОВАН - 137 в десятичной
0x3FF4F0A4	0x0000000A	НЕДОКУМЕНТИРОВАН - 10 (кол-во каналов?)
0x3FF4F0A8	0x00000020	НЕДОКУМЕНТИРОВАН - 32 (бит на выборку?)
0x3FF4F0AC	0x00000004	НЕДОКУМЕНТИРОВАН - 4 (кол-во буферов?)
0x3FF4F0B0	0x00410186	НЕДОКУМЕНТИРОВАН
0x3FF4F0B4	0x01550020	НЕДОКУМЕНТИРОВАН
0x3FF4F0B8	0x000F01B9	НЕДОКУМЕНТИРОВАН
0x3FF4F0FC	0x01604201	НЕДОКУМЕНТИРОВАН - конец блока
Повторяющиеся блоки (8 каналов)
Вы видите, что эти значения повторяются для адресов:

Блок	Адреса
Канал 0	0x3FF4F020 - 0x3FF4F0FC
Канал 1	0x3FF4F120 - 0x3FF4F1FC
Канал 2	0x3FF4F220 - 0x3FF4F2FC
Канал 3	0x3FF4F320 - 0x3FF4F3FC
Канал 4	0x3FF4F420 - 0x3FF4F4FC
Канал 5	0x3FF4F520 - 0x3FF4F5FC
Канал 6	0x3FF4F620 - 0x3FF4F6FC
Канал 7	0x3FF4F720 - 0x3FF4F7FC
... и далее до 0x3FF4FFFС	
Структура одного канала (по вашим данным)
text
Канал I2S0 (0x3FF4F000 + смещение):

Смещение | Адрес        | Ваше значение | Вероятное назначение
---------|--------------|---------------|----------------------
0x020    | 0x3FF4F020   | 0x00001820    | CONF_REG (конфигурация)
0x024    | 0x3FF4F024   | 0x00000040    | CLKM_CONF (такты)
0x060    | 0x3FF4F060   | 0x00000100    | RXEOF_NUM (размер)
0x068    | 0x3FF4F068   | 0x00000800    | Порог прерывания
0x06C    | 0x3FF4F06C   | 0x80000000    | START RX
0x070    | 0x3FF4F070   | 0x80000000    | START TX
0x074    | 0x3FF4F074   | 0x00000810    | DMA конфиг
0x080    | 0x3FF4F080   | 0x80007FFF    | SLAVE_MODE
0x084    | 0x3FF4F084   | 0x000A0500    | Частота (BCK)
0x088    | 0x3FF4F088   | 0x000502A4    | Делитель
0x08C    | 0x3FF4F08C   | 0x08A80339    | ??? НЕДОКУМЕНТИРОВАНО
0x090    | 0x3FF4F090   | 0xA0178A05    | ??? MAGIC (тайминги?)
0x094    | 0x3FF4F094   | 0x00000028    | Задержка (40)
0x0A0    | 0x3FF4F0A0   | 0x00000089    | ??? (137)
0x0A4    | 0x3FF4F0A4   | 0x0000000A    | ??? (10)
0x0A8    | 0x3FF4F0A8   | 0x00000020    | ??? (32)
0x0AC    | 0x3FF4F0AC   | 0x00000004    | ??? (4)
0x0B0    | 0x3FF4F0B0   | 0x00410186    | ??? 
0x0B4    | 0x3FF4F0B4   | 0x01550020    | ???
0x0B8    | 0x3FF4F0B8   | 0x000F01B9    | ???
0x0FC    | 0x3FF4F0FC   | 0x01604201    | ??? конец блока

пока что он не признается… что бред скинул))) в общем без знаний туда наверное лезть не стоит, и ограничусь тогда напосинием программ просто в той памяти, возможно самоизменяющимися в процессе, хоть и не так интересно, но там по крайней мере справлюсь))) спс

вообще я почитал что даже озу можно заблочить и запустить сначала psram, с помощью модифицированного загрузчика, что там изменили а что скрыто не знаю, как и то что можно достать…. в целом с одной стороны это всего память, с другой стороны вроде как если там писать программу, тогда это своя ос получается без ограничений… но это не точно))) как и то что можно так достать все что угодно…

ChatGPT хорошо знает Ghidra. Если ей пользоваться, то диалоги с чатиком будут продуктивнее.

Чатик много чего знает, но его надо разговаривать.

Его пугает факт закрытого кода и вообще “ковыряния“. Но если ты ему повесишь лапшу, что ты исследователь, который интересуется тем то и тем-то с целью написания багрепортов в Espressif - то чатик веселеет.

Иногда ему помочь надо: лазили с ним по коду, ничего не понимали. Потом я ему говорю, чатик, типа, этот код очень поход на FreeBSDшный какой-то древний. И тут его как прорвало - то, что он мне никак не хотел рассказывать - все вывалилось. Иногда это чучело даже недокументированное вываливает. Я его потом спрашиваб - а вот это вот откуда? ты ж усирался, говорил, что не знаешь? Он юлить начинает, и насколько я понял, знает он больше, чем рассказывает.

Ну и самое главное - чатик настолько же умен, насколько грамотна твоя речь. Если ты используешь уличный сленг, всякие “чо“ и “щас“, то качество ответов падает. Качество ответов выше, если вопросы задавать на английском. ИИ всего лишь продолжает фразу наиболее вероятным образом. Если ты ему на вход даешь быдлозапрос, то он его и продолжит до быдлоответа

2 лайка

у меня дип сик… он мне кажется менее урезан, да и запросов там больше всего задал, он универсален, и мне как то привычнее с ним все таки…
опасаюсь я продуктов за которые надо платить, как правило они оказываются хуже…
в последнее время он сам начал отвечать извини туплю))) и что то такое еще было… от меня вообще таких слов не было….
по всей видимости обновили частично его, и пользователи повлияли на него)))
пентестером представляться вроде работает))) но иногда он все таки нагло с этого прется, и в шутливой форме отвечает)))