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
|