diff options
author | Bob Moore <robert.moore@intel.com> | 2011-02-14 03:09:40 -0500 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2011-03-02 19:38:05 -0500 |
commit | 9ad19ac456a5f097f7cbbfef820b95297d6a934f (patch) | |
tree | 6404bfae32d506a66fa6611f4fa131773a309095 /drivers/acpi/acpica/dswload.c | |
parent | d59a3c6b35995615fa9e4f21d63fdf21328c5b6b (diff) |
ACPICA: Split large dsopcode and dsload.c files.
Split dsopcode.c into dsargs.c and dscontrol.c.
Split dsload.c into dsload2.c.
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Lin Ming <ming.m.lin@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/acpica/dswload.c')
-rw-r--r-- | drivers/acpi/acpica/dswload.c | 670 |
1 files changed, 1 insertions, 669 deletions
diff --git a/drivers/acpi/acpica/dswload.c b/drivers/acpi/acpica/dswload.c index 52566ff5e903..23a3b1ab20c1 100644 --- a/drivers/acpi/acpica/dswload.c +++ b/drivers/acpi/acpica/dswload.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /****************************************************************************** | 1 | /****************************************************************************** |
2 | * | 2 | * |
3 | * Module Name: dswload - Dispatcher namespace load callbacks | 3 | * Module Name: dswload - Dispatcher first pass namespace load callbacks |
4 | * | 4 | * |
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
@@ -48,7 +48,6 @@ | |||
48 | #include "acdispat.h" | 48 | #include "acdispat.h" |
49 | #include "acinterp.h" | 49 | #include "acinterp.h" |
50 | #include "acnamesp.h" | 50 | #include "acnamesp.h" |
51 | #include "acevents.h" | ||
52 | 51 | ||
53 | #ifdef ACPI_ASL_COMPILER | 52 | #ifdef ACPI_ASL_COMPILER |
54 | #include <acpi/acdisasm.h> | 53 | #include <acpi/acdisasm.h> |
@@ -537,670 +536,3 @@ acpi_status acpi_ds_load1_end_op(struct acpi_walk_state *walk_state) | |||
537 | 536 | ||
538 | return_ACPI_STATUS(status); | 537 | return_ACPI_STATUS(status); |
539 | } | 538 | } |
540 | |||
541 | /******************************************************************************* | ||
542 | * | ||
543 | * FUNCTION: acpi_ds_load2_begin_op | ||
544 | * | ||
545 | * PARAMETERS: walk_state - Current state of the parse tree walk | ||
546 | * out_op - Wher to return op if a new one is created | ||
547 | * | ||
548 | * RETURN: Status | ||
549 | * | ||
550 | * DESCRIPTION: Descending callback used during the loading of ACPI tables. | ||
551 | * | ||
552 | ******************************************************************************/ | ||
553 | |||
554 | acpi_status | ||
555 | acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state, | ||
556 | union acpi_parse_object **out_op) | ||
557 | { | ||
558 | union acpi_parse_object *op; | ||
559 | struct acpi_namespace_node *node; | ||
560 | acpi_status status; | ||
561 | acpi_object_type object_type; | ||
562 | char *buffer_ptr; | ||
563 | u32 flags; | ||
564 | |||
565 | ACPI_FUNCTION_TRACE(ds_load2_begin_op); | ||
566 | |||
567 | op = walk_state->op; | ||
568 | ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "Op=%p State=%p\n", op, | ||
569 | walk_state)); | ||
570 | |||
571 | if (op) { | ||
572 | if ((walk_state->control_state) && | ||
573 | (walk_state->control_state->common.state == | ||
574 | ACPI_CONTROL_CONDITIONAL_EXECUTING)) { | ||
575 | |||
576 | /* We are executing a while loop outside of a method */ | ||
577 | |||
578 | status = acpi_ds_exec_begin_op(walk_state, out_op); | ||
579 | return_ACPI_STATUS(status); | ||
580 | } | ||
581 | |||
582 | /* We only care about Namespace opcodes here */ | ||
583 | |||
584 | if ((!(walk_state->op_info->flags & AML_NSOPCODE) && | ||
585 | (walk_state->opcode != AML_INT_NAMEPATH_OP)) || | ||
586 | (!(walk_state->op_info->flags & AML_NAMED))) { | ||
587 | return_ACPI_STATUS(AE_OK); | ||
588 | } | ||
589 | |||
590 | /* Get the name we are going to enter or lookup in the namespace */ | ||
591 | |||
592 | if (walk_state->opcode == AML_INT_NAMEPATH_OP) { | ||
593 | |||
594 | /* For Namepath op, get the path string */ | ||
595 | |||
596 | buffer_ptr = op->common.value.string; | ||
597 | if (!buffer_ptr) { | ||
598 | |||
599 | /* No name, just exit */ | ||
600 | |||
601 | return_ACPI_STATUS(AE_OK); | ||
602 | } | ||
603 | } else { | ||
604 | /* Get name from the op */ | ||
605 | |||
606 | buffer_ptr = ACPI_CAST_PTR(char, &op->named.name); | ||
607 | } | ||
608 | } else { | ||
609 | /* Get the namestring from the raw AML */ | ||
610 | |||
611 | buffer_ptr = | ||
612 | acpi_ps_get_next_namestring(&walk_state->parser_state); | ||
613 | } | ||
614 | |||
615 | /* Map the opcode into an internal object type */ | ||
616 | |||
617 | object_type = walk_state->op_info->object_type; | ||
618 | |||
619 | ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, | ||
620 | "State=%p Op=%p Type=%X\n", walk_state, op, | ||
621 | object_type)); | ||
622 | |||
623 | switch (walk_state->opcode) { | ||
624 | case AML_FIELD_OP: | ||
625 | case AML_BANK_FIELD_OP: | ||
626 | case AML_INDEX_FIELD_OP: | ||
627 | |||
628 | node = NULL; | ||
629 | status = AE_OK; | ||
630 | break; | ||
631 | |||
632 | case AML_INT_NAMEPATH_OP: | ||
633 | /* | ||
634 | * The name_path is an object reference to an existing object. | ||
635 | * Don't enter the name into the namespace, but look it up | ||
636 | * for use later. | ||
637 | */ | ||
638 | status = | ||
639 | acpi_ns_lookup(walk_state->scope_info, buffer_ptr, | ||
640 | object_type, ACPI_IMODE_EXECUTE, | ||
641 | ACPI_NS_SEARCH_PARENT, walk_state, &(node)); | ||
642 | break; | ||
643 | |||
644 | case AML_SCOPE_OP: | ||
645 | |||
646 | /* Special case for Scope(\) -> refers to the Root node */ | ||
647 | |||
648 | if (op && (op->named.node == acpi_gbl_root_node)) { | ||
649 | node = op->named.node; | ||
650 | |||
651 | status = | ||
652 | acpi_ds_scope_stack_push(node, object_type, | ||
653 | walk_state); | ||
654 | if (ACPI_FAILURE(status)) { | ||
655 | return_ACPI_STATUS(status); | ||
656 | } | ||
657 | } else { | ||
658 | /* | ||
659 | * The Path is an object reference to an existing object. | ||
660 | * Don't enter the name into the namespace, but look it up | ||
661 | * for use later. | ||
662 | */ | ||
663 | status = | ||
664 | acpi_ns_lookup(walk_state->scope_info, buffer_ptr, | ||
665 | object_type, ACPI_IMODE_EXECUTE, | ||
666 | ACPI_NS_SEARCH_PARENT, walk_state, | ||
667 | &(node)); | ||
668 | if (ACPI_FAILURE(status)) { | ||
669 | #ifdef ACPI_ASL_COMPILER | ||
670 | if (status == AE_NOT_FOUND) { | ||
671 | status = AE_OK; | ||
672 | } else { | ||
673 | ACPI_ERROR_NAMESPACE(buffer_ptr, | ||
674 | status); | ||
675 | } | ||
676 | #else | ||
677 | ACPI_ERROR_NAMESPACE(buffer_ptr, status); | ||
678 | #endif | ||
679 | return_ACPI_STATUS(status); | ||
680 | } | ||
681 | } | ||
682 | |||
683 | /* | ||
684 | * We must check to make sure that the target is | ||
685 | * one of the opcodes that actually opens a scope | ||
686 | */ | ||
687 | switch (node->type) { | ||
688 | case ACPI_TYPE_ANY: | ||
689 | case ACPI_TYPE_LOCAL_SCOPE: /* Scope */ | ||
690 | case ACPI_TYPE_DEVICE: | ||
691 | case ACPI_TYPE_POWER: | ||
692 | case ACPI_TYPE_PROCESSOR: | ||
693 | case ACPI_TYPE_THERMAL: | ||
694 | |||
695 | /* These are acceptable types */ | ||
696 | break; | ||
697 | |||
698 | case ACPI_TYPE_INTEGER: | ||
699 | case ACPI_TYPE_STRING: | ||
700 | case ACPI_TYPE_BUFFER: | ||
701 | |||
702 | /* | ||
703 | * These types we will allow, but we will change the type. | ||
704 | * This enables some existing code of the form: | ||
705 | * | ||
706 | * Name (DEB, 0) | ||
707 | * Scope (DEB) { ... } | ||
708 | */ | ||
709 | ACPI_WARNING((AE_INFO, | ||
710 | "Type override - [%4.4s] had invalid type (%s) " | ||
711 | "for Scope operator, changed to type ANY\n", | ||
712 | acpi_ut_get_node_name(node), | ||
713 | acpi_ut_get_type_name(node->type))); | ||
714 | |||
715 | node->type = ACPI_TYPE_ANY; | ||
716 | walk_state->scope_info->common.value = ACPI_TYPE_ANY; | ||
717 | break; | ||
718 | |||
719 | default: | ||
720 | |||
721 | /* All other types are an error */ | ||
722 | |||
723 | ACPI_ERROR((AE_INFO, | ||
724 | "Invalid type (%s) for target of " | ||
725 | "Scope operator [%4.4s] (Cannot override)", | ||
726 | acpi_ut_get_type_name(node->type), | ||
727 | acpi_ut_get_node_name(node))); | ||
728 | |||
729 | return (AE_AML_OPERAND_TYPE); | ||
730 | } | ||
731 | break; | ||
732 | |||
733 | default: | ||
734 | |||
735 | /* All other opcodes */ | ||
736 | |||
737 | if (op && op->common.node) { | ||
738 | |||
739 | /* This op/node was previously entered into the namespace */ | ||
740 | |||
741 | node = op->common.node; | ||
742 | |||
743 | if (acpi_ns_opens_scope(object_type)) { | ||
744 | status = | ||
745 | acpi_ds_scope_stack_push(node, object_type, | ||
746 | walk_state); | ||
747 | if (ACPI_FAILURE(status)) { | ||
748 | return_ACPI_STATUS(status); | ||
749 | } | ||
750 | } | ||
751 | |||
752 | return_ACPI_STATUS(AE_OK); | ||
753 | } | ||
754 | |||
755 | /* | ||
756 | * Enter the named type into the internal namespace. We enter the name | ||
757 | * as we go downward in the parse tree. Any necessary subobjects that | ||
758 | * involve arguments to the opcode must be created as we go back up the | ||
759 | * parse tree later. | ||
760 | * | ||
761 | * Note: Name may already exist if we are executing a deferred opcode. | ||
762 | */ | ||
763 | if (walk_state->deferred_node) { | ||
764 | |||
765 | /* This name is already in the namespace, get the node */ | ||
766 | |||
767 | node = walk_state->deferred_node; | ||
768 | status = AE_OK; | ||
769 | break; | ||
770 | } | ||
771 | |||
772 | flags = ACPI_NS_NO_UPSEARCH; | ||
773 | if (walk_state->pass_number == ACPI_IMODE_EXECUTE) { | ||
774 | |||
775 | /* Execution mode, node cannot already exist, node is temporary */ | ||
776 | |||
777 | flags |= ACPI_NS_ERROR_IF_FOUND; | ||
778 | |||
779 | if (! | ||
780 | (walk_state-> | ||
781 | parse_flags & ACPI_PARSE_MODULE_LEVEL)) { | ||
782 | flags |= ACPI_NS_TEMPORARY; | ||
783 | } | ||
784 | } | ||
785 | |||
786 | /* Add new entry or lookup existing entry */ | ||
787 | |||
788 | status = | ||
789 | acpi_ns_lookup(walk_state->scope_info, buffer_ptr, | ||
790 | object_type, ACPI_IMODE_LOAD_PASS2, flags, | ||
791 | walk_state, &node); | ||
792 | |||
793 | if (ACPI_SUCCESS(status) && (flags & ACPI_NS_TEMPORARY)) { | ||
794 | ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, | ||
795 | "***New Node [%4.4s] %p is temporary\n", | ||
796 | acpi_ut_get_node_name(node), node)); | ||
797 | } | ||
798 | break; | ||
799 | } | ||
800 | |||
801 | if (ACPI_FAILURE(status)) { | ||
802 | ACPI_ERROR_NAMESPACE(buffer_ptr, status); | ||
803 | return_ACPI_STATUS(status); | ||
804 | } | ||
805 | |||
806 | if (!op) { | ||
807 | |||
808 | /* Create a new op */ | ||
809 | |||
810 | op = acpi_ps_alloc_op(walk_state->opcode); | ||
811 | if (!op) { | ||
812 | return_ACPI_STATUS(AE_NO_MEMORY); | ||
813 | } | ||
814 | |||
815 | /* Initialize the new op */ | ||
816 | |||
817 | if (node) { | ||
818 | op->named.name = node->name.integer; | ||
819 | } | ||
820 | *out_op = op; | ||
821 | } | ||
822 | |||
823 | /* | ||
824 | * Put the Node in the "op" object that the parser uses, so we | ||
825 | * can get it again quickly when this scope is closed | ||
826 | */ | ||
827 | op->common.node = node; | ||
828 | return_ACPI_STATUS(status); | ||
829 | } | ||
830 | |||
831 | /******************************************************************************* | ||
832 | * | ||
833 | * FUNCTION: acpi_ds_load2_end_op | ||
834 | * | ||
835 | * PARAMETERS: walk_state - Current state of the parse tree walk | ||
836 | * | ||
837 | * RETURN: Status | ||
838 | * | ||
839 | * DESCRIPTION: Ascending callback used during the loading of the namespace, | ||
840 | * both control methods and everything else. | ||
841 | * | ||
842 | ******************************************************************************/ | ||
843 | |||
844 | acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state) | ||
845 | { | ||
846 | union acpi_parse_object *op; | ||
847 | acpi_status status = AE_OK; | ||
848 | acpi_object_type object_type; | ||
849 | struct acpi_namespace_node *node; | ||
850 | union acpi_parse_object *arg; | ||
851 | struct acpi_namespace_node *new_node; | ||
852 | #ifndef ACPI_NO_METHOD_EXECUTION | ||
853 | u32 i; | ||
854 | u8 region_space; | ||
855 | #endif | ||
856 | |||
857 | ACPI_FUNCTION_TRACE(ds_load2_end_op); | ||
858 | |||
859 | op = walk_state->op; | ||
860 | ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "Opcode [%s] Op %p State %p\n", | ||
861 | walk_state->op_info->name, op, walk_state)); | ||
862 | |||
863 | /* Check if opcode had an associated namespace object */ | ||
864 | |||
865 | if (!(walk_state->op_info->flags & AML_NSOBJECT)) { | ||
866 | return_ACPI_STATUS(AE_OK); | ||
867 | } | ||
868 | |||
869 | if (op->common.aml_opcode == AML_SCOPE_OP) { | ||
870 | ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, | ||
871 | "Ending scope Op=%p State=%p\n", op, | ||
872 | walk_state)); | ||
873 | } | ||
874 | |||
875 | object_type = walk_state->op_info->object_type; | ||
876 | |||
877 | /* | ||
878 | * Get the Node/name from the earlier lookup | ||
879 | * (It was saved in the *op structure) | ||
880 | */ | ||
881 | node = op->common.node; | ||
882 | |||
883 | /* | ||
884 | * Put the Node on the object stack (Contains the ACPI Name of | ||
885 | * this object) | ||
886 | */ | ||
887 | walk_state->operands[0] = (void *)node; | ||
888 | walk_state->num_operands = 1; | ||
889 | |||
890 | /* Pop the scope stack */ | ||
891 | |||
892 | if (acpi_ns_opens_scope(object_type) && | ||
893 | (op->common.aml_opcode != AML_INT_METHODCALL_OP)) { | ||
894 | ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, | ||
895 | "(%s) Popping scope for Op %p\n", | ||
896 | acpi_ut_get_type_name(object_type), op)); | ||
897 | |||
898 | status = acpi_ds_scope_stack_pop(walk_state); | ||
899 | if (ACPI_FAILURE(status)) { | ||
900 | goto cleanup; | ||
901 | } | ||
902 | } | ||
903 | |||
904 | /* | ||
905 | * Named operations are as follows: | ||
906 | * | ||
907 | * AML_ALIAS | ||
908 | * AML_BANKFIELD | ||
909 | * AML_CREATEBITFIELD | ||
910 | * AML_CREATEBYTEFIELD | ||
911 | * AML_CREATEDWORDFIELD | ||
912 | * AML_CREATEFIELD | ||
913 | * AML_CREATEQWORDFIELD | ||
914 | * AML_CREATEWORDFIELD | ||
915 | * AML_DATA_REGION | ||
916 | * AML_DEVICE | ||
917 | * AML_EVENT | ||
918 | * AML_FIELD | ||
919 | * AML_INDEXFIELD | ||
920 | * AML_METHOD | ||
921 | * AML_METHODCALL | ||
922 | * AML_MUTEX | ||
923 | * AML_NAME | ||
924 | * AML_NAMEDFIELD | ||
925 | * AML_OPREGION | ||
926 | * AML_POWERRES | ||
927 | * AML_PROCESSOR | ||
928 | * AML_SCOPE | ||
929 | * AML_THERMALZONE | ||
930 | */ | ||
931 | |||
932 | ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, | ||
933 | "Create-Load [%s] State=%p Op=%p NamedObj=%p\n", | ||
934 | acpi_ps_get_opcode_name(op->common.aml_opcode), | ||
935 | walk_state, op, node)); | ||
936 | |||
937 | /* Decode the opcode */ | ||
938 | |||
939 | arg = op->common.value.arg; | ||
940 | |||
941 | switch (walk_state->op_info->type) { | ||
942 | #ifndef ACPI_NO_METHOD_EXECUTION | ||
943 | |||
944 | case AML_TYPE_CREATE_FIELD: | ||
945 | /* | ||
946 | * Create the field object, but the field buffer and index must | ||
947 | * be evaluated later during the execution phase | ||
948 | */ | ||
949 | status = acpi_ds_create_buffer_field(op, walk_state); | ||
950 | break; | ||
951 | |||
952 | case AML_TYPE_NAMED_FIELD: | ||
953 | /* | ||
954 | * If we are executing a method, initialize the field | ||
955 | */ | ||
956 | if (walk_state->method_node) { | ||
957 | status = acpi_ds_init_field_objects(op, walk_state); | ||
958 | } | ||
959 | |||
960 | switch (op->common.aml_opcode) { | ||
961 | case AML_INDEX_FIELD_OP: | ||
962 | |||
963 | status = | ||
964 | acpi_ds_create_index_field(op, | ||
965 | (acpi_handle) arg-> | ||
966 | common.node, walk_state); | ||
967 | break; | ||
968 | |||
969 | case AML_BANK_FIELD_OP: | ||
970 | |||
971 | status = | ||
972 | acpi_ds_create_bank_field(op, arg->common.node, | ||
973 | walk_state); | ||
974 | break; | ||
975 | |||
976 | case AML_FIELD_OP: | ||
977 | |||
978 | status = | ||
979 | acpi_ds_create_field(op, arg->common.node, | ||
980 | walk_state); | ||
981 | break; | ||
982 | |||
983 | default: | ||
984 | /* All NAMED_FIELD opcodes must be handled above */ | ||
985 | break; | ||
986 | } | ||
987 | break; | ||
988 | |||
989 | case AML_TYPE_NAMED_SIMPLE: | ||
990 | |||
991 | status = acpi_ds_create_operands(walk_state, arg); | ||
992 | if (ACPI_FAILURE(status)) { | ||
993 | goto cleanup; | ||
994 | } | ||
995 | |||
996 | switch (op->common.aml_opcode) { | ||
997 | case AML_PROCESSOR_OP: | ||
998 | |||
999 | status = acpi_ex_create_processor(walk_state); | ||
1000 | break; | ||
1001 | |||
1002 | case AML_POWER_RES_OP: | ||
1003 | |||
1004 | status = acpi_ex_create_power_resource(walk_state); | ||
1005 | break; | ||
1006 | |||
1007 | case AML_MUTEX_OP: | ||
1008 | |||
1009 | status = acpi_ex_create_mutex(walk_state); | ||
1010 | break; | ||
1011 | |||
1012 | case AML_EVENT_OP: | ||
1013 | |||
1014 | status = acpi_ex_create_event(walk_state); | ||
1015 | break; | ||
1016 | |||
1017 | case AML_ALIAS_OP: | ||
1018 | |||
1019 | status = acpi_ex_create_alias(walk_state); | ||
1020 | break; | ||
1021 | |||
1022 | default: | ||
1023 | /* Unknown opcode */ | ||
1024 | |||
1025 | status = AE_OK; | ||
1026 | goto cleanup; | ||
1027 | } | ||
1028 | |||
1029 | /* Delete operands */ | ||
1030 | |||
1031 | for (i = 1; i < walk_state->num_operands; i++) { | ||
1032 | acpi_ut_remove_reference(walk_state->operands[i]); | ||
1033 | walk_state->operands[i] = NULL; | ||
1034 | } | ||
1035 | |||
1036 | break; | ||
1037 | #endif /* ACPI_NO_METHOD_EXECUTION */ | ||
1038 | |||
1039 | case AML_TYPE_NAMED_COMPLEX: | ||
1040 | |||
1041 | switch (op->common.aml_opcode) { | ||
1042 | #ifndef ACPI_NO_METHOD_EXECUTION | ||
1043 | case AML_REGION_OP: | ||
1044 | case AML_DATA_REGION_OP: | ||
1045 | |||
1046 | if (op->common.aml_opcode == AML_REGION_OP) { | ||
1047 | region_space = (acpi_adr_space_type) | ||
1048 | ((op->common.value.arg)->common.value. | ||
1049 | integer); | ||
1050 | } else { | ||
1051 | region_space = REGION_DATA_TABLE; | ||
1052 | } | ||
1053 | |||
1054 | /* | ||
1055 | * The op_region is not fully parsed at this time. The only valid | ||
1056 | * argument is the space_id. (We must save the address of the | ||
1057 | * AML of the address and length operands) | ||
1058 | * | ||
1059 | * If we have a valid region, initialize it. The namespace is | ||
1060 | * unlocked at this point. | ||
1061 | * | ||
1062 | * Need to unlock interpreter if it is locked (if we are running | ||
1063 | * a control method), in order to allow _REG methods to be run | ||
1064 | * during acpi_ev_initialize_region. | ||
1065 | */ | ||
1066 | if (walk_state->method_node) { | ||
1067 | /* | ||
1068 | * Executing a method: initialize the region and unlock | ||
1069 | * the interpreter | ||
1070 | */ | ||
1071 | status = | ||
1072 | acpi_ex_create_region(op->named.data, | ||
1073 | op->named.length, | ||
1074 | region_space, | ||
1075 | walk_state); | ||
1076 | if (ACPI_FAILURE(status)) { | ||
1077 | return (status); | ||
1078 | } | ||
1079 | |||
1080 | acpi_ex_exit_interpreter(); | ||
1081 | } | ||
1082 | |||
1083 | status = | ||
1084 | acpi_ev_initialize_region | ||
1085 | (acpi_ns_get_attached_object(node), FALSE); | ||
1086 | if (walk_state->method_node) { | ||
1087 | acpi_ex_enter_interpreter(); | ||
1088 | } | ||
1089 | |||
1090 | if (ACPI_FAILURE(status)) { | ||
1091 | /* | ||
1092 | * If AE_NOT_EXIST is returned, it is not fatal | ||
1093 | * because many regions get created before a handler | ||
1094 | * is installed for said region. | ||
1095 | */ | ||
1096 | if (AE_NOT_EXIST == status) { | ||
1097 | status = AE_OK; | ||
1098 | } | ||
1099 | } | ||
1100 | break; | ||
1101 | |||
1102 | case AML_NAME_OP: | ||
1103 | |||
1104 | status = acpi_ds_create_node(walk_state, node, op); | ||
1105 | break; | ||
1106 | |||
1107 | case AML_METHOD_OP: | ||
1108 | /* | ||
1109 | * method_op pkg_length name_string method_flags term_list | ||
1110 | * | ||
1111 | * Note: We must create the method node/object pair as soon as we | ||
1112 | * see the method declaration. This allows later pass1 parsing | ||
1113 | * of invocations of the method (need to know the number of | ||
1114 | * arguments.) | ||
1115 | */ | ||
1116 | ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, | ||
1117 | "LOADING-Method: State=%p Op=%p NamedObj=%p\n", | ||
1118 | walk_state, op, op->named.node)); | ||
1119 | |||
1120 | if (!acpi_ns_get_attached_object(op->named.node)) { | ||
1121 | walk_state->operands[0] = | ||
1122 | ACPI_CAST_PTR(void, op->named.node); | ||
1123 | walk_state->num_operands = 1; | ||
1124 | |||
1125 | status = | ||
1126 | acpi_ds_create_operands(walk_state, | ||
1127 | op->common.value. | ||
1128 | arg); | ||
1129 | if (ACPI_SUCCESS(status)) { | ||
1130 | status = | ||
1131 | acpi_ex_create_method(op->named. | ||
1132 | data, | ||
1133 | op->named. | ||
1134 | length, | ||
1135 | walk_state); | ||
1136 | } | ||
1137 | walk_state->operands[0] = NULL; | ||
1138 | walk_state->num_operands = 0; | ||
1139 | |||
1140 | if (ACPI_FAILURE(status)) { | ||
1141 | return_ACPI_STATUS(status); | ||
1142 | } | ||
1143 | } | ||
1144 | break; | ||
1145 | |||
1146 | #endif /* ACPI_NO_METHOD_EXECUTION */ | ||
1147 | |||
1148 | default: | ||
1149 | /* All NAMED_COMPLEX opcodes must be handled above */ | ||
1150 | break; | ||
1151 | } | ||
1152 | break; | ||
1153 | |||
1154 | case AML_CLASS_INTERNAL: | ||
1155 | |||
1156 | /* case AML_INT_NAMEPATH_OP: */ | ||
1157 | break; | ||
1158 | |||
1159 | case AML_CLASS_METHOD_CALL: | ||
1160 | |||
1161 | ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, | ||
1162 | "RESOLVING-MethodCall: State=%p Op=%p NamedObj=%p\n", | ||
1163 | walk_state, op, node)); | ||
1164 | |||
1165 | /* | ||
1166 | * Lookup the method name and save the Node | ||
1167 | */ | ||
1168 | status = | ||
1169 | acpi_ns_lookup(walk_state->scope_info, | ||
1170 | arg->common.value.string, ACPI_TYPE_ANY, | ||
1171 | ACPI_IMODE_LOAD_PASS2, | ||
1172 | ACPI_NS_SEARCH_PARENT | | ||
1173 | ACPI_NS_DONT_OPEN_SCOPE, walk_state, | ||
1174 | &(new_node)); | ||
1175 | if (ACPI_SUCCESS(status)) { | ||
1176 | /* | ||
1177 | * Make sure that what we found is indeed a method | ||
1178 | * We didn't search for a method on purpose, to see if the name | ||
1179 | * would resolve | ||
1180 | */ | ||
1181 | if (new_node->type != ACPI_TYPE_METHOD) { | ||
1182 | status = AE_AML_OPERAND_TYPE; | ||
1183 | } | ||
1184 | |||
1185 | /* We could put the returned object (Node) on the object stack for | ||
1186 | * later, but for now, we will put it in the "op" object that the | ||
1187 | * parser uses, so we can get it again at the end of this scope | ||
1188 | */ | ||
1189 | op->common.node = new_node; | ||
1190 | } else { | ||
1191 | ACPI_ERROR_NAMESPACE(arg->common.value.string, status); | ||
1192 | } | ||
1193 | break; | ||
1194 | |||
1195 | default: | ||
1196 | break; | ||
1197 | } | ||
1198 | |||
1199 | cleanup: | ||
1200 | |||
1201 | /* Remove the Node pushed at the very beginning */ | ||
1202 | |||
1203 | walk_state->operands[0] = NULL; | ||
1204 | walk_state->num_operands = 0; | ||
1205 | return_ACPI_STATUS(status); | ||
1206 | } | ||