bezpieczeństwo rejestrów z zew. procedury

bezpieczeństwo rejestrów z zew. procedury
CorruptedByCPU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 210
0

Przykład procedury:

Kopiuj
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?

rajszym
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 62
0

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

CorruptedByCPU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 210
rajszym
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 62
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?

rajszym
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 62
0

preserve_most

CorruptedByCPU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 210
1

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

Kopiuj
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;
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.