Subversion Repositories Kolibri OS

Rev

Rev 7734 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 7734 Rev 8111
Line 9... Line 9...
9
;;  See file COPYING for details.                               ;;
9
;;  See file COPYING for details.                               ;;
10
;;  Copyright 2003 Ville Turjanmaa                              ;;
10
;;  Copyright 2003 Ville Turjanmaa                              ;;
11
;;                                                              ;;
11
;;                                                              ;;
12
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
12
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 13... Line 13...
13
 
13
 
14
$Revision: 7734 $
-
 
15
 
-
 
16
; ACPI Generic Address Structure
-
 
17
struct GAS
-
 
18
        asid        db ? ; address space id
-
 
19
        bit_width   db ?
-
 
20
        bit_offset  db ?
-
 
21
        access_size db ?
-
 
22
        address     DQ ?
-
 
23
ends
-
 
24
 
-
 
25
ASID.SYSTEM_MEMORY = 0
-
 
26
ASID.SYSTEM_IO     = 1
-
 
27
ASID.PCI_CONFIG    = 2
-
 
28
ASID.PCI_EC        = 3
-
 
29
ASID.PCI_SMBUS     = 4
-
 
30
 
-
 
31
ACCESS_SIZE.UNDEFINED = 0
-
 
32
ACCESS_SIZE.BYTE      = 1
-
 
33
ACCESS_SIZE.WORD      = 2
-
 
34
ACCESS_SIZE.DWORD     = 3
-
 
Line 35... Line 14...
35
ACCESS_SIZE.QWORD     = 4
14
$Revision: 8111 $
36
 
15
 
Line 37... Line 16...
37
align 4
16
align 4
38
system_shutdown:          ; shut down the system
17
system_shutdown:          ; shut down the system
39
 
18
 
40
        cmp     byte [BOOT.shutdown_type], SYSTEM_SHUTDOWN
19
        cmp     [BOOT.shutdown_type], SYSTEM_SHUTDOWN
41
        jb      @F
20
        jb      @F
42
        cmp     byte [BOOT.shutdown_type], SYSTEM_RESTART
21
        cmp     [BOOT.shutdown_type], SYSTEM_RESTART
43
        jbe     .valid
22
        jbe     .valid
44
@@:
23
@@:
Line 81... Line 60...
81
.no_shutdown_cpus:
60
.no_shutdown_cpus:
Line 82... Line 61...
82
 
61
 
83
        cli
62
        cli
Line 84... Line 63...
84
        call    IRQ_mask_all
63
        call    IRQ_mask_all
85
 
64
 
86
        mov     eax, dword[BOOT.shutdown_type]
65
        movzx   eax, [BOOT.shutdown_type]
Line 87... Line 66...
87
        cmp     al, SYSTEM_RESTART
66
        cmp     al, SYSTEM_RESTART
88
        jne     @F
67
        jne     @F
Line 96... Line 75...
96
        mov     esi, OS_BASE+restart_code_start ; move kernel re-starter to 0x5000:0
75
        mov     esi, OS_BASE+restart_code_start ; move kernel re-starter to 0x5000:0
97
        mov     edi, OS_BASE+0x50000
76
        mov     edi, OS_BASE+0x50000
98
        mov     ecx, (restart_code_end - restart_code_start)/4
77
        mov     ecx, (restart_code_end - restart_code_start)/4
99
        rep movsd
78
        rep movsd
Line 100... Line -...
100
 
-
 
101
        call    create_trampoline_pgmap
-
 
102
        mov     cr3, eax
-
 
103
        jmp     @F
-
 
104
org $-OS_BASE
-
 
105
@@:
-
 
106
 
-
 
107
;disable paging
-
 
108
 
-
 
109
        mov     eax, cr0
-
 
110
        and     eax, 0x7FFFFFFF
-
 
111
        mov     cr0, eax
-
 
112
        mov     eax, cr3
-
 
113
        mov     cr3, eax
-
 
114
 
79
 
115
        cmp     byte [BOOT_LO.shutdown_type], SYSTEM_SHUTDOWN
80
        cmp     [BOOT.shutdown_type], SYSTEM_SHUTDOWN
Line 116... Line 81...
116
        jne     no_acpi_power_off
81
        jne     not_power_off
Line 117... Line 82...
117
 
82
 
-
 
83
; system_power_off
-
 
84
 
118
; system_power_off
85
        mov     ebx, [acpi_fadt_base]
119
 
86
        test    ebx, ebx
120
        mov     ebx, [acpi_fadt_base-OS_BASE]
87
        jz      no_acpi
-
 
88
        cmp     [ebx+ACPI_TABLE.Signature], 'FACP'
-
 
89
        jne     no_acpi
121
        cmp     dword [ebx], 'FACP'
90
        mov     esi, [acpi_ssdt_base]   ; first SSDT is DSDT
122
        jne     no_acpi_power_off
91
        test    esi, esi
123
        mov     esi, [acpi_dsdt_base-OS_BASE]
92
        jz      no_acpi
124
        cmp     dword [esi], 'DSDT'
93
        cmp     [esi+ACPI_TABLE.Signature], 'DSDT'
125
        jne     no_acpi_power_off
94
        jne     no_acpi
126
        mov     eax, [esi+4] ; DSDT length
95
        mov     eax, [esi+ACPI_TABLE.Length]
127
        sub     eax, 36+4
96
        sub     eax, 36+4
128
        jbe     no_acpi_power_off
97
        jbe     no_acpi
129
        add     esi, 36
98
        add     esi, 36
130
.scan_dsdt:
99
.scan_dsdt:
Line 141... Line 110...
141
        lea     esi, [esi+7]
110
        lea     esi, [esi+7]
142
        xor     ecx, ecx
111
        xor     ecx, ecx
143
        cmp     byte [esi], 0 ; 0 means zero byte, 0Ah xx means byte xx
112
        cmp     byte [esi], 0 ; 0 means zero byte, 0Ah xx means byte xx
144
        jz      @f
113
        jz      @f
145
        cmp     byte [esi], 0xA
114
        cmp     byte [esi], 0xA
146
        jnz     no_acpi_power_off
115
        jnz     no_acpi
147
        inc     esi
116
        inc     esi
148
        mov     cl, [esi]
117
        mov     cl, [esi]
149
@@:
118
@@:
150
        inc     esi
119
        inc     esi
151
        cmp     dl, 2
120
        cmp     dl, 2
152
        jb      @f
121
        jb      @f
153
        cmp     byte [esi], 0
122
        cmp     byte [esi], 0
154
        jz      @f
123
        jz      @f
155
        cmp     byte [esi], 0xA
124
        cmp     byte [esi], 0xA
156
        jnz     no_acpi_power_off
125
        jnz     no_acpi
157
        inc     esi
126
        inc     esi
158
        mov     ch, [esi]
127
        mov     ch, [esi]
159
@@:
128
@@:
160
        jmp     do_acpi_power_off
129
        jmp     do_acpi_power_off
161
.scan_dsdt_cont:
130
.scan_dsdt_cont:
162
        inc     esi
131
        inc     esi
163
        dec     eax
132
        dec     eax
164
        jnz     .scan_dsdt
133
        jnz     .scan_dsdt
165
        jmp     no_acpi_power_off
134
        jmp     no_acpi
166
do_acpi_power_off:
135
do_acpi_power_off:
167
        mov     edx, [ebx+48]
136
        mov     edx, [ebx+ACPI_FADT.SMI_CMD]
168
        test    edx, edx
137
        test    edx, edx
169
        jz      .nosmi
138
        jz      .nosmi
170
        mov     al, [ebx+52]
139
        mov     al, [ebx+ACPI_FADT.ACPI_ENABLE]
171
        out     dx, al
140
        out     dx, al
172
        mov     edx, [ebx+64]
141
        mov     edx, [ebx+ACPI_FADT.PM1a_CNT_BLK]
173
@@:
142
@@:
174
        in      ax, dx
143
        in      ax, dx
175
        test    al, 1
144
        test    al, 1
176
        jz      @b
145
        jz      @b
177
.nosmi:
146
.nosmi:
178
        and     cx, 0x0707
147
        and     cx, 0x0707
179
        shl     cx, 2
148
        shl     cx, 2
180
        or      cx, 0x2020
149
        or      cx, 0x2020
181
        mov     edx, [ebx+64]
150
        mov     edx, [ebx+ACPI_FADT.PM1a_CNT_BLK]
182
        in      ax, dx
151
        in      ax, dx
183
        and     ax, 203h
152
        and     ax, 203h
184
        or      ah, cl
153
        or      ah, cl
185
        out     dx, ax
154
        out     dx, ax
186
        mov     edx, [ebx+68]
155
        mov     edx, [ebx+ACPI_FADT.PM1b_CNT_BLK]
187
        test    edx, edx
156
        test    edx, edx
188
        jz      @f
157
        jz      @f
189
        in      ax, dx
158
        in      ax, dx
190
        and     ax, 203h
159
        and     ax, 203h
191
        or      ah, ch
160
        or      ah, ch
192
        out     dx, ax
161
        out     dx, ax
193
@@:
162
@@:
194
        jmp     $
163
        jmp     no_acpi
Line 195... Line 164...
195
 
164
 
196
no_acpi_power_off:
165
not_power_off:
197
        cmp     byte[BOOT_LO.shutdown_type], SYSTEM_REBOOT
166
        cmp     [BOOT.shutdown_type], SYSTEM_REBOOT
198
        jnz     no_acpi_reboot
167
        jnz     not_reboot
199
        ; try to reboot via ACPI fixed features
168
        ; try to reboot via ACPI fixed features
200
        mov     ebx, [acpi_fadt_base-OS_BASE]
169
        mov     ebx, [acpi_fadt_base]
-
 
170
        test    ebx, ebx
-
 
171
        jz      no_acpi
201
        cmp     dword[ebx], 'FACP'
172
        cmp     [ebx+ACPI_TABLE.Signature], 'FACP'
-
 
173
        jne     no_acpi
-
 
174
        cmp     [ebx+ACPI_FADT.Length], ACPI_FADT.RESET_VALUE
202
        jne     no_acpi_power_off
175
        jbe     no_acpi
203
        test    dword[ebx+0x70], 1 SHL 10    ; RESET_REG_SUP
176
        test    [ebx+ACPI_FADT.Flags], 1 SHL 10    ; reset_reg_supported
204
        jz      no_acpi_reboot
177
        jz      no_acpi
205
        cmp     [ebx+0x74+GAS.asid], ASID.SYSTEM_IO
178
        cmp     [ebx+ACPI_FADT.RESET_REG.ASID], ASID.SYSTEM_IO
206
        jnz     no_acpi_reboot
179
        jnz     no_acpi
207
        cmp     [ebx+0x74+GAS.bit_width], 8
180
        cmp     [ebx+ACPI_FADT.RESET_REG.BitWidth], 8
208
        jnz     no_acpi_reboot
181
        jnz     no_acpi
209
        cmp     [ebx+0x74+GAS.bit_offset], 0
182
        cmp     [ebx+ACPI_FADT.RESET_REG.BitOffset], 0
210
        jnz     no_acpi_reboot
183
        jnz     no_acpi
211
        cmp     [ebx+0x74+GAS.access_size], ACCESS_SIZE.BYTE
184
        cmp     [ebx+ACPI_FADT.RESET_REG.AccessSize], ACCESS_SIZE.BYTE
212
        ja      no_acpi_reboot
185
        ja      no_acpi
213
        cmp     [ebx+0x74+GAS.address.hi], 0
186
        cmp     [ebx+ACPI_FADT.RESET_REG.Address.hi], 0
-
 
187
        jnz     no_acpi
214
        jnz     no_acpi_reboot
188
        ; 'enable' ACPI
215
        mov     edx, [ebx+0x74+GAS.address.lo]
189
        mov     edx, [ebx+ACPI_FADT.SMI_CMD]
-
 
190
        test    edx, edx
-
 
191
        jz      .nosmi
216
        movzx   eax, byte[ebx+0x80]
192
        mov     al, [ebx+ACPI_FADT.ACPI_ENABLE]
-
 
193
        out     dx, al
-
 
194
        mov     edx, [ebx+ACPI_FADT.PM1a_CNT_BLK]
-
 
195
@@:
-
 
196
        in      ax, dx
217
        out     dx, al
197
        test    al, 1
-
 
198
        jz      @b
-
 
199
.nosmi:
-
 
200
 
-
 
201
        mov     edx, [ebx+ACPI_FADT.RESET_REG.Address.lo]
-
 
202
        movzx   eax, [ebx+ACPI_FADT.RESET_VALUE]
218
        jmp     $
203
        out     dx, al
-
 
204
        jmp     no_acpi
219
        ; unreachable
205
 
-
 
206
not_reboot:
-
 
207
no_acpi:
-
 
208
        call    create_trampoline_pgmap
-
 
209
        mov     cr3, eax
-
 
210
        jmp     @F
-
 
211
org $-OS_BASE
-
 
212
@@:
-
 
213
 
-
 
214
;disable paging
-
 
215
 
-
 
216
        mov     eax, cr0
-
 
217
        and     eax, 0x7FFFFFFF
-
 
218
        mov     cr0, eax
-
 
219
        mov     eax, cr3
-
 
220
        mov     cr3, eax
220
no_acpi_reboot:
221
 
Line 221... Line 222...
221
        jmp     0x50000
222
        jmp     0x50000
222
 
223
 
223
align 4
224
align 4
Line 224... Line 225...
224
restart_code_start:
225
restart_code_start:
225
org 0x50000
226
org 0x50000
Line 226... Line 227...
226
 
227
 
227
        cmp     byte [BOOT_LO.shutdown_type], SYSTEM_RESTART
228
        cmp     [BOOT_LO.shutdown_type], SYSTEM_RESTART
228
        jne     @F
229
        jne     @F