Subversion Repositories HelenOS

Rev

Rev 194 | Rev 224 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 194 Rev 206
Line 34... Line 34...
34
# include <typedefs.h>
34
# include <typedefs.h>
35
# include <arch/context.h>
35
# include <arch/context.h>
36
#endif
36
#endif
37
 
37
 
38
#define IDT_ITEMS 64
38
#define IDT_ITEMS 64
39
#define GDT_ITEMS 7
39
#define GDT_ITEMS 8
40
 
40
 
41
#define NULL_DES    0
41
#define NULL_DES    0
42
#define KTEXT_DES   1
42
#define KTEXT_DES   1
43
#define KDATA_DES   2
43
#define KDATA_DES   2
44
#define UTEXT_DES   3
44
#define UTEXT_DES   3
45
#define UDATA_DES   4
45
#define UDATA_DES   4
46
#define KTEXT32_DES     5
46
#define KTEXT32_DES     5
47
#define TSS_DES     6
47
#define TSS_DES     6
48
 
48
 
49
#define selector(des)   ((des)<<3)
49
#define gdtselector(des)    ((des)<<3)
-
 
50
#define idtselector(des)        ((des)<<4)
50
 
51
 
51
#define PL_KERNEL   0
52
#define PL_KERNEL   0
52
#define PL_USER     3
53
#define PL_USER     3
53
 
54
 
54
#define AR_PRESENT  (1<<7)
55
#define AR_PRESENT  (1<<7)
55
#define AR_DATA     (2<<3)
56
#define AR_DATA     (2<<3)
56
#define AR_CODE     (3<<3)
57
#define AR_CODE     (3<<3)
57
#define AR_WRITABLE (1<<1)
58
#define AR_WRITABLE (1<<1)
58
#define AR_READABLE     (1<<1)
59
#define AR_READABLE     (1<<1)
59
#define AR_INTERRUPT    (0xe)
-
 
60
#define AR_TSS      (0x9)
60
#define AR_TSS      (0x9)
-
 
61
#define AR_INTERRUPT    (0xe)
-
 
62
#define AR_TRAP         (0xf)
61
 
63
 
62
#define DPL_KERNEL  (PL_KERNEL<<5)
64
#define DPL_KERNEL  (PL_KERNEL<<5)
63
#define DPL_USER    (PL_USER<<5)
65
#define DPL_USER    (PL_USER<<5)
64
 
66
 
65
#define IO_MAP_BASE (104)
67
#define IO_MAP_BASE (104)
66
 
68
 
67
#ifndef __ASM__
69
#ifndef __ASM__
68
 
70
 
69
struct ptr_16_32 {
-
 
70
    __u16 limit;
-
 
71
    __u32 base;
-
 
72
} __attribute__ ((packed));
-
 
73
 
-
 
74
struct descriptor {
71
struct descriptor {
75
    unsigned limit_0_15: 16;
72
    unsigned limit_0_15: 16;
76
    unsigned base_0_15: 16;
73
    unsigned base_0_15: 16;
77
    unsigned base_16_23: 8;
74
    unsigned base_16_23: 8;
78
    unsigned access: 8;
75
    unsigned access: 8;
Line 82... Line 79...
82
    unsigned special: 1;
79
    unsigned special: 1;
83
    unsigned granularity : 1;
80
    unsigned granularity : 1;
84
    unsigned base_24_31: 8;
81
    unsigned base_24_31: 8;
85
} __attribute__ ((packed));
82
} __attribute__ ((packed));
86
 
83
 
-
 
84
struct tss_descriptor {
-
 
85
    unsigned limit_0_15: 16;
-
 
86
    unsigned base_0_15: 16;
-
 
87
    unsigned base_16_23: 8;
-
 
88
    unsigned type: 4;
-
 
89
    unsigned reserve1 : 1;
-
 
90
    unsigned dpl : 2;
-
 
91
    unsigned present : 1;
-
 
92
    unsigned limit_16_19: 4;
-
 
93
    unsigned available: 1;
-
 
94
    unsigned reserve2: 2;
-
 
95
    unsigned granularity : 1;
-
 
96
    unsigned base_24_31: 8;
-
 
97
    unsigned base_32_63 : 32;
-
 
98
    unsigned reserve3 : 32;
-
 
99
} __attribute__ ((packed));
-
 
100
 
87
struct idescriptor {
101
struct idescriptor {
88
    unsigned offset_0_15: 16;
102
    unsigned offset_0_15: 16;
89
    unsigned selector: 16;
103
    unsigned selector: 16;
-
 
104
    unsigned ist:3;
90
    unsigned unused: 8;
105
    unsigned unused: 5;
91
    unsigned access: 8;
106
    unsigned type: 5;
-
 
107
    unsigned dpl: 2;
-
 
108
    unsigned present : 1;
92
    unsigned offset_16_31: 16;
109
    unsigned offset_16_31: 16;
-
 
110
    unsigned offset_32_63: 16;
-
 
111
    unsigned reserved : 32;
93
} __attribute__ ((packed));
112
} __attribute__ ((packed));
94
 
113
 
-
 
114
struct ptr_16_64 {
-
 
115
    __u16 limit;
-
 
116
    __u64 base;
-
 
117
} __attribute__ ((packed));
95
 
118
 
96
struct tss {
119
struct tss {
97
    __u16 link;
-
 
98
    unsigned : 16;
-
 
99
    __u32 esp0;
120
    __u32 reserve1;
100
    __u16 ss0;
121
    __u64 rsp0;
101
    unsigned : 16;
-
 
102
    __u32 esp1;
122
    __u64 rsp1;
103
    __u16 ss1;
-
 
104
    unsigned : 16;
-
 
105
    __u32 esp2;
123
    __u64 rsp2;
106
    __u16 ss2;
124
    __u64 reserve2;
107
    unsigned : 16;
-
 
108
    __u32 cr3;
-
 
109
    __u32 eip;
-
 
110
    __u32 eflags;
-
 
111
    __u32 eax;
-
 
112
    __u32 ecx;
-
 
113
    __u32 edx;
-
 
114
    __u32 ebx;
-
 
115
    __u32 esp;
125
    __u64 ist1;
116
    __u32 ebp;
-
 
117
    __u32 esi;
126
    __u64 ist2;
118
    __u32 edi;
-
 
119
    __u16 es;
127
    __u64 ist3;
120
    unsigned : 16;
-
 
121
    __u16 cs;
128
    __u64 ist4;
122
    unsigned : 16;
-
 
123
    __u16 ss;
129
    __u64 ist5;
124
    unsigned : 16;
-
 
125
    __u16 ds;
130
    __u64 ist6;
126
    unsigned : 16;
-
 
127
    __u16 fs;
131
    __u64 ist7;
128
    unsigned : 16;
-
 
129
    __u16 gs;
132
    __u64 reserve3;
130
    unsigned : 16;
-
 
131
    __u16 ldtr;
133
    __u16 reserve4;
132
    unsigned : 16;
-
 
133
    unsigned : 16;
-
 
134
    __u16 io_map_base;
134
    __u16 iomap;
135
} __attribute__ ((packed));
135
} __attribute__ ((packed));
136
 
136
 
137
extern struct ptr_16_32 gdtr;
-
 
138
extern struct tss *tss_p;
137
extern struct tss *tss_p;
139
 
138
 
140
extern struct descriptor gdt[];
139
extern struct descriptor gdt[];
141
extern struct idescriptor idt[];
140
extern struct idescriptor idt[];
142
 
141
 
-
 
142
extern struct ptr_16_64 gdtr;
-
 
143
 
143
extern void pm_init(void);
144
extern void pm_init(void);
144
 
145
 
145
extern void gdt_setbase(struct descriptor *d, __address base);
146
extern void gdt_tss_setbase(struct descriptor *d, __address base);
146
extern void gdt_setlimit(struct descriptor *d, __u32 limit);
147
extern void gdt_tss_setlimit(struct descriptor *d, __u32 limit);
147
 
148
 
148
extern void idt_init(void);
149
extern void idt_init(void);
149
extern void idt_setoffset(struct idescriptor *d, __address offset);
150
extern void idt_setoffset(struct idescriptor *d, __address offset);
150
 
151
 
151
extern void tss_initialize(struct tss *t);
152
extern void tss_initialize(struct tss *t);