Rev 76 | Rev 102 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1 | ha | 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
||
3 | ;; MenuetOS process management, protected ring3 ;; |
||
4 | ;; ;; |
||
5 | ;; Distributed under GPL. See file COPYING for details. ;; |
||
6 | ;; Copyright 2003 Ville Turjanmaa ;; |
||
7 | ;; ;; |
||
8 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
9 | |||
10 | align 32 |
||
11 | |||
12 | ; GDT TABLE |
||
13 | |||
14 | gdts: |
||
15 | |||
16 | dw gdte-$-1 |
||
17 | dd gdts |
||
18 | dw 0 |
||
19 | |||
20 | int_code_l: |
||
21 | os_code_l: |
||
22 | |||
23 | dw 0xffff |
||
24 | dw 0x0000 |
||
25 | db 0x00 |
||
26 | dw 11011111b *256 +10011010b |
||
27 | db 0x00 |
||
28 | |||
29 | int_data_l: |
||
30 | os_data_l: |
||
31 | |||
32 | dw 0xffff |
||
33 | dw 0x0000 |
||
34 | db 0x00 |
||
35 | dw 11011111b *256 +10010010b |
||
36 | db 0x00 |
||
37 | |||
76 | mario79 | 38 | ; --------------- APM --------------------- |
39 | apm_code_32: |
||
40 | dw 0x10 ; limit 64kb |
||
41 | db 0, 0, 0 |
||
42 | dw 11011111b *256 +10011010b |
||
43 | db 0x00 |
||
44 | apm_code_16: |
||
45 | dw 0x10 |
||
46 | db 0, 0, 0 |
||
47 | dw 10011111b *256 +10011010b |
||
48 | db 0x00 |
||
49 | apm_data_16: |
||
50 | dw 0x10 |
||
51 | db 0, 0, 0 |
||
52 | dw 10011111b *256 +10010010b |
||
53 | db 0x00 |
||
54 | ; ----------------------------------------- |
||
55 | |||
1 | ha | 56 | app_code_l: |
4 | poddubny | 57 | dw ((0x80000000-std_application_base_address) shr 12) and 0xffff |
58 | dw 0 |
||
59 | db 0 |
||
60 | dw 11010000b*256+11111010b+256*((0x80000000-std_application_base_address) shr 28) |
||
61 | db std_application_base_address shr 24 |
||
1 | ha | 62 | |
63 | app_data_l: |
||
4 | poddubny | 64 | dw (0x80000000-std_application_base_address) shr 12 and 0xffff |
65 | dw 0 |
||
66 | db 0 |
||
67 | dw 11010000b*256+11110010b+256*((0x80000000-std_application_base_address) shr 28) |
||
68 | db std_application_base_address shr 24 |
||
1 | ha | 69 | |
8 | poddubny | 70 | graph_data_l: |
1 | ha | 71 | |
8 | poddubny | 72 | dw 0x3ff |
73 | dw 0x0000 |
||
74 | db 0x00 |
||
75 | dw 11010000b *256 +11110010b |
||
76 | db 0x00 |
||
77 | |||
78 | tss0_l: |
||
79 | times (max_processes+10) dd 0,0 |
||
80 | |||
1 | ha | 81 | gdte: |
82 | |||
83 | |||
84 | |||
85 | idtreg: |
||
86 | dw 8*0x41-1 |
||
87 | dd idts+8 |
||
88 | label idts at 0xB100-8 |
||
89 | |||
90 | |||
91 | |||
8 | poddubny | 92 | uglobal |
93 | tss_sceleton: |
||
94 | l.back dw 0,0 |
||
95 | l.esp0 dd 0 |
||
96 | l.ss0 dw 0,0 |
||
97 | l.esp1 dd 0 |
||
98 | l.ss1 dw 0,0 |
||
99 | l.esp2 dd 0 |
||
100 | l.ss2 dw 0,0 |
||
101 | l.cr3 dd 0 |
||
102 | l.eip dd 0 |
||
103 | l.eflags dd 0 |
||
104 | l.eax dd 0 |
||
105 | l.ecx dd 0 |
||
106 | l.edx dd 0 |
||
107 | l.ebx dd 0 |
||
108 | l.esp dd 0 |
||
109 | l.ebp dd 0 |
||
110 | l.esi dd 0 |
||
111 | l.edi dd 0 |
||
112 | l.es dw 0,0 |
||
113 | l.cs dw 0,0 |
||
114 | l.ss dw 0,0 |
||
115 | l.ds dw 0,0 |
||
116 | l.fs dw 0,0 |
||
117 | l.gs dw 0,0 |
||
118 | l.ldt dw 0,0 |
||
119 | l.trap dw 0 |
||
120 | l.io dw 0 |
||
121 | endg |
||
122 | |||
123 | |||
1 | ha | 124 | build_process_gdt_tss_pointer: |
125 | |||
126 | mov ecx,tss_data |
||
127 | mov edi,0 |
||
128 | setgdtl2: |
||
129 | mov [edi+gdts+ tss0 +0], word tss_step |
||
130 | mov [edi+gdts+ tss0 +2], cx |
||
131 | mov eax,ecx |
||
132 | shr eax,16 |
||
133 | mov [edi+gdts+ tss0 +4], al |
||
134 | mov [edi+gdts+ tss0 +7], ah |
||
135 | mov [edi+gdts+ tss0 +5], word 01010000b *256 +11101001b |
||
136 | add ecx,tss_step |
||
137 | add edi,8 |
||
138 | cmp edi,8*(max_processes+5) |
||
139 | jbe setgdtl2 |
||
140 | |||
141 | ret |
||
142 | |||
143 | |||
144 | build_interrupt_table: |
||
145 | |||
6 | poddubny | 146 | mov edi, idts+8 |
147 | mov esi, sys_int |
||
8 | poddubny | 148 | mov ecx, 0x40 |
6 | poddubny | 149 | @@: |
150 | mov eax, [esi] |
||
151 | mov [edi], ax ; lower part of offset |
||
152 | mov [edi+2], word os_code ; segment selector |
||
153 | shr eax, 16 |
||
154 | mov [edi+4], word 10001110b shl 8 ; interrupt descriptor |
||
155 | mov [edi+6], ax |
||
156 | add esi, 4 |
||
157 | add edi, 8 |
||
158 | dec ecx |
||
159 | jnz @b |
||
8 | poddubny | 160 | |
161 | ;mov edi,8*0x40+idts+8 |
||
3 | halyavin | 162 | mov [edi + 0], word (i40 and ((1 shl 16)-1)) |
163 | mov [edi + 2], word os_code |
||
164 | mov [edi + 4], word 11101110b*256 |
||
9 | halyavin | 165 | mov [edi + 6], word (i40 shr 16) |
1 | ha | 166 | |
167 | ret |
||
168 | |||
169 | |||
170 | |||
171 | iglobal |
||
172 | sys_int: |
||
66 | diamond | 173 | dd e0,debug_exc,e2,e3,e4,e5,e6,e7,e8,e9,e10,e11,e12,e13,e14,e15 |
8 | poddubny | 174 | dd e16,e17 |
1 | ha | 175 | times 14 dd unknown_interrupt |
176 | |||
177 | dd irq0 ,irq1 ,p_irq2 ,p_irq3 ,p_irq4 ,p_irq5,p_irq6 ,p_irq7 |
||
178 | dd p_irq8,p_irq9,p_irq10,p_irq11,p_irq12,irqD ,p_irq14,p_irq15 |
||
179 | |||
180 | times 16 dd unknown_interrupt |
||
181 | |||
182 | dd i40 |
||
183 | endg |
||
184 | |||
40 | halyavin | 185 | macro save_ring3_context |
186 | { |
||
58 | mario79 | 187 | push ds es |
188 | pushad |
||
40 | halyavin | 189 | } |
190 | macro restore_ring3_context |
||
191 | { |
||
58 | mario79 | 192 | popad |
193 | pop es ds |
||
40 | halyavin | 194 | } |
195 | |||
8 | poddubny | 196 | ; simply return control to interrupted process |
197 | unknown_interrupt: |
||
198 | iret |
||
1 | ha | 199 | |
22 | poddubny | 200 | macro exc_wo_code [num] |
8 | poddubny | 201 | { |
202 | forward |
||
203 | e#num : |
||
40 | halyavin | 204 | save_ring3_context |
20 | mario79 | 205 | mov bl, num |
206 | jmp exc_c |
||
8 | poddubny | 207 | } |
1 | ha | 208 | |
22 | poddubny | 209 | macro exc_w_code [num] |
210 | { |
||
211 | forward |
||
212 | e#num : |
||
213 | add esp, 4 |
||
40 | halyavin | 214 | save_ring3_context |
22 | poddubny | 215 | mov bl, num |
216 | jmp exc_c |
||
217 | } |
||
218 | |||
219 | exc_wo_code 0, 1, 2, 3, 4, 5, 6, 9, 15, 16 ; 18, 19 |
||
220 | exc_w_code 8, 10, 11, 12, 13, 14, 17 |
||
221 | |||
8 | poddubny | 222 | exc_c: |
6 | poddubny | 223 | mov ax, os_data |
224 | mov ds, ax |
||
225 | mov es, ax |
||
1 | ha | 226 | |
40 | halyavin | 227 | ; test if debugging |
228 | cli |
||
229 | mov eax, [0x3000] |
||
230 | shl eax, 8 |
||
231 | mov eax, [0x80000+eax+0xAC] |
||
232 | test eax, eax |
||
233 | jnz .debug |
||
234 | sti |
||
235 | ; not debuggee => say error and terminate |
||
236 | add esp, 28h |
||
8 | poddubny | 237 | movzx eax, bl |
238 | mov [error_interrupt], eax |
||
1 | ha | 239 | call show_error_parameters |
8 | poddubny | 240 | |
241 | mov edx, [0x3010] |
||
242 | mov [edx + 0xA], byte 4 |
||
243 | |||
1 |