#ifndef _VISOR_GDT_H_ #define _VISOR_GDT_H_ #include __attribute__ ((packed)) struct segdescr { uint16_t limit0; uint16_t base0; uint8_t base1; uint8_t access; uint8_t flags; uint16_t base2; uint32_t base3; uint32_t reserved; }; __attribute__ ((packed)) struct GDTR { uint16_t limit; uint64_t base; }; static inline struct GDTR storegdt(void) { struct GDTR gdtr; __asm__ ("sgdt %0\n\t" : "=m"(gdtr)); return gdtr; } static inline void setsegdescr(struct segdescr *descr, uint64_t base, uint32_t limit, uint8_t access, uint8_t flags) { descr->limit0 = limit; descr->base0 = base; descr->base1 = base >> 16; descr->access = access; descr->flags = flags | (limit >> 16); descr->base2 = base >> 24; descr->base3 = base >> 32; descr->reserved = 0; } #endif