#powerpc #cpu-cache
#powerpc #cpu-cache
Вопрос:
Специальный блок памяти будет периодически обновляться задачей DMA. Когда другая задача часто пыталась выполнить поиск данных в этом блоке, возникало MCE (исключение проверки компьютера) для проверки четности кэша данных L1. Могу ли я сделать недействительным кэш данных L1 для этого блока памяти полностью или только после обновления DMA?
В libogc есть интересный API, подобный:
void DCInvalidateRange(void *startaddress,u32 len);
.globl DCInvalidateRange
DCInvalidateRange:
cmplwi r4, 0 # zero or negative size?
blelr
clrlwi. r5, r3, 27 # check for lower bits set in address
beq 1f
addi r4, r4, 0x20
1:
addi r4, r4, 0x1f
srwi r4, r4, 5
mtctr r4
2:
dcbi r0, r3
addi r3, r3, 0x20
bdnz 2b
blr
Я не знаком ни с ASM, ни с ASM на PowerPC. Кто-нибудь порекомендует ссылки или описания для этой операции?
Комментарии:
1. freescale.com/files/32bit/doc/app_note/AN3544.pdf предоставлены средства для работы с флагами TLB, но это не прямая операция с адресами пользовательского пространства для MPC8540 e500.
2. Я пытался отключить кэш данных L1 с помощью приведенных ниже инструкций на этапе инициализации ko, но это не удалось с помощью sys-trap. asm volatile («eieio;sync»); mtspr(SPRN_L1CSR0, 0x00000000);
Ответ №1:
Вот лучший ресурс, руководство по среде программирования PowerPC
У вас есть конкретные вопросы по поводу кэша?
Работая с DMA, вы выбираете отслеживание или очистку кэша. Чтобы получить эту ошибку, у вас, вероятно, включено отслеживание. Таким образом, проблема, скорее всего, в том, что у вас есть данные в кэше L1, которые неинициализированы.
Есть второй ресурс, справочное руководство по ядру E500, которое я не смог загрузить в данный момент, но в котором должно быть хорошее описание того, как инициализировать кэш. Я постоянно пользуюсь книгой E-600.
Комментарии:
1. Дэвид, я попробовал 1-й шаг, чтобы отключить кэш данных L1 при загрузке частного ko. Но плата перезагружается, когда выполняется приведенная ниже инструкция в функции инициализации. Журналы ошибок показывают, что произошло несколько «повреждений сляба», а затем, после выполнения initialize_func и загрузки ko в kernel, ядро сообщает о переполнении стека ядра перед перезагрузкой. Журналы, о которых я упоминал: (1) 38E12D103: 06:31:32 14/03/1902 UTC, [ 366.427292] Повреждение плиты: размер-32 начало = 8b4de9e0, len =32 (2) 38E420545: 14/03/1902 UTC 06:31:32, [ 366.497530] 80<2> Происходит переполнение стека ядра.
2. @iMax — вы должны быть осторожны, отключая кэш. если вы сначала не очистите данные, вы потеряете данные, записанные ядром. Это может вызвать переполнение стека. Есть ли шанс, что вы могли бы отключить отслеживание в DMA в качестве теста?
3. Спасибо за напоминание. Я не сбросил данные L1 перед отключением кэша данных L1. Таким образом, я бы прочитал 2-й источник, который вы упомянули выше, и нашел способ протестировать два случая: 1) Очистить кэш данных L1 перед отключением кэша данных L1 (это частный тест, позволяющий определить, была ли проверка кэша данных L1 на четность вызвана неправильным использованием DMA; 2) Попытка включить отслеживание кэша данных L1 с помощью DMA. Поскольку я не знаком с инструкциями ASM, это займет некоторое время. Я хотел бы сообщить вам о результате. В любом случае, вы указали способ решить мою проблему.