kinit.c

00001 /***************************************************************************
00002                           kinit.c  -  description
00003                              -------------------
00004     begin                : Sat Dec 13 2003
00005     copyright            : (C) 2003 by Dynacube Team
00006     email                : mdshah82@yahoo.com
00007  ***************************************************************************/
00008 
00009 /***************************************************************************
00010  *                                                                         *
00011  *   This program is free software; you can redistribute it and/or modify  *
00012  *   it under the terms of the GNU General Public License as published by  *
00013  *   the Free Software Foundation; either version 2 of the License, or     *
00014  *   (at your option) any later version.                                   *
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;      //DATA
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;                        //CODE
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;      //STACK SPACE
00049    createDESC(&sys,0x0,((KERNEL_SIZE - _4MB)<< 12) ,flags); //0x800000
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;      //STACK SPACE
00055    createDESC(&sys,0x0,((KERNEL_SIZE - 3*_4MB/4)<< 12) ,flags); //0x800000
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;      //GUI STACK SPACE
00061    createDESC(&sys,0x0,((KERNEL_SIZE - 2*_4MB/4)<< 12) ,flags); //0x800000
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;      //FS STACK SPACE
00067    createDESC(&sys,0x0,((KERNEL_SIZE - _4MB/4)<< 12) ,flags); //0x800000
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; //Expand Up Stack
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)//Both GDT & LDT
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  

Generated on Thu Jul 27 23:52:26 2006 for Dynacube by  doxygen 1.4.7