1
Lowlevel-Coding / GP-Fault beim schreiben von CR0
« am: 17. March 2014, 20:17 »
Guten Abend,
ich bin gerade dabei einen Startup-Code zu schreiben um in den Long-Mode zu kommen. Dabei bin ich auf einen Fehler gestoßen zu dem mir überhaubt nicht einfällt wie dieser zu stande kommen könnte. Es geht sich um folgendes: So bald ich diesen Code
Hat irgendjemand eine Ahnung woran dass liegen könnte?
Gruß,
Streetrunner
PS: Der Fehler ist natürlich reproduzierbar
ich bin gerade dabei einen Startup-Code zu schreiben um in den Long-Mode zu kommen. Dabei bin ich auf einen Fehler gestoßen zu dem mir überhaubt nicht einfällt wie dieser zu stande kommen könnte. Es geht sich um folgendes: So bald ich diesen Code
Code: [Auswählen]
asm volatile("movl %cr0, %eax");
asm volatile("or $0x80000000, %eax");
asm volatile("movl %eax, %cr0");
ausführe bricht mir qemu mit einem GP-Fault ab. Hier mal die interessanten Zeilen des Logs:Code: [Auswählen]
0: v=0d e=0010 i=0 cpl=0 IP=0008:0000000000100ba2 pc=0000000000100ba2 SP=0010:00000000433385e6 env->regs[R_EAX]=000000002bb00fe3
EAX=2bb00fe3 EBX=00009500 ECX=c000007b EDX=a30c3147
ESI=93416461 EDI=00129000 EBP=00104fc0 ESP=433385e6
EIP=00100ba2 EFL=00000003 [------C] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00cf9300 DPL=0 DS [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS [-WA]
DS =0010 00000000 ffffffff 00cf9300 DPL=0 DS [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT= 00104fa8 00000017
IDT= 00000000 000003ff
CR0=80000011 CR2=00000000 CR3=08000000 CR4=00000020
DR0=0000000000000000 DR1=0000000000000000 DR2=0000000000000000 DR3=0000000000000000
DR6=00000000ffff0ff0 DR7=0000000000000400
CCS=00000001 CCD=2bb00fe3 CCO=INCL
EFER=0000000000000000
So bald ich aber "asm volatile("movl %eax, %cr0")" auskommentiere läuft alles wie geschmiert (außer dass das Paging natürlich nicht aktiviert wird). Ein objdump hat mir bis jetzt auch nicht weitergeholfen, denn die Speicheraddresse in EIP liegt nicht mehr in meinem Code, sondern irgendwo dahinter (aber immer noch im .text Segment).Hat irgendjemand eine Ahnung woran dass liegen könnte?
Gruß,
Streetrunner
PS: Der Fehler ist natürlich reproduzierbar