Merge branch 'x86-pti-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[sfrench/cifs-2.6.git] / drivers / acpi / acpica / exconvrt.c
1 /******************************************************************************
2  *
3  * Module Name: exconvrt - Object conversion routines
4  *
5  *****************************************************************************/
6
7 /*
8  * Copyright (C) 2000 - 2017, 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 MERCHANTIBILITY 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/acpi.h>
45 #include "accommon.h"
46 #include "acinterp.h"
47 #include "amlcode.h"
48
49 #define _COMPONENT          ACPI_EXECUTER
50 ACPI_MODULE_NAME("exconvrt")
51
52 /* Local prototypes */
53 static u32
54 acpi_ex_convert_to_ascii(u64 integer, u16 base, u8 *string, u8 max_length);
55
56 /*******************************************************************************
57  *
58  * FUNCTION:    acpi_ex_convert_to_integer
59  *
60  * PARAMETERS:  obj_desc            - Object to be converted. Must be an
61  *                                    Integer, Buffer, or String
62  *              result_desc         - Where the new Integer object is returned
63  *              implicit_conversion - Used for string conversion
64  *
65  * RETURN:      Status
66  *
67  * DESCRIPTION: Convert an ACPI Object to an integer.
68  *
69  ******************************************************************************/
70
71 acpi_status
72 acpi_ex_convert_to_integer(union acpi_operand_object *obj_desc,
73                            union acpi_operand_object **result_desc,
74                            u32 implicit_conversion)
75 {
76         union acpi_operand_object *return_desc;
77         u8 *pointer;
78         u64 result;
79         u32 i;
80         u32 count;
81
82         ACPI_FUNCTION_TRACE_PTR(ex_convert_to_integer, obj_desc);
83
84         switch (obj_desc->common.type) {
85         case ACPI_TYPE_INTEGER:
86
87                 /* No conversion necessary */
88
89                 *result_desc = obj_desc;
90                 return_ACPI_STATUS(AE_OK);
91
92         case ACPI_TYPE_BUFFER:
93         case ACPI_TYPE_STRING:
94
95                 /* Note: Takes advantage of common buffer/string fields */
96
97                 pointer = obj_desc->buffer.pointer;
98                 count = obj_desc->buffer.length;
99                 break;
100
101         default:
102
103                 return_ACPI_STATUS(AE_TYPE);
104         }
105
106         /*
107          * Convert the buffer/string to an integer. Note that both buffers and
108          * strings are treated as raw data - we don't convert ascii to hex for
109          * strings.
110          *
111          * There are two terminating conditions for the loop:
112          * 1) The size of an integer has been reached, or
113          * 2) The end of the buffer or string has been reached
114          */
115         result = 0;
116
117         /* String conversion is different than Buffer conversion */
118
119         switch (obj_desc->common.type) {
120         case ACPI_TYPE_STRING:
121                 /*
122                  * Convert string to an integer - for most cases, the string must be
123                  * hexadecimal as per the ACPI specification. The only exception (as
124                  * of ACPI 3.0) is that the to_integer() operator allows both decimal
125                  * and hexadecimal strings (hex prefixed with "0x").
126                  *
127                  * Explicit conversion is used only by to_integer.
128                  * All other string-to-integer conversions are implicit conversions.
129                  */
130                 if (implicit_conversion) {
131                         result =
132                             acpi_ut_implicit_strtoul64(ACPI_CAST_PTR
133                                                        (char, pointer));
134                 } else {
135                         result =
136                             acpi_ut_explicit_strtoul64(ACPI_CAST_PTR
137                                                        (char, pointer));
138                 }
139                 break;
140
141         case ACPI_TYPE_BUFFER:
142
143                 /* Check for zero-length buffer */
144
145                 if (!count) {
146                         return_ACPI_STATUS(AE_AML_BUFFER_LIMIT);
147                 }
148
149                 /* Transfer no more than an integer's worth of data */
150
151                 if (count > acpi_gbl_integer_byte_width) {
152                         count = acpi_gbl_integer_byte_width;
153                 }
154
155                 /*
156                  * Convert buffer to an integer - we simply grab enough raw data
157                  * from the buffer to fill an integer
158                  */
159                 for (i = 0; i < count; i++) {
160                         /*
161                          * Get next byte and shift it into the Result.
162                          * Little endian is used, meaning that the first byte of the buffer
163                          * is the LSB of the integer
164                          */
165                         result |= (((u64) pointer[i]) << (i * 8));
166                 }
167                 break;
168
169         default:
170
171                 /* No other types can get here */
172
173                 break;
174         }
175
176         /* Create a new integer */
177
178         return_desc = acpi_ut_create_integer_object(result);
179         if (!return_desc) {
180                 return_ACPI_STATUS(AE_NO_MEMORY);
181         }
182
183         ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Converted value: %8.8X%8.8X\n",
184                           ACPI_FORMAT_UINT64(result)));
185
186         /* Save the Result */
187
188         (void)acpi_ex_truncate_for32bit_table(return_desc);
189         *result_desc = return_desc;
190         return_ACPI_STATUS(AE_OK);
191 }
192
193 /*******************************************************************************
194  *
195  * FUNCTION:    acpi_ex_convert_to_buffer
196  *
197  * PARAMETERS:  obj_desc        - Object to be converted. Must be an
198  *                                Integer, Buffer, or String
199  *              result_desc     - Where the new buffer object is returned
200  *
201  * RETURN:      Status
202  *
203  * DESCRIPTION: Convert an ACPI Object to a Buffer
204  *
205  ******************************************************************************/
206
207 acpi_status
208 acpi_ex_convert_to_buffer(union acpi_operand_object *obj_desc,
209                           union acpi_operand_object **result_desc)
210 {
211         union acpi_operand_object *return_desc;
212         u8 *new_buf;
213
214         ACPI_FUNCTION_TRACE_PTR(ex_convert_to_buffer, obj_desc);
215
216         switch (obj_desc->common.type) {
217         case ACPI_TYPE_BUFFER:
218
219                 /* No conversion necessary */
220
221                 *result_desc = obj_desc;
222                 return_ACPI_STATUS(AE_OK);
223
224         case ACPI_TYPE_INTEGER:
225                 /*
226                  * Create a new Buffer object.
227                  * Need enough space for one integer
228                  */
229                 return_desc =
230                     acpi_ut_create_buffer_object(acpi_gbl_integer_byte_width);
231                 if (!return_desc) {
232                         return_ACPI_STATUS(AE_NO_MEMORY);
233                 }
234
235                 /* Copy the integer to the buffer, LSB first */
236
237                 new_buf = return_desc->buffer.pointer;
238                 memcpy(new_buf, &obj_desc->integer.value,
239                        acpi_gbl_integer_byte_width);
240                 break;
241
242         case ACPI_TYPE_STRING:
243                 /*
244                  * Create a new Buffer object
245                  * Size will be the string length
246                  *
247                  * NOTE: Add one to the string length to include the null terminator.
248                  * The ACPI spec is unclear on this subject, but there is existing
249                  * ASL/AML code that depends on the null being transferred to the new
250                  * buffer.
251                  */
252                 return_desc = acpi_ut_create_buffer_object((acpi_size)
253                                                            obj_desc->string.
254                                                            length + 1);
255                 if (!return_desc) {
256                         return_ACPI_STATUS(AE_NO_MEMORY);
257                 }
258
259                 /* Copy the string to the buffer */
260
261                 new_buf = return_desc->buffer.pointer;
262                 strncpy((char *)new_buf, (char *)obj_desc->string.pointer,
263                         obj_desc->string.length);
264                 break;
265
266         default:
267
268                 return_ACPI_STATUS(AE_TYPE);
269         }
270
271         /* Mark buffer initialized */
272
273         return_desc->common.flags |= AOPOBJ_DATA_VALID;
274         *result_desc = return_desc;
275         return_ACPI_STATUS(AE_OK);
276 }
277
278 /*******************************************************************************
279  *
280  * FUNCTION:    acpi_ex_convert_to_ascii
281  *
282  * PARAMETERS:  integer         - Value to be converted
283  *              base            - ACPI_STRING_DECIMAL or ACPI_STRING_HEX
284  *              string          - Where the string is returned
285  *              data_width      - Size of data item to be converted, in bytes
286  *
287  * RETURN:      Actual string length
288  *
289  * DESCRIPTION: Convert an ACPI Integer to a hex or decimal string
290  *
291  ******************************************************************************/
292
293 static u32
294 acpi_ex_convert_to_ascii(u64 integer, u16 base, u8 *string, u8 data_width)
295 {
296         u64 digit;
297         u32 i;
298         u32 j;
299         u32 k = 0;
300         u32 hex_length;
301         u32 decimal_length;
302         u32 remainder;
303         u8 supress_zeros;
304
305         ACPI_FUNCTION_ENTRY();
306
307         switch (base) {
308         case 10:
309
310                 /* Setup max length for the decimal number */
311
312                 switch (data_width) {
313                 case 1:
314
315                         decimal_length = ACPI_MAX8_DECIMAL_DIGITS;
316                         break;
317
318                 case 4:
319
320                         decimal_length = ACPI_MAX32_DECIMAL_DIGITS;
321                         break;
322
323                 case 8:
324                 default:
325
326                         decimal_length = ACPI_MAX64_DECIMAL_DIGITS;
327                         break;
328                 }
329
330                 supress_zeros = TRUE;   /* No leading zeros */
331                 remainder = 0;
332
333                 for (i = decimal_length; i > 0; i--) {
334
335                         /* Divide by nth factor of 10 */
336
337                         digit = integer;
338                         for (j = 0; j < i; j++) {
339                                 (void)acpi_ut_short_divide(digit, 10, &digit,
340                                                            &remainder);
341                         }
342
343                         /* Handle leading zeros */
344
345                         if (remainder != 0) {
346                                 supress_zeros = FALSE;
347                         }
348
349                         if (!supress_zeros) {
350                                 string[k] = (u8) (ACPI_ASCII_ZERO + remainder);
351                                 k++;
352                         }
353                 }
354                 break;
355
356         case 16:
357
358                 /* hex_length: 2 ascii hex chars per data byte */
359
360                 hex_length = ACPI_MUL_2(data_width);
361                 for (i = 0, j = (hex_length - 1); i < hex_length; i++, j--) {
362
363                         /* Get one hex digit, most significant digits first */
364
365                         string[k] = (u8)
366                             acpi_ut_hex_to_ascii_char(integer, ACPI_MUL_4(j));
367                         k++;
368                 }
369                 break;
370
371         default:
372                 return (0);
373         }
374
375         /*
376          * Since leading zeros are suppressed, we must check for the case where
377          * the integer equals 0
378          *
379          * Finally, null terminate the string and return the length
380          */
381         if (!k) {
382                 string[0] = ACPI_ASCII_ZERO;
383                 k = 1;
384         }
385
386         string[k] = 0;
387         return ((u32) k);
388 }
389
390 /*******************************************************************************
391  *
392  * FUNCTION:    acpi_ex_convert_to_string
393  *
394  * PARAMETERS:  obj_desc        - Object to be converted. Must be an
395  *                                Integer, Buffer, or String
396  *              result_desc     - Where the string object is returned
397  *              type            - String flags (base and conversion type)
398  *
399  * RETURN:      Status
400  *
401  * DESCRIPTION: Convert an ACPI Object to a string
402  *
403  ******************************************************************************/
404
405 acpi_status
406 acpi_ex_convert_to_string(union acpi_operand_object * obj_desc,
407                           union acpi_operand_object ** result_desc, u32 type)
408 {
409         union acpi_operand_object *return_desc;
410         u8 *new_buf;
411         u32 i;
412         u32 string_length = 0;
413         u16 base = 16;
414         u8 separator = ',';
415
416         ACPI_FUNCTION_TRACE_PTR(ex_convert_to_string, obj_desc);
417
418         switch (obj_desc->common.type) {
419         case ACPI_TYPE_STRING:
420
421                 /* No conversion necessary */
422
423                 *result_desc = obj_desc;
424                 return_ACPI_STATUS(AE_OK);
425
426         case ACPI_TYPE_INTEGER:
427
428                 switch (type) {
429                 case ACPI_EXPLICIT_CONVERT_DECIMAL:
430
431                         /* Make room for maximum decimal number */
432
433                         string_length = ACPI_MAX_DECIMAL_DIGITS;
434                         base = 10;
435                         break;
436
437                 default:
438
439                         /* Two hex string characters for each integer byte */
440
441                         string_length = ACPI_MUL_2(acpi_gbl_integer_byte_width);
442                         break;
443                 }
444
445                 /*
446                  * Create a new String
447                  * Need enough space for one ASCII integer (plus null terminator)
448                  */
449                 return_desc =
450                     acpi_ut_create_string_object((acpi_size)string_length);
451                 if (!return_desc) {
452                         return_ACPI_STATUS(AE_NO_MEMORY);
453                 }
454
455                 new_buf = return_desc->buffer.pointer;
456
457                 /* Convert integer to string */
458
459                 string_length =
460                     acpi_ex_convert_to_ascii(obj_desc->integer.value, base,
461                                              new_buf,
462                                              acpi_gbl_integer_byte_width);
463
464                 /* Null terminate at the correct place */
465
466                 return_desc->string.length = string_length;
467                 new_buf[string_length] = 0;
468                 break;
469
470         case ACPI_TYPE_BUFFER:
471
472                 /* Setup string length, base, and separator */
473
474                 switch (type) {
475                 case ACPI_EXPLICIT_CONVERT_DECIMAL:     /* Used by to_decimal_string */
476                         /*
477                          * From ACPI: "If Data is a buffer, it is converted to a string of
478                          * decimal values separated by commas."
479                          */
480                         base = 10;
481
482                         /*
483                          * Calculate the final string length. Individual string values
484                          * are variable length (include separator for each)
485                          */
486                         for (i = 0; i < obj_desc->buffer.length; i++) {
487                                 if (obj_desc->buffer.pointer[i] >= 100) {
488                                         string_length += 4;
489                                 } else if (obj_desc->buffer.pointer[i] >= 10) {
490                                         string_length += 3;
491                                 } else {
492                                         string_length += 2;
493                                 }
494                         }
495                         break;
496
497                 case ACPI_IMPLICIT_CONVERT_HEX:
498                         /*
499                          * From the ACPI spec:
500                          *"The entire contents of the buffer are converted to a string of
501                          * two-character hexadecimal numbers, each separated by a space."
502                          */
503                         separator = ' ';
504                         string_length = (obj_desc->buffer.length * 3);
505                         break;
506
507                 case ACPI_EXPLICIT_CONVERT_HEX: /* Used by to_hex_string */
508                         /*
509                          * From ACPI: "If Data is a buffer, it is converted to a string of
510                          * hexadecimal values separated by commas."
511                          */
512                         string_length = (obj_desc->buffer.length * 3);
513                         break;
514
515                 default:
516                         return_ACPI_STATUS(AE_BAD_PARAMETER);
517                 }
518
519                 /*
520                  * Create a new string object and string buffer
521                  * (-1 because of extra separator included in string_length from above)
522                  * Allow creation of zero-length strings from zero-length buffers.
523                  */
524                 if (string_length) {
525                         string_length--;
526                 }
527
528                 return_desc =
529                     acpi_ut_create_string_object((acpi_size)string_length);
530                 if (!return_desc) {
531                         return_ACPI_STATUS(AE_NO_MEMORY);
532                 }
533
534                 new_buf = return_desc->buffer.pointer;
535
536                 /*
537                  * Convert buffer bytes to hex or decimal values
538                  * (separated by commas or spaces)
539                  */
540                 for (i = 0; i < obj_desc->buffer.length; i++) {
541                         new_buf += acpi_ex_convert_to_ascii((u64) obj_desc->
542                                                             buffer.pointer[i],
543                                                             base, new_buf, 1);
544                         *new_buf++ = separator; /* each separated by a comma or space */
545                 }
546
547                 /*
548                  * Null terminate the string
549                  * (overwrites final comma/space from above)
550                  */
551                 if (obj_desc->buffer.length) {
552                         new_buf--;
553                 }
554                 *new_buf = 0;
555                 break;
556
557         default:
558
559                 return_ACPI_STATUS(AE_TYPE);
560         }
561
562         *result_desc = return_desc;
563         return_ACPI_STATUS(AE_OK);
564 }
565
566 /*******************************************************************************
567  *
568  * FUNCTION:    acpi_ex_convert_to_target_type
569  *
570  * PARAMETERS:  destination_type    - Current type of the destination
571  *              source_desc         - Source object to be converted.
572  *              result_desc         - Where the converted object is returned
573  *              walk_state          - Current method state
574  *
575  * RETURN:      Status
576  *
577  * DESCRIPTION: Implements "implicit conversion" rules for storing an object.
578  *
579  ******************************************************************************/
580
581 acpi_status
582 acpi_ex_convert_to_target_type(acpi_object_type destination_type,
583                                union acpi_operand_object *source_desc,
584                                union acpi_operand_object **result_desc,
585                                struct acpi_walk_state *walk_state)
586 {
587         acpi_status status = AE_OK;
588
589         ACPI_FUNCTION_TRACE(ex_convert_to_target_type);
590
591         /* Default behavior */
592
593         *result_desc = source_desc;
594
595         /*
596          * If required by the target,
597          * perform implicit conversion on the source before we store it.
598          */
599         switch (GET_CURRENT_ARG_TYPE(walk_state->op_info->runtime_args)) {
600         case ARGI_SIMPLE_TARGET:
601         case ARGI_INTEGER_REF:  /* Handles Increment, Decrement cases */
602
603                 switch (destination_type) {
604                 case ACPI_TYPE_LOCAL_REGION_FIELD:
605                         /*
606                          * Named field can always handle conversions
607                          */
608                         break;
609
610                 default:
611
612                         /* No conversion allowed for these types */
613
614                         if (destination_type != source_desc->common.type) {
615                                 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
616                                                   "Explicit operator, will store (%s) over existing type (%s)\n",
617                                                   acpi_ut_get_object_type_name
618                                                   (source_desc),
619                                                   acpi_ut_get_type_name
620                                                   (destination_type)));
621                                 status = AE_TYPE;
622                         }
623                 }
624                 break;
625
626         case ARGI_TARGETREF:
627         case ARGI_STORE_TARGET:
628
629                 switch (destination_type) {
630                 case ACPI_TYPE_INTEGER:
631                 case ACPI_TYPE_BUFFER_FIELD:
632                 case ACPI_TYPE_LOCAL_BANK_FIELD:
633                 case ACPI_TYPE_LOCAL_INDEX_FIELD:
634                         /*
635                          * These types require an Integer operand. We can convert
636                          * a Buffer or a String to an Integer if necessary.
637                          */
638                         status =
639                             acpi_ex_convert_to_integer(source_desc, result_desc,
640                                                        ACPI_IMPLICIT_CONVERSION);
641                         break;
642
643                 case ACPI_TYPE_STRING:
644                         /*
645                          * The operand must be a String. We can convert an
646                          * Integer or Buffer if necessary
647                          */
648                         status =
649                             acpi_ex_convert_to_string(source_desc, result_desc,
650                                                       ACPI_IMPLICIT_CONVERT_HEX);
651                         break;
652
653                 case ACPI_TYPE_BUFFER:
654                         /*
655                          * The operand must be a Buffer. We can convert an
656                          * Integer or String if necessary
657                          */
658                         status =
659                             acpi_ex_convert_to_buffer(source_desc, result_desc);
660                         break;
661
662                 default:
663
664                         ACPI_ERROR((AE_INFO,
665                                     "Bad destination type during conversion: 0x%X",
666                                     destination_type));
667                         status = AE_AML_INTERNAL;
668                         break;
669                 }
670                 break;
671
672         case ARGI_REFERENCE:
673                 /*
674                  * create_xxxx_field cases - we are storing the field object into the name
675                  */
676                 break;
677
678         default:
679
680                 ACPI_ERROR((AE_INFO,
681                             "Unknown Target type ID 0x%X AmlOpcode 0x%X DestType %s",
682                             GET_CURRENT_ARG_TYPE(walk_state->op_info->
683                                                  runtime_args),
684                             walk_state->opcode,
685                             acpi_ut_get_type_name(destination_type)));
686                 status = AE_AML_INTERNAL;
687         }
688
689         /*
690          * Source-to-Target conversion semantics:
691          *
692          * If conversion to the target type cannot be performed, then simply
693          * overwrite the target with the new object and type.
694          */
695         if (status == AE_TYPE) {
696                 status = AE_OK;
697         }
698
699         return_ACPI_STATUS(status);
700 }