1    /*
2     * Some or all of this work - Copyright (c) 2006 - 2021, Intel Corp.
3     * All rights reserved.
4     *
5     * Redistribution and use in source and binary forms, with or without modification,
6     * are permitted provided that the following conditions are met:
7     *
8     * Redistributions of source code must retain the above copyright notice,
9     * this list of conditions and the following disclaimer.
10     * Redistributions in binary form must reproduce the above copyright notice,
11     * this list of conditions and the following disclaimer in the documentation
12     * and/or other materials provided with the distribution.
13     * Neither the name of Intel Corporation nor the names of its contributors
14     * may be used to endorse or promote products derived from this software
15     * without specific prior written permission.
16     *
17     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18     * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19     * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20     * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21     * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22     * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23     * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24     * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25     * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
26     * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27     */
28    /*
29     * Data type conversion and manipulation
30     *
31     * Extract Portion of Buffer or String
32     */
33    Name (Z039, 0x27)
34    Name (S200, "!\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !\"#$%&\'()*")
35    /* Verifying 3-parameters, 1-result operator */
36
37    Method (M304, 6, Serialized)
38    {
39        Local5 = 0x00
40        Local3 = Arg1
41        While (Local3)
42        {
43            /* Operands */
44
45            Local6 = (Local5 * 0x03)
46            Local0 = DerefOf (Arg3 [Local6])
47            Local6++
48            Local1 = DerefOf (Arg3 [Local6])
49            Local6++
50            Local4 = DerefOf (Arg3 [Local6])
51            /* Expected result */
52
53            Local2 = DerefOf (Arg4 [Local5])
54            Switch (ToInteger (Arg5))
55            {
56                Case (0x00)
57                {
58                    Mid (Local0, Local1, Local4, Local7)
59                    If ((Local7 != Local2))
60                    {
61                        ERR (Arg0, Z039, __LINE__, 0x00, 0x00, Local5, Arg2)
62                    }
63                }
64                Case (0x01)
65                {
66                    Mid (S200, Local1, Local4, Local7)
67                    If ((Local7 != Local2))
68                    {
69                        ERR (Arg0, Z039, __LINE__, 0x00, 0x00, Local5, Arg2)
70                    }
71                }
72
73            }
74
75            Local5++
76            Local3--
77        }
78    }
79
80    /* String */
81
82    Name (P362, Package (0x2A)
83    {
84        /* Length > 0 */
85
86        "0123456789a",
87        0x00,
88        0x06,            /* Index == 0, Index + Length < Size */
89        "0123456789a",
90        0x03,
91        0x07,            /* Index < Size, Index + Length < Size */
92        "0123456789a",
93        0x05,
94        0x06,            /* Index < Size, Index + Length == Size */
95        "0123456789a",
96        0x00,
97        0x0B,       /* Index == 0, Index + Length == Size */
98        "0123456789a",
99        0x08,
100        0x08,            /* Index < Size, Index + Length > Size */
101        "0123456789a",
102        0x0B,
103        0x03,       /* Index == Size */
104        "0123456789a",
105        0x0E,
106        0x01,       /* Index > Size */
107        "0123456789a",
108        0x00,
109        0x0E,       /* Index == 0, Length > Size */
110        /* Length == 0 */
111
112        "0123456789a",
113        0x00,
114        0x00,            /* Index == 0 */
115        "0123456789a",
116        0x05,
117        0x00,            /* Index < Size */
118        "0123456789a",
119        0x0B,
120        0x00,       /* Index == Size */
121        "0123456789a",
122        0x0F,
123        0x00,       /* Index > Size */
124        /* Size == 0 */
125
126        "",
127        0x00,
128        0x01,
129        "",
130        0x012C,
131        0x012C
132    })
133    Name (P363, Package (0x0E)
134    {
135        "012345",
136        "3456789",
137        "56789a",
138        "0123456789a",
139        "89a",
140        "",
141        "",
142        "0123456789a",
143        "",
144        "",
145        "",
146        "",
147        "",
148        ""
149    })
150    /* String, Size == 200, Length > 0 */
151
152    Name (P364, Package (0x18)
153    {
154        0x00,
155        0x00,
156        0x7D,  /* Index == 0, Index + Length < Size */
157        0x00,
158        0x43,
159        0x43,  /* Index < Size, Index + Length < Size */
160        0x00,
161        0x5D,
162        0x6B,     /* Index < Size, Index + Length == Size */
163        0x00,
164        0x00,
165        0xC8,  /* Index == 0, Index + Length == Size */
166        0x00,
167        0x7F,
168        0x64,    /* Index < Size, Index + Length > Size */
169        0x00,
170        0xC8,
171        0x03,  /* Index == Size */
172        0x00,
173        0xD6,
174        0x01,  /* Index > Size */
175        0x00,
176        0x00,
177        0xC9 /* Index == 0, Length > Size */
178    })
179    Name (P365, Package (0x08)
180    {
181        "!\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !\"#$%&\'()*+,-./0123456789:;<=>",
182        "defghijklmnopqrstuvwxyz{|}~ !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFG",
183        "~ !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !\"#$%&\'()*",
184        "!\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !\"#$%&\'()*",
185        "ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !\"#$%&\'()*",
186        "",
187        "",
188        "!\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ !\"#$%&\'()*"
189    })
190    /* Buffer */
191
192    Name (P366, Package (0x18)
193    {
194        /* Length > 0 */
195
196        Buffer (0x0B)
197        {
198            /* 0000 */  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,  // ........
199            /* 0008 */  0x08, 0x09, 0x00                                 // ...
200        },
201
202        0x00,
203        0x06,            /* Index == 0, Index + Length < Size */
204        Buffer (0x0B)
205        {
206            /* 0000 */  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,  // ........
207            /* 0008 */  0x08, 0x09, 0x00                                 // ...
208        },
209
210        0x03,
211        0x07,            /* Index < Size, Index + Length < Size */
212        Buffer (0x0B)
213        {
214            /* 0000 */  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x00, 0x07,  // ........
215            /* 0008 */  0x08, 0x09, 0x00                                 // ...
216        },
217
218        0x03,
219        0x07,            /* Index < Size, Index + Length < Size */
220        Buffer (0x0B)
221        {
222            /* 0000 */  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,  // ........
223            /* 0008 */  0x08, 0x09, 0x00                                 // ...
224        },
225
226        0x05,
227        0x06,            /* Index < Size, Index + Length == Size */
228        Buffer (0x0B)
229        {
230            /* 0000 */  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,  // ........
231            /* 0008 */  0x08, 0x09, 0x00                                 // ...
232        },
233
234        0x00,
235        0x0B,       /* Index == 0, Index + Length == Size */
236        Buffer (0x0B)
237        {
238            /* 0000 */  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,  // ........
239            /* 0008 */  0x08, 0x09, 0x00                                 // ...
240        },
241
242        0x08,
243        0x08,            /* Index < Size, Index + Length > Size */
244        Buffer (0x0B)
245        {
246            /* 0000 */  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,  // ........
247            /* 0008 */  0x08, 0x09, 0x00                                 // ...
248        },
249
250        0x00,
251        0xC9,      /* Index == 0, Length > Size */
252        /* Length > 200 */
253
254        Buffer (0xD3)
255        {
256            /* 0000 */  0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,  // ........
257            /* 0008 */  0x09, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,  // ........
258            /* 0010 */  0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,  // ........
259            /* 0018 */  0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,  // ........
260            /* 0020 */  0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D,  // ........
261            /* 0028 */  0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25,  // .. !"#$%
262            /* 0030 */  0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D,  // &'()*+,-
263            /* 0038 */  0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,  // ./012345
264            /* 0040 */  0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D,  // 6789:;<=
265            /* 0048 */  0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45,  // >?@ABCDE
266            /* 0050 */  0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D,  // FGHIJKLM
267            /* 0058 */  0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55,  // NOPQRSTU
268            /* 0060 */  0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D,  // VWXYZ[\]
269            /* 0068 */  0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65,  // ^_`abcde
270            /* 0070 */  0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D,  // fghijklm
271            /* 0078 */  0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,  // nopqrstu
272            /* 0080 */  0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D,  // vwxyz{|}
273            /* 0088 */  0x7E, 0x7F, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85,  // ~.......
274            /* 0090 */  0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D,  // ........
275            /* 0098 */  0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95,  // ........
276            /* 00A0 */  0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D,  // ........
277            /* 00A8 */  0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5,  // ........
278            /* 00B0 */  0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD,  // ........
279            /* 00B8 */  0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5,  // ........
280            /* 00C0 */  0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD,  // ........
281            /* 00C8 */  0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5,  // ........
282            /* 00D0 */  0xC6, 0xC7, 0xC8                                 // ...
283        },
284
285        0x02,
286        0xCB
287    })
288    Name (P367, Package (0x08)
289    {
290        Buffer (0x06)
291        {
292             0x00, 0x01, 0x02, 0x03, 0x04, 0x05               // ......
293        },
294
295        Buffer (0x07)
296        {
297             0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09         // .......
298        },
299
300        Buffer (0x07)
301        {
302             0x03, 0x04, 0x05, 0x00, 0x07, 0x08, 0x09         // .......
303        },
304
305        Buffer (0x06)
306        {
307             0x05, 0x06, 0x07, 0x08, 0x09, 0x00               // ......
308        },
309
310        Buffer (0x0B)
311        {
312            /* 0000 */  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,  // ........
313            /* 0008 */  0x08, 0x09, 0x00                                 // ...
314        },
315
316        Buffer (0x03)
317        {
318             0x08, 0x09, 0x00                                 // ...
319        },
320
321        Buffer (0x0B)
322        {
323            /* 0000 */  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,  // ........
324            /* 0008 */  0x08, 0x09, 0x00                                 // ...
325        },
326
327        Buffer (0xCB)
328        {
329            /* 0000 */  0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x00,  // ........
330            /* 0008 */  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,  // ........
331            /* 0010 */  0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,  // ........
332            /* 0018 */  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,  // ........
333            /* 0020 */  0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,  // ........
334            /* 0028 */  0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,  //  !"#$%&'
335            /* 0030 */  0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,  // ()*+,-./
336            /* 0038 */  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,  // 01234567
337            /* 0040 */  0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,  // 89:;<=>?
338            /* 0048 */  0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,  // @ABCDEFG
339            /* 0050 */  0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,  // HIJKLMNO
340            /* 0058 */  0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,  // PQRSTUVW
341            /* 0060 */  0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,  // XYZ[\]^_
342            /* 0068 */  0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,  // `abcdefg
343            /* 0070 */  0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,  // hijklmno
344            /* 0078 */  0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,  // pqrstuvw
345            /* 0080 */  0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,  // xyz{|}~.
346            /* 0088 */  0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,  // ........
347            /* 0090 */  0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,  // ........
348            /* 0098 */  0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,  // ........
349            /* 00A0 */  0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,  // ........
350            /* 00A8 */  0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,  // ........
351            /* 00B0 */  0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,  // ........
352            /* 00B8 */  0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7,  // ........
353            /* 00C0 */  0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,  // ........
354            /* 00C8 */  0xC0, 0xC1, 0xC2                                 // ...
355        }
356    })
357    /* Buffer, Mid() results in Buffer(0){} */
358
359    Name (P368, Package (0x12)
360    {
361        /* Length > 0 */
362
363        Buffer (0x0B)
364        {
365            /* 0000 */  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,  // ........
366            /* 0008 */  0x08, 0x09, 0x00                                 // ...
367        },
368
369        0x0B,
370        0x03,           /* Index == Size */
371        Buffer (0x0B)
372        {
373            /* 0000 */  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,  // ........
374            /* 0008 */  0x08, 0x09, 0x00                                 // ...
375        },
376
377        0x0E,
378        0x01,           /* Index > Size */
379        /* Length == 0 */
380
381        Buffer (0x0B)
382        {
383            /* 0000 */  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,  // ........
384            /* 0008 */  0x08, 0x09, 0x00                                 // ...
385        },
386
387        0x00,
388        0x00,                /* Index == 0 */
389        Buffer (0x0B)
390        {
391            /* 0000 */  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x00,  // ........
392            /* 0008 */  0x08, 0x09, 0x00                                 // ...
393        },
394
395        0x05,
396        0x00,                /* Index < Size */
397        Buffer (0x0B)
398        {
399            /* 0000 */  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,  // ........
400            /* 0008 */  0x08, 0x09, 0x00                                 // ...
401        },
402
403        0x0B,
404        0x00,           /* Index == Size */
405        Buffer (0x0B)
406        {
407            /* 0000 */  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,  // ........
408            /* 0008 */  0x08, 0x09, 0x00                                 // ...
409        },
410
411        0x0F,
412        0x00          /* Index > Size */
413    })
414    /* Run-method */
415
416    Method (MID0, 0, Serialized)
417    {
418        Debug = "TEST: MID0, Extract Portion of Buffer or String"
419        /* String */
420
421        M304 (__METHOD__, 0x0E, "p362", P362, P363, 0x00)
422        /* String, Size == 200, Length > 0 */
423
424        M304 (__METHOD__, 0x08, "p364", P364, P365, 0x01)
425        /* Buffer */
426
427        M304 (__METHOD__, 0x08, "p366", P366, P367, 0x00)
428        /* Prepare Package of Buffer(0){} elements */
429
430        Local5 = Package (0x06){}
431        Local1 = 0x00
432        Local0 = 0x00
433        While ((Local0 < 0x06))
434        {
435            Local5 [Local0] = Buffer (Local1){}
436            Local0++
437        }
438
439        /* Buffer, Mid() results in Buffer(0){} */
440
441        M304 (__METHOD__, 0x06, "p366", P368, Local5, 0x00)
442        /* Buffer, Mid(Buffer(0){}) */
443
444        Mid (Buffer (Local1){}, 0x00, 0x01, Local7)
445        If ((Local7 != Buffer (Local1){}))
446        {
447            ERR (__METHOD__, Z039, __LINE__, 0x00, 0x00, 0x00, "Buffer(0)")
448        }
449
450        Mid (Buffer (Local1){}, 0x012C, 0x012C, Local7)
451        If ((Local7 != Buffer (Local1){}))
452        {
453            ERR (__METHOD__, Z039, __LINE__, 0x00, 0x00, 0x00, "Buffer(0)")
454        }
455    }
456