jalsenz

Problem with GDT switch in long mode

Discussion created by jalsenz on Oct 29, 2008
Latest reply on Oct 29, 2008 by jalsenz

Hello!

 

I'm currently trying to build a small hypervisor.

I am already in long mode with most stuff set up. IDT vor example seems to work fine.

But I fail to relocate the GDT to a different position...

I already successfully changed it in protected mode, but now I can't seem to get it working. This is, what I do:

[quote]    daffhy_gdt_reg64_t my_gdt_reg;
   
    asm volatile("sgdt %0;" // store gdt register
            : "=m" (my_gdt_reg));
   
    daffhy_uint64_t* my_gdt = malloc(my_gdt_reg.limit+1);
    daffhy_memcpy(my_gdt, (daffhy_uint64_t*)(my_gdt_reg.base), my_gdt_reg.limit+1); // copy the GDT
   
    my_gdt_reg.base = (daffhy_uint64_t)my_gdt;
  
    asm volatile("lgdt %0;" // load our gdt
                ::"m" (my_gdt_reg));
[/quote]

[quote]typedef struct __attribute__ ((__packed__)){
    daffhy_uint16_t limit;
    daffhy_uint64_t base;
} daffhy_gdt_reg64_t;[/quote]

Interrupts are currently activated at this point, but none are thrown.

It crashes (after a retrun and call) at a jmp instruction with a #DF (int 8) (that doesn't return an error code).

I'm working with simnow at the moment, and already checked all obvious option.

 

Anyone any ideas? What am I doing wrong?

 

Thanks and Greets,

 

Jan

Outcomes