cos2000v2/include/gdt.h

56 lines
1.4 KiB
C
Executable File

#include <types.h>
/* Ordre imposé par SYSENTER */
#define SEL_KERNEL_CODE 0x8 /* selecteur code du kernel */
#define SEL_KERNEL_STACK 0x10 /* selecteur pile du kernel */
#define SEL_USER_CODE 0x18 /* selecteur code utilisateur */
#define SEL_USER_STACK 0x20 /* selecteur pile utilisateur */
#define SEL_KERNEL_DATA 0x28 /* selecteur data du kernel */
#define SEL_USER_DATA 0x30 /* selecteur data utilisateur */
#define SEL_TSS 0x38 /* selecteur TSR */
#define STACK_OFFSET 0xFFFF /* adresse de la pile du kernel */
#define SIZEGDT 0x8 /* nombre de descripteurs */
#define BASEGDT 0x00000800 /* addr de la GDT */
typedef struct gdtdes {
u16 lim0_15;
u16 base0_15;
u8 base16_23;
u8 acces;
u8 lim16_19 : 4;
u8 flags : 4;
u8 base24_31;
} gdtdes __attribute__ ((packed));
struct gdtr {
u16 limite;
u32 base;
} __attribute__ ((packed));
typedef struct tss {
u16 prevtask, reserved00;
u32 esp0;
u16 ss0, reserved0;
u32 esp1;
u16 ss1, reserved1;
u32 esp2;
u16 ss2, reserved2;
u32 cr3;
u32 eip, eflags, eax, ecx, edx, ebx, esp, ebp, esi, edi;
u16 es, reserved3;
u16 cs, reserved4;
u16 ss, reserved5;
u16 ds, reserved6;
u16 fs, reserved7;
u16 gs, reserved8;
u16 ldt_selector, reserved9;
u16 trapflag, iomap;
} __attribute__ ((packed));
void inittr(void);
void initgdt(u32 offset);
void makegdtdes(u32 base, u32 limite, u8 acces, u8 flags, gdtdes *desc);