00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "core/kmaster.h"
00019 #include "proc/proc.h"
00020
00021 #include "gui/svga.h"
00022
00023 DB gdt_array[256*8] __attribute__((aligned (8)));
00024
00025 extern int main(void);
00026
00027
00028 void gdt_init()
00029 {
00030 DB i;
00031 DW flags;
00032 SEG_DESC sys;
00033 GDT _gdt;
00034 CALL_GATE _call_gate;
00035
00036 createDESC(&sys,0,0,0);
00037 addDesc(NULL1_SEL,&sys);
00038 addDesc(NULL2_SEL,&sys);
00039
00040 flags = ((F_G|F_D_B)<<8)|F_P|F_S|F_TYPE_DATA|F_TYPE_W;
00041 createDESC(&sys,0,0xFFFFFFFF,flags);
00042 addDesc(SYS_DATA_SEL,&sys);
00043
00044 flags = ((F_G|F_D_B)<<8)|F_P|F_S|F_TYPE_CODE|F_TYPE_R;
00045 createDESC(&sys,0,0xFFFFFFFF,flags);
00046 addDesc(SYS_CODE_SEL,&sys);
00047
00048 flags = ((F_G|F_D_B)<<8)|F_P|F_S|F_TYPE_DATA|F_TYPE_W|F_TYPE_E;
00049 createDESC(&sys,0x0,((KERNEL_SIZE - _4MB)<< 12) ,flags);
00050 addDesc(FS_STACK_SEL,&sys);
00051
00052 printDESC(&sys);
00053
00054 flags = ((F_G|F_D_B)<<8)|F_P|F_S|F_TYPE_DATA|F_TYPE_W|F_TYPE_E;
00055 createDESC(&sys,0x0,((KERNEL_SIZE - 3*_4MB/4)<< 12) ,flags);
00056 addDesc(SYS_STACK_SEL,&sys);
00057
00058 printDESC(&sys);
00059
00060 flags = ((F_G|F_D_B)<<8)|F_P|F_S|F_TYPE_DATA|F_TYPE_W|F_TYPE_E;
00061 createDESC(&sys,0x0,((KERNEL_SIZE - 2*_4MB/4)<< 12) ,flags);
00062 addDesc(GUI_STACK_SEL,&sys);
00063
00064 printDESC(&sys);
00065
00066 flags = ((F_G|F_D_B)<<8)|F_P|F_S|F_TYPE_DATA|F_TYPE_W|F_TYPE_E;
00067 createDESC(&sys,0x0,((KERNEL_SIZE - _4MB/4)<< 12) ,flags);
00068 addDesc(FLOPPY_STACK_SEL,&sys);
00069
00070 printDESC(&sys);
00071
00072 flags = 0x882;
00073 createDESC(&sys,0,0xFFFFFFFF,flags);
00074 addDesc(LDT_SYS_SEL,&sys);
00075
00076 flags = 0;
00077 createDESC(&sys,0,0xFFFFFFFF,flags);
00078 addDesc(LDT_USR_SEL,&sys);
00079
00080 flags = 0;
00081 createDESC(&sys,0,0xFFFFFFFF,flags);
00082 addDesc(SYS_TSS_SEL,&sys);
00083
00084 flags = 0;
00085 createDESC(&sys,0,0x6C,flags);
00086 addDesc(TASK1_TSS_SEL,&sys);
00087
00088 flags = 0;
00089 createDESC(&sys,0,0x6C,flags);
00090 addDesc(TASK2_TSS_SEL,&sys);
00091
00092 _call_gate.off_0_15 = (DD)do_exit & 0xFFFF;
00093 _call_gate.off_16_31 = ((DD)do_exit >> 16) & 0xFFFF;
00094 _call_gate.segsel_16_31 = SYS_CODE_SEL * 8;
00095 _call_gate.param_count = 0;
00096 _call_gate.flags = 0xEC;
00097
00098 addCallDesc(CALL_GATE_SEL,&_call_gate);
00099
00100 flags = 0x09E;
00101 createDESC(&sys,vgabios_buffer,0x8000,flags);
00102 addDesc(SVGA_CODE_16_SEL,&sys);
00103
00104 flags = 0x092;
00105 createDESC(&sys,vgabios_buffer,0x8000,flags);
00106 addDesc(SVGA_DATA_16_SEL,&sys);
00107
00108 flags = 0x092;
00109 createDESC(&sys,svga_stack,0x400,flags);
00110 addDesc(SVGA_STACK_16_SEL,&sys);
00111
00112 flags = 0x092;
00113 createDESC(&sys,0xA0000,0x10000,flags);
00114 addDesc(A000_SEL,&sys);
00115
00116 flags = 0x092;
00117 createDESC(&sys,0xB0000,0x10000,flags);
00118 addDesc(B000_SEL,&sys);
00119
00120 flags = 0x092;
00121 createDESC(&sys,0xB8000,0x8000,flags);
00122 addDesc(B800_SEL,&sys);
00123
00124 flags = 0x092;
00125 createDESC(&sys,BIOSData,0x600,flags);
00126 addDesc(BIOS_DATA_SEL,&sys);
00127
00128 for(i=END_SEL;i<255;i++)
00129 {
00130 createDESC(&sys,0,0,0);
00131 addDesc(i,&sys);
00132 }
00133
00134 _gdt.hibase = GDT_BASE >> 16;
00135 _gdt.lobase = GDT_BASE & 0xFFFF;
00136 _gdt.limit = (i+1)*8-1;
00137
00138 lgdt(&_gdt);
00139
00140 lds(SYS_DATA_SEL * 8);
00141 lss(SYS_STACK_SEL * 8);
00142 }
00143
00144 void getDesc(DB index,SEG_DESC *ret)
00145 {
00146 SEG_DESC *tmp = (SEG_DESC*)(GDT_BASE + index*8);
00147
00148 ret->base_0_15 = tmp->base_0_15;
00149 ret->base_16_23 = tmp->base_16_23;
00150 ret->base_24_31 = tmp->base_24_31;
00151
00152 ret->flags_20_23 = tmp->flags_20_23;
00153 ret->flags_8_15 = tmp->flags_8_15;
00154
00155 ret->lt_0_15 = tmp->lt_0_15;
00156 ret->lt_16_19 = tmp->lt_16_19;
00157 }
00158
00159 void addDesc(DB index, SEG_DESC *tmp)
00160 {
00161 SEG_DESC *item = (SEG_DESC*)(GDT_BASE + index*8);
00162
00163 item->base_0_15 = tmp->base_0_15;
00164 item->base_16_23 = tmp->base_16_23;
00165 item->base_24_31 = tmp->base_24_31;
00166
00167 item->flags_20_23 = tmp->flags_20_23;
00168 item->flags_8_15 = tmp->flags_8_15;
00169
00170 item->lt_0_15 = tmp->lt_0_15;
00171 item->lt_16_19 = tmp->lt_16_19;
00172 }
00173
00174 void addCallDesc(DB index, CALL_GATE *tmp)
00175 {
00176 CALL_GATE *item = (CALL_GATE*)(GDT_BASE + index*8);
00177
00178 item->off_0_15 = tmp->off_0_15;
00179 item->off_16_31 = tmp->off_16_31;
00180 item->segsel_16_31 = tmp->segsel_16_31;
00181
00182 item->flags = tmp->flags;
00183 item->param_count = tmp->param_count;
00184 }
00185
00186
00187 void printTable(SEG_DESC *tab,int num_of_sel)
00188 {
00189 SEG_DESC *t;
00190 DW index = 0;
00191
00192 while(index < num_of_sel)
00193 {
00194 t = (SEG_DESC*)(tab + index);
00195 printf(" %d ",index);
00196 printDESC(t);
00197 index++;
00198 }
00199 }
00200
00201 void addIG(DB index, IG_DESC *tmp)
00202 {
00203 IG_DESC *item = (IG_DESC*)(IDT_BASE + index*8);
00204 }
00205
00206 void addTG(DB index, TG_DESC *tmp)
00207 {
00208 }
00209
00210 void addTRG(DB index, TRG_DESC *tmp)
00211 {
00212 }
00213