75384caf5abc15d668ed68a10a70854f94d0ccec
[reactos.git] / hal / halx86 / reboot.c
1 /* $Id$
2  *
3  * COPYRIGHT:       See COPYING in the top level directory
4  * PROJECT:         ReactOS kernel
5  * FILE:            ntoskrnl/hal/x86/reboot.c
6  * PURPOSE:         Reboot functions.
7  * PROGRAMMER:      Eric Kohl (ekohl@abo.rhein-zeitung.de)
8  * UPDATE HISTORY:
9  *                  Created 11/10/99
10  */
11
12
13 #include <ddk/ntddk.h>
14 #include <hal.h>
15
16
17 static VOID
18 HalReboot (VOID)
19 {
20     char data;
21     BYTE *mem;
22
23     /* enable warm reboot */
24     mem = (BYTE *)(0xd0000000 + 0x0000);
25 //    mem = HalMapPhysicalMemory (0, 1);
26     mem[0x472] = 0x34;
27     mem[0x473] = 0x12;
28
29     /* disable interrupts */
30     __asm__("cli\n");
31
32     /* disable periodic interrupt (RTC) */
33     WRITE_PORT_UCHAR((PUCHAR)0x70, 0x0b);
34     data = READ_PORT_UCHAR((PUCHAR)0x71);
35     WRITE_PORT_UCHAR((PUCHAR)0x71, data & 0xbf);
36
37     /* */
38     WRITE_PORT_UCHAR((PUCHAR)0x70, 0x0a);
39     data = READ_PORT_UCHAR((PUCHAR)0x71);
40     WRITE_PORT_UCHAR((PUCHAR)0x71, (data & 0xf0) | 0x06);
41
42     /* */
43     WRITE_PORT_UCHAR((PUCHAR)0x70, 0x15);
44
45     /* generate RESET signal via keyboard controller */
46     WRITE_PORT_UCHAR((PUCHAR)0x64, 0xfe);
47
48     /* stop the processor */
49 #if 1
50     __asm__("hlt\n");
51 #else
52    for(;;);
53 #endif   
54 }
55
56
57 VOID STDCALL
58 HalReturnToFirmware (
59         ULONG   Action
60         )
61 {
62     if (Action == FIRMWARE_HALT)
63     {
64         DbgPrint ("HalReturnToFirmware called!\n");
65         DbgBreakPoint ();
66     }
67     else if (Action == FIRMWARE_REBOOT)
68     {
69         HalResetDisplay ();
70         HalReboot ();
71     }
72 }
73
74 /* EOF */