1 /* $NetBSD: OsdMisc.c,v 1.16 2017/01/25 13:38:40 christos Exp $ */
2
3 /*
4 * Copyright 2001 Wasabi Systems, Inc.
5 * All rights reserved.
6 *
7 * Written by Jason R. Thorpe for Wasabi Systems, Inc.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 * 3. All advertising materials mentioning features or use of this software
18 * must display the following acknowledgement:
19 * This product includes software developed for the NetBSD Project by
20 * Wasabi Systems, Inc.
21 * 4. The name of Wasabi Systems, Inc. may not be used to endorse
22 * or promote products derived from this software without specific prior
23 * written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
27 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC
29 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35 * POSSIBILITY OF SUCH DAMAGE.
36 */
37
38 /*
39 * Copyright (C) 2000 - 2017, Intel Corp.
40 * All rights reserved.
41 *
42 * Redistribution and use in source and binary forms, with or without
43 * modification, are permitted provided that the following conditions
44 * are met:
45 * 1. Redistributions of source code must retain the above copyright
46 * notice, this list of conditions, and the following disclaimer,
47 * without modification.
48 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
49 * substantially similar to the "NO WARRANTY" disclaimer below
50 * ("Disclaimer") and any redistribution must be conditioned upon
51 * including a substantially similar Disclaimer requirement for further
52 * binary redistribution.
53 * 3. Neither the names of the above-listed copyright holders nor the names
54 * of any contributors may be used to endorse or promote products derived
55 * from this software without specific prior written permission.
56 *
57 * Alternatively, this software may be distributed under the terms of the
58 * GNU General Public License ("GPL") version 2 as published by the Free
59 * Software Foundation.
60 *
61 * NO WARRANTY
62 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
63 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
64 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
65 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
66 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
67 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
68 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
69 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
70 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
71 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
72 * POSSIBILITY OF SUCH DAMAGES.
73 */
74
75 /*
76 * OS Services Layer
77 *
78 * 6.10: Miscellaneous
79 */
80
81 #include <sys/cdefs.h>
82 __KERNEL_RCSID(0, "$NetBSD: OsdMisc.c,v 1.16 2017/01/25 13:38:40 christos Exp $");
83
84 #include "opt_acpi.h"
85 #include "opt_ddb.h"
86
87 #include <sys/param.h>
88 #include <sys/systm.h>
89
90 #include <machine/db_machdep.h>
91
92 #include <ddb/db_extern.h>
93 #include <ddb/db_output.h>
94
95 #include <dev/acpi/acpica.h>
96 #include <dev/acpi/acpi_osd.h>
97
98 #ifdef ACPI_DEBUG
99 #include <external/bsd/acpica/dist/include/acpi.h>
100 #include <external/bsd/acpica/dist/include/accommon.h>
101 #include <external/bsd/acpica/dist/include/acdebug.h>
102 #endif
103
104 #ifdef ACPI_DSDT_OVERRIDE
105 #ifndef ACPI_DSDT_FILE
106 #define ACPI_DSDT_FILE "dsdt.hex"
107 #endif
108 #include ACPI_DSDT_FILE
109 #endif
110
111 int acpi_indebugger;
112
113 /*
114 * AcpiOsSignal:
115 *
116 * Break to the debugger or display a breakpoint message.
117 */
118 ACPI_STATUS
AcpiOsSignal(UINT32 Function,void * Info)119 AcpiOsSignal(UINT32 Function, void *Info)
120 {
121 /*
122 * the upper layer might call with Info = NULL,
123 * which makes little sense.
124 */
125 if (Info == NULL)
126 return AE_NO_MEMORY;
127
128 switch (Function) {
129 case ACPI_SIGNAL_FATAL:
130 {
131 ACPI_SIGNAL_FATAL_INFO *info = Info;
132
133 panic("ACPI fatal signal: "
134 "Type 0x%08x, Code 0x%08x, Argument 0x%08x",
135 info->Type, info->Code, info->Argument);
136 /* NOTREACHED */
137 break;
138 }
139
140 case ACPI_SIGNAL_BREAKPOINT:
141 {
142 #ifdef ACPI_BREAKPOINT
143 char *info = Info;
144
145 printf("%s\n", info);
146 # if defined(DDB)
147 Debugger();
148 # else
149 printf("ACPI: WARNING: DDB not configured into kernel.\n");
150 return AE_NOT_EXIST;
151 # endif
152 #endif
153 break;
154 }
155
156 default:
157 return AE_BAD_PARAMETER;
158 }
159
160 return AE_OK;
161 }
162
163 ACPI_STATUS
AcpiOsGetLine(char * Buffer,UINT32 BufferLength,UINT32 * BytesRead)164 AcpiOsGetLine(char *Buffer, UINT32 BufferLength, UINT32 *BytesRead)
165 {
166 #if defined(DDB)
167 char *cp;
168
169 db_readline(Buffer, 80);
170 for (cp = Buffer; *cp != 0; cp++)
171 if (*cp == '\n' || *cp == '\r')
172 *cp = 0;
173 db_output_line = 0;
174 return AE_OK;
175 #else
176 printf("ACPI: WARNING: DDB not configured into kernel.\n");
177 return AE_NOT_EXIST;
178 #endif
179 }
180
181 ACPI_STATUS
AcpiOsTableOverride(ACPI_TABLE_HEADER * ExistingTable,ACPI_TABLE_HEADER ** NewTable)182 AcpiOsTableOverride(ACPI_TABLE_HEADER *ExistingTable,
183 ACPI_TABLE_HEADER **NewTable)
184 {
185 #ifndef ACPI_DSDT_OVERRIDE
186 *NewTable = NULL;
187 #else
188 if (strncmp(ExistingTable->Signature, "DSDT", 4) == 0)
189 *NewTable = (ACPI_TABLE_HEADER *)AmlCode;
190 else
191 *NewTable = NULL;
192 #endif
193 return AE_OK;
194 }
195
196 ACPI_STATUS
AcpiOsPredefinedOverride(const ACPI_PREDEFINED_NAMES * InitVal,ACPI_STRING * NewVal)197 AcpiOsPredefinedOverride(const ACPI_PREDEFINED_NAMES *InitVal,
198 ACPI_STRING *NewVal)
199 {
200 if (!InitVal || !NewVal)
201 return AE_BAD_PARAMETER;
202
203 *NewVal = NULL;
204 return AE_OK;
205 }
206
207
208 /*
209 * AcpiOsPhysicalTableOverride:
210 *
211 * ExistingTable - Header of current table (probably firmware)
212 * NewAddress - Where new table address is returned
213 * (Physical address)
214 * NewTableLength - Where new table length is returned
215 *
216 * RETURN: Status, address/length of new table. Null pointer returned
217 * if no table is available to override.
218 *
219 * DESCRIPTION: Returns AE_SUPPORT, function not used in user space.
220 */
221 ACPI_STATUS
AcpiOsPhysicalTableOverride(ACPI_TABLE_HEADER * ExistingTable,ACPI_PHYSICAL_ADDRESS * NewAddress,UINT32 * NewTableLength)222 AcpiOsPhysicalTableOverride (
223 ACPI_TABLE_HEADER *ExistingTable,
224 ACPI_PHYSICAL_ADDRESS *NewAddress,
225 UINT32 *NewTableLength)
226 {
227
228 return AE_SUPPORT;
229 }
230
231 /******************************************************************************
232 *
233 * FUNCTION: AcpiOsEnterSleep
234 *
235 * PARAMETERS: SleepState - Which sleep state to enter
236 * RegaValue - Register A value
237 * RegbValue - Register B value
238 *
239 * RETURN: Status
240 *
241 * DESCRIPTION: A hook before writing sleep registers to enter the sleep
242 * state. Return AE_CTRL_TERMINATE to skip further sleep register
243 * writes.
244 *
245 *****************************************************************************/
246
247 ACPI_STATUS
AcpiOsEnterSleep(UINT8 SleepState,UINT32 RegaValue,UINT32 RegbValue)248 AcpiOsEnterSleep (
249 UINT8 SleepState,
250 UINT32 RegaValue,
251 UINT32 RegbValue)
252 {
253
254 return AE_OK;
255 }
256
257
258 /*
259 * acpi_osd_debugger:
260 *
261 * Enter the ACPICA debugger.
262 */
263 void
acpi_osd_debugger(void)264 acpi_osd_debugger(void)
265 {
266 #ifdef ACPI_DEBUG
267 label_t acpi_jmpbuf;
268 label_t *savejmp;
269
270 printf("Entering ACPICA debugger...\n");
271 savejmp = db_recover;
272 setjmp(&acpi_jmpbuf);
273 db_recover = &acpi_jmpbuf;
274
275 acpi_indebugger = 1;
276 AcpiDbUserCommands();
277 acpi_indebugger = 0;
278
279 db_recover = savejmp;
280 #else
281 printf("ACPI: WARNING: ACPICA debugger not present.\n");
282 #endif
283 }
284
285 #ifdef ACPI_DEBUG
286
287 #define _COMPONENT ACPI_CA_DEBUGGER
288 ACPI_MODULE_NAME ("osnetbsdbg")
289
290
291 /******************************************************************************
292 *
293 * FUNCTION: AcpiOsWaitCommandReady
294 *
295 * PARAMETERS: None
296 *
297 * RETURN: Status
298 *
299 * DESCRIPTION: Negotiate with the debugger foreground thread (the user
300 * thread) to wait the readiness of a command.
301 *
302 *****************************************************************************/
303
304 ACPI_STATUS
AcpiOsWaitCommandReady(void)305 AcpiOsWaitCommandReady (
306 void)
307 {
308 ACPI_STATUS Status;
309 /* Force output to console until a command is entered */
310
311 AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
312
313 /* Different prompt if method is executing */
314
315 if (!AcpiGbl_MethodExecuting)
316 {
317 AcpiOsPrintf ("%1c ", ACPI_DEBUGGER_COMMAND_PROMPT);
318 }
319 else
320 {
321 AcpiOsPrintf ("%1c ", ACPI_DEBUGGER_EXECUTE_PROMPT);
322 }
323
324 /* Get the user input line */
325
326 Status = AcpiOsGetLine (AcpiGbl_DbLineBuf,
327 ACPI_DB_LINE_BUFFER_SIZE, NULL);
328
329 if (ACPI_FAILURE (Status) && Status != AE_CTRL_TERMINATE)
330 {
331 ACPI_EXCEPTION ((AE_INFO, Status,
332 "While parsing/handling command line"));
333 }
334 return (Status);
335 }
336
337
338 /******************************************************************************
339 *
340 * FUNCTION: AcpiOsNotifyCommandComplete
341 *
342 * PARAMETERS: void
343 *
344 * RETURN: Status
345 *
346 * DESCRIPTION: Negotiate with the debugger foreground thread (the user
347 * thread) to notify the completion of a command.
348 *
349 *****************************************************************************/
350
351 ACPI_STATUS
AcpiOsNotifyCommandComplete(void)352 AcpiOsNotifyCommandComplete (
353 void)
354 {
355
356 return AE_OK;
357 }
358
359
360 /******************************************************************************
361 *
362 * FUNCTION: AcpiOsInitializeDebugger
363 *
364 * PARAMETERS: None
365 *
366 * RETURN: Status
367 *
368 * DESCRIPTION: Initialize OSPM specific part of the debugger
369 *
370 *****************************************************************************/
371
372 ACPI_STATUS
AcpiOsInitializeDebugger(void)373 AcpiOsInitializeDebugger (
374 void)
375 {
376 return AE_OK;
377 }
378
379
380 /******************************************************************************
381 *
382 * FUNCTION: AcpiOsTerminateDebugger
383 *
384 * PARAMETERS: None
385 *
386 * RETURN: None
387 *
388 * DESCRIPTION: Terminate signals used by the multi-threading debugger
389 *
390 *****************************************************************************/
391
392 void
AcpiOsTerminateDebugger(void)393 AcpiOsTerminateDebugger (
394 void)
395 {
396 }
397
398
399 /******************************************************************************
400 *
401 * FUNCTION: AcpiRunDebugger
402 *
403 * PARAMETERS: BatchBuffer - Buffer containing commands running in
404 * the batch mode
405 *
406 * RETURN: None
407 *
408 * DESCRIPTION: Run a local/remote debugger
409 *
410 *****************************************************************************/
411
412 void
AcpiRunDebugger(char * BatchBuffer)413 AcpiRunDebugger (
414 char *BatchBuffer)
415 {
416 AcpiDbUserCommands ();
417 }
418
419 ACPI_EXPORT_SYMBOL (AcpiRunDebugger)
420 #endif
421