]> git.saurik.com Git - apple/xnu.git/blame - pexpert/i386/kd.c
xnu-792.6.22.tar.gz
[apple/xnu.git] / pexpert / i386 / kd.c
CommitLineData
1c79356b
A
1/*
2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
e5568f75
A
6 * The contents of this file constitute Original Code as defined in and
7 * are subject to the Apple Public Source License Version 1.1 (the
8 * "License"). You may not use this file except in compliance with the
9 * License. Please obtain a copy of the License at
10 * http://www.apple.com/publicsource and read it before using this file.
1c79356b 11 *
e5568f75
A
12 * This Original Code and all software distributed under the License are
13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
1c79356b
A
14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
e5568f75
A
16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17 * License for the specific language governing rights and limitations
18 * under the License.
1c79356b
A
19 *
20 * @APPLE_LICENSE_HEADER_END@
21 */
22/*
23 * @OSF_COPYRIGHT@
24 */
25/*
26 */
27
28/*
29 * Olivetti Mach Console driver v0.0
30 * Copyright Ing. C. Olivetti & C. S.p.A. 1988, 1989
31 * All rights reserved.
32 *
33 */
34/*
35 * Copyright 1988, 1989 by Olivetti Advanced Technology Center, Inc.,
36 * Cupertino, California.
37 *
38 * All Rights Reserved
39 *
40 * Permission to use, copy, modify, and distribute this software and
41 * its documentation for any purpose and without fee is hereby
42 * granted, provided that the above copyright notice appears in all
43 * copies and that both the copyright notice and this permission notice
44 * appear in supporting documentation, and that the name of Olivetti
45 * not be used in advertising or publicity pertaining to distribution
46 * of the software without specific, written prior permission.
47 *
48 * OLIVETTI DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
49 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
50 * IN NO EVENT SHALL OLIVETTI BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
51 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
52 * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
53 * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUR OF OR IN CONNECTION
54 * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
55 *
56 *
57 * Copyright 1988, 1989 by Intel Corporation, Santa Clara, California.
58 *
59 * All Rights Reserved
60 *
61 * Permission to use, copy, modify, and distribute this software and
62 * its documentation for any purpose and without fee is hereby
63 * granted, provided that the above copyright notice appears in all
64 * copies and that both the copyright notice and this permission notice
65 * appear in supporting documentation, and that the name of Intel
66 * not be used in advertising or publicity pertaining to distribution
67 * of the software without specific, written prior permission.
68 *
69 * INTEL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
70 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
71 * IN NO EVENT SHALL INTEL BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
72 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
73 * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
74 * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
75 * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
76 */
77
78/* $ Header: $ */
79
0b4e3aa0 80#include <pexpert/pexpert.h>
1c79356b 81
91447636
A
82extern void cpu_shutdown(void);
83
84int cngetc(void);
85int cnmaygetc(void);
86void kdreboot(void);
87
1c79356b 88/*
0b4e3aa0 89 * Common I/O ports.
1c79356b 90 */
0b4e3aa0
A
91#define K_RDWR 0x60 /* keyboard data & cmds (read/write) */
92#define K_STATUS 0x64 /* keybd status (read-only) */
93#define K_CMD 0x64 /* keybd ctlr command (write-only) */
1c79356b
A
94
95/*
0b4e3aa0 96 * Bit definitions for K_STATUS port.
1c79356b 97 */
0b4e3aa0
A
98#define K_OBUF_FUL 0x01 /* output (from keybd) buffer full */
99#define K_IBUF_FUL 0x02 /* input (to keybd) buffer full */
100#define K_SYSFLAG 0x04 /* "System Flag" */
101#define K_CMD_DATA 0x08 /* 1 = input buf has cmd, 0 = data */
102#define K_KBD_INHBT 0x10 /* 0 if keyboard inhibited */
103#define K_XMT_TIMEOUT 0x20 /* Transmit time out */
104#define K_RCV_TIMEOUT 0x40 /* Receive time out */
1c79356b 105
0b4e3aa0
A
106/*
107 * Keyboard controller commands (sent to K_CMD port).
108 */
109#define K_CMD_READ 0x20 /* read controller command byte */
110#define K_CMD_WRITE 0x60 /* write controller command byte */
111#define K_CMD_TEST 0xab /* test interface */
112#define K_CMD_DUMP 0xac /* diagnostic dump */
113#define K_CMD_DISBLE 0xad /* disable keyboard */
114#define K_CMD_ENBLE 0xae /* enable keyboard */
115#define K_CMD_RDKBD 0xc4 /* read keyboard ID */
116#define K_CMD_ECHO 0xee /* used for diagnostic testing */
117#define K_CMD_RESET 0xfe /* issue a system reset */
1c79356b
A
118
119/*
0b4e3aa0 120 * cngetc / cnmaygetc
1c79356b 121 *
0b4e3aa0
A
122 * Get one character using polling, rather than interrupts.
123 * Used by the kernel debugger.
1c79356b
A
124 */
125
126int
127cngetc(void)
128{
0b4e3aa0 129 char c;
1c79356b 130
0b4e3aa0
A
131 if ( 0 == (*PE_poll_input)(0, &c) )
132 return ( c );
133 else
134 return ( 0 );
1c79356b
A
135}
136
137int
138cnmaygetc(void)
139{
0b4e3aa0 140 char c;
1c79356b 141
0b4e3aa0
A
142 if ( 0 == (*PE_poll_input)(0, &c) )
143 return ( c );
144 else
145 return ( 0 );
1c79356b
A
146}
147
1c79356b 148/*
0b4e3aa0 149 * kd_sendcmd
1c79356b 150 *
0b4e3aa0
A
151 * This function sends a command byte to the keyboard command
152 * port, but first waits until the input/output data buffer is
153 * clear before sending the data.
1c79356b 154 *
1c79356b
A
155 */
156
0b4e3aa0
A
157static void
158kd_sendcmd(unsigned char ch)
1c79356b 159{
0b4e3aa0
A
160 while (inb(K_STATUS) & K_IBUF_FUL);
161 outb(K_CMD, ch);
1c79356b
A
162}
163
1c79356b 164/*
0b4e3aa0 165 * kdreboot
1c79356b 166 *
0b4e3aa0
A
167 * Send a command to the motherboard keyboard controller to
168 * issue a hardware reset.
1c79356b
A
169 */
170
1c79356b
A
171void
172kdreboot(void)
173{
0b4e3aa0 174 kd_sendcmd( K_CMD_RESET );
1c79356b 175
0b4e3aa0
A
176 /*
177 * DRAT. We're still here. Let's try a "CPU shutdown", which consists
178 * of clearing the IDTR and causing an exception. It's in locore.s
179 */
180 cpu_shutdown();
181 /*NOTREACHED*/
1c79356b 182}