GenaSPB 11 23 января, 2023 Опубликовано 23 января, 2023 (изменено) · Жалоба Пытаюсь сделать вложенные прерывания = но нигде не могу найти инфу, что же в стеке сохраняется из стсотояния процессора. Судя по отладке, 64 быайта сохранены... RV64. Изменено 23 января, 2023 пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 7 23 января, 2023 Опубликовано 23 января, 2023 · Жалоба x0 x1 x2 x3 x4 x5–7 x8 x9 x10–11 x12–17 x18–27 x28–31 zero ra sp gp tp t0–2 s0/fp s1 a0–1 a2–7 s2–11 t3–6 Hard-wired zero Return address Stack pointer Global pointer Thread pointer Temporaries Saved register/frame pointer Saved register Function arguments/return values Function arguments Saved registers Temporaries — Caller Callee — — Caller Callee Callee Caller Caller Callee Caller это из документации - я полагаю, что формально достаточно gp, sp upd: tp (thread чтоб это ни значило) и то что сохраняет Caller. но по факту gcc сохраняет все 31 x4 + еще немного... (это для 32 бита без F и по наличию m*** CSR предполагаю для S-mode может быть еще как-то...) addi sp,sp,-136 sw ra,0(sp) sw gp,8(sp) sw tp,12(sp) sw t0,16(sp) sw t1,20(sp) sw t2,24(sp) sw s0,28(sp) sw s1,32(sp) sw a0,36(sp) sw a1,40(sp) sw a2,44(sp) sw a3,48(sp) sw a4,52(sp) sw a5,56(sp) sw a6,60(sp) sw a7,64(sp) sw s2,68(sp) sw s3,72(sp) sw s4,76(sp) sw s5,80(sp) sw s6,84(sp) sw s7,88(sp) sw s8,92(sp) sw s9,96(sp) sw s10,100(sp) sw s11,104(sp) sw t3,108(sp) sw t4,112(sp) sw t5,116(sp) sw t6,120(sp) csrr a0,mstatus csrr a1,mepc csrr a2,mcause sw a0,124(sp) sw a1,128(sp) sw a2,132(sp) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 23 января, 2023 Опубликовано 23 января, 2023 · Жалоба 6 hours ago, GenaSPB said: Пытаюсь сделать вложенные прерывания = но нигде не могу найти инфу, что же в стеке сохраняется из стсотояния процессора. Сам процессор ничего на стеке не сохраняет. Что сохраните вы при входе в прерывание зависит только тот вас 🙂 Смотрите в коде обработчика прерывания вашей ОС, что она сохраняет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 7 23 января, 2023 Опубликовано 23 января, 2023 · Жалоба с ОСом может быть перезаклад - там обычно переключается контекст (то есть вообще все. в RISCV это могут быть, например, и какие-то регистры таймера-профилировщика), а в задаче ТС можно сэкономить на том, что вернется кол-стек потом обратно в этот же обработчик. по крайней мере, я так понял. но у RV есть нереентерабельные CSR регистры - типа того же mepc (или sepc взависимости от обработчика/моды) - то есть может и недозаклад в ОСи - ну то есть указатель стека там поменяется (при переключении контекста), а вложенности прерываний нету то есть их надо вытащить и сохранить для вложенности... -------------------- разбираться надо, по-моему... если вообще есть ли смысл во вложенности прерываний (?) - я так понимаю, что бай дизайн такого в RV не предполагалось Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 23 января, 2023 Опубликовано 23 января, 2023 (изменено) · Жалоба Но хоть lr или еще что-то должно... mret ведь предполагает что-то для возврата... зы: rv64 должен сохранять 8 байт ргистры. Вот мой стартап файл: Spoiler // See: // https://github.com/syntacore/sc-bl/blob/master/src/startup.S // https://codebrowser.dev/glibc/glibc/sysdeps/riscv/start.S.html // https://github.com/riscv-non-isa/riscv-asm-manual/blob/master/riscv-asm.md /** * RISC-V bootup test * Author: Daniele Lacamera <[email protected]> * * MIT License * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ // __attribute__ ((interrupt ("machine"))) .macro trap_entry addi sp,sp,-288 sd a5,208(sp) sd ra,280(sp) sd t0,272(sp) sd t1,264(sp) sd t2,256(sp) sd a0,248(sp) sd a1,240(sp) sd a2,232(sp) sd a3,224(sp) sd a4,216(sp) sd a6,200(sp) sd a7,192(sp) sd t3,184(sp) sd t4,176(sp) sd t5,168(sp) sd t6,160(sp) fsd ft0,152(sp) fsd ft1,144(sp) fsd ft2,136(sp) fsd ft3,128(sp) fsd ft4,120(sp) fsd ft5,112(sp) fsd ft6,104(sp) fsd ft7,96(sp) fsd fa0,88(sp) fsd fa1,80(sp) fsd fa2,72(sp) fsd fa3,64(sp) fsd fa4,56(sp) fsd fa5,48(sp) fsd fa6,40(sp) fsd fa7,32(sp) fsd ft8,24(sp) fsd ft9,16(sp) fsd ft10,8(sp) fsd ft11,0(sp) .endm .macro trap_exit ld ra,280(sp) ld t0,272(sp) ld t1,264(sp) ld t2,256(sp) ld a0,248(sp) ld a1,240(sp) ld a2,232(sp) ld a3,224(sp) ld a4,216(sp) ld a5,208(sp) ld a6,200(sp) ld a7,192(sp) ld t3,184(sp) ld t4,176(sp) ld t5,168(sp) ld t6,160(sp) fld ft0,152(sp) fld ft1,144(sp) fld ft2,136(sp) fld ft3,128(sp) fld ft4,120(sp) fld ft5,112(sp) fld ft6,104(sp) fld ft7,96(sp) fld fa0,88(sp) fld fa1,80(sp) fld fa2,72(sp) fld fa3,64(sp) fld fa4,56(sp) fld fa5,48(sp) fld fa6,40(sp) fld fa7,32(sp) fld ft8,24(sp) fld ft9,16(sp) fld ft10,8(sp) fld ft11,0(sp) addi sp,sp,288 .endm .macro mtrap_handler func, tail=_Handler trap_\func: trap_entry call \func\tail trap_exit mret .endm .global Reset_Handler .section .startup0 .align 8 Reset_Handler: /* set all registers to zero */ mv x1, x0 mv x2, x1 mv x3, x1 mv x4, x1 mv x5, x1 mv x6, x1 mv x7, x1 mv x8, x1 mv x9, x1 mv x10, x1 mv x11, x1 mv x12, x1 mv x13, x1 mv x14, x1 mv x15, x1 mv x16, x1 mv x17, x1 mv x18, x1 mv x19, x1 mv x20, x1 mv x21, x1 mv x22, x1 mv x23, x1 mv x24, x1 mv x25, x1 mv x26, x1 mv x27, x1 mv x28, x1 mv x29, x1 mv x30, x1 mv x31, x1 /* stack initilization */ la sp, __stack mv gp, zero mv a0, zero mv a1, zero call SystemInit call __riscv_start /* to let simulator know program end point */ addi x1,x0,1 addi x2,x0,-1 sw x1, 0(x2) .section .isr_vector .align 8 .global __Vectors __Vectors: j trap_SYNCTRAP .align 2 j trap_EMPTY .align 2 j trap_EMPTY .align 2 j trap_VMSI .align 2 j trap_EMPTY .align 2 j trap_EMPTY .align 2 j trap_EMPTY .align 2 j trap_VMTI .align 2 j trap_EMPTY .align 2 j trap_EMPTY .align 2 j trap_EMPTY .align 2 j trap_VMEI .align 2 j trap_EMPTY .align 2 j trap_EMPTY .align 2 j trap_EMPTY .align 2 j trap_EMPTY .align 2 j trap_IRQ0 .align 2 j trap_IRQ1 .align 2 j trap_IRQ2 .align 2 j trap_IRQ3 .align 2 j trap_IRQ4 .align 2 j trap_IRQ5 .align 2 j trap_IRQ6 .align 2 j trap_IRQ7 .align 2 j trap_IRQ8 .align 2 j trap_IRQ9 .align 2 j trap_IRQ10 .align 2 j trap_IRQ11 .align 2 j trap_IRQ12 .align 2 j trap_IRQ13 .align 2 j trap_IRQ14 .align 2 j trap_IRQ15 .align 2 // .space (4096 - (16 + 16) * 4) .section .text mtrap_handler SYNCTRAP mtrap_handler VMSI mtrap_handler VMTI mtrap_handler VMEI mtrap_handler IRQ0 mtrap_handler IRQ1 mtrap_handler IRQ2 mtrap_handler IRQ3 mtrap_handler IRQ4 mtrap_handler IRQ5 mtrap_handler IRQ6 mtrap_handler IRQ7 mtrap_handler IRQ8 mtrap_handler IRQ9 mtrap_handler IRQ10 mtrap_handler IRQ11 mtrap_handler IRQ12 mtrap_handler IRQ13 mtrap_handler IRQ14 mtrap_handler IRQ15 mtrap_handler EMPTY 54 minutes ago, yes said: если вообще есть ли смысл во вложенности прерываний (?) - я так понимаю, что бай дизайн такого в RV не предполагалось Так и в Cortex-A это ручками делается... Смысл диктуется имеющимся многоплатформенным проектом. Короче вопрос уточняю - что использует mret кроме сосотояния флага? 54 minutes ago, yes said: но у RV есть нереентерабельные CSR регистры - типа того же mepc (или sepc взависимости от обработчика/моды) - то есть может и недозаклад в ОСи - ну то есть указатель стека там поменяется (при переключении контекста), а вложенности прерываний нету На Corex-A содержимое стекового фрейма обработчика переносится в общий стек Изменено 23 января, 2023 пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 23 января, 2023 Опубликовано 23 января, 2023 · Жалоба У RISC-V в этом плане зоопарк. Вендоры кто во что горазд. У кого-то есть аппаратное сохранение как Cortex-M, у кого-то нет. Надо доки на контроллер прерываний конкретного ядра читать. Судя по стартапу, вам надо всё самому сохранять. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 23 января, 2023 Опубликовано 23 января, 2023 · Жалоба 1 hour ago, GenaSPB said: Но хоть lr или еще что-то должно... mret ведь предполагает что-то для возврата... В стек ничего, у него для сохранения регистры есть. 1 hour ago, GenaSPB said: Вот мой стартап файл: Не пойдёт - в прерывании надо сохранять ВСЕ gp регистры (все 32 целых и все 32 плавучки). У вас же не вызов С функции - внутри пользовательского кода все регистры важны, это только на границе вызова С функций можно что то не сохранять. 1 hour ago, GenaSPB said: Короче вопрос уточняю - что использует mret кроме сосотояния флага? 2 hours ago, yes said: Ничего. В ISA прописано, читали? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 23 января, 2023 Опубликовано 23 января, 2023 (изменено) · Жалоба Так я все gp и плавучку сохраняю . В Isa не понял откуда адрес берет. Изменено 23 января, 2023 пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 23 января, 2023 Опубликовано 23 января, 2023 · Жалоба Адрес возврата в mepc. Поэтому для вложенных прерываний его надо сохранять. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 23 января, 2023 Опубликовано 23 января, 2023 · Жалоба 2 hours ago, GenaSPB said: Так я все gp и плавучку сохраняю . В листинге у вас 16 gp (у процессора их 32), и 20 плавучки (у процесора её тоже 32 штуки) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 24 января, 2023 Опубликовано 24 января, 2023 (изменено) · Жалоба Ясность появилась. Сохранение/восстановление перделал как надо (32 без двух целочисленных регистров и 32 double). сохранение/восстановление mstatus, mpc, mcause вокруг вызова обработчика (под запрещенным через mstatus.MIE запросами). void VMEI_Handler(void) { const uint_fast16_t int_id = PLIC->PLIC_MCLAIM_REG; PRINTF("VMEI_Handler enter: int_id=%u\n", int_id); if (int_id != 0) { //const uint32_t prio = PLIC->PLIC_MTH_REG; #if WITHNESTEDINTERRUPTS const uint_fast8_t priority = PLIC->PLIC_MTH_REG; /* текущий уровень приоритета */ PLIC->PLIC_MTH_REG = PLIC->PLIC_PRIO_REGn [int_id]; /* обрабатываемый уровень приоритета */ const uint_xlen_t mepc = csr_read_mepc(); const uint_xlen_t mcause = csr_read_mcause(); const uint_xlen_t mstatus = csr_read_set_bits_mstatus(MSTATUS_MIE_BIT_MASK); /* раразршение прерываний */ ASSERT((mstatus & MSTATUS_MIE_BIT_MASK) == 0); /* прерывания были запрещены при входе в обработчик */ #endif /* WITHNESTEDINTERRUPTS */ __FPU_Enable(); ASSERT(int_id < MAX_IRQ_n); (plic_vectors [int_id])(); #if WITHNESTEDINTERRUPTS csr_write_mstatus(mstatus); csr_write_mcause(mcause); csr_write_mepc(mepc); PLIC->PLIC_MTH_REG = priority; /* восстанавливаем обрабатываемый уровень приоритета */ #endif /* WITHNESTEDINTERRUPTS */ //PLIC->PLIC_MTH_REG = prio; PRINTF("VMEI_Handler exit: int_id=%u\n", int_id); PLIC->PLIC_MCLAIM_REG = int_id; /* EOI */ } } Я правильно понял, что сперва в архитектуре источники запосов проходят через регистр mie - а затем фильтруется mstatus.MIE ? ... осталось разобравтьс с PLIC - выдает прерывания того же приоритета до EOI обрабатываемого. Ожиждаемое поведление - прерывается только более высоким приоритетом Изменено 24 января, 2023 пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 24 января, 2023 Опубликовано 24 января, 2023 · Жалоба 9 hours ago, GenaSPB said: Я правильно понял, что сперва в архитектуре источники запосов проходят через регистр mie - а затем фильтруется mstatus.MIE ? Если у вас в других модах проц не работает (S/U/H), то да 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться