00001
00002 #ifndef _CORE_X86_GDT_HPP
00003 #define _CORE_X86_GDT_HPP
00004
00005 namespace Arch {
00006 namespace x86 {
00007 namespace GDT {
00008
00009
00010 void init();
00011
00012 const uint32 DEF_MAXSEGMS = 16;
00013
00014
00015 extern uint32 code_sel_kernel;
00016 extern uint32 data_sel_kernel;
00017 extern uint32 code_sel_user;
00018 extern uint32 data_sel_user;
00019 extern uint32 tss_sel_kernel;
00020 extern uint32 tss_sel_kernel_df;
00021 extern uint32 tss_sel_kernel_sf;
00022
00023
00024 extern "C" struct tss_t kernel_tss;
00025 extern tss_t kernel_tss_df;
00026 extern tss_t kernel_tss_sf;
00027 extern char temp_tss_stack[0x100];
00028
00029 struct gdt_entry_t
00030 {
00031 short s_limit0_15;
00032 short s_base0_15;
00033 char s_base16_23;
00034 char s_attr;
00035 char s_limit16_19;
00036 char s_base24_31;
00037 } __attribute__ ((packed));
00038
00039 struct gdtr_t
00040 {
00041 short s_limit;
00042 gdt_entry_t *s_base;
00043 } __attribute__ ((packed));
00044
00045 class gdt_t
00046 {
00047 public:
00048 gdtr_t gdtr;
00049 gdt_entry_t gdt[DEF_MAXSEGMS];
00050 short segm_count;
00051 public:
00052 void init();
00053 short new_sel(int limit, int base, char attr, char flags);
00054 void lgdt();
00055 };
00056
00057 extern gdt_t kernel_gdt;
00058
00059 struct tss_t
00060 {
00061 uint16 backlink, __blh;
00062 uint32 esp0;
00063 uint16 ss0, __ss0h;
00064 uint32 esp1;
00065 uint16 ss1, __ss1h;
00066 uint32 esp2;
00067 uint16 ss2, __ss2h;
00068 uint32 cr3;
00069 uint32 eip;
00070 uint32 eflags;
00071 uint32 eax, ecx, edx, ebx;
00072 uint32 esp, ebp, esi, edi;
00073 uint16 es, __esh;
00074 uint16 cs, __csh;
00075 uint16 ss, __ssh;
00076 uint16 ds, __dsh;
00077 uint16 fs, __fsh;
00078 uint16 gs, __gsh;
00079 uint16 ldt, __ldth;
00080 uint16 trace, bitmap;
00081 } __attribute__ ((packed));
00082
00083
00084 };
00085 };
00086 };
00087
00088 #endif