Как сделать недействительным кэш данных L1 для определенного диапазона памяти на PowerPC PQ-III e500?

#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, это займет некоторое время. Я хотел бы сообщить вам о результате. В любом случае, вы указали способ решить мою проблему.