visor/include/x86/gdt.h

88 lines
1.6 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-12 02:33:53 +01:00
#include <stdbool.h>
2025-03-11 02:06:12 +01:00
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;
2025-03-12 02:33:53 +01:00
uint8_t base2;
2025-03-11 18:46:10 +01:00
};
2025-03-11 02:06:12 +01:00
__attribute__ ((packed))
struct GDTR {
uint16_t limit;
2025-03-12 02:33:53 +01:00
struct segdescr *base;
2025-03-11 02:06:12 +01:00
};
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
2025-03-12 02:33:53 +01:00
setsegdescr(struct segdescr *descr, uint32_t base, uint32_t limit, uint8_t access, uint8_t flags)
2025-03-11 18:46:10 +01:00
{
descr->limit0 = limit;
descr->base0 = base;
descr->base1 = base >> 16;
descr->access = access;
descr->flags = flags | (limit >> 16);
descr->base2 = base >> 24;
2025-03-12 02:33:53 +01:00
}
static inline uint32_t
getsegbase(struct segdescr *descr)
{
return descr->base0 | ((uint32_t)descr->base1 << 16) | ((uint32_t)descr->base2 << 24);
}
static inline uint32_t
getsegbaseext(struct segdescr *descr)
{
uint32_t *words = (void *)descr;
return words[0];
}
static inline uint32_t
getseglimit(struct segdescr *descr)
{
return descr->limit0 | ((uint32_t)(descr->flags & 0xf) << 16);
}
static inline uint32_t
getsegaccess(struct segdescr *descr, bool unusable)
{
uint32_t *words = (void *)descr;
return (words[1] & 0x00ffffff) | (unusable ? 0x10000 : 0);
2025-03-11 18:46:10 +01:00
}
2025-03-11 02:06:12 +01:00
#endif