Subversion Repositories Kolibri OS

Rev

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