coverity appeasement
[minix.git] / kernel / arch / i386 / klib16.S
blob36a0683cc78e213a2dda62fbc1775fb6a7e818b7
1 /* sections */
4 #include <minix/config.h>
5 #include <minix/const.h>
6 #include <machine/asm.h>
7 #include <machine/interrupt.h>
8 #include "archconst.h"
9 #include "kernel/const.h"
10 #include "sconst.h"
11 #include <machine/multiboot.h>
14  * This file contains a number of 16-bit assembly code utility routines needed by the
15  * kernel.
16  */
18 .text
19 .code16
21 /*===========================================================================*/
22 /*                              poweroff16                                           */
23 /*===========================================================================*/
24 /* PUBLIC void poweroff16(); */
25 /* Power down system */
26 ENTRY(poweroff16)
27         /* Assume eax is already set to required value of cr0*/
28 .byte   0x0F,0x22,0xC0  /* mov %cr0,%eax */
29         ljmp    $0,$(BIOS_POWEROFF_ENTRY + real_mode - _C_LABEL(poweroff16))
30 real_mode:
31         mov     $((BIOS_POWEROFF_ENTRY >> 4) + 0x200),%ax
32         mov     %ax, %ds
33         mov     %ax, %es
34         mov     %ax, %ss
35         mov     $0x1000, %sp
37         xorb    %ah, %ah
38 /* Close gate A20 */
39 gate_A20:
40         call    kb_wait
41         movb    $0xD1,%al
42         outb    $0x64
43         call    kb_wait
44         movb    $0xDD,%al
45         orb             %ah,%al
46         outb    $0x60
47         call    kb_wait
48         movb    $0xFF,%al
49         outb    $0x64
50         call    kb_wait
51         
52         /* Connect to APM */
53         mov     $0x5301,%ax
54         mov     $0x0,%bx
55         int     $0x15
56         jc      apm_err
57         
58         /* Enable power management */
59         mov     $0x5308,%ax
60         mov     $0x1,%bx
61         mov     $0x1,%cx
62         int     $0x15
63         jc      apm_err
64         
65         /* Set power state to off */
66         mov     $0x5307,%ax
67         mov     $0x01,%bx
68         mov     $0x3,%cx
69         int     $0x15
70         jc      apm_err
71 0:      hlt
72         jmp     0b
73         
74 poweroff_msg:
75 .ascii  "You can poweroff the machine safely now"
76 poweroff_msg_end:
77 #define POWEROFF_MSG_LEN        (poweroff_msg_end-poweroff_msg)
78 apm_err:
79         /* If APM can't perform the shutdown, print something to inform */
80         mov     $0x02, %ax      /* clear screen */
81         int     $0x10
82         
83         mov     $(BIOS_POWEROFF_ENTRY >> 4), %ax
84         mov     %ax, %es
85         mov     $0x1301, %ax
86         mov     $0x07, %bx
87         mov     $POWEROFF_MSG_LEN, %cx
88         mov     $0x0300, %dx
89         mov     $(poweroff_msg - _C_LABEL(poweroff16)), %bp
90         int     $0x10
91 0:      hlt
92         jmp     0b
93         
94 kb_wait:
95         inb     $0x64
96         testb   $0x02,%al
97         jnz     kb_wait
98         ret
99 /*mark the end for copy*/
100 LABEL(poweroff16_end)