您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 
 

132 行
3.6 KiB

  1. /*
  2. *'freely' inspired by http://jojo.ouvaton.org/dossiers/boot_sector/tutorial02.html
  3. * (actually, that's mostly copied, with minor compilation fixes)
  4. */
  5. #include "kernel.h"
  6. #include "klibc.h"
  7. #define IDTBASE 0 /* GDT Physical address */
  8. #define IDTSIZE 256 /* Max descriptor count */
  9. #define INTGATE 0x8E00 /* Interruptions */
  10. #define TRAPGATE 0x8F00 /* Syscalls */
  11. #define TASKGATE 0x8500 /* Task switching */
  12. /* segment descriptor */
  13. struct idtdesc {
  14. u16 offset0_15;
  15. u16 select;
  16. u16 type;
  17. u16 offset16_31;
  18. } __attribute__ ((packed));
  19. /* IDTR register */
  20. struct idtr {
  21. u16 limite;
  22. u32 base;
  23. } __attribute__ ((packed));
  24. struct idtr kidtr;
  25. /* IDT table */
  26. struct idtdesc kidt[IDTSIZE] = {{0, 0, 0, 0}};
  27. /* pointer on a free IDT entry */
  28. unsigned int kidtptr = 0;
  29. void default_int(void);
  30. void k_int0(void);
  31. void k_int1(void);
  32. void k_int2(void);
  33. void k_int3(void);
  34. void k_int4(void);
  35. void k_int5(void);
  36. void k_int6(void);
  37. void k_int7(void);
  38. void k_int8(void);
  39. void k_int9(void);
  40. void k_int10(void);
  41. void k_int11(void);
  42. void k_int12(void);
  43. void k_int13(void);
  44. void k_int14(void);
  45. void k_int15(void);
  46. void k_int16(void);
  47. void k_int17(void);
  48. void k_int18(void);
  49. void k_irq0(void);
  50. void k_irq1(void);
  51. void k_irq2(void);
  52. void k_irq3(void);
  53. void k_irq4(void);
  54. void k_irq5(void);
  55. void k_irq6(void);
  56. void k_irq7(void);
  57. void k_irq8(void);
  58. void init_idt_desc(u32 offset, u16 select, u16 type, struct idtdesc* desc) {
  59. desc->offset0_15 = (offset & 0xffff);
  60. desc->select = select;
  61. desc->type = type;
  62. desc->offset16_31 = (offset & 0xffff0000) >> 16;
  63. return;
  64. }
  65. void add_idt_desc(struct idtdesc desc) {
  66. kidt[kidtptr++] = desc;
  67. return;
  68. }
  69. void init_idt(void) {
  70. struct idtdesc desc;
  71. int i;
  72. for(i=0;i<IDTSIZE;i++) {
  73. init_idt_desc((u32)default_int, 0x08, INTGATE, &desc);
  74. add_idt_desc(desc);
  75. }
  76. init_idt_desc((u32)k_int0, 0x08, INTGATE, &kidt[0]);
  77. init_idt_desc((u32)k_int1, 0x08, INTGATE, &kidt[1]);
  78. init_idt_desc((u32)k_int2, 0x08, INTGATE, &kidt[2]);
  79. init_idt_desc((u32)k_int3, 0x08, INTGATE, &kidt[3]);
  80. init_idt_desc((u32)k_int4, 0x08, INTGATE, &kidt[4]);
  81. init_idt_desc((u32)k_int5, 0x08, INTGATE, &kidt[5]);
  82. init_idt_desc((u32)k_int6, 0x08, INTGATE, &kidt[6]);
  83. init_idt_desc((u32)k_int7, 0x08, INTGATE, &kidt[7]);
  84. init_idt_desc((u32)k_int8, 0x08, INTGATE, &kidt[8]);
  85. init_idt_desc((u32)k_int9, 0x08, INTGATE, &kidt[9]);
  86. init_idt_desc((u32)k_int10, 0x08, INTGATE, &kidt[10]);
  87. init_idt_desc((u32)k_int11, 0x08, INTGATE, &kidt[11]);
  88. init_idt_desc((u32)k_int12, 0x08, INTGATE, &kidt[12]);
  89. init_idt_desc((u32)k_int13, 0x08, INTGATE, &kidt[13]);
  90. init_idt_desc((u32)k_int14, 0x08, INTGATE, &kidt[14]);
  91. init_idt_desc((u32)k_int15, 0x08, INTGATE, &kidt[15]);
  92. init_idt_desc((u32)k_int16, 0x08, INTGATE, &kidt[16]);
  93. init_idt_desc((u32)k_int17, 0x08, INTGATE, &kidt[17]);
  94. init_idt_desc((u32)k_int18, 0x08, INTGATE, &kidt[18]);
  95. init_idt_desc((u32)k_irq0, 0x08, INTGATE, &kidt[32]);
  96. init_idt_desc((u32)k_irq1, 0x08, INTGATE, &kidt[33]);
  97. init_idt_desc((u32)k_irq2, 0x08, INTGATE, &kidt[34]);
  98. init_idt_desc((u32)k_irq3, 0x08, INTGATE, &kidt[35]);
  99. init_idt_desc((u32)k_irq4, 0x08, INTGATE, &kidt[36]);
  100. init_idt_desc((u32)k_irq5, 0x08, INTGATE, &kidt[37]);
  101. init_idt_desc((u32)k_irq6, 0x08, INTGATE, &kidt[38]);
  102. init_idt_desc((u32)k_irq7, 0x08, INTGATE, &kidt[39]);
  103. init_idt_desc((u32)k_irq8, 0x08, INTGATE, &kidt[40]);
  104. kidtr.limite = IDTSIZE*8;
  105. kidtr.base = IDTBASE;
  106. memcpy((void*)kidtr.base, kidt, kidtr.limite);
  107. #define printf(format, ...) { char __str[255]; sprintf (__str, format, __VA_ARGS__); print(__str);}
  108. printf("Loading IDT from 0x%x\n", kidtr);
  109. #undef printf
  110. asm("lidtl (kidtr)");
  111. }