LCOV - code coverage report
Current view: top level - drivers/acpi/acpica - psscope.c (source / functions) Hit Total Coverage
Test: combined.info Lines: 55 55 100.0 %
Date: 2022-04-01 14:17:54 Functions: 6 6 100.0 %
Branches: 13 16 81.2 %

           Branch data     Line data    Source code
       1                 :            : // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
       2                 :            : /******************************************************************************
       3                 :            :  *
       4                 :            :  * Module Name: psscope - Parser scope stack management routines
       5                 :            :  *
       6                 :            :  * Copyright (C) 2000 - 2020, Intel Corp.
       7                 :            :  *
       8                 :            :  *****************************************************************************/
       9                 :            : 
      10                 :            : #include <acpi/acpi.h>
      11                 :            : #include "accommon.h"
      12                 :            : #include "acparser.h"
      13                 :            : 
      14                 :            : #define _COMPONENT          ACPI_PARSER
      15                 :            : ACPI_MODULE_NAME("psscope")
      16                 :            : 
      17                 :            : /*******************************************************************************
      18                 :            :  *
      19                 :            :  * FUNCTION:    acpi_ps_get_parent_scope
      20                 :            :  *
      21                 :            :  * PARAMETERS:  parser_state        - Current parser state object
      22                 :            :  *
      23                 :            :  * RETURN:      Pointer to an Op object
      24                 :            :  *
      25                 :            :  * DESCRIPTION: Get parent of current op being parsed
      26                 :            :  *
      27                 :            :  ******************************************************************************/
      28                 :     193457 : union acpi_parse_object *acpi_ps_get_parent_scope(struct acpi_parse_state
      29                 :            :                                                   *parser_state)
      30                 :            : {
      31                 :            : 
      32                 :     193457 :         return (parser_state->scope->parse_scope.op);
      33                 :            : }
      34                 :            : 
      35                 :            : /*******************************************************************************
      36                 :            :  *
      37                 :            :  * FUNCTION:    acpi_ps_has_completed_scope
      38                 :            :  *
      39                 :            :  * PARAMETERS:  parser_state        - Current parser state object
      40                 :            :  *
      41                 :            :  * RETURN:      Boolean, TRUE = scope completed.
      42                 :            :  *
      43                 :            :  * DESCRIPTION: Is parsing of current argument complete?  Determined by
      44                 :            :  *              1) AML pointer is at or beyond the end of the scope
      45                 :            :  *              2) The scope argument count has reached zero.
      46                 :            :  *
      47                 :            :  ******************************************************************************/
      48                 :            : 
      49                 :     185922 : u8 acpi_ps_has_completed_scope(struct acpi_parse_state * parser_state)
      50                 :            : {
      51                 :            : 
      52                 :     371844 :         return ((u8)
      53                 :     185922 :                 ((parser_state->aml >= parser_state->scope->parse_scope.arg_end
      54   [ +  +  +  + ]:     185922 :                   || !parser_state->scope->parse_scope.arg_count)));
      55                 :            : }
      56                 :            : 
      57                 :            : /*******************************************************************************
      58                 :            :  *
      59                 :            :  * FUNCTION:    acpi_ps_init_scope
      60                 :            :  *
      61                 :            :  * PARAMETERS:  parser_state        - Current parser state object
      62                 :            :  *              root                - the Root Node of this new scope
      63                 :            :  *
      64                 :            :  * RETURN:      Status
      65                 :            :  *
      66                 :            :  * DESCRIPTION: Allocate and init a new scope object
      67                 :            :  *
      68                 :            :  ******************************************************************************/
      69                 :            : 
      70                 :            : acpi_status
      71                 :       1958 : acpi_ps_init_scope(struct acpi_parse_state * parser_state,
      72                 :            :                    union acpi_parse_object * root_op)
      73                 :            : {
      74                 :       1958 :         union acpi_generic_state *scope;
      75                 :            : 
      76                 :       1958 :         ACPI_FUNCTION_TRACE_PTR(ps_init_scope, root_op);
      77                 :            : 
      78                 :       1958 :         scope = acpi_ut_create_generic_state();
      79         [ +  - ]:       1958 :         if (!scope) {
      80                 :            :                 return_ACPI_STATUS(AE_NO_MEMORY);
      81                 :            :         }
      82                 :            : 
      83                 :       1958 :         scope->common.descriptor_type = ACPI_DESC_TYPE_STATE_RPSCOPE;
      84                 :       1958 :         scope->parse_scope.op = root_op;
      85                 :       1958 :         scope->parse_scope.arg_count = ACPI_VAR_ARGS;
      86                 :       1958 :         scope->parse_scope.arg_end = parser_state->aml_end;
      87                 :       1958 :         scope->parse_scope.pkg_end = parser_state->aml_end;
      88                 :            : 
      89                 :       1958 :         parser_state->scope = scope;
      90                 :       1958 :         parser_state->start_op = root_op;
      91                 :            : 
      92                 :       1958 :         return_ACPI_STATUS(AE_OK);
      93                 :            : }
      94                 :            : 
      95                 :            : /*******************************************************************************
      96                 :            :  *
      97                 :            :  * FUNCTION:    acpi_ps_push_scope
      98                 :            :  *
      99                 :            :  * PARAMETERS:  parser_state        - Current parser state object
     100                 :            :  *              op                  - Current op to be pushed
     101                 :            :  *              remaining_args      - List of args remaining
     102                 :            :  *              arg_count           - Fixed or variable number of args
     103                 :            :  *
     104                 :            :  * RETURN:      Status
     105                 :            :  *
     106                 :            :  * DESCRIPTION: Push current op to begin parsing its argument
     107                 :            :  *
     108                 :            :  ******************************************************************************/
     109                 :            : 
     110                 :            : acpi_status
     111                 :     152559 : acpi_ps_push_scope(struct acpi_parse_state *parser_state,
     112                 :            :                    union acpi_parse_object *op,
     113                 :            :                    u32 remaining_args, u32 arg_count)
     114                 :            : {
     115                 :     152559 :         union acpi_generic_state *scope;
     116                 :            : 
     117                 :     152559 :         ACPI_FUNCTION_TRACE_PTR(ps_push_scope, op);
     118                 :            : 
     119                 :     152559 :         scope = acpi_ut_create_generic_state();
     120         [ +  - ]:     152559 :         if (!scope) {
     121                 :            :                 return_ACPI_STATUS(AE_NO_MEMORY);
     122                 :            :         }
     123                 :            : 
     124                 :     152559 :         scope->common.descriptor_type = ACPI_DESC_TYPE_STATE_PSCOPE;
     125                 :     152559 :         scope->parse_scope.op = op;
     126                 :     152559 :         scope->parse_scope.arg_list = remaining_args;
     127                 :     152559 :         scope->parse_scope.arg_count = arg_count;
     128                 :     152559 :         scope->parse_scope.pkg_end = parser_state->pkg_end;
     129                 :            : 
     130                 :            :         /* Push onto scope stack */
     131                 :            : 
     132                 :     152559 :         acpi_ut_push_generic_state(&parser_state->scope, scope);
     133                 :            : 
     134         [ +  + ]:     152559 :         if (arg_count == ACPI_VAR_ARGS) {
     135                 :            : 
     136                 :            :                 /* Multiple arguments */
     137                 :            : 
     138                 :      10879 :                 scope->parse_scope.arg_end = parser_state->pkg_end;
     139                 :            :         } else {
     140                 :            :                 /* Single argument */
     141                 :            : 
     142                 :     141680 :                 scope->parse_scope.arg_end = ACPI_TO_POINTER(ACPI_MAX_PTR);
     143                 :            :         }
     144                 :            : 
     145                 :            :         return_ACPI_STATUS(AE_OK);
     146                 :            : }
     147                 :            : 
     148                 :            : /*******************************************************************************
     149                 :            :  *
     150                 :            :  * FUNCTION:    acpi_ps_pop_scope
     151                 :            :  *
     152                 :            :  * PARAMETERS:  parser_state        - Current parser state object
     153                 :            :  *              op                  - Where the popped op is returned
     154                 :            :  *              arg_list            - Where the popped "next argument" is
     155                 :            :  *                                    returned
     156                 :            :  *              arg_count           - Count of objects in arg_list
     157                 :            :  *
     158                 :            :  * RETURN:      Status
     159                 :            :  *
     160                 :            :  * DESCRIPTION: Return to parsing a previous op
     161                 :            :  *
     162                 :            :  ******************************************************************************/
     163                 :            : 
     164                 :            : void
     165                 :     156266 : acpi_ps_pop_scope(struct acpi_parse_state *parser_state,
     166                 :            :                   union acpi_parse_object **op, u32 * arg_list, u32 * arg_count)
     167                 :            : {
     168                 :     156266 :         union acpi_generic_state *scope = parser_state->scope;
     169                 :            : 
     170                 :     156266 :         ACPI_FUNCTION_TRACE(ps_pop_scope);
     171                 :            : 
     172                 :            :         /* Only pop the scope if there is in fact a next scope */
     173                 :            : 
     174         [ +  + ]:     156266 :         if (scope->common.next) {
     175                 :     152559 :                 scope = acpi_ut_pop_generic_state(&parser_state->scope);
     176                 :            : 
     177                 :            :                 /* Return to parsing previous op */
     178                 :            : 
     179                 :     152559 :                 *op = scope->parse_scope.op;
     180                 :     152559 :                 *arg_list = scope->parse_scope.arg_list;
     181                 :     152559 :                 *arg_count = scope->parse_scope.arg_count;
     182                 :     152559 :                 parser_state->pkg_end = scope->parse_scope.pkg_end;
     183                 :            : 
     184                 :            :                 /* All done with this scope state structure */
     185                 :            : 
     186                 :     152559 :                 acpi_ut_delete_generic_state(scope);
     187                 :            :         } else {
     188                 :            :                 /* Empty parse stack, prepare to fetch next opcode */
     189                 :            : 
     190                 :       3707 :                 *op = NULL;
     191                 :       3707 :                 *arg_list = 0;
     192                 :       3707 :                 *arg_count = 0;
     193                 :            :         }
     194                 :            : 
     195                 :            :         ACPI_DEBUG_PRINT((ACPI_DB_PARSE,
     196                 :     156266 :                           "Popped Op %p Args %X\n", *op, *arg_count));
     197                 :     156266 :         return_VOID;
     198                 :            : }
     199                 :            : 
     200                 :            : /*******************************************************************************
     201                 :            :  *
     202                 :            :  * FUNCTION:    acpi_ps_cleanup_scope
     203                 :            :  *
     204                 :            :  * PARAMETERS:  parser_state        - Current parser state object
     205                 :            :  *
     206                 :            :  * RETURN:      None
     207                 :            :  *
     208                 :            :  * DESCRIPTION: Destroy available list, remaining stack levels, and return
     209                 :            :  *              root scope
     210                 :            :  *
     211                 :            :  ******************************************************************************/
     212                 :            : 
     213                 :       1958 : void acpi_ps_cleanup_scope(struct acpi_parse_state *parser_state)
     214                 :            : {
     215                 :       1958 :         union acpi_generic_state *scope;
     216                 :            : 
     217                 :       1958 :         ACPI_FUNCTION_TRACE_PTR(ps_cleanup_scope, parser_state);
     218                 :            : 
     219         [ +  - ]:       1958 :         if (!parser_state) {
     220                 :            :                 return_VOID;
     221                 :            :         }
     222                 :            : 
     223                 :            :         /* Delete anything on the scope stack */
     224                 :            : 
     225         [ +  + ]:       3916 :         while (parser_state->scope) {
     226                 :       1958 :                 scope = acpi_ut_pop_generic_state(&parser_state->scope);
     227                 :       1958 :                 acpi_ut_delete_generic_state(scope);
     228                 :            :         }
     229                 :            : 
     230                 :            :         return_VOID;
     231                 :            : }

Generated by: LCOV version 1.14