Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: RedEagle am 25. August 2007, 11:55

Titel: Reboot nach lesen eines Registers?!?
Beitrag von: RedEagle am 25. August 2007, 11:55
Hi, wenn ich folgenden code ausführe gibts ein reboot:

DWORD cr4()
{
   unsigned int cr4;
    asm volatile ("movl %%cr4, %0" : "=a" (cr4));
   return cr4;
}

Der folgende code hingegen funktioniert:
DWORD cr0()
{
   unsigned int cr0;
    asm volatile ("movl %%cr0, %0" : "=a" (cr0));
   return cr0;
}

was ist oben falsch, was unten richtig ist??

CPU: Cyrix 6x86
Titel: Re: Reboot nach lesen eines Registers?!?
Beitrag von: bluecode am 25. August 2007, 12:00
geht das?
asm volatile("mov %%crX, %%eax":"=a" (crX));
edit: Mal abgesehen davon, was sagt den bochs wegen des reboots? :wink:
Titel: Re: Reboot nach lesen eines Registers?!?
Beitrag von: RedEagle am 25. August 2007, 12:02
Bei cr0 gibg es auch, zudem ist des nicht in "", und somit kein asm-code,,,

Werds mal eben testen...

--[edit]--

DWORD cr4()
{
   unsigned int reg;
    asm volatile ("movl %%cr4, %0" : "=a" (reg));
   return reg;
}

selbes problem, der name ist also nicht verantwortlich...

zu bochs:
bis zum neustart, ununterbrochen diese meldung:
[FDD  ] read() on floppy image return 0
wobei die exception nicht auflistet ist, da danach das logfile sofort wider geleert wird :(
Titel: Re: Reboot nach lesen eines Registers?!?
Beitrag von: bluecode am 25. August 2007, 12:10
Mir ging eigentlich eher um das %%eax statt dem %0... oder hab ich dich jetzt falsch verstanden?
Titel: Re: Reboot nach lesen eines Registers?!?
Beitrag von: RedEagle am 25. August 2007, 12:18
ändert auch nichts...
Titel: Re: Reboot nach lesen eines Registers?!?
Beitrag von: bluecode am 25. August 2007, 12:18
Ach noch was: Der Cyrix 6x86 unterstützt so wie ich das seh kein Register cr4 (laut "PC Hardwarebuch"). Aber trotzdem sollte bochs das können. Es sei den du hast ihn dazu gebracht einen cyrix 6x86 oder nen 386/486 zu emulieren. Aber kA inwieweit ersteres möglich ist...
Titel: Re: Reboot nach lesen eines Registers?!?
Beitrag von: RedEagle am 25. August 2007, 12:45
Ich habe jetzt bochs unter linux eingerichtet, und dort funktionierts.
Trotzedem danke.

Ach noch was: Der Cyrix 6x86 unterstützt so wie ich das seh kein Register cr4[...]
:-o   :?

Titel: Re: Reboot nach lesen eines Registers?!?
Beitrag von: bluecode am 25. August 2007, 13:08
 :? Es wird auch bei den Intel CPUs erst ab dem Pentium unterstützt... Ich nehme mal an, dass Cyrix dann eine invalid opcode exception schmeißt und wenn man die nicht fängt dann nähert man sich halt bedenklich nahe dem Tripple Fault :mrgreen:
Titel: Re: Reboot nach lesen eines Registers?!?
Beitrag von: RedEagle am 26. August 2007, 14:58
so, jetzt ist mit cr4 alles i.o. (unter bochs) aber cr3 machnt nun Probleme:

Ich schreibe die Adresse des PDs nach cr3, wenn ich cr3 dann auslese, habe ich 0x00000000 drinn stehen.

cpu::cr3((DWORD)KernelPageDirectory);
 DWORD cr3chk = cpu::cr3();
 if(cr3chk != (DWORD)KernelPageDirectory)
 {
  return PGERR_FATALERROR;
 }

KernelPageDirectory ist global:
DWORD *KernelPageDirectory = (DWORD*)0x400000;
cpu::cr3 ist wie bei cr4 und 0 auch:
void cr3(DWORD cr3)
{
     asm volatile("movl %%eax, %%cr3" : "=a" (cr3));
}

DWORD cr3()
{
   unsigned int cr3;
    asm volatile ("movl %%cr3, %%eax" : "=a" (cr3));
   return cr3;
}

ps.: Natürlich jetzt unter bochs ausgeführt  :cry:
Titel: Re: Reboot nach lesen eines Registers?!?
Beitrag von: FreakyPenguin am 26. August 2007, 15:15
Jo, der Code zum setzen ist ja auch falsch ;-)

Es muss so aussehen:
void cr3(DWORD cr3)
{
     asm volatile("movl %%eax, %%cr3" : : "a" (cr3));
}

Mehr dazu auf: http://lowlevel.brainsware.org/wiki/index.php/Inline-Assembler_mit_GCC
Titel: Re: Reboot nach lesen eines Registers?!?
Beitrag von: RedEagle am 26. August 2007, 18:08
Das wars, danke.

Was mich allerdings verwirrt, das schreiben in cr4 schien zu funktionieren (laut hexdump von bochs), und das im prinzip der gleiche code  :?

naja, so läufts auf jeden fall, und es mach auch noch sinn ;)

Hauptsache paging läuft, auch wenn es erstmal nur im emulator ist :(
zum glück habe ich in einer woche ein Pentium 3 zum testen  :evil: