Share Pastebin
Guest
Public paste!

ehenhes

By: a guest | Mar 21st, 2010 | Syntax: None | Size: 2.32 KB | Hits: 106 | Expires: Never
Copy text to clipboard
  1. task_t* create_task( page_directory_t* directory, void* entry, uint8_t privilege)
  2. {
  3.     cli();
  4.  
  5.     ///
  6.     #ifdef _DIAGNOSIS_
  7.     settextcolor(2,0);
  8.     printformat("cr_task: ");
  9.     settextcolor(15,0);
  10.     #endif
  11.     ///
  12.  
  13.     task_t* new_task = (task_t*)malloc(sizeof(task_t),0);
  14.     new_task->id  = next_pid++;
  15.     new_task->page_directory = directory;
  16.     new_task->heap_top = USER_HEAP_START;
  17.  
  18.     ///
  19.     #ifdef _DIAGNOSIS_
  20.     settextcolor(2,0);
  21.     printformat("cr_task_ks: ");
  22.     settextcolor(15,0);
  23.     #endif
  24.     ///
  25.  
  26.     new_task->kernel_stack = (uint32_t) malloc(KERNEL_STACK_SIZE,PAGESIZE)+KERNEL_STACK_SIZE;
  27.     new_task->next = 0;
  28.  
  29.     task_t* tmp_task = (task_t*)ready_queue;
  30.     while (tmp_task->next)
  31.     {
  32.         tmp_task = tmp_task->next;
  33.     }
  34.     tmp_task->next = new_task;
  35.  
  36.     uint32_t* kernel_stack = (uint32_t*) new_task->kernel_stack;
  37.  
  38.     uint32_t code_segment=0x08, data_segment=0x10;
  39.  
  40. ///TEST///
  41.     *(--kernel_stack) = 0x0;  // return address dummy
  42. ///TEST///
  43.  
  44.     if(privilege == 3)
  45.     {
  46.         // general information: Intel 3A Chapter 5.12
  47.         *(--kernel_stack) = new_task->ss = 0x23;    // ss
  48.         *(--kernel_stack) = new_task->kernel_stack; // esp
  49.         code_segment = 0x1B; // 0x18|0x3=0x1B
  50.     }
  51.  
  52.     *(--kernel_stack) = 0x0202; // eflags = interrupts activated and iopl = 0
  53.     *(--kernel_stack) = code_segment; // cs
  54.     *(--kernel_stack) = (uint32_t)entry; // eip
  55.     *(--kernel_stack) = 0; // error code
  56.  
  57.     *(--kernel_stack) = 0; // interrupt nummer
  58.  
  59.     // general purpose registers w/o esp
  60.     *(--kernel_stack) = 0;
  61.     *(--kernel_stack) = 0;
  62.     *(--kernel_stack) = 0;
  63.     *(--kernel_stack) = 0;
  64.     *(--kernel_stack) = 0;
  65.     *(--kernel_stack) = 0;
  66.     *(--kernel_stack) = 0;
  67.  
  68.     if(privilege == 3) data_segment = 0x23; // 0x20|0x3=0x23
  69.  
  70.     *(--kernel_stack) = data_segment;
  71.     *(--kernel_stack) = data_segment;
  72.     *(--kernel_stack) = data_segment;
  73.     *(--kernel_stack) = data_segment;
  74.  
  75.  
  76.  
  77.     //setup TSS
  78.     tss.ss0   = 0x10;
  79.     tss.esp0  = new_task->kernel_stack;
  80.     tss.ss    = data_segment;
  81.  
  82.  
  83.     //setup task_t
  84.     new_task->ebp = 0xd00fc0de; // test value
  85.     new_task->esp = (uint32_t)kernel_stack;
  86.     new_task->eip = (uint32_t)irq_tail;
  87.     new_task->ss  = data_segment;
  88.  
  89.     sti();
  90.     return new_task;
  91. }