Перейти к содержанию
    

Что сохраняется на стеке по machine trap (RV64, Allwinner D1s/F133A)

Пытаюсь сделать вложенные прерывания = но нигде не могу найти инфу, что же в стеке сохраняется из стсотояния процессора. Судя по отладке, 64 быайта сохранены... RV64.

Изменено пользователем GenaSPB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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)
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 hours ago, GenaSPB said:

Пытаюсь сделать вложенные прерывания = но нигде не могу найти инфу, что же в стеке сохраняется из стсотояния процессора.

Сам процессор ничего на стеке не сохраняет. Что сохраните вы при входе в прерывание зависит только тот вас 🙂

Смотрите в коде обработчика прерывания вашей ОС, что она сохраняет.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

с ОСом может быть перезаклад - там обычно переключается контекст (то есть вообще все. в RISCV это могут быть, например, и какие-то регистры таймера-профилировщика), а в задаче ТС можно сэкономить на том, что вернется кол-стек потом обратно в этот же обработчик.

по крайней мере, я так понял.

но у RV есть нереентерабельные CSR регистры - типа того же mepc (или sepc взависимости от обработчика/моды) - то есть может и недозаклад в ОСи - ну то есть указатель стека там поменяется (при переключении контекста), а вложенности прерываний нету 

то есть их надо вытащить и сохранить для вложенности...

--------------------

разбираться надо, по-моему...

если вообще есть ли смысл во вложенности прерываний (?) - я так понимаю, что бай дизайн такого в RV не предполагалось


 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но хоть 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 содержимое стекового фрейма обработчика переносится в общий стек

Изменено пользователем GenaSPB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У RISC-V в этом плане зоопарк. Вендоры кто во что горазд. У кого-то есть аппаратное сохранение как Cortex-M, у кого-то нет. Надо доки на контроллер прерываний конкретного ядра читать. Судя по стартапу, вам надо всё самому сохранять.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 прописано, читали?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так я все gp и плавучку сохраняю .

В Isa не понял откуда адрес берет. 

Изменено пользователем GenaSPB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Адрес возврата в mepc. Поэтому для вложенных прерываний его надо сохранять.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, GenaSPB said:

Так я все gp и плавучку сохраняю .

 

В листинге у вас 16 gp (у процессора их 32), и 20 плавучки (у процесора её тоже 32 штуки)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ясность появилась.
Сохранение/восстановление перделал как надо (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 обрабатываемого.
Ожиждаемое поведление - прерывается только более высоким приоритетом

Изменено пользователем GenaSPB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 hours ago, GenaSPB said:

Я правильно понял, что сперва в архитектуре источники запосов проходят через регистр mie - а затем фильтруется mstatus.MIE ?

Если у вас в других модах проц не работает (S/U/H), то да

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...