bezpieczeństwo rejestrów z zew. procedury

0

Przykład procedury:

void procedure() {
	variable++;

	outb( 0x0070, 0x0C );
	inb( 0x0071 );

	struct STRUCTURE *interrupt = (struct STRUCTURE *) 0x1000;
	interrupt -> end = 0;

	asm volatile( "iretq" );
}

Jest ona wywoływana w przypadku wystąpienia przerwania zegara czasu rzeczywistego RTC. Problem w tym, że Clang nie zabezpieczył rejestru RAX, którego dopuścił się wykorzystać.
W jaki sposób poinformować kompilator że dla tej procedury należy ze szczególną uwagą zabezpieczyć (PUSH/POP) każdy wykorzystywany rejestr?

0

Czy kompilator "wie", że jest to procedura przerwania?

0

Użycie atrybutu "interrupt" spowoduje, że zostanie zachowana ramka na stosie (ip, cs, flags, ss, sp) i nie trzeba kombinować z "iret".
zobacz tutaj

Zobacz też tutaj
Może atrybut "no_caller_saved_registers" coś pomoże?

0

preserve_most

1

W pełni rozwiązało sprawę :)

struct interrupt_frame
{
  uint64_t ip;
  uint64_t cs;
  uint64_t flags;
  uint64_t sp;
  uint64_t ss;
};

__attribute__ ((interrupt))
void procedure(struct interrupt_frame *frame) {
    variable++;

    outb( 0x0070, 0x0C );
    inb( 0x0071 );

    struct STRUCTURE *interrupt = (struct STRUCTURE *) 0x1000;
    interrupt -> end = 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1