2016-09-26 9 views
0

Я запускаю 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. Кто-нибудь знает, в чем проблема?

+0

Здесь не достаточно информации, чтобы попытаться диагностировать проблему. Какой код неисправен? Это похоже на коррупцию регистра, коррупцию в стеке или что-то еще? Как выглядит состояние регистра/стека до и после прерывания? Если вы убедитесь, что это ошибка QEMU, тогда список рассылки QEMU, вероятно, будет гораздо более подходящим местом для его повышения. – Notlikethat

+0

@Notlikethat Linux 32-разрядные приложения с ошибкой, такие как 'busybox' или 'gdb server'. Это похоже на коррупцию регистра. Как я уже упоминал, я уже сравнивал сохраненный и восстановленный контекст в EL3 для случая 3, когда FIQ возник и выглядит нормально - сохраненный контекст равен восстановленному контексту перед входом в NWD EL0. – scopichmu

ответ

0

Фактически я уже исправил это. Проблема была в файле 'op_helper.c' в реализации инструкции 'eret': 'env-> regs [15] = env-> elr_el [1] & ~ 0x1;'. «1» необходимо изменить на «cur_el». Также эта ошибка была исправлена ​​в последнем qemu, поэтому мне нужно обновить ее.

 Смежные вопросы

  • Нет связанных вопросов^_^