1 Reply Latest reply on Oct 29, 2008 1:37 PM by jalsenz

    Problem with GDT switch in long mode




      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]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,



        • Problem with GDT switch in long mode

          Ok, I found it now.

          The Problem wasn't the GDT change. (Seems I didn't try to run through without changing the GDT and activted interrupts before...).


          But it is still strange: simnow seems to generate interrupts after a while if the code has an endless loop.

          I will post the details soon.