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