visor/include/x86/gdt.h

65 lines
1.1 KiB
C
Raw Normal View History

2025-03-11 02:06:12 +01:00
#ifndef _VISOR_GDT_H_
#define _VISOR_GDT_H_
#include <stdint.h>
2025-03-11 18:46:10 +01:00
__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;
};
2025-03-11 02:06:12 +01:00
__attribute__ ((packed))
struct GDTR {
uint16_t limit;
uint64_t base;
};
2025-03-11 21:23:15 +01:00
__attribute__ ((packed))
struct TSS {
uint32_t reserved0;
uint64_t rsp0;
uint64_t rsp1;
uint64_t rsp2;
uint64_t reserved1;
uint64_t ist1;
uint64_t ist2;
uint64_t ist3;
uint64_t ist4;
uint64_t ist5;
uint64_t ist6;
uint64_t ist7;
uint64_t reserved2;
uint16_t reserved3;
uint16_t iopb;
};
2025-03-11 02:06:12 +01:00
static inline struct GDTR
storegdt(void)
{
struct GDTR gdtr;
__asm__ ("sgdt %0\n\t" : "=m"(gdtr));
return gdtr;
}
2025-03-11 18:46:10 +01:00
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;
}
2025-03-11 02:06:12 +01:00
#endif