xref: /freebsd/sys/contrib/dev/acpica/components/disassembler/dmresrcs.c (revision a159c266a93c3c4f229864954c5f963acd8f60f2)
1*a159c266SJung-uk Kim /*******************************************************************************
2*a159c266SJung-uk Kim  *
3*a159c266SJung-uk Kim  * Module Name: dmresrcs.c - "Small" Resource Descriptor disassembly
4*a159c266SJung-uk Kim  *
5*a159c266SJung-uk Kim  ******************************************************************************/
6*a159c266SJung-uk Kim 
7*a159c266SJung-uk Kim /*
8*a159c266SJung-uk Kim  * Copyright (C) 2000 - 2012, Intel Corp.
9*a159c266SJung-uk Kim  * All rights reserved.
10*a159c266SJung-uk Kim  *
11*a159c266SJung-uk Kim  * Redistribution and use in source and binary forms, with or without
12*a159c266SJung-uk Kim  * modification, are permitted provided that the following conditions
13*a159c266SJung-uk Kim  * are met:
14*a159c266SJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
15*a159c266SJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
16*a159c266SJung-uk Kim  *    without modification.
17*a159c266SJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18*a159c266SJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
19*a159c266SJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
20*a159c266SJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
21*a159c266SJung-uk Kim  *    binary redistribution.
22*a159c266SJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
23*a159c266SJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
24*a159c266SJung-uk Kim  *    from this software without specific prior written permission.
25*a159c266SJung-uk Kim  *
26*a159c266SJung-uk Kim  * Alternatively, this software may be distributed under the terms of the
27*a159c266SJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
28*a159c266SJung-uk Kim  * Software Foundation.
29*a159c266SJung-uk Kim  *
30*a159c266SJung-uk Kim  * NO WARRANTY
31*a159c266SJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32*a159c266SJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33*a159c266SJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34*a159c266SJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35*a159c266SJung-uk Kim  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36*a159c266SJung-uk Kim  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37*a159c266SJung-uk Kim  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38*a159c266SJung-uk Kim  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39*a159c266SJung-uk Kim  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40*a159c266SJung-uk Kim  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41*a159c266SJung-uk Kim  * POSSIBILITY OF SUCH DAMAGES.
42*a159c266SJung-uk Kim  */
43*a159c266SJung-uk Kim 
44*a159c266SJung-uk Kim 
45*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h>
46*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h>
47*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acdisasm.h>
48*a159c266SJung-uk Kim 
49*a159c266SJung-uk Kim 
50*a159c266SJung-uk Kim #ifdef ACPI_DISASSEMBLER
51*a159c266SJung-uk Kim 
52*a159c266SJung-uk Kim #define _COMPONENT          ACPI_CA_DEBUGGER
53*a159c266SJung-uk Kim         ACPI_MODULE_NAME    ("dbresrcs")
54*a159c266SJung-uk Kim 
55*a159c266SJung-uk Kim 
56*a159c266SJung-uk Kim /*******************************************************************************
57*a159c266SJung-uk Kim  *
58*a159c266SJung-uk Kim  * FUNCTION:    AcpiDmIrqDescriptor
59*a159c266SJung-uk Kim  *
60*a159c266SJung-uk Kim  * PARAMETERS:  Resource            - Pointer to the resource descriptor
61*a159c266SJung-uk Kim  *              Length              - Length of the descriptor in bytes
62*a159c266SJung-uk Kim  *              Level               - Current source code indentation level
63*a159c266SJung-uk Kim  *
64*a159c266SJung-uk Kim  * RETURN:      None
65*a159c266SJung-uk Kim  *
66*a159c266SJung-uk Kim  * DESCRIPTION: Decode a IRQ descriptor, either Irq() or IrqNoFlags()
67*a159c266SJung-uk Kim  *
68*a159c266SJung-uk Kim  ******************************************************************************/
69*a159c266SJung-uk Kim 
70*a159c266SJung-uk Kim void
71*a159c266SJung-uk Kim AcpiDmIrqDescriptor (
72*a159c266SJung-uk Kim     AML_RESOURCE            *Resource,
73*a159c266SJung-uk Kim     UINT32                  Length,
74*a159c266SJung-uk Kim     UINT32                  Level)
75*a159c266SJung-uk Kim {
76*a159c266SJung-uk Kim 
77*a159c266SJung-uk Kim     AcpiDmIndent (Level);
78*a159c266SJung-uk Kim     AcpiOsPrintf ("%s (",
79*a159c266SJung-uk Kim         AcpiGbl_IrqDecode [Length & 1]);
80*a159c266SJung-uk Kim 
81*a159c266SJung-uk Kim     /* Decode flags byte if present */
82*a159c266SJung-uk Kim 
83*a159c266SJung-uk Kim     if (Length & 1)
84*a159c266SJung-uk Kim     {
85*a159c266SJung-uk Kim         AcpiOsPrintf ("%s, %s, %s, ",
86*a159c266SJung-uk Kim             AcpiGbl_HeDecode [Resource->Irq.Flags & 1],
87*a159c266SJung-uk Kim             AcpiGbl_LlDecode [(Resource->Irq.Flags >> 3) & 1],
88*a159c266SJung-uk Kim             AcpiGbl_ShrDecode [(Resource->Irq.Flags >> 4) & 1]);
89*a159c266SJung-uk Kim     }
90*a159c266SJung-uk Kim 
91*a159c266SJung-uk Kim     /* Insert a descriptor name */
92*a159c266SJung-uk Kim 
93*a159c266SJung-uk Kim     AcpiDmDescriptorName ();
94*a159c266SJung-uk Kim     AcpiOsPrintf (")\n");
95*a159c266SJung-uk Kim 
96*a159c266SJung-uk Kim     AcpiDmIndent (Level + 1);
97*a159c266SJung-uk Kim     AcpiDmBitList (Resource->Irq.IrqMask);
98*a159c266SJung-uk Kim }
99*a159c266SJung-uk Kim 
100*a159c266SJung-uk Kim 
101*a159c266SJung-uk Kim /*******************************************************************************
102*a159c266SJung-uk Kim  *
103*a159c266SJung-uk Kim  * FUNCTION:    AcpiDmDmaDescriptor
104*a159c266SJung-uk Kim  *
105*a159c266SJung-uk Kim  * PARAMETERS:  Resource            - Pointer to the resource descriptor
106*a159c266SJung-uk Kim  *              Length              - Length of the descriptor in bytes
107*a159c266SJung-uk Kim  *              Level               - Current source code indentation level
108*a159c266SJung-uk Kim  *
109*a159c266SJung-uk Kim  * RETURN:      None
110*a159c266SJung-uk Kim  *
111*a159c266SJung-uk Kim  * DESCRIPTION: Decode a DMA descriptor
112*a159c266SJung-uk Kim  *
113*a159c266SJung-uk Kim  ******************************************************************************/
114*a159c266SJung-uk Kim 
115*a159c266SJung-uk Kim void
116*a159c266SJung-uk Kim AcpiDmDmaDescriptor (
117*a159c266SJung-uk Kim     AML_RESOURCE            *Resource,
118*a159c266SJung-uk Kim     UINT32                  Length,
119*a159c266SJung-uk Kim     UINT32                  Level)
120*a159c266SJung-uk Kim {
121*a159c266SJung-uk Kim 
122*a159c266SJung-uk Kim     AcpiDmIndent (Level);
123*a159c266SJung-uk Kim     AcpiOsPrintf ("DMA (%s, %s, %s, ",
124*a159c266SJung-uk Kim         AcpiGbl_TypDecode [(Resource->Dma.Flags >> 5) & 3],
125*a159c266SJung-uk Kim         AcpiGbl_BmDecode  [(Resource->Dma.Flags >> 2) & 1],
126*a159c266SJung-uk Kim         AcpiGbl_SizDecode [(Resource->Dma.Flags >> 0) & 3]);
127*a159c266SJung-uk Kim 
128*a159c266SJung-uk Kim     /* Insert a descriptor name */
129*a159c266SJung-uk Kim 
130*a159c266SJung-uk Kim     AcpiDmDescriptorName ();
131*a159c266SJung-uk Kim     AcpiOsPrintf (")\n");
132*a159c266SJung-uk Kim 
133*a159c266SJung-uk Kim     AcpiDmIndent (Level + 1);
134*a159c266SJung-uk Kim     AcpiDmBitList (Resource->Dma.DmaChannelMask);
135*a159c266SJung-uk Kim }
136*a159c266SJung-uk Kim 
137*a159c266SJung-uk Kim 
138*a159c266SJung-uk Kim /*******************************************************************************
139*a159c266SJung-uk Kim  *
140*a159c266SJung-uk Kim  * FUNCTION:    AcpiDmFixedDmaDescriptor
141*a159c266SJung-uk Kim  *
142*a159c266SJung-uk Kim  * PARAMETERS:  Resource            - Pointer to the resource descriptor
143*a159c266SJung-uk Kim  *              Length              - Length of the descriptor in bytes
144*a159c266SJung-uk Kim  *              Level               - Current source code indentation level
145*a159c266SJung-uk Kim  *
146*a159c266SJung-uk Kim  * RETURN:      None
147*a159c266SJung-uk Kim  *
148*a159c266SJung-uk Kim  * DESCRIPTION: Decode a FixedDMA descriptor
149*a159c266SJung-uk Kim  *
150*a159c266SJung-uk Kim  ******************************************************************************/
151*a159c266SJung-uk Kim 
152*a159c266SJung-uk Kim void
153*a159c266SJung-uk Kim AcpiDmFixedDmaDescriptor (
154*a159c266SJung-uk Kim     AML_RESOURCE            *Resource,
155*a159c266SJung-uk Kim     UINT32                  Length,
156*a159c266SJung-uk Kim     UINT32                  Level)
157*a159c266SJung-uk Kim {
158*a159c266SJung-uk Kim 
159*a159c266SJung-uk Kim     AcpiDmIndent (Level);
160*a159c266SJung-uk Kim     AcpiOsPrintf ("FixedDMA (0x%4.4X, 0x%4.4X, ",
161*a159c266SJung-uk Kim         Resource->FixedDma.RequestLines,
162*a159c266SJung-uk Kim         Resource->FixedDma.Channels);
163*a159c266SJung-uk Kim 
164*a159c266SJung-uk Kim     if (Resource->FixedDma.Width <= 5)
165*a159c266SJung-uk Kim     {
166*a159c266SJung-uk Kim         AcpiOsPrintf ("%s, ",
167*a159c266SJung-uk Kim             AcpiGbl_DtsDecode [Resource->FixedDma.Width]);
168*a159c266SJung-uk Kim     }
169*a159c266SJung-uk Kim     else
170*a159c266SJung-uk Kim     {
171*a159c266SJung-uk Kim         AcpiOsPrintf ("%X /* INVALID DMA WIDTH */, ", Resource->FixedDma.Width);
172*a159c266SJung-uk Kim     }
173*a159c266SJung-uk Kim 
174*a159c266SJung-uk Kim     /* Insert a descriptor name */
175*a159c266SJung-uk Kim 
176*a159c266SJung-uk Kim     AcpiDmDescriptorName ();
177*a159c266SJung-uk Kim     AcpiOsPrintf (")\n");
178*a159c266SJung-uk Kim }
179*a159c266SJung-uk Kim 
180*a159c266SJung-uk Kim 
181*a159c266SJung-uk Kim /*******************************************************************************
182*a159c266SJung-uk Kim  *
183*a159c266SJung-uk Kim  * FUNCTION:    AcpiDmIoDescriptor
184*a159c266SJung-uk Kim  *
185*a159c266SJung-uk Kim  * PARAMETERS:  Resource            - Pointer to the resource descriptor
186*a159c266SJung-uk Kim  *              Length              - Length of the descriptor in bytes
187*a159c266SJung-uk Kim  *              Level               - Current source code indentation level
188*a159c266SJung-uk Kim  *
189*a159c266SJung-uk Kim  * RETURN:      None
190*a159c266SJung-uk Kim  *
191*a159c266SJung-uk Kim  * DESCRIPTION: Decode an IO descriptor
192*a159c266SJung-uk Kim  *
193*a159c266SJung-uk Kim  ******************************************************************************/
194*a159c266SJung-uk Kim 
195*a159c266SJung-uk Kim void
196*a159c266SJung-uk Kim AcpiDmIoDescriptor (
197*a159c266SJung-uk Kim     AML_RESOURCE            *Resource,
198*a159c266SJung-uk Kim     UINT32                  Length,
199*a159c266SJung-uk Kim     UINT32                  Level)
200*a159c266SJung-uk Kim {
201*a159c266SJung-uk Kim 
202*a159c266SJung-uk Kim     AcpiDmIndent (Level);
203*a159c266SJung-uk Kim     AcpiOsPrintf ("IO (%s,\n",
204*a159c266SJung-uk Kim         AcpiGbl_IoDecode [(Resource->Io.Flags & 1)]);
205*a159c266SJung-uk Kim 
206*a159c266SJung-uk Kim     AcpiDmIndent (Level + 1);
207*a159c266SJung-uk Kim     AcpiDmDumpInteger16 (Resource->Io.Minimum, "Range Minimum");
208*a159c266SJung-uk Kim 
209*a159c266SJung-uk Kim     AcpiDmIndent (Level + 1);
210*a159c266SJung-uk Kim     AcpiDmDumpInteger16 (Resource->Io.Maximum, "Range Maximum");
211*a159c266SJung-uk Kim 
212*a159c266SJung-uk Kim     AcpiDmIndent (Level + 1);
213*a159c266SJung-uk Kim     AcpiDmDumpInteger8 (Resource->Io.Alignment, "Alignment");
214*a159c266SJung-uk Kim 
215*a159c266SJung-uk Kim     AcpiDmIndent (Level + 1);
216*a159c266SJung-uk Kim     AcpiDmDumpInteger8 (Resource->Io.AddressLength, "Length");
217*a159c266SJung-uk Kim 
218*a159c266SJung-uk Kim     /* Insert a descriptor name */
219*a159c266SJung-uk Kim 
220*a159c266SJung-uk Kim     AcpiDmIndent (Level + 1);
221*a159c266SJung-uk Kim     AcpiDmDescriptorName ();
222*a159c266SJung-uk Kim     AcpiOsPrintf (")\n");
223*a159c266SJung-uk Kim }
224*a159c266SJung-uk Kim 
225*a159c266SJung-uk Kim 
226*a159c266SJung-uk Kim /*******************************************************************************
227*a159c266SJung-uk Kim  *
228*a159c266SJung-uk Kim  * FUNCTION:    AcpiDmFixedIoDescriptor
229*a159c266SJung-uk Kim  *
230*a159c266SJung-uk Kim  * PARAMETERS:  Resource            - Pointer to the resource descriptor
231*a159c266SJung-uk Kim  *              Length              - Length of the descriptor in bytes
232*a159c266SJung-uk Kim  *              Level               - Current source code indentation level
233*a159c266SJung-uk Kim  *
234*a159c266SJung-uk Kim  * RETURN:      None
235*a159c266SJung-uk Kim  *
236*a159c266SJung-uk Kim  * DESCRIPTION: Decode a Fixed IO descriptor
237*a159c266SJung-uk Kim  *
238*a159c266SJung-uk Kim  ******************************************************************************/
239*a159c266SJung-uk Kim 
240*a159c266SJung-uk Kim void
241*a159c266SJung-uk Kim AcpiDmFixedIoDescriptor (
242*a159c266SJung-uk Kim     AML_RESOURCE            *Resource,
243*a159c266SJung-uk Kim     UINT32                  Length,
244*a159c266SJung-uk Kim     UINT32                  Level)
245*a159c266SJung-uk Kim {
246*a159c266SJung-uk Kim 
247*a159c266SJung-uk Kim     AcpiDmIndent (Level);
248*a159c266SJung-uk Kim     AcpiOsPrintf ("FixedIO (\n");
249*a159c266SJung-uk Kim 
250*a159c266SJung-uk Kim     AcpiDmIndent (Level + 1);
251*a159c266SJung-uk Kim     AcpiDmDumpInteger16 (Resource->FixedIo.Address, "Address");
252*a159c266SJung-uk Kim 
253*a159c266SJung-uk Kim     AcpiDmIndent (Level + 1);
254*a159c266SJung-uk Kim     AcpiDmDumpInteger8 (Resource->FixedIo.AddressLength, "Length");
255*a159c266SJung-uk Kim 
256*a159c266SJung-uk Kim     /* Insert a descriptor name */
257*a159c266SJung-uk Kim 
258*a159c266SJung-uk Kim     AcpiDmIndent (Level + 1);
259*a159c266SJung-uk Kim     AcpiDmDescriptorName ();
260*a159c266SJung-uk Kim     AcpiOsPrintf (")\n");
261*a159c266SJung-uk Kim }
262*a159c266SJung-uk Kim 
263*a159c266SJung-uk Kim 
264*a159c266SJung-uk Kim /*******************************************************************************
265*a159c266SJung-uk Kim  *
266*a159c266SJung-uk Kim  * FUNCTION:    AcpiDmStartDependentDescriptor
267*a159c266SJung-uk Kim  *
268*a159c266SJung-uk Kim  * PARAMETERS:  Resource            - Pointer to the resource descriptor
269*a159c266SJung-uk Kim  *              Length              - Length of the descriptor in bytes
270*a159c266SJung-uk Kim  *              Level               - Current source code indentation level
271*a159c266SJung-uk Kim  *
272*a159c266SJung-uk Kim  * RETURN:      None
273*a159c266SJung-uk Kim  *
274*a159c266SJung-uk Kim  * DESCRIPTION: Decode a Start Dependendent functions descriptor
275*a159c266SJung-uk Kim  *
276*a159c266SJung-uk Kim  ******************************************************************************/
277*a159c266SJung-uk Kim 
278*a159c266SJung-uk Kim void
279*a159c266SJung-uk Kim AcpiDmStartDependentDescriptor (
280*a159c266SJung-uk Kim     AML_RESOURCE            *Resource,
281*a159c266SJung-uk Kim     UINT32                  Length,
282*a159c266SJung-uk Kim     UINT32                  Level)
283*a159c266SJung-uk Kim {
284*a159c266SJung-uk Kim 
285*a159c266SJung-uk Kim     AcpiDmIndent (Level);
286*a159c266SJung-uk Kim 
287*a159c266SJung-uk Kim     if (Length & 1)
288*a159c266SJung-uk Kim     {
289*a159c266SJung-uk Kim         AcpiOsPrintf ("StartDependentFn (0x%2.2X, 0x%2.2X)\n",
290*a159c266SJung-uk Kim             (UINT32) Resource->StartDpf.Flags & 3,
291*a159c266SJung-uk Kim             (UINT32) (Resource->StartDpf.Flags >> 2) & 3);
292*a159c266SJung-uk Kim     }
293*a159c266SJung-uk Kim     else
294*a159c266SJung-uk Kim     {
295*a159c266SJung-uk Kim         AcpiOsPrintf ("StartDependentFnNoPri ()\n");
296*a159c266SJung-uk Kim     }
297*a159c266SJung-uk Kim 
298*a159c266SJung-uk Kim     AcpiDmIndent (Level);
299*a159c266SJung-uk Kim     AcpiOsPrintf ("{\n");
300*a159c266SJung-uk Kim }
301*a159c266SJung-uk Kim 
302*a159c266SJung-uk Kim 
303*a159c266SJung-uk Kim /*******************************************************************************
304*a159c266SJung-uk Kim  *
305*a159c266SJung-uk Kim  * FUNCTION:    AcpiDmEndDependentDescriptor
306*a159c266SJung-uk Kim  *
307*a159c266SJung-uk Kim  * PARAMETERS:  Resource            - Pointer to the resource descriptor
308*a159c266SJung-uk Kim  *              Length              - Length of the descriptor in bytes
309*a159c266SJung-uk Kim  *              Level               - Current source code indentation level
310*a159c266SJung-uk Kim  *
311*a159c266SJung-uk Kim  * RETURN:      None
312*a159c266SJung-uk Kim  *
313*a159c266SJung-uk Kim  * DESCRIPTION: Decode an End Dependent functions descriptor
314*a159c266SJung-uk Kim  *
315*a159c266SJung-uk Kim  ******************************************************************************/
316*a159c266SJung-uk Kim 
317*a159c266SJung-uk Kim void
318*a159c266SJung-uk Kim AcpiDmEndDependentDescriptor (
319*a159c266SJung-uk Kim     AML_RESOURCE            *Resource,
320*a159c266SJung-uk Kim     UINT32                  Length,
321*a159c266SJung-uk Kim     UINT32                  Level)
322*a159c266SJung-uk Kim {
323*a159c266SJung-uk Kim 
324*a159c266SJung-uk Kim     AcpiDmIndent (Level);
325*a159c266SJung-uk Kim     AcpiOsPrintf ("}\n");
326*a159c266SJung-uk Kim     AcpiDmIndent (Level);
327*a159c266SJung-uk Kim     AcpiOsPrintf ("EndDependentFn ()\n");
328*a159c266SJung-uk Kim }
329*a159c266SJung-uk Kim 
330*a159c266SJung-uk Kim 
331*a159c266SJung-uk Kim /*******************************************************************************
332*a159c266SJung-uk Kim  *
333*a159c266SJung-uk Kim  * FUNCTION:    AcpiDmVendorSmallDescriptor
334*a159c266SJung-uk Kim  *
335*a159c266SJung-uk Kim  * PARAMETERS:  Resource            - Pointer to the resource descriptor
336*a159c266SJung-uk Kim  *              Length              - Length of the descriptor in bytes
337*a159c266SJung-uk Kim  *              Level               - Current source code indentation level
338*a159c266SJung-uk Kim  *
339*a159c266SJung-uk Kim  * RETURN:      None
340*a159c266SJung-uk Kim  *
341*a159c266SJung-uk Kim  * DESCRIPTION: Decode a Vendor Small Descriptor
342*a159c266SJung-uk Kim  *
343*a159c266SJung-uk Kim  ******************************************************************************/
344*a159c266SJung-uk Kim 
345*a159c266SJung-uk Kim void
346*a159c266SJung-uk Kim AcpiDmVendorSmallDescriptor (
347*a159c266SJung-uk Kim     AML_RESOURCE            *Resource,
348*a159c266SJung-uk Kim     UINT32                  Length,
349*a159c266SJung-uk Kim     UINT32                  Level)
350*a159c266SJung-uk Kim {
351*a159c266SJung-uk Kim 
352*a159c266SJung-uk Kim     AcpiDmVendorCommon ("Short",
353*a159c266SJung-uk Kim         ACPI_ADD_PTR (UINT8, Resource, sizeof (AML_RESOURCE_SMALL_HEADER)),
354*a159c266SJung-uk Kim         Length, Level);
355*a159c266SJung-uk Kim }
356*a159c266SJung-uk Kim 
357*a159c266SJung-uk Kim #endif
358*a159c266SJung-uk Kim 
359