File: idt.c

package info (click to toggle)
libcaca 0.99.beta20-6
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,540 kB
  • sloc: ansic: 25,091; php: 2,763; python: 2,637; cs: 1,213; cpp: 1,127; java: 916; objc: 836; makefile: 545; perl: 505; sh: 472; asm: 297; ruby: 215; xml: 33
file content (151 lines) | stat: -rw-r--r-- 4,420 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/*
 *  libcaca       Colour ASCII-Art library
 *  Copyright (c) 2006 Sam Hocevar <sam@hocevar.net>
 *                2009 Jean-Yves Lamoureux <jylam@lnxscene.org>
 *                All Rights Reserved
 *
 *  This library is free software. It comes without any warranty, to
 *  the extent permitted by applicable law. You can redistribute it
 *  and/or modify it under the terms of the Do What the Fuck You Want
 *  to Public License, Version 2, as published by Sam Hocevar. See
 *  http://www.wtfpl.net/ for more details.
 */

/*
 *'freely' inspired by http://jojo.ouvaton.org/dossiers/boot_sector/tutorial02.html
 * (actually, that's mostly copied, with minor compilation fixes)
 */
#include "kernel.h"
#include "klibc.h"

#define IDTBASE	0               /* GDT Physical address */
#define IDTSIZE	256             /* Max descriptor count */
#define INTGATE 0x8E00          /* Interruptions */
#define TRAPGATE 0x8F00         /* Syscalls */
#define TASKGATE 0x8500         /* Task switching */

/* segment descriptor */
struct idtdesc
{
    u16 offset0_15;
    u16 select;
    u16 type;
    u16 offset16_31;
} __attribute__ ((packed));

/* IDTR register */
struct idtr
{
    u16 limite;
    u32 base;
} __attribute__ ((packed));

struct idtr kidtr;

/* IDT table */
struct idtdesc kidt[IDTSIZE] = { {0, 0, 0, 0} };

/* pointer on a free IDT entry */
unsigned int kidtptr = 0;

void default_int(void);
void k_int0(void);
void k_int1(void);
void k_int2(void);
void k_int3(void);
void k_int4(void);
void k_int5(void);
void k_int6(void);
void k_int7(void);
void k_int8(void);
void k_int9(void);
void k_int10(void);
void k_int11(void);
void k_int12(void);
void k_int13(void);
void k_int14(void);
void k_int15(void);
void k_int16(void);
void k_int17(void);
void k_int18(void);
void k_irq0(void);
void k_irq1(void);
void k_irq2(void);
void k_irq3(void);
void k_irq4(void);
void k_irq5(void);
void k_irq6(void);
void k_irq7(void);
void k_irq8(void);


void init_idt_desc(u32 offset, u16 select, u16 type, struct idtdesc *desc)
{
    desc->offset0_15 = (offset & 0xffff);
    desc->select = select;
    desc->type = type;
    desc->offset16_31 = (offset & 0xffff0000) >> 16;
    return;
}


void add_idt_desc(struct idtdesc desc)
{
    kidt[kidtptr++] = desc;
    return;
}


void init_idt(void)
{
    struct idtdesc desc;
    int i;


    for (i = 0; i < IDTSIZE; i++)
    {
        init_idt_desc((u32) default_int, 0x08, INTGATE, &desc);
        add_idt_desc(desc);
    }

    init_idt_desc((u32) k_int0, 0x08, INTGATE, &kidt[0]);
    init_idt_desc((u32) k_int1, 0x08, INTGATE, &kidt[1]);
    init_idt_desc((u32) k_int2, 0x08, INTGATE, &kidt[2]);
    init_idt_desc((u32) k_int3, 0x08, INTGATE, &kidt[3]);
    init_idt_desc((u32) k_int4, 0x08, INTGATE, &kidt[4]);
    init_idt_desc((u32) k_int5, 0x08, INTGATE, &kidt[5]);
    init_idt_desc((u32) k_int6, 0x08, INTGATE, &kidt[6]);
    init_idt_desc((u32) k_int7, 0x08, INTGATE, &kidt[7]);
    init_idt_desc((u32) k_int8, 0x08, INTGATE, &kidt[8]);
    init_idt_desc((u32) k_int9, 0x08, INTGATE, &kidt[9]);
    init_idt_desc((u32) k_int10, 0x08, INTGATE, &kidt[10]);
    init_idt_desc((u32) k_int11, 0x08, INTGATE, &kidt[11]);
    init_idt_desc((u32) k_int12, 0x08, INTGATE, &kidt[12]);
    init_idt_desc((u32) k_int13, 0x08, INTGATE, &kidt[13]);
    init_idt_desc((u32) k_int14, 0x08, INTGATE, &kidt[14]);
    init_idt_desc((u32) k_int15, 0x08, INTGATE, &kidt[15]);
    init_idt_desc((u32) k_int16, 0x08, INTGATE, &kidt[16]);
    init_idt_desc((u32) k_int17, 0x08, INTGATE, &kidt[17]);
    init_idt_desc((u32) k_int18, 0x08, INTGATE, &kidt[18]);

    init_idt_desc((u32) k_irq0, 0x08, INTGATE, &kidt[32]);
    init_idt_desc((u32) k_irq1, 0x08, INTGATE, &kidt[33]);
    init_idt_desc((u32) k_irq2, 0x08, INTGATE, &kidt[34]);
    init_idt_desc((u32) k_irq3, 0x08, INTGATE, &kidt[35]);
    init_idt_desc((u32) k_irq4, 0x08, INTGATE, &kidt[36]);
    init_idt_desc((u32) k_irq5, 0x08, INTGATE, &kidt[37]);
    init_idt_desc((u32) k_irq6, 0x08, INTGATE, &kidt[38]);
    init_idt_desc((u32) k_irq7, 0x08, INTGATE, &kidt[39]);
    init_idt_desc((u32) k_irq8, 0x08, INTGATE, &kidt[40]);

    kidtr.limite = IDTSIZE * 8;
    kidtr.base = IDTBASE;

    memcpy((void *)kidtr.base, kidt, kidtr.limite);
#define printf(format, ...) { char __str[255]; sprintf (__str, format, __VA_ARGS__); print(__str);}

    printf("Loading IDT from 0x%x\n", kidtr);
#undef printf

    asm("lidtl (kidtr)");
}