bezpieczeństwo rejestrów z zew. procedury

bezpieczeństwo rejestrów z zew. procedury
Akasei
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 3 godziny
  • Postów:194
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:prawie 6 lat
  • Ostatnio:ponad rok
  • Postów:62
0

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

Akasei
Nie :) Nie wiedziałem, że można mu to powiedzieć :)
Akasei
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 3 godziny
  • Postów:194
0
rajszym
  • Rejestracja:prawie 6 lat
  • Ostatnio:ponad rok
  • 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?

edytowany 1x, ostatnio: rajszym
Akasei
"no_caller_saved_registers" niet :/
rajszym
  • Rejestracja:prawie 6 lat
  • Ostatnio:ponad rok
  • Postów:62
0

preserve_most

Akasei
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 3 godziny
  • Postów:194
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;
}
edytowany 2x, ostatnio: Akasei
AL
STRUCTURE wygląda jak rejestry procesora. Nie powinno być volatile? Bo zaraz będziesz mieć inny problem ;)
Akasei
@alagner: to jest kod podglądowy ;) prawdziwy jest lepiej zorganizowany ;)

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.