xref: /dflybsd-src/sys/contrib/dev/acpica/source/os_specific/service_layers/oswintbl.c (revision 872a09d51adf63b4bdae6adb1d96a53f76e161e2)
1 /******************************************************************************
2  *
3  * Module Name: oswintbl - Windows OSL for obtaining ACPI tables
4  *
5  *****************************************************************************/
6 
7 /******************************************************************************
8  *
9  * 1. Copyright Notice
10  *
11  * Some or all of this work - Copyright (c) 1999 - 2020, Intel Corp.
12  * All rights reserved.
13  *
14  * 2. License
15  *
16  * 2.1. This is your license from Intel Corp. under its intellectual property
17  * rights. You may have additional license terms from the party that provided
18  * you this software, covering your right to use that party's intellectual
19  * property rights.
20  *
21  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22  * copy of the source code appearing in this file ("Covered Code") an
23  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24  * base code distributed originally by Intel ("Original Intel Code") to copy,
25  * make derivatives, distribute, use and display any portion of the Covered
26  * Code in any form, with the right to sublicense such rights; and
27  *
28  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29  * license (with the right to sublicense), under only those claims of Intel
30  * patents that are infringed by the Original Intel Code, to make, use, sell,
31  * offer to sell, and import the Covered Code and derivative works thereof
32  * solely to the minimum extent necessary to exercise the above copyright
33  * license, and in no event shall the patent license extend to any additions
34  * to or modifications of the Original Intel Code. No other license or right
35  * is granted directly or by implication, estoppel or otherwise;
36  *
37  * The above copyright and patent license is granted only if the following
38  * conditions are met:
39  *
40  * 3. Conditions
41  *
42  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43  * Redistribution of source code of any substantial portion of the Covered
44  * Code or modification with rights to further distribute source must include
45  * the above Copyright Notice, the above License, this list of Conditions,
46  * and the following Disclaimer and Export Compliance provision. In addition,
47  * Licensee must cause all Covered Code to which Licensee contributes to
48  * contain a file documenting the changes Licensee made to create that Covered
49  * Code and the date of any change. Licensee must include in that file the
50  * documentation of any changes made by any predecessor Licensee. Licensee
51  * must include a prominent statement that the modification is derived,
52  * directly or indirectly, from Original Intel Code.
53  *
54  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55  * Redistribution of source code of any substantial portion of the Covered
56  * Code or modification without rights to further distribute source must
57  * include the following Disclaimer and Export Compliance provision in the
58  * documentation and/or other materials provided with distribution. In
59  * addition, Licensee may not authorize further sublicense of source of any
60  * portion of the Covered Code, and must include terms to the effect that the
61  * license from Licensee to its licensee is limited to the intellectual
62  * property embodied in the software Licensee provides to its licensee, and
63  * not to intellectual property embodied in modifications its licensee may
64  * make.
65  *
66  * 3.3. Redistribution of Executable. Redistribution in executable form of any
67  * substantial portion of the Covered Code or modification must reproduce the
68  * above Copyright Notice, and the following Disclaimer and Export Compliance
69  * provision in the documentation and/or other materials provided with the
70  * distribution.
71  *
72  * 3.4. Intel retains all right, title, and interest in and to the Original
73  * Intel Code.
74  *
75  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76  * Intel shall be used in advertising or otherwise to promote the sale, use or
77  * other dealings in products derived from or relating to the Covered Code
78  * without prior written authorization from Intel.
79  *
80  * 4. Disclaimer and Export Compliance
81  *
82  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88  * PARTICULAR PURPOSE.
89  *
90  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97  * LIMITED REMEDY.
98  *
99  * 4.3. Licensee shall not export, either directly or indirectly, any of this
100  * software or system incorporating such software without first obtaining any
101  * required license or other approval from the U. S. Department of Commerce or
102  * any other agency or department of the United States Government. In the
103  * event Licensee exports any such software from the United States or
104  * re-exports any such software from a foreign destination, Licensee shall
105  * ensure that the distribution and export/re-export of the software is in
106  * compliance with all laws, regulations, orders, or other restrictions of the
107  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108  * any of its subsidiaries will export/re-export any technical data, process,
109  * software, or service, directly or indirectly, to any country for which the
110  * United States government or any agency thereof requires an export license,
111  * other governmental approval, or letter of assurance, without first obtaining
112  * such license, approval or letter.
113  *
114  *****************************************************************************
115  *
116  * Alternatively, you may choose to be licensed under the terms of the
117  * following license:
118  *
119  * Redistribution and use in source and binary forms, with or without
120  * modification, are permitted provided that the following conditions
121  * are met:
122  * 1. Redistributions of source code must retain the above copyright
123  *    notice, this list of conditions, and the following disclaimer,
124  *    without modification.
125  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
126  *    substantially similar to the "NO WARRANTY" disclaimer below
127  *    ("Disclaimer") and any redistribution must be conditioned upon
128  *    including a substantially similar Disclaimer requirement for further
129  *    binary redistribution.
130  * 3. Neither the names of the above-listed copyright holders nor the names
131  *    of any contributors may be used to endorse or promote products derived
132  *    from this software without specific prior written permission.
133  *
134  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
135  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
137  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145  *
146  * Alternatively, you may choose to be licensed under the terms of the
147  * GNU General Public License ("GPL") version 2 as published by the Free
148  * Software Foundation.
149  *
150  *****************************************************************************/
151 
152 #include "acpi.h"
153 #include "accommon.h"
154 #include "acutils.h"
155 #include <stdio.h>
156 
157 #ifdef WIN32
158 #pragma warning(disable:4115)   /* warning C4115: (caused by rpcasync.h) */
159 #include <windows.h>
160 
161 #elif WIN64
162 #include <windowsx.h>
163 #endif
164 
165 #define _COMPONENT          ACPI_OS_SERVICES
166         ACPI_MODULE_NAME    ("oswintbl")
167 
168 /* Local prototypes */
169 
170 static char *
171 WindowsFormatException (
172     LONG                WinStatus);
173 
174 /* Globals */
175 
176 #define LOCAL_BUFFER_SIZE           64
177 
178 static char             KeyBuffer[LOCAL_BUFFER_SIZE];
179 static char             ErrorBuffer[LOCAL_BUFFER_SIZE];
180 
181 /*
182  * List of table signatures reported by EnumSystemFirmwareTables ()
183  */
184 UINT32                  *Gbl_AvailableTableSignatures;
185 UINT32                  Gbl_TableCount = 0;
186 UINT32                  Gbl_SsdtInstance = 0;
187 
188 BOOLEAN                 Gbl_TableListInitialized = FALSE;
189 
190 static ACPI_STATUS
191 OslTableInitialize (
192     void);
193 
194 
195 /******************************************************************************
196  *
197  * FUNCTION:    WindowsFormatException
198  *
199  * PARAMETERS:  WinStatus       - Status from a Windows system call
200  *
201  * RETURN:      Formatted (ascii) exception code. Front-end to Windows
202  *              FormatMessage interface.
203  *
204  * DESCRIPTION: Decode a windows exception
205  *
206  *****************************************************************************/
207 
208 static char *
209 WindowsFormatException (
210     LONG                WinStatus)
211 {
212 
213     ErrorBuffer[0] = 0;
214     FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL, WinStatus, 0,
215         ErrorBuffer, LOCAL_BUFFER_SIZE, NULL);
216 
217     return (ErrorBuffer);
218 }
219 
220 
221 /******************************************************************************
222  *
223  * FUNCTION:    AcpiOsGetTableByAddress
224  *
225  * PARAMETERS:  Address         - Physical address of the ACPI table
226  *              Table           - Where a pointer to the table is returned
227  *
228  * RETURN:      Status; Table buffer is returned if AE_OK.
229  *              AE_NOT_FOUND: A valid table was not found at the address
230  *
231  * DESCRIPTION: Get an ACPI table via a physical memory address.
232  *
233  * NOTE:        Cannot be implemented without a Windows device driver.
234  *
235  *****************************************************************************/
236 
237 ACPI_STATUS
238 AcpiOsGetTableByAddress (
239     ACPI_PHYSICAL_ADDRESS   Address,
240     ACPI_TABLE_HEADER       **Table)
241 {
242 
243     fprintf (stderr, "Get table by address is not supported on Windows\n");
244     return (AE_SUPPORT);
245 }
246 
247 
248 /******************************************************************************
249  *
250  * FUNCTION:    AcpiOsGetTableByIndex
251  *
252  * PARAMETERS:  Index           - Which table to get
253  *              Table           - Where a pointer to the table is returned
254  *              Instance        - Where a pointer to the table instance no. is
255  *                                returned
256  *              Address         - Where the table physical address is returned
257  *
258  * RETURN:      Status; Table buffer and physical address returned if AE_OK.
259  *              AE_LIMIT: Index is beyond valid limit
260  *
261  * DESCRIPTION: Get an ACPI table via an index value (0 through n). Returns
262  *              AE_LIMIT when an invalid index is reached. Index is not
263  *              necessarily an index into the RSDT/XSDT.
264  *              SSDT tables are obtained from the Windows registry. All other
265  *              tables are obtained through GetSystemFirmwareTable ().
266  *
267  * NOTE:        Cannot get the physical address from the windows registry;
268  *              zero is returned instead.
269  *
270  *****************************************************************************/
271 
272 ACPI_STATUS
273 AcpiOsGetTableByIndex (
274     UINT32                  Index,
275     ACPI_TABLE_HEADER       **Table,
276     UINT32                  *Instance,
277     ACPI_PHYSICAL_ADDRESS   *Address)
278 {
279     ACPI_STATUS             Status;
280     char                    *Signature;
281     UINT32                  CurrentInstance;
282 
283 
284     /* Enumerate all ACPI table signatures on first invocation of this function */
285 
286     Status = OslTableInitialize ();
287     if (ACPI_FAILURE (Status))
288     {
289         return (Status);
290     }
291 
292     /* Validate Index */
293 
294     if (Index < Gbl_TableCount)
295     {
296         Signature = malloc (ACPI_NAMESEG_SIZE + 1);
297         if (!Signature)
298         {
299             return (AE_NO_MEMORY);
300         }
301 
302         Signature = memmove (Signature, &Gbl_AvailableTableSignatures[Index], ACPI_NAMESEG_SIZE);
303     }
304     else
305     {
306         return (AE_LIMIT);
307     }
308 
309     if (ACPI_COMPARE_NAMESEG (Signature, ACPI_SIG_SSDT))
310     {
311         CurrentInstance = Gbl_SsdtInstance;
312         Gbl_SsdtInstance++;
313     }
314     else
315     {
316         CurrentInstance = 0;
317     }
318 
319     Status = AcpiOsGetTableByName (Signature, CurrentInstance, Table, Address);
320     if (ACPI_SUCCESS (Status))
321     {
322         *Instance = CurrentInstance;
323     }
324     else if (Status == AE_NOT_FOUND &&
325         ACPI_COMPARE_NAMESEG (Signature, ACPI_SIG_SSDT))
326     {
327         /* Treat SSDTs that are not found as invalid index. */
328         Status = AE_LIMIT;
329     }
330 
331     free (Signature);
332     return (Status);
333 }
334 
335 /******************************************************************************
336  *
337  * FUNCTION:    OslTableInitialize
338  *
339  * PARAMETERS:  None
340  *
341  * RETURN:      Status
342  *
343  * DESCRIPTION: Initialize ACPI table data. Enumerate all ACPI table signatures
344  *              and save them to a global list.
345  *
346  *****************************************************************************/
347 static ACPI_STATUS
348 OslTableInitialize (
349     void)
350 {
351     UINT32                  ResultSize;
352     UINT32                  DataSize;
353 
354     if (Gbl_TableListInitialized)
355     {
356         return (AE_OK);
357     }
358 
359     /*
360      * ACPI table signatures are always 4 characters. Therefore, the data size
361      * buffer should be a multiple of 4
362      */
363     DataSize = EnumSystemFirmwareTables ('ACPI', NULL, 0);
364     if (DataSize % ACPI_NAMESEG_SIZE)
365     {
366         return (AE_ERROR);
367     }
368 
369     /*
370      * EnumSystemFirmwareTables () does not report the DSDT or XSDT. Work around this
371      * by adding these entries manually.
372      */
373     Gbl_TableCount = 2 + DataSize / ACPI_NAMESEG_SIZE;
374     Gbl_AvailableTableSignatures = malloc (Gbl_TableCount * ACPI_NAMESEG_SIZE);
375     if (!Gbl_AvailableTableSignatures)
376     {
377         return (AE_NO_MEMORY);
378     }
379 
380     ResultSize = EnumSystemFirmwareTables ('ACPI', Gbl_AvailableTableSignatures, DataSize);
381     if (ResultSize > DataSize)
382     {
383         return (AE_ERROR);
384     }
385 
386     /* Insert the DSDT and XSDT tables signatures */
387 
388     Gbl_AvailableTableSignatures [Gbl_TableCount - 1] = 'TDSD';
389     Gbl_AvailableTableSignatures [Gbl_TableCount - 2] = 'TDSX';
390 
391     Gbl_TableListInitialized = TRUE;
392     return (AE_OK);
393 }
394 
395 
396 /******************************************************************************
397  *
398  * FUNCTION:    WindowsGetTableFromRegistry
399  *
400  * PARAMETERS:  Signature       - ACPI Signature for desired table. Must be
401  *                                a null terminated 4-character string.
402  *              Instance        - For SSDTs (0...n). Use 0 otherwise.
403  *              Table           - Where a pointer to the table is returned
404  *              Address         - Where the table physical address is returned
405  *
406  * RETURN:      Status; Table buffer and physical address returned if AE_OK.
407  *              AE_LIMIT: Instance is beyond valid limit
408  *              AE_NOT_FOUND: A table with the signature was not found
409  *
410  * DESCRIPTION: Get an ACPI table via a table signature (4 ASCII characters).
411  *              Returns AE_LIMIT when an invalid instance is reached.
412  *              Table is obtained from the Windows registry.
413  *
414  * NOTE:        Assumes the input signature is uppercase.
415  *              Cannot get the physical address from the windows registry;
416  *              zero is returned instead.
417  *
418  *****************************************************************************/
419 
420 static ACPI_STATUS
421 WindowsGetTableFromRegistry (
422 	char                    *Signature,
423 	UINT32                  Instance,
424 	ACPI_TABLE_HEADER       **Table,
425 	ACPI_PHYSICAL_ADDRESS   *Address)
426 {
427 	HKEY                    Handle = NULL;
428 	LONG                    WinStatus;
429 	ULONG                   Type;
430 	ULONG                   NameSize;
431 	ULONG                   DataSize;
432 	HKEY                    SubKey;
433 	ULONG                   i;
434 	ACPI_TABLE_HEADER       *ReturnTable;
435 	ACPI_STATUS             Status = AE_OK;
436 
437 
438 	/* Get a handle to the table key */
439 
440 	while (1)
441 	{
442 		strcpy(KeyBuffer, "HARDWARE\\ACPI\\");
443 		if (AcpiUtSafeStrcat(KeyBuffer, sizeof(KeyBuffer), Signature))
444 		{
445 			return (AE_BUFFER_OVERFLOW);
446 		}
447 
448 		/*
449 		 * Windows stores SSDT at SSDT, SSD1, ..., SSD9, SSDA, ..., SSDS, SSDT,
450 		 * SSDU, ..., SSDY. If the first (0th) and the 29th tables have the same
451 		 * OEM ID, Table ID and Revision, then the 29th entry will overwrite the
452 		 * first entry... Let's hope that we do not have that many entries.
453 		 */
454 		if (Instance > 0 && ACPI_COMPARE_NAMESEG(Signature, ACPI_SIG_SSDT))
455 		{
456 			if (Instance < 10)
457 			{
458 				KeyBuffer[strlen(KeyBuffer) - 1] = '0' + (char)Instance;
459 			}
460 			else if (Instance < 29)
461 			{
462 				KeyBuffer[strlen(KeyBuffer) - 1] = 'A' + (char)(Instance - 10);
463 			}
464 			else
465 			{
466 				return (AE_LIMIT);
467 			}
468 		}
469 
470 		WinStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, KeyBuffer,
471 			0L, KEY_READ, &Handle);
472 
473 		if (WinStatus != ERROR_SUCCESS)
474 		{
475 			/*
476 			 * Somewhere along the way, MS changed the registry entry for
477 			 * the FADT from
478 			 * HARDWARE/ACPI/FACP  to
479 			 * HARDWARE/ACPI/FADT.
480 			 *
481 			 * This code allows for both.
482 			 */
483 			if (ACPI_COMPARE_NAMESEG(Signature, "FACP"))
484 			{
485 				Signature = "FADT";
486 			}
487 			else if (ACPI_COMPARE_NAMESEG(Signature, "XSDT"))
488 			{
489 				Signature = "RSDT";
490 			}
491 			else if (ACPI_COMPARE_NAMESEG(Signature, ACPI_SIG_SSDT))
492 			{
493 				/*
494                  * SSDT may not be present on older Windows versions, but it is
495 				 * also possible that the index is not found.
496                  */
497 				return (AE_NOT_FOUND);
498 			}
499 			else
500 			{
501 				fprintf(stderr,
502 					"Could not find %s in registry at %s: %s (WinStatus=0x%X)\n",
503 					Signature, KeyBuffer, WindowsFormatException(WinStatus), WinStatus);
504 				return (AE_NOT_FOUND);
505 			}
506 		}
507 		else
508 		{
509 			break;
510 		}
511 	}
512 
513 	/* Actual data for the table is down a couple levels */
514 
515 	for (i = 0; ;)
516 	{
517 		WinStatus = RegEnumKey(Handle, i, KeyBuffer, sizeof(KeyBuffer));
518 		i++;
519 		if (WinStatus == ERROR_NO_MORE_ITEMS)
520 		{
521 			break;
522 		}
523 
524 		WinStatus = RegOpenKey(Handle, KeyBuffer, &SubKey);
525 		if (WinStatus != ERROR_SUCCESS)
526 		{
527 			fprintf(stderr, "Could not open %s entry: %s\n",
528 				Signature, WindowsFormatException(WinStatus));
529 			Status = AE_ERROR;
530 			goto Cleanup;
531 		}
532 
533 		RegCloseKey(Handle);
534 		Handle = SubKey;
535 		i = 0;
536 	}
537 
538 	/* Find the (binary) table entry */
539 
540 	for (i = 0; ; i++)
541 	{
542 		NameSize = sizeof(KeyBuffer);
543 		WinStatus = RegEnumValue(Handle, i, KeyBuffer, &NameSize, NULL,
544 			&Type, NULL, 0);
545 		if (WinStatus != ERROR_SUCCESS)
546 		{
547 			fprintf(stderr, "Could not get %s registry entry: %s\n",
548 				Signature, WindowsFormatException(WinStatus));
549 			Status = AE_ERROR;
550 			goto Cleanup;
551 		}
552 
553 		if (Type == REG_BINARY)
554 		{
555 			break;
556 		}
557 	}
558 
559 	/* Get the size of the table */
560 
561 	WinStatus = RegQueryValueEx(Handle, KeyBuffer, NULL, NULL,
562 		NULL, &DataSize);
563 	if (WinStatus != ERROR_SUCCESS)
564 	{
565 		fprintf(stderr, "Could not read the %s table size: %s\n",
566 			Signature, WindowsFormatException(WinStatus));
567 		Status = AE_ERROR;
568 		goto Cleanup;
569 	}
570 
571 	/* Allocate a new buffer for the table */
572 
573 	ReturnTable = malloc(DataSize);
574 	if (!ReturnTable)
575 	{
576 		Status = AE_NO_MEMORY;
577 		goto Cleanup;
578 	}
579 
580 	/* Get the actual table from the registry */
581 
582 	WinStatus = RegQueryValueEx(Handle, KeyBuffer, NULL, NULL,
583 		(UCHAR *)ReturnTable, &DataSize);
584 
585 	if (WinStatus != ERROR_SUCCESS)
586 	{
587 		fprintf(stderr, "Could not read %s data: %s\n",
588 			Signature, WindowsFormatException(WinStatus));
589 		free(ReturnTable);
590 		Status = AE_ERROR;
591 		goto Cleanup;
592 	}
593 
594 	*Table = ReturnTable;
595 	*Address = 0;
596 
597 Cleanup:
598 	RegCloseKey(Handle);
599 	return (Status);
600 }
601 
602 
603 /******************************************************************************
604  *
605  * FUNCTION:    AcpiOsGetTableByName
606  *
607  * PARAMETERS:  Signature       - ACPI Signature for desired table. Must be
608  *                                a null terminated 4-character string.
609  *              Instance        - For SSDTs (0...n). Use 0 otherwise.
610  *              Table           - Where a pointer to the table is returned
611  *              Address         - Where the table physical address is returned
612  *
613  * RETURN:      Status; Table buffer and physical address returned if AE_OK.
614  *              AE_LIMIT: Instance is beyond valid limit
615  *              AE_NOT_FOUND: A table with the signature was not found
616  *
617  * DESCRIPTION: Get an ACPI table via a table signature (4 ASCII characters).
618  *              Returns AE_LIMIT when an invalid instance is reached.
619  *              Table is obtained from the Windows registry.
620  *
621  * NOTE:        Assumes the input signature is uppercase.
622  *              Cannot get the physical address from the windows registry;
623  *              zero is returned instead.
624  *
625  *****************************************************************************/
626 
627 ACPI_STATUS
628 AcpiOsGetTableByName(
629 	char                    *Signature,
630 	UINT32                  Instance,
631 	ACPI_TABLE_HEADER       **Table,
632 	ACPI_PHYSICAL_ADDRESS   *Address)
633 {
634 	LONG                    Result;
635 	ACPI_STATUS             Status = AE_OK;
636 	UINT32                  DataSize;
637 	ACPI_TABLE_HEADER       *ReturnTable;
638 	UINT32                  UIntSignature = 0;
639 
640 
641     /* Multiple instances are only supported for SSDT tables. */
642 
643 	if (Instance > 0 && !ACPI_COMPARE_NAMESEG (Signature, ACPI_SIG_SSDT))
644 	{
645 		return (AE_LIMIT);
646 	}
647 
648 	if (ACPI_COMPARE_NAMESEG (Signature, ACPI_SIG_SSDT))
649 	{
650 		Status = WindowsGetTableFromRegistry ("SSDT", Instance, Table, Address);
651 		return (Status);
652 	}
653 
654     /* GetSystemFirmwareTable requires the table signature to be UINT32 */
655 
656     UIntSignature = *ACPI_CAST_PTR (UINT32, Signature);
657 	DataSize = GetSystemFirmwareTable('ACPI', UIntSignature, NULL, 0);
658 	if (!DataSize)
659 	{
660 		fprintf(stderr, "The table signature %s does not exist.", Signature);
661 		return (AE_ERROR);
662 	}
663 
664 	ReturnTable = malloc(DataSize);
665 	if (!ReturnTable)
666 	{
667 		return (AE_NO_MEMORY);
668 	}
669 
670 	Result = GetSystemFirmwareTable('ACPI', UIntSignature, ReturnTable, DataSize);
671 	if (Result > (LONG) DataSize)
672 	{
673         /* Clean up */
674 
675 	    fprintf (stderr, "Could not read %s data\n", Signature);
676 	    free (ReturnTable);
677 	    return (AE_ERROR);
678 	}
679 
680     *Table = ReturnTable;
681 	return (Status);
682 }
683 
684 
685 /* These are here for acpidump only, so we don't need to link oswinxf */
686 
687 #ifdef ACPI_DUMP_APP
688 /******************************************************************************
689  *
690  * FUNCTION:    AcpiOsMapMemory
691  *
692  * PARAMETERS:  Where               - Physical address of memory to be mapped
693  *              Length              - How much memory to map
694  *
695  * RETURN:      Pointer to mapped memory. Null on error.
696  *
697  * DESCRIPTION: Map physical memory into caller's address space
698  *
699  *****************************************************************************/
700 
701 void *
702 AcpiOsMapMemory (
703     ACPI_PHYSICAL_ADDRESS   Where,
704     ACPI_SIZE               Length)
705 {
706 
707     return (ACPI_TO_POINTER ((ACPI_SIZE) Where));
708 }
709 
710 
711 /******************************************************************************
712  *
713  * FUNCTION:    AcpiOsUnmapMemory
714  *
715  * PARAMETERS:  Where               - Logical address of memory to be unmapped
716  *              Length              - How much memory to unmap
717  *
718  * RETURN:      None.
719  *
720  * DESCRIPTION: Delete a previously created mapping. Where and Length must
721  *              correspond to a previous mapping exactly.
722  *
723  *****************************************************************************/
724 
725 void
726 AcpiOsUnmapMemory (
727     void                    *Where,
728     ACPI_SIZE               Length)
729 {
730 
731     return;
732 }
733 #endif
734