selectors, descriptors, more interrupt init
[3sys] / sys1 / kern / src / desc.c
index d02c5fc..9af939e 100644 (file)
 #define SEG_DEF                        0x00400000
 
 
+#define GATE_TYPE_INTR 0x0e00
+#define GATE_TYPE_TRAP 0x0f00
+#define GATE_PRESENT   0x8000
+
+
 void desc_seg(struct desc *desc, int type, uint32_t base, uint32_t limit, int dpl)
 {
        if(type == SEG_NULL) {
@@ -43,3 +48,13 @@ void desc_seg(struct desc *desc, int type, uint32_t base, uint32_t limit, int dp
                break;
        }
 }
+
+
+
+void desc_intr(struct desc *desc, int type, uint16_t sel, uint32_t offs, int dpl)
+{
+       uint32_t gate_type[] = { GATE_TYPE_INTR, GATE_TYPE_TRAP };
+
+       desc->d[0] = (offs & 0xffff) | ((uint32_t)sel << 16);
+       desc->d[1] = (offs & 0xffff0000) | GATE_PRESENT | (dpl << 13) | gate_type[type];
+}