ReactOS 0.4.15-dev-7958-gcd0bb1a
rsdump.c
Go to the documentation of this file.
1/*******************************************************************************
2 *
3 * Module Name: rsdump - AML debugger support for resource structures.
4 *
5 ******************************************************************************/
6
7/*
8 * Copyright (C) 2000 - 2022, Intel Corp.
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions, and the following disclaimer,
16 * without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 * substantially similar to the "NO WARRANTY" disclaimer below
19 * ("Disclaimer") and any redistribution must be conditioned upon
20 * including a substantially similar Disclaimer requirement for further
21 * binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 * of any contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
25 *
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
29 *
30 * NO WARRANTY
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
42 */
43
44#include "acpi.h"
45#include "accommon.h"
46#include "acresrc.h"
47
48#define _COMPONENT ACPI_RESOURCES
49 ACPI_MODULE_NAME ("rsdump")
50
51/*
52 * All functions in this module are used by the AML Debugger only
53 */
54
55/* Local prototypes */
56
57static void
59 const char *Title,
60 const char *Value);
61
62static void
64 const char *Title,
65 UINT8 Value);
66
67static void
69 const char *Title,
71
72static void
74 const char *Title,
76
77static void
79 const char *Title,
81
82static void
84 const char *Title);
85
86static void
89 UINT8 *Data);
90
91static void
94 UINT16 *Data);
95
96static void
99 UINT32 *Data);
100
101static void
104 UINT8 *Data);
105
106static void
108 ACPI_RESOURCE_SOURCE *ResourceSource);
109
110static void
112 char *Title,
113 ACPI_RESOURCE_LABEL *ResourceLabel);
114
115static void
118
119static void
121 void *Resource,
123
124
125/*******************************************************************************
126 *
127 * FUNCTION: AcpiRsDumpResourceList
128 *
129 * PARAMETERS: ResourceList - Pointer to a resource descriptor list
130 *
131 * RETURN: None
132 *
133 * DESCRIPTION: Dispatches the structure to the correct dump routine.
134 *
135 ******************************************************************************/
136
137void
140{
141 UINT32 Count = 0;
142 UINT32 Type;
143
144
146
147
148 /* Check if debug output enabled */
149
151 {
152 return;
153 }
154
155 /* Walk list and dump all resource descriptors (END_TAG terminates) */
156
157 do
158 {
159 AcpiOsPrintf ("\n[%02X] ", Count);
160 Count++;
161
162 /* Validate Type before dispatch */
163
164 Type = ResourceList->Type;
166 {
168 "Invalid descriptor type (%X) in resource list\n",
169 ResourceList->Type);
170 return;
171 }
172 else if (!ResourceList->Type)
173 {
174 ACPI_ERROR ((AE_INFO, "Invalid Zero Resource Type"));
175 return;
176 }
177
178 /* Sanity check the length. It must not be zero, or we loop forever */
179
180 if (!ResourceList->Length)
181 {
183 "Invalid zero length descriptor in resource list\n");
184 return;
185 }
186
187 /* Dump the resource descriptor */
188
190 {
192 AcpiGbl_DumpSerialBusDispatch[
193 ResourceList->Data.CommonSerialBus.Type]);
194 }
195 else
196 {
198 AcpiGbl_DumpResourceDispatch[Type]);
199 }
200
201 /* Point to the next resource structure */
202
204
205 /* Exit when END_TAG descriptor is reached */
206
207 } while (Type != ACPI_RESOURCE_TYPE_END_TAG);
208}
209
210
211/*******************************************************************************
212 *
213 * FUNCTION: AcpiRsDumpIrqList
214 *
215 * PARAMETERS: RouteTable - Pointer to the routing table to dump.
216 *
217 * RETURN: None
218 *
219 * DESCRIPTION: Print IRQ routing table
220 *
221 ******************************************************************************/
222
223void
226{
227 ACPI_PCI_ROUTING_TABLE *PrtElement;
228 UINT8 Count;
229
230
232
233
234 /* Check if debug output enabled */
235
237 {
238 return;
239 }
240
242
243 /* Dump all table elements, Exit on zero length element */
244
245 for (Count = 0; PrtElement->Length; Count++)
246 {
247 AcpiOsPrintf ("\n[%02X] PCI IRQ Routing Table Package\n", Count);
248 AcpiRsDumpDescriptor (PrtElement, AcpiRsDumpPrt);
249
251 PrtElement, PrtElement->Length);
252 }
253}
254
255
256/*******************************************************************************
257 *
258 * FUNCTION: AcpiRsDumpDescriptor
259 *
260 * PARAMETERS: Resource - Buffer containing the resource
261 * Table - Table entry to decode the resource
262 *
263 * RETURN: None
264 *
265 * DESCRIPTION: Dump a resource descriptor based on a dump table entry.
266 *
267 ******************************************************************************/
268
269static void
271 void *Resource,
273{
274 UINT8 *Target = NULL;
275 UINT8 *PreviousTarget;
276 const char *Name;
277 UINT8 Count;
278
279
280 /* First table entry must contain the table length (# of table entries) */
281
282 Count = Table->Offset;
283
284 while (Count)
285 {
286 PreviousTarget = Target;
287 Target = ACPI_ADD_PTR (UINT8, Resource, Table->Offset);
288 Name = Table->Name;
289
290 switch (Table->Opcode)
291 {
292 case ACPI_RSD_TITLE:
293 /*
294 * Optional resource title
295 */
296 if (Table->Name)
297 {
298 AcpiOsPrintf ("%s Resource\n", Name);
299 }
300 break;
301
302 /* Strings */
303
304 case ACPI_RSD_LITERAL:
305
306 AcpiRsOutString (Name, ACPI_CAST_PTR (char, Table->Pointer));
307 break;
308
309 case ACPI_RSD_STRING:
310
312 break;
313
314 /* Data items, 8/16/32/64 bit */
315
316 case ACPI_RSD_UINT8:
317
318 if (Table->Pointer)
319 {
320 AcpiRsOutString (Name, Table->Pointer [*Target]);
321 }
322 else
323 {
325 }
326 break;
327
328 case ACPI_RSD_UINT16:
329
331 break;
332
333 case ACPI_RSD_UINT32:
334
336 break;
337
338 case ACPI_RSD_UINT64:
339
341 break;
342
343 /* Flags: 1-bit and 2-bit flags supported */
344
346
347 AcpiRsOutString (Name, Table->Pointer [*Target & 0x01]);
348 break;
349
351
352 AcpiRsOutString (Name, Table->Pointer [*Target & 0x03]);
353 break;
354
356
357 AcpiRsOutString (Name, Table->Pointer [*Target & 0x07]);
358 break;
359
361
363 break;
364
366 /*
367 * Short byte list (single line output) for DMA and IRQ resources
368 * Note: The list length is obtained from the previous table entry
369 */
370 if (PreviousTarget)
371 {
373 AcpiRsDumpShortByteList (*PreviousTarget, Target);
374 }
375 break;
376
378 /*
379 * Short byte list (single line output) for GPIO vendor data
380 * Note: The list length is obtained from the previous table entry
381 */
382 if (PreviousTarget)
383 {
385 AcpiRsDumpShortByteList (*PreviousTarget,
387 }
388 break;
389
391 /*
392 * Long byte list for Vendor resource data
393 * Note: The list length is obtained from the previous table entry
394 */
395 if (PreviousTarget)
396 {
397 AcpiRsDumpByteList (ACPI_GET16 (PreviousTarget), Target);
398 }
399 break;
400
402 /*
403 * Dword list for Extended Interrupt resources
404 * Note: The list length is obtained from the previous table entry
405 */
406 if (PreviousTarget)
407 {
408 AcpiRsDumpDwordList (*PreviousTarget,
410 }
411 break;
412
414 /*
415 * Word list for GPIO Pin Table
416 * Note: The list length is obtained from the previous table entry
417 */
418 if (PreviousTarget)
419 {
420 AcpiRsDumpWordList (*PreviousTarget,
422 }
423 break;
424
425 case ACPI_RSD_ADDRESS:
426 /*
427 * Common flags for all Address resources
428 */
431 break;
432
433 case ACPI_RSD_SOURCE:
434 /*
435 * Optional ResourceSource for Address resources
436 */
439 break;
440
441 case ACPI_RSD_LABEL:
442 /*
443 * ResourceLabel
444 */
445 AcpiRsDumpResourceLabel ("Resource Label", ACPI_CAST_PTR (
447 break;
448
450 /*
451 * ResourceSourceLabel
452 */
453 AcpiRsDumpResourceLabel ("Resource Source Label", ACPI_CAST_PTR (
455 break;
456
457 default:
458
459 AcpiOsPrintf ("**** Invalid table opcode [%X] ****\n",
460 Table->Opcode);
461 return;
462 }
463
464 Table++;
465 Count--;
466 }
467}
468
469
470/*******************************************************************************
471 *
472 * FUNCTION: AcpiRsDumpResourceSource
473 *
474 * PARAMETERS: ResourceSource - Pointer to a Resource Source struct
475 *
476 * RETURN: None
477 *
478 * DESCRIPTION: Common routine for dumping the optional ResourceSource and the
479 * corresponding ResourceSourceIndex.
480 *
481 ******************************************************************************/
482
483static void
485 ACPI_RESOURCE_SOURCE *ResourceSource)
486{
488
489
490 if (ResourceSource->Index == 0xFF)
491 {
492 return;
493 }
494
495 AcpiRsOutInteger8 ("Resource Source Index",
496 ResourceSource->Index);
497
498 AcpiRsOutString ("Resource Source",
499 ResourceSource->StringPtr ?
500 ResourceSource->StringPtr : "[Not Specified]");
501}
502
503
504/*******************************************************************************
505 *
506 * FUNCTION: AcpiRsDumpResourceLabel
507 *
508 * PARAMETERS: Title - Title of the dumped resource field
509 * ResourceLabel - Pointer to a Resource Label struct
510 *
511 * RETURN: None
512 *
513 * DESCRIPTION: Common routine for dumping the ResourceLabel
514 *
515 ******************************************************************************/
516
517static void
519 char *Title,
520 ACPI_RESOURCE_LABEL *ResourceLabel)
521{
523
525 ResourceLabel->StringPtr ?
526 ResourceLabel->StringPtr : "[Not Specified]");
527}
528
529
530/*******************************************************************************
531 *
532 * FUNCTION: AcpiRsDumpAddressCommon
533 *
534 * PARAMETERS: Resource - Pointer to an internal resource descriptor
535 *
536 * RETURN: None
537 *
538 * DESCRIPTION: Dump the fields that are common to all Address resource
539 * descriptors
540 *
541 ******************************************************************************/
542
543static void
546{
548
549
550 /* Decode the type-specific flags */
551
552 switch (Resource->Address.ResourceType)
553 {
555
556 AcpiRsDumpDescriptor (Resource, AcpiRsDumpMemoryFlags);
557 break;
558
559 case ACPI_IO_RANGE:
560
561 AcpiRsDumpDescriptor (Resource, AcpiRsDumpIoFlags);
562 break;
563
565
566 AcpiRsOutString ("Resource Type", "Bus Number Range");
567 break;
568
569 default:
570
571 AcpiRsOutInteger8 ("Resource Type",
572 (UINT8) Resource->Address.ResourceType);
573 break;
574 }
575
576 /* Decode the general flags */
577
578 AcpiRsDumpDescriptor (Resource, AcpiRsDumpGeneralFlags);
579}
580
581
582/*******************************************************************************
583 *
584 * FUNCTION: AcpiRsOut*
585 *
586 * PARAMETERS: Title - Name of the resource field
587 * Value - Value of the resource field
588 *
589 * RETURN: None
590 *
591 * DESCRIPTION: Miscellaneous helper functions to consistently format the
592 * output of the resource dump routines
593 *
594 ******************************************************************************/
595
596static void
598 const char *Title,
599 const char *Value)
600{
601
602 AcpiOsPrintf ("%27s : %s", Title, Value);
603 if (!*Value)
604 {
605 AcpiOsPrintf ("[NULL NAMESTRING]");
606 }
607 AcpiOsPrintf ("\n");
608}
609
610static void
612 const char *Title,
613 UINT8 Value)
614{
615 AcpiOsPrintf ("%27s : %2.2X\n", Title, Value);
616}
617
618static void
620 const char *Title,
622{
623
624 AcpiOsPrintf ("%27s : %4.4X\n", Title, Value);
625}
626
627static void
629 const char *Title,
631{
632
633 AcpiOsPrintf ("%27s : %8.8X\n", Title, Value);
634}
635
636static void
638 const char *Title,
640{
641
642 AcpiOsPrintf ("%27s : %8.8X%8.8X\n", Title,
644}
645
646static void
648 const char *Title)
649{
650
651 AcpiOsPrintf ("%27s : ", Title);
652}
653
654
655/*******************************************************************************
656 *
657 * FUNCTION: AcpiRsDump*List
658 *
659 * PARAMETERS: Length - Number of elements in the list
660 * Data - Start of the list
661 *
662 * RETURN: None
663 *
664 * DESCRIPTION: Miscellaneous functions to dump lists of raw data
665 *
666 ******************************************************************************/
667
668static void
671 UINT8 *Data)
672{
673 UINT16 i;
674
675
676 for (i = 0; i < Length; i++)
677 {
678 AcpiOsPrintf ("%25s%2.2X : %2.2X\n", "Byte", i, Data[i]);
679 }
680}
681
682static void
685 UINT8 *Data)
686{
687 UINT8 i;
688
689
690 for (i = 0; i < Length; i++)
691 {
692 AcpiOsPrintf ("%X ", Data[i]);
693 }
694
695 AcpiOsPrintf ("\n");
696}
697
698static void
701 UINT32 *Data)
702{
703 UINT8 i;
704
705
706 for (i = 0; i < Length; i++)
707 {
708 AcpiOsPrintf ("%25s%2.2X : %8.8X\n", "Dword", i, Data[i]);
709 }
710}
711
712static void
715 UINT16 *Data)
716{
717 UINT16 i;
718
719
720 for (i = 0; i < Length; i++)
721 {
722 AcpiOsPrintf ("%25s%2.2X : %4.4X\n", "Word", i, Data[i]);
723 }
724}
unsigned short UINT16
unsigned long long UINT64
unsigned char UINT8
unsigned int UINT32
Type
Definition: Type.h:7
#define ACPI_GET16(ptr)
Definition: acmacros.h:58
#define ACPI_GET32(ptr)
Definition: acmacros.h:59
#define ACPI_FORMAT_UINT64(i)
Definition: acmacros.h:71
#define ACPI_GET8(ptr)
Definition: acmacros.h:57
#define ACPI_GET64(ptr)
Definition: acmacros.h:60
#define ACPI_MODULE_NAME(Name)
Definition: acoutput.h:216
#define ACPI_FUNCTION_ENTRY()
Definition: acoutput.h:484
#define ACPI_IS_DEBUG_ENABLED(Level, Component)
Definition: acoutput.h:490
#define ACPI_ERROR(plist)
Definition: acoutput.h:240
#define ACPI_LV_RESOURCES
Definition: acoutput.h:108
#define AE_INFO
Definition: acoutput.h:230
void ACPI_INTERNAL_VAR_XFACE AcpiOsPrintf(const char *Format,...)
Definition: osl.c:851
@ ACPI_RSD_SOURCE
Definition: acresrc.h:154
@ ACPI_RSD_LITERAL
Definition: acresrc.h:150
@ ACPI_RSD_ADDRESS
Definition: acresrc.h:148
@ ACPI_RSD_6BITFLAG
Definition: acresrc.h:147
@ ACPI_RSD_SHORTLIST
Definition: acresrc.h:152
@ ACPI_RSD_LABEL
Definition: acresrc.h:161
@ ACPI_RSD_LONGLIST
Definition: acresrc.h:151
@ ACPI_RSD_SHORTLISTX
Definition: acresrc.h:153
@ ACPI_RSD_1BITFLAG
Definition: acresrc.h:144
@ ACPI_RSD_UINT16
Definition: acresrc.h:157
@ ACPI_RSD_UINT8
Definition: acresrc.h:156
@ ACPI_RSD_3BITFLAG
Definition: acresrc.h:146
@ ACPI_RSD_UINT32
Definition: acresrc.h:158
@ ACPI_RSD_WORDLIST
Definition: acresrc.h:160
@ ACPI_RSD_DWORDLIST
Definition: acresrc.h:149
@ ACPI_RSD_UINT64
Definition: acresrc.h:159
@ ACPI_RSD_2BITFLAG
Definition: acresrc.h:145
@ ACPI_RSD_TITLE
Definition: acresrc.h:143
@ ACPI_RSD_STRING
Definition: acresrc.h:155
@ ACPI_RSD_SOURCE_LABEL
Definition: acresrc.h:162
#define ACPI_RESOURCE_TYPE_SERIAL_BUS
Definition: acrestyp.h:742
#define ACPI_NEXT_RESOURCE(Res)
Definition: acrestyp.h:812
#define ACPI_BUS_NUMBER_RANGE
Definition: acrestyp.h:139
#define ACPI_RESOURCE_TYPE_END_TAG
Definition: acrestyp.h:730
#define ACPI_RESOURCE_TYPE_MAX
Definition: acrestyp.h:748
#define ACPI_IO_RANGE
Definition: acrestyp.h:138
#define ACPI_MEMORY_RANGE
Definition: acrestyp.h:137
#define ACPI_CAST_INDIRECT_PTR(t, p)
Definition: actypes.h:545
#define ACPI_ADD_PTR(t, a, b)
Definition: actypes.h:546
#define ACPI_CAST_PTR(t, p)
Definition: actypes.h:544
struct NameRec_ * Name
Definition: cdprocs.h:460
_Acquires_exclusive_lock_ Resource _Acquires_shared_lock_ Resource _Inout_ PERESOURCE Resource
Definition: cdprocs.h:843
#define NULL
Definition: types.h:112
static const WCHAR Title[]
Definition: oid.c:1259
ASMGENDATA Table[]
Definition: genincdata.c:61
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
int Count
Definition: noreturn.cpp:7
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
static void AcpiRsDumpResourceLabel(char *Title, ACPI_RESOURCE_LABEL *ResourceLabel)
Definition: rsdump.c:518
void AcpiRsDumpResourceList(ACPI_RESOURCE *ResourceList)
Definition: rsdump.c:138
void AcpiRsDumpIrqList(UINT8 *RouteTable)
Definition: rsdump.c:224
static void AcpiRsOutInteger16(const char *Title, UINT16 Value)
Definition: rsdump.c:619
static void AcpiRsDumpDwordList(UINT8 Length, UINT32 *Data)
Definition: rsdump.c:699
static void AcpiRsDumpWordList(UINT16 Length, UINT16 *Data)
Definition: rsdump.c:713
static void AcpiRsDumpDescriptor(void *Resource, ACPI_RSDUMP_INFO *Table)
Definition: rsdump.c:270
static void AcpiRsOutTitle(const char *Title)
Definition: rsdump.c:647
static void AcpiRsDumpResourceSource(ACPI_RESOURCE_SOURCE *ResourceSource)
Definition: rsdump.c:484
static void AcpiRsOutInteger8(const char *Title, UINT8 Value)
Definition: rsdump.c:611
static void AcpiRsOutInteger64(const char *Title, UINT64 Value)
Definition: rsdump.c:637
static void AcpiRsOutInteger32(const char *Title, UINT32 Value)
Definition: rsdump.c:628
static void AcpiRsDumpByteList(UINT16 Length, UINT8 *Data)
Definition: rsdump.c:669
#define _COMPONENT
Definition: rsdump.c:48
static void AcpiRsOutString(const char *Title, const char *Value)
Definition: rsdump.c:597
static void AcpiRsDumpShortByteList(UINT8 Length, UINT8 *Data)
Definition: rsdump.c:683
static void AcpiRsDumpAddressCommon(ACPI_RESOURCE_DATA *Resource)
Definition: rsdump.c:544
char Name[55]
Definition: genincdata.c:33
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413
_In_ WDFIOTARGET Target
Definition: wdfrequest.h:306
_Must_inspect_result_ _In_ WDFIORESREQLIST _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFIORESLIST * ResourceList
Definition: wdfresource.h:309
#define const
Definition: zconf.h:233