Я запускаю qemu с эмуляцией зоны доверия. 64-разрядный Linux запускается в нормальном мире (NWD) EL1, а некоторые проприетарные коды запускаются в EL3 и Secure World (SWD) EL1. Также у меня такая конфигурация для прерываний: 1) FIQ назначается для SWD; 2) IRQ назначается для NWD.Ошибка сегментации при возврате из el3 в nwd 32-разрядный процесс при возникновении FIQ
Также существуют три случая, когда NWD может быть прерван FIQ: 1) NWD была выполнена в режиме ядра (64-битный Linux) 2) NWD был выполнен в 64-битном режиме пользователя 3) NWD был выполнен в 32-битном пользовательском режиме
Когда FIQ произошел, он попал в ловушку EL3. Затем контекст NWD сохраняется кодом EL3 и начинает выполняться обработчик FIQ. После возвращения из el3 в NWD для 1), 2) случаи, когда все работает хорошо - прерванный процесс продолжает работать. Но после возвращения из el3 в NWD для случая 3) произошла ошибка сегментации для прерванного процесса. Также это значение регистра spsr_el3 перед возвратом из el3 в NWD EL0 - 0x600f0010 - выглядит нормально. Также я уже сравнил сохраненный и восстановленный контекст в EL3 для случая 3, и он также выглядит нормально. Похоже, что это ошибка в qemu. Кто-нибудь знает, в чем проблема?
Здесь не достаточно информации, чтобы попытаться диагностировать проблему. Какой код неисправен? Это похоже на коррупцию регистра, коррупцию в стеке или что-то еще? Как выглядит состояние регистра/стека до и после прерывания? Если вы убедитесь, что это ошибка QEMU, тогда список рассылки QEMU, вероятно, будет гораздо более подходящим местом для его повышения. – Notlikethat
@Notlikethat Linux 32-разрядные приложения с ошибкой, такие как 'busybox' или 'gdb server'. Это похоже на коррупцию регистра. Как я уже упоминал, я уже сравнивал сохраненный и восстановленный контекст в EL3 для случая 3, когда FIQ возник и выглядит нормально - сохраненный контекст равен восстановленному контексту перед входом в NWD EL0. – scopichmu