diff options
Diffstat (limited to 'drivers/acpi')
40 files changed, 2469 insertions, 1941 deletions
diff --git a/drivers/acpi/dispatcher/dsmthdat.c b/drivers/acpi/dispatcher/dsmthdat.c index f7998306f756..c83d53fd6398 100644 --- a/drivers/acpi/dispatcher/dsmthdat.c +++ b/drivers/acpi/dispatcher/dsmthdat.c | |||
@@ -633,22 +633,11 @@ acpi_ds_store_object_to_local ( | |||
633 | */ | 633 | */ |
634 | if (opcode == AML_ARG_OP) { | 634 | if (opcode == AML_ARG_OP) { |
635 | /* | 635 | /* |
636 | * Make sure that the object is the correct type. This may be | ||
637 | * overkill, butit is here because references were NS nodes in | ||
638 | * the past. Now they are operand objects of type Reference. | ||
639 | */ | ||
640 | if (ACPI_GET_DESCRIPTOR_TYPE (current_obj_desc) != ACPI_DESC_TYPE_OPERAND) { | ||
641 | ACPI_REPORT_ERROR (( | ||
642 | "Invalid descriptor type while storing to method arg: [%s]\n", | ||
643 | acpi_ut_get_descriptor_name (current_obj_desc))); | ||
644 | return_ACPI_STATUS (AE_AML_INTERNAL); | ||
645 | } | ||
646 | |||
647 | /* | ||
648 | * If we have a valid reference object that came from ref_of(), | 636 | * If we have a valid reference object that came from ref_of(), |
649 | * do the indirect store | 637 | * do the indirect store |
650 | */ | 638 | */ |
651 | if ((current_obj_desc->common.type == ACPI_TYPE_LOCAL_REFERENCE) && | 639 | if ((ACPI_GET_DESCRIPTOR_TYPE (current_obj_desc) == ACPI_DESC_TYPE_OPERAND) && |
640 | (current_obj_desc->common.type == ACPI_TYPE_LOCAL_REFERENCE) && | ||
652 | (current_obj_desc->reference.opcode == AML_REF_OF_OP)) { | 641 | (current_obj_desc->reference.opcode == AML_REF_OF_OP)) { |
653 | ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, | 642 | ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, |
654 | "Arg (%p) is an obj_ref(Node), storing in node %p\n", | 643 | "Arg (%p) is an obj_ref(Node), storing in node %p\n", |
diff --git a/drivers/acpi/dispatcher/dswload.c b/drivers/acpi/dispatcher/dswload.c index e2e0a855be2c..d2c603f54fd6 100644 --- a/drivers/acpi/dispatcher/dswload.c +++ b/drivers/acpi/dispatcher/dswload.c | |||
@@ -50,7 +50,7 @@ | |||
50 | #include <acpi/acnamesp.h> | 50 | #include <acpi/acnamesp.h> |
51 | #include <acpi/acevents.h> | 51 | #include <acpi/acevents.h> |
52 | 52 | ||
53 | #ifdef _ACPI_ASL_COMPILER | 53 | #ifdef ACPI_ASL_COMPILER |
54 | #include <acpi/acdisasm.h> | 54 | #include <acpi/acdisasm.h> |
55 | #endif | 55 | #endif |
56 | 56 | ||
@@ -176,7 +176,7 @@ acpi_ds_load1_begin_op ( | |||
176 | */ | 176 | */ |
177 | status = acpi_ns_lookup (walk_state->scope_info, path, object_type, | 177 | status = acpi_ns_lookup (walk_state->scope_info, path, object_type, |
178 | ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, walk_state, &(node)); | 178 | ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, walk_state, &(node)); |
179 | #ifdef _ACPI_ASL_COMPILER | 179 | #ifdef ACPI_ASL_COMPILER |
180 | if (status == AE_NOT_FOUND) { | 180 | if (status == AE_NOT_FOUND) { |
181 | /* | 181 | /* |
182 | * Table disassembly: | 182 | * Table disassembly: |
@@ -569,7 +569,7 @@ acpi_ds_load2_begin_op ( | |||
569 | ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, | 569 | ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, |
570 | walk_state, &(node)); | 570 | walk_state, &(node)); |
571 | if (ACPI_FAILURE (status)) { | 571 | if (ACPI_FAILURE (status)) { |
572 | #ifdef _ACPI_ASL_COMPILER | 572 | #ifdef ACPI_ASL_COMPILER |
573 | if (status == AE_NOT_FOUND) { | 573 | if (status == AE_NOT_FOUND) { |
574 | status = AE_OK; | 574 | status = AE_OK; |
575 | } | 575 | } |
diff --git a/drivers/acpi/dispatcher/dswstate.c b/drivers/acpi/dispatcher/dswstate.c index cc45d52225d6..d360d8e89544 100644 --- a/drivers/acpi/dispatcher/dswstate.c +++ b/drivers/acpi/dispatcher/dswstate.c | |||
@@ -681,7 +681,7 @@ acpi_ds_create_walk_state ( | |||
681 | ACPI_FUNCTION_TRACE ("ds_create_walk_state"); | 681 | ACPI_FUNCTION_TRACE ("ds_create_walk_state"); |
682 | 682 | ||
683 | 683 | ||
684 | walk_state = acpi_ut_acquire_from_cache (ACPI_MEM_LIST_WALK); | 684 | walk_state = ACPI_MEM_CALLOCATE (sizeof (struct acpi_walk_state)); |
685 | if (!walk_state) { | 685 | if (!walk_state) { |
686 | return_PTR (NULL); | 686 | return_PTR (NULL); |
687 | } | 687 | } |
@@ -704,7 +704,7 @@ acpi_ds_create_walk_state ( | |||
704 | 704 | ||
705 | status = acpi_ds_result_stack_push (walk_state); | 705 | status = acpi_ds_result_stack_push (walk_state); |
706 | if (ACPI_FAILURE (status)) { | 706 | if (ACPI_FAILURE (status)) { |
707 | acpi_ut_release_to_cache (ACPI_MEM_LIST_WALK, walk_state); | 707 | ACPI_MEM_FREE (walk_state); |
708 | return_PTR (NULL); | 708 | return_PTR (NULL); |
709 | } | 709 | } |
710 | 710 | ||
@@ -900,38 +900,11 @@ acpi_ds_delete_walk_state ( | |||
900 | acpi_ut_delete_generic_state (state); | 900 | acpi_ut_delete_generic_state (state); |
901 | } | 901 | } |
902 | 902 | ||
903 | acpi_ut_release_to_cache (ACPI_MEM_LIST_WALK, walk_state); | 903 | ACPI_MEM_FREE (walk_state); |
904 | return_VOID; | 904 | return_VOID; |
905 | } | 905 | } |
906 | 906 | ||
907 | 907 | ||
908 | #ifdef ACPI_ENABLE_OBJECT_CACHE | ||
909 | /****************************************************************************** | ||
910 | * | ||
911 | * FUNCTION: acpi_ds_delete_walk_state_cache | ||
912 | * | ||
913 | * PARAMETERS: None | ||
914 | * | ||
915 | * RETURN: None | ||
916 | * | ||
917 | * DESCRIPTION: Purge the global state object cache. Used during subsystem | ||
918 | * termination. | ||
919 | * | ||
920 | ******************************************************************************/ | ||
921 | |||
922 | void | ||
923 | acpi_ds_delete_walk_state_cache ( | ||
924 | void) | ||
925 | { | ||
926 | ACPI_FUNCTION_TRACE ("ds_delete_walk_state_cache"); | ||
927 | |||
928 | |||
929 | acpi_ut_delete_generic_cache (ACPI_MEM_LIST_WALK); | ||
930 | return_VOID; | ||
931 | } | ||
932 | #endif | ||
933 | |||
934 | |||
935 | #ifdef ACPI_OBSOLETE_FUNCTIONS | 908 | #ifdef ACPI_OBSOLETE_FUNCTIONS |
936 | /******************************************************************************* | 909 | /******************************************************************************* |
937 | * | 910 | * |
diff --git a/drivers/acpi/events/evgpe.c b/drivers/acpi/events/evgpe.c index 081120b109ba..ede834df4f69 100644 --- a/drivers/acpi/events/evgpe.c +++ b/drivers/acpi/events/evgpe.c | |||
@@ -396,6 +396,7 @@ acpi_ev_gpe_detect ( | |||
396 | struct acpi_gpe_register_info *gpe_register_info; | 396 | struct acpi_gpe_register_info *gpe_register_info; |
397 | u32 status_reg; | 397 | u32 status_reg; |
398 | u32 enable_reg; | 398 | u32 enable_reg; |
399 | u32 flags; | ||
399 | acpi_status status; | 400 | acpi_status status; |
400 | struct acpi_gpe_block_info *gpe_block; | 401 | struct acpi_gpe_block_info *gpe_block; |
401 | acpi_native_uint i; | 402 | acpi_native_uint i; |
@@ -412,7 +413,7 @@ acpi_ev_gpe_detect ( | |||
412 | 413 | ||
413 | /* Examine all GPE blocks attached to this interrupt level */ | 414 | /* Examine all GPE blocks attached to this interrupt level */ |
414 | 415 | ||
415 | acpi_os_acquire_lock (acpi_gbl_gpe_lock, ACPI_ISR); | 416 | flags = acpi_os_acquire_lock (acpi_gbl_gpe_lock); |
416 | gpe_block = gpe_xrupt_list->gpe_block_list_head; | 417 | gpe_block = gpe_xrupt_list->gpe_block_list_head; |
417 | while (gpe_block) { | 418 | while (gpe_block) { |
418 | /* | 419 | /* |
@@ -476,7 +477,7 @@ acpi_ev_gpe_detect ( | |||
476 | 477 | ||
477 | unlock_and_exit: | 478 | unlock_and_exit: |
478 | 479 | ||
479 | acpi_os_release_lock (acpi_gbl_gpe_lock, ACPI_ISR); | 480 | acpi_os_release_lock (acpi_gbl_gpe_lock, flags); |
480 | return (int_status); | 481 | return (int_status); |
481 | } | 482 | } |
482 | 483 | ||
diff --git a/drivers/acpi/events/evgpeblk.c b/drivers/acpi/events/evgpeblk.c index ee5419b8f1b1..dfc54692b127 100644 --- a/drivers/acpi/events/evgpeblk.c +++ b/drivers/acpi/events/evgpeblk.c | |||
@@ -138,7 +138,6 @@ acpi_ev_valid_gpe_event ( | |||
138 | * FUNCTION: acpi_ev_walk_gpe_list | 138 | * FUNCTION: acpi_ev_walk_gpe_list |
139 | * | 139 | * |
140 | * PARAMETERS: gpe_walk_callback - Routine called for each GPE block | 140 | * PARAMETERS: gpe_walk_callback - Routine called for each GPE block |
141 | * Flags - ACPI_NOT_ISR or ACPI_ISR | ||
142 | * | 141 | * |
143 | * RETURN: Status | 142 | * RETURN: Status |
144 | * | 143 | * |
@@ -148,18 +147,18 @@ acpi_ev_valid_gpe_event ( | |||
148 | 147 | ||
149 | acpi_status | 148 | acpi_status |
150 | acpi_ev_walk_gpe_list ( | 149 | acpi_ev_walk_gpe_list ( |
151 | ACPI_GPE_CALLBACK gpe_walk_callback, | 150 | ACPI_GPE_CALLBACK gpe_walk_callback) |
152 | u32 flags) | ||
153 | { | 151 | { |
154 | struct acpi_gpe_block_info *gpe_block; | 152 | struct acpi_gpe_block_info *gpe_block; |
155 | struct acpi_gpe_xrupt_info *gpe_xrupt_info; | 153 | struct acpi_gpe_xrupt_info *gpe_xrupt_info; |
156 | acpi_status status = AE_OK; | 154 | acpi_status status = AE_OK; |
155 | u32 flags; | ||
157 | 156 | ||
158 | 157 | ||
159 | ACPI_FUNCTION_TRACE ("ev_walk_gpe_list"); | 158 | ACPI_FUNCTION_TRACE ("ev_walk_gpe_list"); |
160 | 159 | ||
161 | 160 | ||
162 | acpi_os_acquire_lock (acpi_gbl_gpe_lock, flags); | 161 | flags = acpi_os_acquire_lock (acpi_gbl_gpe_lock); |
163 | 162 | ||
164 | /* Walk the interrupt level descriptor list */ | 163 | /* Walk the interrupt level descriptor list */ |
165 | 164 | ||
@@ -500,6 +499,7 @@ acpi_ev_get_gpe_xrupt_block ( | |||
500 | struct acpi_gpe_xrupt_info *next_gpe_xrupt; | 499 | struct acpi_gpe_xrupt_info *next_gpe_xrupt; |
501 | struct acpi_gpe_xrupt_info *gpe_xrupt; | 500 | struct acpi_gpe_xrupt_info *gpe_xrupt; |
502 | acpi_status status; | 501 | acpi_status status; |
502 | u32 flags; | ||
503 | 503 | ||
504 | 504 | ||
505 | ACPI_FUNCTION_TRACE ("ev_get_gpe_xrupt_block"); | 505 | ACPI_FUNCTION_TRACE ("ev_get_gpe_xrupt_block"); |
@@ -527,7 +527,7 @@ acpi_ev_get_gpe_xrupt_block ( | |||
527 | 527 | ||
528 | /* Install new interrupt descriptor with spin lock */ | 528 | /* Install new interrupt descriptor with spin lock */ |
529 | 529 | ||
530 | acpi_os_acquire_lock (acpi_gbl_gpe_lock, ACPI_NOT_ISR); | 530 | flags = acpi_os_acquire_lock (acpi_gbl_gpe_lock); |
531 | if (acpi_gbl_gpe_xrupt_list_head) { | 531 | if (acpi_gbl_gpe_xrupt_list_head) { |
532 | next_gpe_xrupt = acpi_gbl_gpe_xrupt_list_head; | 532 | next_gpe_xrupt = acpi_gbl_gpe_xrupt_list_head; |
533 | while (next_gpe_xrupt->next) { | 533 | while (next_gpe_xrupt->next) { |
@@ -540,7 +540,7 @@ acpi_ev_get_gpe_xrupt_block ( | |||
540 | else { | 540 | else { |
541 | acpi_gbl_gpe_xrupt_list_head = gpe_xrupt; | 541 | acpi_gbl_gpe_xrupt_list_head = gpe_xrupt; |
542 | } | 542 | } |
543 | acpi_os_release_lock (acpi_gbl_gpe_lock, ACPI_NOT_ISR); | 543 | acpi_os_release_lock (acpi_gbl_gpe_lock, flags); |
544 | 544 | ||
545 | /* Install new interrupt handler if not SCI_INT */ | 545 | /* Install new interrupt handler if not SCI_INT */ |
546 | 546 | ||
@@ -577,6 +577,7 @@ acpi_ev_delete_gpe_xrupt ( | |||
577 | struct acpi_gpe_xrupt_info *gpe_xrupt) | 577 | struct acpi_gpe_xrupt_info *gpe_xrupt) |
578 | { | 578 | { |
579 | acpi_status status; | 579 | acpi_status status; |
580 | u32 flags; | ||
580 | 581 | ||
581 | 582 | ||
582 | ACPI_FUNCTION_TRACE ("ev_delete_gpe_xrupt"); | 583 | ACPI_FUNCTION_TRACE ("ev_delete_gpe_xrupt"); |
@@ -599,7 +600,7 @@ acpi_ev_delete_gpe_xrupt ( | |||
599 | 600 | ||
600 | /* Unlink the interrupt block with lock */ | 601 | /* Unlink the interrupt block with lock */ |
601 | 602 | ||
602 | acpi_os_acquire_lock (acpi_gbl_gpe_lock, ACPI_NOT_ISR); | 603 | flags = acpi_os_acquire_lock (acpi_gbl_gpe_lock); |
603 | if (gpe_xrupt->previous) { | 604 | if (gpe_xrupt->previous) { |
604 | gpe_xrupt->previous->next = gpe_xrupt->next; | 605 | gpe_xrupt->previous->next = gpe_xrupt->next; |
605 | } | 606 | } |
@@ -607,7 +608,7 @@ acpi_ev_delete_gpe_xrupt ( | |||
607 | if (gpe_xrupt->next) { | 608 | if (gpe_xrupt->next) { |
608 | gpe_xrupt->next->previous = gpe_xrupt->previous; | 609 | gpe_xrupt->next->previous = gpe_xrupt->previous; |
609 | } | 610 | } |
610 | acpi_os_release_lock (acpi_gbl_gpe_lock, ACPI_NOT_ISR); | 611 | acpi_os_release_lock (acpi_gbl_gpe_lock, flags); |
611 | 612 | ||
612 | /* Free the block */ | 613 | /* Free the block */ |
613 | 614 | ||
@@ -637,6 +638,7 @@ acpi_ev_install_gpe_block ( | |||
637 | struct acpi_gpe_block_info *next_gpe_block; | 638 | struct acpi_gpe_block_info *next_gpe_block; |
638 | struct acpi_gpe_xrupt_info *gpe_xrupt_block; | 639 | struct acpi_gpe_xrupt_info *gpe_xrupt_block; |
639 | acpi_status status; | 640 | acpi_status status; |
641 | u32 flags; | ||
640 | 642 | ||
641 | 643 | ||
642 | ACPI_FUNCTION_TRACE ("ev_install_gpe_block"); | 644 | ACPI_FUNCTION_TRACE ("ev_install_gpe_block"); |
@@ -655,7 +657,7 @@ acpi_ev_install_gpe_block ( | |||
655 | 657 | ||
656 | /* Install the new block at the end of the list with lock */ | 658 | /* Install the new block at the end of the list with lock */ |
657 | 659 | ||
658 | acpi_os_acquire_lock (acpi_gbl_gpe_lock, ACPI_NOT_ISR); | 660 | flags = acpi_os_acquire_lock (acpi_gbl_gpe_lock); |
659 | if (gpe_xrupt_block->gpe_block_list_head) { | 661 | if (gpe_xrupt_block->gpe_block_list_head) { |
660 | next_gpe_block = gpe_xrupt_block->gpe_block_list_head; | 662 | next_gpe_block = gpe_xrupt_block->gpe_block_list_head; |
661 | while (next_gpe_block->next) { | 663 | while (next_gpe_block->next) { |
@@ -670,7 +672,7 @@ acpi_ev_install_gpe_block ( | |||
670 | } | 672 | } |
671 | 673 | ||
672 | gpe_block->xrupt_block = gpe_xrupt_block; | 674 | gpe_block->xrupt_block = gpe_xrupt_block; |
673 | acpi_os_release_lock (acpi_gbl_gpe_lock, ACPI_NOT_ISR); | 675 | acpi_os_release_lock (acpi_gbl_gpe_lock, flags); |
674 | 676 | ||
675 | unlock_and_exit: | 677 | unlock_and_exit: |
676 | status = acpi_ut_release_mutex (ACPI_MTX_EVENTS); | 678 | status = acpi_ut_release_mutex (ACPI_MTX_EVENTS); |
@@ -695,6 +697,7 @@ acpi_ev_delete_gpe_block ( | |||
695 | struct acpi_gpe_block_info *gpe_block) | 697 | struct acpi_gpe_block_info *gpe_block) |
696 | { | 698 | { |
697 | acpi_status status; | 699 | acpi_status status; |
700 | u32 flags; | ||
698 | 701 | ||
699 | 702 | ||
700 | ACPI_FUNCTION_TRACE ("ev_install_gpe_block"); | 703 | ACPI_FUNCTION_TRACE ("ev_install_gpe_block"); |
@@ -720,7 +723,7 @@ acpi_ev_delete_gpe_block ( | |||
720 | else { | 723 | else { |
721 | /* Remove the block on this interrupt with lock */ | 724 | /* Remove the block on this interrupt with lock */ |
722 | 725 | ||
723 | acpi_os_acquire_lock (acpi_gbl_gpe_lock, ACPI_NOT_ISR); | 726 | flags = acpi_os_acquire_lock (acpi_gbl_gpe_lock); |
724 | if (gpe_block->previous) { | 727 | if (gpe_block->previous) { |
725 | gpe_block->previous->next = gpe_block->next; | 728 | gpe_block->previous->next = gpe_block->next; |
726 | } | 729 | } |
@@ -731,7 +734,7 @@ acpi_ev_delete_gpe_block ( | |||
731 | if (gpe_block->next) { | 734 | if (gpe_block->next) { |
732 | gpe_block->next->previous = gpe_block->previous; | 735 | gpe_block->next->previous = gpe_block->previous; |
733 | } | 736 | } |
734 | acpi_os_release_lock (acpi_gbl_gpe_lock, ACPI_NOT_ISR); | 737 | acpi_os_release_lock (acpi_gbl_gpe_lock, flags); |
735 | } | 738 | } |
736 | 739 | ||
737 | /* Free the gpe_block */ | 740 | /* Free the gpe_block */ |
diff --git a/drivers/acpi/events/evmisc.c b/drivers/acpi/events/evmisc.c index 659e90956112..38d7ab8aef3a 100644 --- a/drivers/acpi/events/evmisc.c +++ b/drivers/acpi/events/evmisc.c | |||
@@ -589,7 +589,7 @@ acpi_ev_terminate ( | |||
589 | 589 | ||
590 | /* Disable all GPEs in all GPE blocks */ | 590 | /* Disable all GPEs in all GPE blocks */ |
591 | 591 | ||
592 | status = acpi_ev_walk_gpe_list (acpi_hw_disable_gpe_block, ACPI_NOT_ISR); | 592 | status = acpi_ev_walk_gpe_list (acpi_hw_disable_gpe_block); |
593 | 593 | ||
594 | /* Remove SCI handler */ | 594 | /* Remove SCI handler */ |
595 | 595 | ||
@@ -602,7 +602,7 @@ acpi_ev_terminate ( | |||
602 | 602 | ||
603 | /* Deallocate all handler objects installed within GPE info structs */ | 603 | /* Deallocate all handler objects installed within GPE info structs */ |
604 | 604 | ||
605 | status = acpi_ev_walk_gpe_list (acpi_ev_delete_gpe_handlers, ACPI_NOT_ISR); | 605 | status = acpi_ev_walk_gpe_list (acpi_ev_delete_gpe_handlers); |
606 | 606 | ||
607 | /* Return to original mode if necessary */ | 607 | /* Return to original mode if necessary */ |
608 | 608 | ||
diff --git a/drivers/acpi/events/evxface.c b/drivers/acpi/events/evxface.c index 4092d47f6758..4c1c25e316a8 100644 --- a/drivers/acpi/events/evxface.c +++ b/drivers/acpi/events/evxface.c | |||
@@ -591,6 +591,7 @@ acpi_install_gpe_handler ( | |||
591 | struct acpi_gpe_event_info *gpe_event_info; | 591 | struct acpi_gpe_event_info *gpe_event_info; |
592 | struct acpi_handler_info *handler; | 592 | struct acpi_handler_info *handler; |
593 | acpi_status status; | 593 | acpi_status status; |
594 | u32 flags; | ||
594 | 595 | ||
595 | 596 | ||
596 | ACPI_FUNCTION_TRACE ("acpi_install_gpe_handler"); | 597 | ACPI_FUNCTION_TRACE ("acpi_install_gpe_handler"); |
@@ -643,7 +644,7 @@ acpi_install_gpe_handler ( | |||
643 | 644 | ||
644 | /* Install the handler */ | 645 | /* Install the handler */ |
645 | 646 | ||
646 | acpi_os_acquire_lock (acpi_gbl_gpe_lock, ACPI_NOT_ISR); | 647 | flags = acpi_os_acquire_lock (acpi_gbl_gpe_lock); |
647 | gpe_event_info->dispatch.handler = handler; | 648 | gpe_event_info->dispatch.handler = handler; |
648 | 649 | ||
649 | /* Setup up dispatch flags to indicate handler (vs. method) */ | 650 | /* Setup up dispatch flags to indicate handler (vs. method) */ |
@@ -651,7 +652,7 @@ acpi_install_gpe_handler ( | |||
651 | gpe_event_info->flags &= ~(ACPI_GPE_XRUPT_TYPE_MASK | ACPI_GPE_DISPATCH_MASK); /* Clear bits */ | 652 | gpe_event_info->flags &= ~(ACPI_GPE_XRUPT_TYPE_MASK | ACPI_GPE_DISPATCH_MASK); /* Clear bits */ |
652 | gpe_event_info->flags |= (u8) (type | ACPI_GPE_DISPATCH_HANDLER); | 653 | gpe_event_info->flags |= (u8) (type | ACPI_GPE_DISPATCH_HANDLER); |
653 | 654 | ||
654 | acpi_os_release_lock (acpi_gbl_gpe_lock, ACPI_NOT_ISR); | 655 | acpi_os_release_lock (acpi_gbl_gpe_lock, flags); |
655 | 656 | ||
656 | 657 | ||
657 | unlock_and_exit: | 658 | unlock_and_exit: |
@@ -685,6 +686,7 @@ acpi_remove_gpe_handler ( | |||
685 | struct acpi_gpe_event_info *gpe_event_info; | 686 | struct acpi_gpe_event_info *gpe_event_info; |
686 | struct acpi_handler_info *handler; | 687 | struct acpi_handler_info *handler; |
687 | acpi_status status; | 688 | acpi_status status; |
689 | u32 flags; | ||
688 | 690 | ||
689 | 691 | ||
690 | ACPI_FUNCTION_TRACE ("acpi_remove_gpe_handler"); | 692 | ACPI_FUNCTION_TRACE ("acpi_remove_gpe_handler"); |
@@ -741,7 +743,7 @@ acpi_remove_gpe_handler ( | |||
741 | 743 | ||
742 | /* Remove the handler */ | 744 | /* Remove the handler */ |
743 | 745 | ||
744 | acpi_os_acquire_lock (acpi_gbl_gpe_lock, ACPI_NOT_ISR); | 746 | flags = acpi_os_acquire_lock (acpi_gbl_gpe_lock); |
745 | handler = gpe_event_info->dispatch.handler; | 747 | handler = gpe_event_info->dispatch.handler; |
746 | 748 | ||
747 | /* Restore Method node (if any), set dispatch flags */ | 749 | /* Restore Method node (if any), set dispatch flags */ |
@@ -751,7 +753,7 @@ acpi_remove_gpe_handler ( | |||
751 | if (handler->method_node) { | 753 | if (handler->method_node) { |
752 | gpe_event_info->flags |= ACPI_GPE_DISPATCH_METHOD; | 754 | gpe_event_info->flags |= ACPI_GPE_DISPATCH_METHOD; |
753 | } | 755 | } |
754 | acpi_os_release_lock (acpi_gbl_gpe_lock, ACPI_NOT_ISR); | 756 | acpi_os_release_lock (acpi_gbl_gpe_lock, flags); |
755 | 757 | ||
756 | /* Now we can free the handler object */ | 758 | /* Now we can free the handler object */ |
757 | 759 | ||
diff --git a/drivers/acpi/executer/exconvrt.c b/drivers/acpi/executer/exconvrt.c index 97856c48bd74..21331625e66e 100644 --- a/drivers/acpi/executer/exconvrt.c +++ b/drivers/acpi/executer/exconvrt.c | |||
@@ -367,7 +367,7 @@ acpi_ex_convert_to_ascii ( | |||
367 | 367 | ||
368 | /* hex_length: 2 ascii hex chars per data byte */ | 368 | /* hex_length: 2 ascii hex chars per data byte */ |
369 | 369 | ||
370 | hex_length = ACPI_MUL_2 (data_width); | 370 | hex_length = (acpi_native_uint) ACPI_MUL_2 (data_width); |
371 | for (i = 0, j = (hex_length-1); i < hex_length; i++, j--) { | 371 | for (i = 0, j = (hex_length-1); i < hex_length; i++, j--) { |
372 | /* Get one hex digit, most significant digits first */ | 372 | /* Get one hex digit, most significant digits first */ |
373 | 373 | ||
diff --git a/drivers/acpi/executer/exdump.c b/drivers/acpi/executer/exdump.c index ae6cad85e015..7007abb6051e 100644 --- a/drivers/acpi/executer/exdump.c +++ b/drivers/acpi/executer/exdump.c | |||
@@ -80,6 +80,16 @@ acpi_ex_out_address ( | |||
80 | acpi_physical_address value); | 80 | acpi_physical_address value); |
81 | #endif /* ACPI_FUTURE_USAGE */ | 81 | #endif /* ACPI_FUTURE_USAGE */ |
82 | 82 | ||
83 | static void | ||
84 | acpi_ex_dump_reference ( | ||
85 | union acpi_operand_object *obj_desc); | ||
86 | |||
87 | static void | ||
88 | acpi_ex_dump_package ( | ||
89 | union acpi_operand_object *obj_desc, | ||
90 | u32 level, | ||
91 | u32 index); | ||
92 | |||
83 | 93 | ||
84 | /******************************************************************************* | 94 | /******************************************************************************* |
85 | * | 95 | * |
@@ -508,7 +518,7 @@ acpi_ex_out_integer ( | |||
508 | char *title, | 518 | char *title, |
509 | u32 value) | 519 | u32 value) |
510 | { | 520 | { |
511 | acpi_os_printf ("%20s : %X\n", title, value); | 521 | acpi_os_printf ("%20s : %.2X\n", title, value); |
512 | } | 522 | } |
513 | 523 | ||
514 | static void | 524 | static void |
@@ -565,9 +575,144 @@ acpi_ex_dump_node ( | |||
565 | 575 | ||
566 | /******************************************************************************* | 576 | /******************************************************************************* |
567 | * | 577 | * |
578 | * FUNCTION: acpi_ex_dump_reference | ||
579 | * | ||
580 | * PARAMETERS: Object - Descriptor to dump | ||
581 | * | ||
582 | * DESCRIPTION: Dumps a reference object | ||
583 | * | ||
584 | ******************************************************************************/ | ||
585 | |||
586 | static void | ||
587 | acpi_ex_dump_reference ( | ||
588 | union acpi_operand_object *obj_desc) | ||
589 | { | ||
590 | struct acpi_buffer ret_buf; | ||
591 | acpi_status status; | ||
592 | |||
593 | |||
594 | if (obj_desc->reference.opcode == AML_INT_NAMEPATH_OP) { | ||
595 | acpi_os_printf ("Named Object %p ", obj_desc->reference.node); | ||
596 | ret_buf.length = ACPI_ALLOCATE_LOCAL_BUFFER; | ||
597 | status = acpi_ns_handle_to_pathname (obj_desc->reference.node, &ret_buf); | ||
598 | if (ACPI_FAILURE (status)) { | ||
599 | acpi_os_printf ("Could not convert name to pathname\n"); | ||
600 | } | ||
601 | else { | ||
602 | acpi_os_printf ("%s\n", ret_buf.pointer); | ||
603 | ACPI_MEM_FREE (ret_buf.pointer); | ||
604 | } | ||
605 | } | ||
606 | else if (obj_desc->reference.object) { | ||
607 | acpi_os_printf ("\nReferenced Object: %p\n", obj_desc->reference.object); | ||
608 | } | ||
609 | } | ||
610 | |||
611 | |||
612 | /******************************************************************************* | ||
613 | * | ||
614 | * FUNCTION: acpi_ex_dump_package | ||
615 | * | ||
616 | * PARAMETERS: Object - Descriptor to dump | ||
617 | * Level - Indentation Level | ||
618 | * Index - Package index for this object | ||
619 | * | ||
620 | * DESCRIPTION: Dumps the elements of the package | ||
621 | * | ||
622 | ******************************************************************************/ | ||
623 | |||
624 | static void | ||
625 | acpi_ex_dump_package ( | ||
626 | union acpi_operand_object *obj_desc, | ||
627 | u32 level, | ||
628 | u32 index) | ||
629 | { | ||
630 | u32 i; | ||
631 | |||
632 | |||
633 | /* Indentation and index output */ | ||
634 | |||
635 | if (level > 0) { | ||
636 | for (i = 0; i < level; i++) { | ||
637 | acpi_os_printf (" "); | ||
638 | } | ||
639 | |||
640 | acpi_os_printf ("[%.2d] ", index); | ||
641 | } | ||
642 | |||
643 | acpi_os_printf ("%p ", obj_desc); | ||
644 | |||
645 | /* Null package elements are allowed */ | ||
646 | |||
647 | if (!obj_desc) { | ||
648 | acpi_os_printf ("[Null Object]\n"); | ||
649 | return; | ||
650 | } | ||
651 | |||
652 | /* Packages may only contain a few object types */ | ||
653 | |||
654 | switch (ACPI_GET_OBJECT_TYPE (obj_desc)) { | ||
655 | case ACPI_TYPE_INTEGER: | ||
656 | |||
657 | acpi_os_printf ("[Integer] = %8.8X%8.8X\n", | ||
658 | ACPI_FORMAT_UINT64 (obj_desc->integer.value)); | ||
659 | break; | ||
660 | |||
661 | |||
662 | case ACPI_TYPE_STRING: | ||
663 | |||
664 | acpi_os_printf ("[String] Value: "); | ||
665 | for (i = 0; i < obj_desc->string.length; i++) { | ||
666 | acpi_os_printf ("%c", obj_desc->string.pointer[i]); | ||
667 | } | ||
668 | acpi_os_printf ("\n"); | ||
669 | break; | ||
670 | |||
671 | |||
672 | case ACPI_TYPE_BUFFER: | ||
673 | |||
674 | acpi_os_printf ("[Buffer] Length %.2X = ", obj_desc->buffer.length); | ||
675 | if (obj_desc->buffer.length) { | ||
676 | acpi_ut_dump_buffer ((u8 *) obj_desc->buffer.pointer, | ||
677 | obj_desc->buffer.length, DB_DWORD_DISPLAY, _COMPONENT); | ||
678 | } | ||
679 | else { | ||
680 | acpi_os_printf ("\n"); | ||
681 | } | ||
682 | break; | ||
683 | |||
684 | |||
685 | case ACPI_TYPE_PACKAGE: | ||
686 | |||
687 | acpi_os_printf ("[Package] Contains %d Elements: \n", | ||
688 | obj_desc->package.count); | ||
689 | |||
690 | for (i = 0; i < obj_desc->package.count; i++) { | ||
691 | acpi_ex_dump_package (obj_desc->package.elements[i], level+1, i); | ||
692 | } | ||
693 | break; | ||
694 | |||
695 | |||
696 | case ACPI_TYPE_LOCAL_REFERENCE: | ||
697 | |||
698 | acpi_os_printf ("[Object Reference] "); | ||
699 | acpi_ex_dump_reference (obj_desc); | ||
700 | break; | ||
701 | |||
702 | |||
703 | default: | ||
704 | |||
705 | acpi_os_printf ("[Unknown Type] %X\n", ACPI_GET_OBJECT_TYPE (obj_desc)); | ||
706 | break; | ||
707 | } | ||
708 | } | ||
709 | |||
710 | |||
711 | /******************************************************************************* | ||
712 | * | ||
568 | * FUNCTION: acpi_ex_dump_object_descriptor | 713 | * FUNCTION: acpi_ex_dump_object_descriptor |
569 | * | 714 | * |
570 | * PARAMETERS: *Object - Descriptor to dump | 715 | * PARAMETERS: Object - Descriptor to dump |
571 | * Flags - Force display if TRUE | 716 | * Flags - Force display if TRUE |
572 | * | 717 | * |
573 | * DESCRIPTION: Dumps the members of the object descriptor given. | 718 | * DESCRIPTION: Dumps the members of the object descriptor given. |
@@ -579,9 +724,6 @@ acpi_ex_dump_object_descriptor ( | |||
579 | union acpi_operand_object *obj_desc, | 724 | union acpi_operand_object *obj_desc, |
580 | u32 flags) | 725 | u32 flags) |
581 | { | 726 | { |
582 | u32 i; | ||
583 | |||
584 | |||
585 | ACPI_FUNCTION_TRACE ("ex_dump_object_descriptor"); | 727 | ACPI_FUNCTION_TRACE ("ex_dump_object_descriptor"); |
586 | 728 | ||
587 | 729 | ||
@@ -648,22 +790,13 @@ acpi_ex_dump_object_descriptor ( | |||
648 | case ACPI_TYPE_PACKAGE: | 790 | case ACPI_TYPE_PACKAGE: |
649 | 791 | ||
650 | acpi_ex_out_integer ("Flags", obj_desc->package.flags); | 792 | acpi_ex_out_integer ("Flags", obj_desc->package.flags); |
651 | acpi_ex_out_integer ("Count", obj_desc->package.count); | 793 | acpi_ex_out_integer ("Elements", obj_desc->package.count); |
652 | acpi_ex_out_pointer ("Elements", obj_desc->package.elements); | 794 | acpi_ex_out_pointer ("Element List", obj_desc->package.elements); |
653 | 795 | ||
654 | /* Dump the package contents */ | 796 | /* Dump the package contents */ |
655 | 797 | ||
656 | if (obj_desc->package.count > 0) { | 798 | acpi_os_printf ("\nPackage Contents:\n"); |
657 | acpi_os_printf ("\nPackage Contents:\n"); | 799 | acpi_ex_dump_package (obj_desc, 0, 0); |
658 | for (i = 0; i < obj_desc->package.count; i++) { | ||
659 | acpi_os_printf ("[%.3d] %p", i, obj_desc->package.elements[i]); | ||
660 | if (obj_desc->package.elements[i]) { | ||
661 | acpi_os_printf (" %s", | ||
662 | acpi_ut_get_object_type_name (obj_desc->package.elements[i])); | ||
663 | } | ||
664 | acpi_os_printf ("\n"); | ||
665 | } | ||
666 | } | ||
667 | break; | 800 | break; |
668 | 801 | ||
669 | 802 | ||
@@ -790,10 +923,7 @@ acpi_ex_dump_object_descriptor ( | |||
790 | acpi_ex_out_pointer ("Node", obj_desc->reference.node); | 923 | acpi_ex_out_pointer ("Node", obj_desc->reference.node); |
791 | acpi_ex_out_pointer ("Where", obj_desc->reference.where); | 924 | acpi_ex_out_pointer ("Where", obj_desc->reference.where); |
792 | 925 | ||
793 | if (obj_desc->reference.object) { | 926 | acpi_ex_dump_reference (obj_desc); |
794 | acpi_os_printf ("\nReferenced Object:\n"); | ||
795 | acpi_ex_dump_object_descriptor (obj_desc->reference.object, flags); | ||
796 | } | ||
797 | break; | 927 | break; |
798 | 928 | ||
799 | 929 | ||
diff --git a/drivers/acpi/executer/exmisc.c b/drivers/acpi/executer/exmisc.c index 022f281345b8..237ef28c8132 100644 --- a/drivers/acpi/executer/exmisc.c +++ b/drivers/acpi/executer/exmisc.c | |||
@@ -302,7 +302,7 @@ acpi_ex_do_concatenate ( | |||
302 | /* Result of two Integers is a Buffer */ | 302 | /* Result of two Integers is a Buffer */ |
303 | /* Need enough buffer space for two integers */ | 303 | /* Need enough buffer space for two integers */ |
304 | 304 | ||
305 | return_desc = acpi_ut_create_buffer_object ( | 305 | return_desc = acpi_ut_create_buffer_object ((acpi_size) |
306 | ACPI_MUL_2 (acpi_gbl_integer_byte_width)); | 306 | ACPI_MUL_2 (acpi_gbl_integer_byte_width)); |
307 | if (!return_desc) { | 307 | if (!return_desc) { |
308 | status = AE_NO_MEMORY; | 308 | status = AE_NO_MEMORY; |
diff --git a/drivers/acpi/executer/exoparg1.c b/drivers/acpi/executer/exoparg1.c index ffc61ddeb659..131f49acb1df 100644 --- a/drivers/acpi/executer/exoparg1.c +++ b/drivers/acpi/executer/exoparg1.c | |||
@@ -113,8 +113,9 @@ acpi_ex_opcode_0A_0T_1R ( | |||
113 | status = AE_NO_MEMORY; | 113 | status = AE_NO_MEMORY; |
114 | goto cleanup; | 114 | goto cleanup; |
115 | } | 115 | } |
116 | 116 | #if ACPI_MACHINE_WIDTH != 16 | |
117 | return_desc->integer.value = acpi_os_get_timer (); | 117 | return_desc->integer.value = acpi_os_get_timer (); |
118 | #endif | ||
118 | break; | 119 | break; |
119 | 120 | ||
120 | default: /* Unknown opcode */ | 121 | default: /* Unknown opcode */ |
diff --git a/drivers/acpi/executer/exoparg3.c b/drivers/acpi/executer/exoparg3.c index 23b068adbf58..197890f443b5 100644 --- a/drivers/acpi/executer/exoparg3.c +++ b/drivers/acpi/executer/exoparg3.c | |||
@@ -160,7 +160,7 @@ acpi_ex_opcode_3A_1T_1R ( | |||
160 | { | 160 | { |
161 | union acpi_operand_object **operand = &walk_state->operands[0]; | 161 | union acpi_operand_object **operand = &walk_state->operands[0]; |
162 | union acpi_operand_object *return_desc = NULL; | 162 | union acpi_operand_object *return_desc = NULL; |
163 | char *buffer; | 163 | char *buffer = NULL; |
164 | acpi_status status = AE_OK; | 164 | acpi_status status = AE_OK; |
165 | acpi_integer index; | 165 | acpi_integer index; |
166 | acpi_size length; | 166 | acpi_size length; |
@@ -193,34 +193,63 @@ acpi_ex_opcode_3A_1T_1R ( | |||
193 | * If the index is beyond the length of the String/Buffer, or if the | 193 | * If the index is beyond the length of the String/Buffer, or if the |
194 | * requested length is zero, return a zero-length String/Buffer | 194 | * requested length is zero, return a zero-length String/Buffer |
195 | */ | 195 | */ |
196 | if ((index < operand[0]->string.length) && | 196 | if (index >= operand[0]->string.length) { |
197 | (length > 0)) { | 197 | length = 0; |
198 | /* Truncate request if larger than the actual String/Buffer */ | 198 | } |
199 | 199 | ||
200 | if ((index + length) > | 200 | /* Truncate request if larger than the actual String/Buffer */ |
201 | operand[0]->string.length) { | 201 | |
202 | length = (acpi_size) operand[0]->string.length - | 202 | else if ((index + length) > operand[0]->string.length) { |
203 | (acpi_size) index; | 203 | length = (acpi_size) operand[0]->string.length - |
204 | } | 204 | (acpi_size) index; |
205 | } | ||
205 | 206 | ||
206 | /* Allocate a new buffer for the String/Buffer */ | 207 | /* Strings always have a sub-pointer, not so for buffers */ |
208 | |||
209 | switch (ACPI_GET_OBJECT_TYPE (operand[0])) { | ||
210 | case ACPI_TYPE_STRING: | ||
211 | |||
212 | /* Always allocate a new buffer for the String */ | ||
207 | 213 | ||
208 | buffer = ACPI_MEM_CALLOCATE ((acpi_size) length + 1); | 214 | buffer = ACPI_MEM_CALLOCATE ((acpi_size) length + 1); |
209 | if (!buffer) { | 215 | if (!buffer) { |
210 | status = AE_NO_MEMORY; | 216 | status = AE_NO_MEMORY; |
211 | goto cleanup; | 217 | goto cleanup; |
212 | } | 218 | } |
219 | break; | ||
220 | |||
221 | case ACPI_TYPE_BUFFER: | ||
222 | |||
223 | /* If the requested length is zero, don't allocate a buffer */ | ||
224 | |||
225 | if (length > 0) { | ||
226 | /* Allocate a new buffer for the Buffer */ | ||
227 | |||
228 | buffer = ACPI_MEM_CALLOCATE (length); | ||
229 | if (!buffer) { | ||
230 | status = AE_NO_MEMORY; | ||
231 | goto cleanup; | ||
232 | } | ||
233 | } | ||
234 | break; | ||
213 | 235 | ||
236 | default: /* Should not happen */ | ||
237 | |||
238 | status = AE_AML_OPERAND_TYPE; | ||
239 | goto cleanup; | ||
240 | } | ||
241 | |||
242 | if (length > 0) { | ||
214 | /* Copy the portion requested */ | 243 | /* Copy the portion requested */ |
215 | 244 | ||
216 | ACPI_MEMCPY (buffer, operand[0]->string.pointer + index, | 245 | ACPI_MEMCPY (buffer, operand[0]->string.pointer + index, |
217 | length); | 246 | length); |
247 | } | ||
218 | 248 | ||
219 | /* Set the length of the new String/Buffer */ | 249 | /* Set the length of the new String/Buffer */ |
220 | 250 | ||
221 | return_desc->string.pointer = buffer; | 251 | return_desc->string.pointer = buffer; |
222 | return_desc->string.length = (u32) length; | 252 | return_desc->string.length = (u32) length; |
223 | } | ||
224 | 253 | ||
225 | /* Mark buffer initialized */ | 254 | /* Mark buffer initialized */ |
226 | 255 | ||
@@ -244,13 +273,13 @@ cleanup: | |||
244 | 273 | ||
245 | /* Delete return object on error */ | 274 | /* Delete return object on error */ |
246 | 275 | ||
247 | if (ACPI_FAILURE (status)) { | 276 | if (ACPI_FAILURE (status) || walk_state->result_obj) { |
248 | acpi_ut_remove_reference (return_desc); | 277 | acpi_ut_remove_reference (return_desc); |
249 | } | 278 | } |
250 | 279 | ||
251 | /* Set the return object and exit */ | 280 | /* Set the return object and exit */ |
252 | 281 | ||
253 | if (!walk_state->result_obj) { | 282 | else { |
254 | walk_state->result_obj = return_desc; | 283 | walk_state->result_obj = return_desc; |
255 | } | 284 | } |
256 | return_ACPI_STATUS (status); | 285 | return_ACPI_STATUS (status); |
diff --git a/drivers/acpi/executer/exstore.c b/drivers/acpi/executer/exstore.c index 763ffeea8503..59dbfeaa54c0 100644 --- a/drivers/acpi/executer/exstore.c +++ b/drivers/acpi/executer/exstore.c | |||
@@ -147,7 +147,7 @@ acpi_ex_do_debug_object ( | |||
147 | 147 | ||
148 | case ACPI_TYPE_BUFFER: | 148 | case ACPI_TYPE_BUFFER: |
149 | 149 | ||
150 | ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "[0x%.2X]", | 150 | ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "[0x%.2X]\n", |
151 | (u32) source_desc->buffer.length)); | 151 | (u32) source_desc->buffer.length)); |
152 | ACPI_DUMP_BUFFER (source_desc->buffer.pointer, | 152 | ACPI_DUMP_BUFFER (source_desc->buffer.pointer, |
153 | (source_desc->buffer.length < 32) ? source_desc->buffer.length : 32); | 153 | (source_desc->buffer.length < 32) ? source_desc->buffer.length : 32); |
diff --git a/drivers/acpi/executer/exutils.c b/drivers/acpi/executer/exutils.c index 5c7ec0c04177..d00b0dcba96a 100644 --- a/drivers/acpi/executer/exutils.c +++ b/drivers/acpi/executer/exutils.c | |||
@@ -369,7 +369,7 @@ acpi_ex_eisa_id_to_string ( | |||
369 | * | 369 | * |
370 | * RETURN: None, string | 370 | * RETURN: None, string |
371 | * | 371 | * |
372 | * DESCRIPTOIN: Convert a number to string representation. Assumes string | 372 | * DESCRIPTION: Convert a number to string representation. Assumes string |
373 | * buffer is large enough to hold the string. | 373 | * buffer is large enough to hold the string. |
374 | * | 374 | * |
375 | ******************************************************************************/ | 375 | ******************************************************************************/ |
diff --git a/drivers/acpi/hardware/hwgpe.c b/drivers/acpi/hardware/hwgpe.c index 8daeabb2fc7a..3536bbb990c3 100644 --- a/drivers/acpi/hardware/hwgpe.c +++ b/drivers/acpi/hardware/hwgpe.c | |||
@@ -374,7 +374,7 @@ acpi_hw_enable_wakeup_gpe_block ( | |||
374 | * | 374 | * |
375 | * FUNCTION: acpi_hw_disable_all_gpes | 375 | * FUNCTION: acpi_hw_disable_all_gpes |
376 | * | 376 | * |
377 | * PARAMETERS: Flags - ACPI_NOT_ISR or ACPI_ISR | 377 | * PARAMETERS: None |
378 | * | 378 | * |
379 | * RETURN: Status | 379 | * RETURN: Status |
380 | * | 380 | * |
@@ -384,7 +384,7 @@ acpi_hw_enable_wakeup_gpe_block ( | |||
384 | 384 | ||
385 | acpi_status | 385 | acpi_status |
386 | acpi_hw_disable_all_gpes ( | 386 | acpi_hw_disable_all_gpes ( |
387 | u32 flags) | 387 | void) |
388 | { | 388 | { |
389 | acpi_status status; | 389 | acpi_status status; |
390 | 390 | ||
@@ -392,8 +392,8 @@ acpi_hw_disable_all_gpes ( | |||
392 | ACPI_FUNCTION_TRACE ("hw_disable_all_gpes"); | 392 | ACPI_FUNCTION_TRACE ("hw_disable_all_gpes"); |
393 | 393 | ||
394 | 394 | ||
395 | status = acpi_ev_walk_gpe_list (acpi_hw_disable_gpe_block, flags); | 395 | status = acpi_ev_walk_gpe_list (acpi_hw_disable_gpe_block); |
396 | status = acpi_ev_walk_gpe_list (acpi_hw_clear_gpe_block, flags); | 396 | status = acpi_ev_walk_gpe_list (acpi_hw_clear_gpe_block); |
397 | return_ACPI_STATUS (status); | 397 | return_ACPI_STATUS (status); |
398 | } | 398 | } |
399 | 399 | ||
@@ -402,7 +402,7 @@ acpi_hw_disable_all_gpes ( | |||
402 | * | 402 | * |
403 | * FUNCTION: acpi_hw_enable_all_runtime_gpes | 403 | * FUNCTION: acpi_hw_enable_all_runtime_gpes |
404 | * | 404 | * |
405 | * PARAMETERS: Flags - ACPI_NOT_ISR or ACPI_ISR | 405 | * PARAMETERS: None |
406 | * | 406 | * |
407 | * RETURN: Status | 407 | * RETURN: Status |
408 | * | 408 | * |
@@ -412,7 +412,7 @@ acpi_hw_disable_all_gpes ( | |||
412 | 412 | ||
413 | acpi_status | 413 | acpi_status |
414 | acpi_hw_enable_all_runtime_gpes ( | 414 | acpi_hw_enable_all_runtime_gpes ( |
415 | u32 flags) | 415 | void) |
416 | { | 416 | { |
417 | acpi_status status; | 417 | acpi_status status; |
418 | 418 | ||
@@ -420,7 +420,7 @@ acpi_hw_enable_all_runtime_gpes ( | |||
420 | ACPI_FUNCTION_TRACE ("hw_enable_all_runtime_gpes"); | 420 | ACPI_FUNCTION_TRACE ("hw_enable_all_runtime_gpes"); |
421 | 421 | ||
422 | 422 | ||
423 | status = acpi_ev_walk_gpe_list (acpi_hw_enable_runtime_gpe_block, flags); | 423 | status = acpi_ev_walk_gpe_list (acpi_hw_enable_runtime_gpe_block); |
424 | return_ACPI_STATUS (status); | 424 | return_ACPI_STATUS (status); |
425 | } | 425 | } |
426 | 426 | ||
@@ -429,7 +429,7 @@ acpi_hw_enable_all_runtime_gpes ( | |||
429 | * | 429 | * |
430 | * FUNCTION: acpi_hw_enable_all_wakeup_gpes | 430 | * FUNCTION: acpi_hw_enable_all_wakeup_gpes |
431 | * | 431 | * |
432 | * PARAMETERS: Flags - ACPI_NOT_ISR or ACPI_ISR | 432 | * PARAMETERS: None |
433 | * | 433 | * |
434 | * RETURN: Status | 434 | * RETURN: Status |
435 | * | 435 | * |
@@ -439,7 +439,7 @@ acpi_hw_enable_all_runtime_gpes ( | |||
439 | 439 | ||
440 | acpi_status | 440 | acpi_status |
441 | acpi_hw_enable_all_wakeup_gpes ( | 441 | acpi_hw_enable_all_wakeup_gpes ( |
442 | u32 flags) | 442 | void) |
443 | { | 443 | { |
444 | acpi_status status; | 444 | acpi_status status; |
445 | 445 | ||
@@ -447,7 +447,7 @@ acpi_hw_enable_all_wakeup_gpes ( | |||
447 | ACPI_FUNCTION_TRACE ("hw_enable_all_wakeup_gpes"); | 447 | ACPI_FUNCTION_TRACE ("hw_enable_all_wakeup_gpes"); |
448 | 448 | ||
449 | 449 | ||
450 | status = acpi_ev_walk_gpe_list (acpi_hw_enable_wakeup_gpe_block, flags); | 450 | status = acpi_ev_walk_gpe_list (acpi_hw_enable_wakeup_gpe_block); |
451 | return_ACPI_STATUS (status); | 451 | return_ACPI_STATUS (status); |
452 | } | 452 | } |
453 | 453 | ||
diff --git a/drivers/acpi/hardware/hwregs.c b/drivers/acpi/hardware/hwregs.c index 6d9e4eb84836..04a058565d8d 100644 --- a/drivers/acpi/hardware/hwregs.c +++ b/drivers/acpi/hardware/hwregs.c | |||
@@ -106,7 +106,7 @@ acpi_hw_clear_acpi_status ( | |||
106 | 106 | ||
107 | /* Clear the GPE Bits in all GPE registers in all GPE blocks */ | 107 | /* Clear the GPE Bits in all GPE registers in all GPE blocks */ |
108 | 108 | ||
109 | status = acpi_ev_walk_gpe_list (acpi_hw_clear_gpe_block, ACPI_ISR); | 109 | status = acpi_ev_walk_gpe_list (acpi_hw_clear_gpe_block); |
110 | 110 | ||
111 | unlock_and_exit: | 111 | unlock_and_exit: |
112 | if (flags & ACPI_MTX_LOCK) { | 112 | if (flags & ACPI_MTX_LOCK) { |
diff --git a/drivers/acpi/hardware/hwsleep.c b/drivers/acpi/hardware/hwsleep.c index 415d342aeab5..cedee0c43b5f 100644 --- a/drivers/acpi/hardware/hwsleep.c +++ b/drivers/acpi/hardware/hwsleep.c | |||
@@ -274,13 +274,13 @@ acpi_enter_sleep_state ( | |||
274 | * 1) Disable/Clear all GPEs | 274 | * 1) Disable/Clear all GPEs |
275 | * 2) Enable all wakeup GPEs | 275 | * 2) Enable all wakeup GPEs |
276 | */ | 276 | */ |
277 | status = acpi_hw_disable_all_gpes (ACPI_ISR); | 277 | status = acpi_hw_disable_all_gpes (); |
278 | if (ACPI_FAILURE (status)) { | 278 | if (ACPI_FAILURE (status)) { |
279 | return_ACPI_STATUS (status); | 279 | return_ACPI_STATUS (status); |
280 | } | 280 | } |
281 | acpi_gbl_system_awake_and_running = FALSE; | 281 | acpi_gbl_system_awake_and_running = FALSE; |
282 | 282 | ||
283 | status = acpi_hw_enable_all_wakeup_gpes (ACPI_ISR); | 283 | status = acpi_hw_enable_all_wakeup_gpes (); |
284 | if (ACPI_FAILURE (status)) { | 284 | if (ACPI_FAILURE (status)) { |
285 | return_ACPI_STATUS (status); | 285 | return_ACPI_STATUS (status); |
286 | } | 286 | } |
@@ -424,13 +424,13 @@ acpi_enter_sleep_state_s4bios ( | |||
424 | * 1) Disable/Clear all GPEs | 424 | * 1) Disable/Clear all GPEs |
425 | * 2) Enable all wakeup GPEs | 425 | * 2) Enable all wakeup GPEs |
426 | */ | 426 | */ |
427 | status = acpi_hw_disable_all_gpes (ACPI_ISR); | 427 | status = acpi_hw_disable_all_gpes (); |
428 | if (ACPI_FAILURE (status)) { | 428 | if (ACPI_FAILURE (status)) { |
429 | return_ACPI_STATUS (status); | 429 | return_ACPI_STATUS (status); |
430 | } | 430 | } |
431 | acpi_gbl_system_awake_and_running = FALSE; | 431 | acpi_gbl_system_awake_and_running = FALSE; |
432 | 432 | ||
433 | status = acpi_hw_enable_all_wakeup_gpes (ACPI_ISR); | 433 | status = acpi_hw_enable_all_wakeup_gpes (); |
434 | if (ACPI_FAILURE (status)) { | 434 | if (ACPI_FAILURE (status)) { |
435 | return_ACPI_STATUS (status); | 435 | return_ACPI_STATUS (status); |
436 | } | 436 | } |
@@ -557,13 +557,13 @@ acpi_leave_sleep_state ( | |||
557 | * 1) Disable/Clear all GPEs | 557 | * 1) Disable/Clear all GPEs |
558 | * 2) Enable all runtime GPEs | 558 | * 2) Enable all runtime GPEs |
559 | */ | 559 | */ |
560 | status = acpi_hw_disable_all_gpes (ACPI_NOT_ISR); | 560 | status = acpi_hw_disable_all_gpes (); |
561 | if (ACPI_FAILURE (status)) { | 561 | if (ACPI_FAILURE (status)) { |
562 | return_ACPI_STATUS (status); | 562 | return_ACPI_STATUS (status); |
563 | } | 563 | } |
564 | acpi_gbl_system_awake_and_running = TRUE; | 564 | acpi_gbl_system_awake_and_running = TRUE; |
565 | 565 | ||
566 | status = acpi_hw_enable_all_runtime_gpes (ACPI_NOT_ISR); | 566 | status = acpi_hw_enable_all_runtime_gpes (); |
567 | if (ACPI_FAILURE (status)) { | 567 | if (ACPI_FAILURE (status)) { |
568 | return_ACPI_STATUS (status); | 568 | return_ACPI_STATUS (status); |
569 | } | 569 | } |
diff --git a/drivers/acpi/namespace/nsaccess.c b/drivers/acpi/namespace/nsaccess.c index ece7a9dedd5c..9df0a64ba9e9 100644 --- a/drivers/acpi/namespace/nsaccess.c +++ b/drivers/acpi/namespace/nsaccess.c | |||
@@ -159,7 +159,7 @@ acpi_ns_root_initialize ( | |||
159 | obj_desc->method.param_count = (u8) ACPI_TO_INTEGER (val); | 159 | obj_desc->method.param_count = (u8) ACPI_TO_INTEGER (val); |
160 | obj_desc->common.flags |= AOPOBJ_DATA_VALID; | 160 | obj_desc->common.flags |= AOPOBJ_DATA_VALID; |
161 | 161 | ||
162 | #if defined (_ACPI_ASL_COMPILER) || defined (_ACPI_DUMP_App) | 162 | #if defined (ACPI_ASL_COMPILER) || defined (ACPI_DUMP_App) |
163 | 163 | ||
164 | /* | 164 | /* |
165 | * i_aSL Compiler cheats by putting parameter count | 165 | * i_aSL Compiler cheats by putting parameter count |
diff --git a/drivers/acpi/namespace/nsalloc.c b/drivers/acpi/namespace/nsalloc.c index 5653a19d7172..3f94b0806ecf 100644 --- a/drivers/acpi/namespace/nsalloc.c +++ b/drivers/acpi/namespace/nsalloc.c | |||
@@ -83,7 +83,7 @@ acpi_ns_create_node ( | |||
83 | return_PTR (NULL); | 83 | return_PTR (NULL); |
84 | } | 84 | } |
85 | 85 | ||
86 | ACPI_MEM_TRACKING (acpi_gbl_memory_lists[ACPI_MEM_LIST_NSNODE].total_allocated++); | 86 | ACPI_MEM_TRACKING (acpi_gbl_ns_node_list->total_allocated++); |
87 | 87 | ||
88 | node->name.integer = name; | 88 | node->name.integer = name; |
89 | node->reference_count = 1; | 89 | node->reference_count = 1; |
@@ -151,7 +151,7 @@ acpi_ns_delete_node ( | |||
151 | } | 151 | } |
152 | } | 152 | } |
153 | 153 | ||
154 | ACPI_MEM_TRACKING (acpi_gbl_memory_lists[ACPI_MEM_LIST_NSNODE].total_freed++); | 154 | ACPI_MEM_TRACKING (acpi_gbl_ns_node_list->total_freed++); |
155 | 155 | ||
156 | /* | 156 | /* |
157 | * Detach an object if there is one then delete the node | 157 | * Detach an object if there is one then delete the node |
@@ -362,7 +362,7 @@ acpi_ns_delete_children ( | |||
362 | 362 | ||
363 | /* Now we can free this child object */ | 363 | /* Now we can free this child object */ |
364 | 364 | ||
365 | ACPI_MEM_TRACKING (acpi_gbl_memory_lists[ACPI_MEM_LIST_NSNODE].total_freed++); | 365 | ACPI_MEM_TRACKING (acpi_gbl_ns_node_list->total_freed++); |
366 | 366 | ||
367 | ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "Object %p, Remaining %X\n", | 367 | ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "Object %p, Remaining %X\n", |
368 | child_node, acpi_gbl_current_node_count)); | 368 | child_node, acpi_gbl_current_node_count)); |
diff --git a/drivers/acpi/namespace/nsdump.c b/drivers/acpi/namespace/nsdump.c index 05af95322a62..c9f35dd7a431 100644 --- a/drivers/acpi/namespace/nsdump.c +++ b/drivers/acpi/namespace/nsdump.c | |||
@@ -208,33 +208,37 @@ acpi_ns_dump_one_object ( | |||
208 | return (AE_OK); | 208 | return (AE_OK); |
209 | } | 209 | } |
210 | 210 | ||
211 | /* Indent the object according to the level */ | 211 | if (!(info->display_type & ACPI_DISPLAY_SHORT)) { |
212 | /* Indent the object according to the level */ | ||
212 | 213 | ||
213 | acpi_os_printf ("%2d%*s", (u32) level - 1, (int) level * 2, " "); | 214 | acpi_os_printf ("%2d%*s", (u32) level - 1, (int) level * 2, " "); |
214 | 215 | ||
215 | /* Check the node type and name */ | 216 | /* Check the node type and name */ |
216 | 217 | ||
217 | if (type > ACPI_TYPE_LOCAL_MAX) { | 218 | if (type > ACPI_TYPE_LOCAL_MAX) { |
218 | ACPI_REPORT_WARNING (("Invalid ACPI Type %08X\n", type)); | 219 | ACPI_REPORT_WARNING (("Invalid ACPI Type %08X\n", type)); |
219 | } | 220 | } |
221 | |||
222 | if (!acpi_ut_valid_acpi_name (this_node->name.integer)) { | ||
223 | ACPI_REPORT_WARNING (("Invalid ACPI Name %08X\n", | ||
224 | this_node->name.integer)); | ||
225 | } | ||
220 | 226 | ||
221 | if (!acpi_ut_valid_acpi_name (this_node->name.integer)) { | 227 | acpi_os_printf ("%4.4s", acpi_ut_get_node_name (this_node)); |
222 | ACPI_REPORT_WARNING (("Invalid ACPI Name %08X\n", | ||
223 | this_node->name.integer)); | ||
224 | } | 228 | } |
225 | 229 | ||
226 | /* | 230 | /* |
227 | * Now we can print out the pertinent information | 231 | * Now we can print out the pertinent information |
228 | */ | 232 | */ |
229 | acpi_os_printf ("%4.4s %-12s %p ", | 233 | acpi_os_printf (" %-12s %p ", |
230 | acpi_ut_get_node_name (this_node), acpi_ut_get_type_name (type), this_node); | 234 | acpi_ut_get_type_name (type), this_node); |
231 | 235 | ||
232 | dbg_level = acpi_dbg_level; | 236 | dbg_level = acpi_dbg_level; |
233 | acpi_dbg_level = 0; | 237 | acpi_dbg_level = 0; |
234 | obj_desc = acpi_ns_get_attached_object (this_node); | 238 | obj_desc = acpi_ns_get_attached_object (this_node); |
235 | acpi_dbg_level = dbg_level; | 239 | acpi_dbg_level = dbg_level; |
236 | 240 | ||
237 | switch (info->display_type) { | 241 | switch (info->display_type & ACPI_DISPLAY_MASK) { |
238 | case ACPI_DISPLAY_SUMMARY: | 242 | case ACPI_DISPLAY_SUMMARY: |
239 | 243 | ||
240 | if (!obj_desc) { | 244 | if (!obj_desc) { |
@@ -646,7 +650,7 @@ acpi_ns_dump_entry ( | |||
646 | } | 650 | } |
647 | 651 | ||
648 | 652 | ||
649 | #ifdef _ACPI_ASL_COMPILER | 653 | #ifdef ACPI_ASL_COMPILER |
650 | /******************************************************************************* | 654 | /******************************************************************************* |
651 | * | 655 | * |
652 | * FUNCTION: acpi_ns_dump_tables | 656 | * FUNCTION: acpi_ns_dump_tables |
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index bdd9f37f8101..56e7cedba919 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c | |||
@@ -778,54 +778,6 @@ acpi_os_delete_lock ( | |||
778 | return_VOID; | 778 | return_VOID; |
779 | } | 779 | } |
780 | 780 | ||
781 | /* | ||
782 | * Acquire a spinlock. | ||
783 | * | ||
784 | * handle is a pointer to the spinlock_t. | ||
785 | * flags is *not* the result of save_flags - it is an ACPI-specific flag variable | ||
786 | * that indicates whether we are at interrupt level. | ||
787 | */ | ||
788 | void | ||
789 | acpi_os_acquire_lock ( | ||
790 | acpi_handle handle, | ||
791 | u32 flags) | ||
792 | { | ||
793 | ACPI_FUNCTION_TRACE ("os_acquire_lock"); | ||
794 | |||
795 | ACPI_DEBUG_PRINT ((ACPI_DB_MUTEX, "Acquiring spinlock[%p] from %s level\n", handle, | ||
796 | ((flags & ACPI_NOT_ISR) ? "non-interrupt" : "interrupt"))); | ||
797 | |||
798 | if (flags & ACPI_NOT_ISR) | ||
799 | ACPI_DISABLE_IRQS(); | ||
800 | |||
801 | spin_lock((spinlock_t *)handle); | ||
802 | |||
803 | return_VOID; | ||
804 | } | ||
805 | |||
806 | |||
807 | /* | ||
808 | * Release a spinlock. See above. | ||
809 | */ | ||
810 | void | ||
811 | acpi_os_release_lock ( | ||
812 | acpi_handle handle, | ||
813 | u32 flags) | ||
814 | { | ||
815 | ACPI_FUNCTION_TRACE ("os_release_lock"); | ||
816 | |||
817 | ACPI_DEBUG_PRINT ((ACPI_DB_MUTEX, "Releasing spinlock[%p] from %s level\n", handle, | ||
818 | ((flags & ACPI_NOT_ISR) ? "non-interrupt" : "interrupt"))); | ||
819 | |||
820 | spin_unlock((spinlock_t *)handle); | ||
821 | |||
822 | if (flags & ACPI_NOT_ISR) | ||
823 | ACPI_ENABLE_IRQS(); | ||
824 | |||
825 | return_VOID; | ||
826 | } | ||
827 | |||
828 | |||
829 | acpi_status | 781 | acpi_status |
830 | acpi_os_create_semaphore( | 782 | acpi_os_create_semaphore( |
831 | u32 max_units, | 783 | u32 max_units, |
@@ -1172,3 +1124,151 @@ unsigned int max_cstate = ACPI_PROCESSOR_MAX_POWER; | |||
1172 | 1124 | ||
1173 | 1125 | ||
1174 | EXPORT_SYMBOL(max_cstate); | 1126 | EXPORT_SYMBOL(max_cstate); |
1127 | |||
1128 | /* | ||
1129 | * Acquire a spinlock. | ||
1130 | * | ||
1131 | * handle is a pointer to the spinlock_t. | ||
1132 | * flags is *not* the result of save_flags - it is an ACPI-specific flag variable | ||
1133 | * that indicates whether we are at interrupt level. | ||
1134 | */ | ||
1135 | |||
1136 | unsigned long | ||
1137 | acpi_os_acquire_lock ( | ||
1138 | acpi_handle handle) | ||
1139 | { | ||
1140 | unsigned long flags; | ||
1141 | spin_lock_irqsave((spinlock_t *)handle, flags); | ||
1142 | return flags; | ||
1143 | } | ||
1144 | |||
1145 | /* | ||
1146 | * Release a spinlock. See above. | ||
1147 | */ | ||
1148 | |||
1149 | void | ||
1150 | acpi_os_release_lock ( | ||
1151 | acpi_handle handle, | ||
1152 | unsigned long flags) | ||
1153 | { | ||
1154 | spin_unlock_irqrestore((spinlock_t *)handle, flags); | ||
1155 | } | ||
1156 | |||
1157 | |||
1158 | #ifndef ACPI_USE_LOCAL_CACHE | ||
1159 | |||
1160 | /******************************************************************************* | ||
1161 | * | ||
1162 | * FUNCTION: acpi_os_create_cache | ||
1163 | * | ||
1164 | * PARAMETERS: CacheName - Ascii name for the cache | ||
1165 | * ObjectSize - Size of each cached object | ||
1166 | * MaxDepth - Maximum depth of the cache (in objects) | ||
1167 | * ReturnCache - Where the new cache object is returned | ||
1168 | * | ||
1169 | * RETURN: Status | ||
1170 | * | ||
1171 | * DESCRIPTION: Create a cache object | ||
1172 | * | ||
1173 | ******************************************************************************/ | ||
1174 | |||
1175 | acpi_status | ||
1176 | acpi_os_create_cache ( | ||
1177 | char *name, | ||
1178 | u16 size, | ||
1179 | u16 depth, | ||
1180 | acpi_cache_t **cache) | ||
1181 | { | ||
1182 | *cache = kmem_cache_create (name, size, 0, 0, NULL, NULL); | ||
1183 | return AE_OK; | ||
1184 | } | ||
1185 | |||
1186 | /******************************************************************************* | ||
1187 | * | ||
1188 | * FUNCTION: acpi_os_purge_cache | ||
1189 | * | ||
1190 | * PARAMETERS: Cache - Handle to cache object | ||
1191 | * | ||
1192 | * RETURN: Status | ||
1193 | * | ||
1194 | * DESCRIPTION: Free all objects within the requested cache. | ||
1195 | * | ||
1196 | ******************************************************************************/ | ||
1197 | |||
1198 | acpi_status | ||
1199 | acpi_os_purge_cache ( | ||
1200 | acpi_cache_t *cache) | ||
1201 | { | ||
1202 | (void) kmem_cache_shrink(cache); | ||
1203 | return (AE_OK); | ||
1204 | } | ||
1205 | |||
1206 | /******************************************************************************* | ||
1207 | * | ||
1208 | * FUNCTION: acpi_os_delete_cache | ||
1209 | * | ||
1210 | * PARAMETERS: Cache - Handle to cache object | ||
1211 | * | ||
1212 | * RETURN: Status | ||
1213 | * | ||
1214 | * DESCRIPTION: Free all objects within the requested cache and delete the | ||
1215 | * cache object. | ||
1216 | * | ||
1217 | ******************************************************************************/ | ||
1218 | |||
1219 | acpi_status | ||
1220 | acpi_os_delete_cache ( | ||
1221 | acpi_cache_t *cache) | ||
1222 | { | ||
1223 | (void)kmem_cache_destroy(cache); | ||
1224 | return (AE_OK); | ||
1225 | } | ||
1226 | |||
1227 | /******************************************************************************* | ||
1228 | * | ||
1229 | * FUNCTION: acpi_os_release_object | ||
1230 | * | ||
1231 | * PARAMETERS: Cache - Handle to cache object | ||
1232 | * Object - The object to be released | ||
1233 | * | ||
1234 | * RETURN: None | ||
1235 | * | ||
1236 | * DESCRIPTION: Release an object to the specified cache. If cache is full, | ||
1237 | * the object is deleted. | ||
1238 | * | ||
1239 | ******************************************************************************/ | ||
1240 | |||
1241 | acpi_status | ||
1242 | acpi_os_release_object ( | ||
1243 | acpi_cache_t *cache, | ||
1244 | void *object) | ||
1245 | { | ||
1246 | kmem_cache_free(cache, object); | ||
1247 | return (AE_OK); | ||
1248 | } | ||
1249 | |||
1250 | /******************************************************************************* | ||
1251 | * | ||
1252 | * FUNCTION: acpi_os_acquire_object | ||
1253 | * | ||
1254 | * PARAMETERS: Cache - Handle to cache object | ||
1255 | * ReturnObject - Where the object is returned | ||
1256 | * | ||
1257 | * RETURN: Status | ||
1258 | * | ||
1259 | * DESCRIPTION: Get an object from the specified cache. If cache is empty, | ||
1260 | * the object is allocated. | ||
1261 | * | ||
1262 | ******************************************************************************/ | ||
1263 | |||
1264 | void * | ||
1265 | acpi_os_acquire_object ( | ||
1266 | acpi_cache_t *cache) | ||
1267 | { | ||
1268 | void *object = kmem_cache_alloc(cache, GFP_KERNEL); | ||
1269 | WARN_ON(!object); | ||
1270 | return object; | ||
1271 | } | ||
1272 | |||
1273 | #endif | ||
1274 | |||
diff --git a/drivers/acpi/parser/Makefile b/drivers/acpi/parser/Makefile index bbdd286c660d..db24ee09cf11 100644 --- a/drivers/acpi/parser/Makefile +++ b/drivers/acpi/parser/Makefile | |||
@@ -2,7 +2,7 @@ | |||
2 | # Makefile for all Linux ACPI interpreter subdirectories | 2 | # Makefile for all Linux ACPI interpreter subdirectories |
3 | # | 3 | # |
4 | 4 | ||
5 | obj-y := psargs.o psparse.o pstree.o pswalk.o \ | 5 | obj-y := psargs.o psparse.o psloop.o pstree.o pswalk.o \ |
6 | psopcode.o psscope.o psutils.o psxface.o | 6 | psopcode.o psscope.o psutils.o psxface.o |
7 | 7 | ||
8 | EXTRA_CFLAGS += $(ACPI_CFLAGS) | 8 | EXTRA_CFLAGS += $(ACPI_CFLAGS) |
diff --git a/drivers/acpi/parser/psloop.c b/drivers/acpi/parser/psloop.c new file mode 100644 index 000000000000..decb2e9a049d --- /dev/null +++ b/drivers/acpi/parser/psloop.c | |||
@@ -0,0 +1,775 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * Module Name: psloop - Main AML parse loop | ||
4 | * | ||
5 | *****************************************************************************/ | ||
6 | |||
7 | /* | ||
8 | * Copyright (C) 2000 - 2005, R. Byron Moore | ||
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 | |||
45 | /* | ||
46 | * Parse the AML and build an operation tree as most interpreters, | ||
47 | * like Perl, do. Parsing is done by hand rather than with a YACC | ||
48 | * generated parser to tightly constrain stack and dynamic memory | ||
49 | * usage. At the same time, parsing is kept flexible and the code | ||
50 | * fairly compact by parsing based on a list of AML opcode | ||
51 | * templates in aml_op_info[] | ||
52 | */ | ||
53 | |||
54 | #include <acpi/acpi.h> | ||
55 | #include <acpi/acparser.h> | ||
56 | #include <acpi/acdispat.h> | ||
57 | #include <acpi/amlcode.h> | ||
58 | #include <acpi/acnamesp.h> | ||
59 | #include <acpi/acinterp.h> | ||
60 | |||
61 | #define _COMPONENT ACPI_PARSER | ||
62 | ACPI_MODULE_NAME ("psloop") | ||
63 | |||
64 | static u32 acpi_gbl_depth = 0; | ||
65 | |||
66 | |||
67 | /******************************************************************************* | ||
68 | * | ||
69 | * FUNCTION: acpi_ps_parse_loop | ||
70 | * | ||
71 | * PARAMETERS: walk_state - Current state | ||
72 | * | ||
73 | * RETURN: Status | ||
74 | * | ||
75 | * DESCRIPTION: Parse AML (pointed to by the current parser state) and return | ||
76 | * a tree of ops. | ||
77 | * | ||
78 | ******************************************************************************/ | ||
79 | |||
80 | acpi_status | ||
81 | acpi_ps_parse_loop ( | ||
82 | struct acpi_walk_state *walk_state) | ||
83 | { | ||
84 | acpi_status status = AE_OK; | ||
85 | acpi_status status2; | ||
86 | union acpi_parse_object *op = NULL; /* current op */ | ||
87 | union acpi_parse_object *arg = NULL; | ||
88 | union acpi_parse_object *pre_op = NULL; | ||
89 | struct acpi_parse_state *parser_state; | ||
90 | u8 *aml_op_start = NULL; | ||
91 | |||
92 | |||
93 | ACPI_FUNCTION_TRACE_PTR ("ps_parse_loop", walk_state); | ||
94 | |||
95 | if (walk_state->descending_callback == NULL) { | ||
96 | return_ACPI_STATUS (AE_BAD_PARAMETER); | ||
97 | } | ||
98 | |||
99 | parser_state = &walk_state->parser_state; | ||
100 | walk_state->arg_types = 0; | ||
101 | |||
102 | #if (!defined (ACPI_NO_METHOD_EXECUTION) && !defined (ACPI_CONSTANT_EVAL_ONLY)) | ||
103 | |||
104 | if (walk_state->walk_type & ACPI_WALK_METHOD_RESTART) { | ||
105 | /* We are restarting a preempted control method */ | ||
106 | |||
107 | if (acpi_ps_has_completed_scope (parser_state)) { | ||
108 | /* | ||
109 | * We must check if a predicate to an IF or WHILE statement | ||
110 | * was just completed | ||
111 | */ | ||
112 | if ((parser_state->scope->parse_scope.op) && | ||
113 | ((parser_state->scope->parse_scope.op->common.aml_opcode == AML_IF_OP) || | ||
114 | (parser_state->scope->parse_scope.op->common.aml_opcode == AML_WHILE_OP)) && | ||
115 | (walk_state->control_state) && | ||
116 | (walk_state->control_state->common.state == | ||
117 | ACPI_CONTROL_PREDICATE_EXECUTING)) { | ||
118 | /* | ||
119 | * A predicate was just completed, get the value of the | ||
120 | * predicate and branch based on that value | ||
121 | */ | ||
122 | walk_state->op = NULL; | ||
123 | status = acpi_ds_get_predicate_value (walk_state, ACPI_TO_POINTER (TRUE)); | ||
124 | if (ACPI_FAILURE (status) && | ||
125 | ((status & AE_CODE_MASK) != AE_CODE_CONTROL)) { | ||
126 | if (status == AE_AML_NO_RETURN_VALUE) { | ||
127 | ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, | ||
128 | "Invoked method did not return a value, %s\n", | ||
129 | acpi_format_exception (status))); | ||
130 | |||
131 | } | ||
132 | ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, | ||
133 | "get_predicate Failed, %s\n", | ||
134 | acpi_format_exception (status))); | ||
135 | return_ACPI_STATUS (status); | ||
136 | } | ||
137 | |||
138 | status = acpi_ps_next_parse_state (walk_state, op, status); | ||
139 | } | ||
140 | |||
141 | acpi_ps_pop_scope (parser_state, &op, | ||
142 | &walk_state->arg_types, &walk_state->arg_count); | ||
143 | ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Popped scope, Op=%p\n", op)); | ||
144 | } | ||
145 | else if (walk_state->prev_op) { | ||
146 | /* We were in the middle of an op */ | ||
147 | |||
148 | op = walk_state->prev_op; | ||
149 | walk_state->arg_types = walk_state->prev_arg_types; | ||
150 | } | ||
151 | } | ||
152 | #endif | ||
153 | |||
154 | /* Iterative parsing loop, while there is more AML to process: */ | ||
155 | |||
156 | while ((parser_state->aml < parser_state->aml_end) || (op)) { | ||
157 | aml_op_start = parser_state->aml; | ||
158 | if (!op) { | ||
159 | /* Get the next opcode from the AML stream */ | ||
160 | |||
161 | walk_state->aml_offset = (u32) ACPI_PTR_DIFF (parser_state->aml, | ||
162 | parser_state->aml_start); | ||
163 | walk_state->opcode = acpi_ps_peek_opcode (parser_state); | ||
164 | |||
165 | /* | ||
166 | * First cut to determine what we have found: | ||
167 | * 1) A valid AML opcode | ||
168 | * 2) A name string | ||
169 | * 3) An unknown/invalid opcode | ||
170 | */ | ||
171 | walk_state->op_info = acpi_ps_get_opcode_info (walk_state->opcode); | ||
172 | switch (walk_state->op_info->class) { | ||
173 | case AML_CLASS_ASCII: | ||
174 | case AML_CLASS_PREFIX: | ||
175 | /* | ||
176 | * Starts with a valid prefix or ASCII char, this is a name | ||
177 | * string. Convert the bare name string to a namepath. | ||
178 | */ | ||
179 | walk_state->opcode = AML_INT_NAMEPATH_OP; | ||
180 | walk_state->arg_types = ARGP_NAMESTRING; | ||
181 | break; | ||
182 | |||
183 | case AML_CLASS_UNKNOWN: | ||
184 | |||
185 | /* The opcode is unrecognized. Just skip unknown opcodes */ | ||
186 | |||
187 | ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, | ||
188 | "Found unknown opcode %X at AML address %p offset %X, ignoring\n", | ||
189 | walk_state->opcode, parser_state->aml, walk_state->aml_offset)); | ||
190 | |||
191 | ACPI_DUMP_BUFFER (parser_state->aml, 128); | ||
192 | |||
193 | /* Assume one-byte bad opcode */ | ||
194 | |||
195 | parser_state->aml++; | ||
196 | continue; | ||
197 | |||
198 | default: | ||
199 | |||
200 | /* Found opcode info, this is a normal opcode */ | ||
201 | |||
202 | parser_state->aml += acpi_ps_get_opcode_size (walk_state->opcode); | ||
203 | walk_state->arg_types = walk_state->op_info->parse_args; | ||
204 | break; | ||
205 | } | ||
206 | |||
207 | /* Create Op structure and append to parent's argument list */ | ||
208 | |||
209 | if (walk_state->op_info->flags & AML_NAMED) { | ||
210 | /* Allocate a new pre_op if necessary */ | ||
211 | |||
212 | if (!pre_op) { | ||
213 | pre_op = acpi_ps_alloc_op (walk_state->opcode); | ||
214 | if (!pre_op) { | ||
215 | status = AE_NO_MEMORY; | ||
216 | goto close_this_op; | ||
217 | } | ||
218 | } | ||
219 | |||
220 | pre_op->common.value.arg = NULL; | ||
221 | pre_op->common.aml_opcode = walk_state->opcode; | ||
222 | |||
223 | /* | ||
224 | * Get and append arguments until we find the node that contains | ||
225 | * the name (the type ARGP_NAME). | ||
226 | */ | ||
227 | while (GET_CURRENT_ARG_TYPE (walk_state->arg_types) && | ||
228 | (GET_CURRENT_ARG_TYPE (walk_state->arg_types) != ARGP_NAME)) { | ||
229 | status = acpi_ps_get_next_arg (walk_state, parser_state, | ||
230 | GET_CURRENT_ARG_TYPE (walk_state->arg_types), &arg); | ||
231 | if (ACPI_FAILURE (status)) { | ||
232 | goto close_this_op; | ||
233 | } | ||
234 | |||
235 | acpi_ps_append_arg (pre_op, arg); | ||
236 | INCREMENT_ARG_LIST (walk_state->arg_types); | ||
237 | } | ||
238 | |||
239 | /* | ||
240 | * Make sure that we found a NAME and didn't run out of | ||
241 | * arguments | ||
242 | */ | ||
243 | if (!GET_CURRENT_ARG_TYPE (walk_state->arg_types)) { | ||
244 | status = AE_AML_NO_OPERAND; | ||
245 | goto close_this_op; | ||
246 | } | ||
247 | |||
248 | /* We know that this arg is a name, move to next arg */ | ||
249 | |||
250 | INCREMENT_ARG_LIST (walk_state->arg_types); | ||
251 | |||
252 | /* | ||
253 | * Find the object. This will either insert the object into | ||
254 | * the namespace or simply look it up | ||
255 | */ | ||
256 | walk_state->op = NULL; | ||
257 | |||
258 | status = walk_state->descending_callback (walk_state, &op); | ||
259 | if (ACPI_FAILURE (status)) { | ||
260 | ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, | ||
261 | "During name lookup/catalog, %s\n", | ||
262 | acpi_format_exception (status))); | ||
263 | goto close_this_op; | ||
264 | } | ||
265 | |||
266 | if (!op) { | ||
267 | continue; | ||
268 | } | ||
269 | |||
270 | status = acpi_ps_next_parse_state (walk_state, op, status); | ||
271 | if (status == AE_CTRL_PENDING) { | ||
272 | status = AE_OK; | ||
273 | goto close_this_op; | ||
274 | } | ||
275 | |||
276 | if (ACPI_FAILURE (status)) { | ||
277 | goto close_this_op; | ||
278 | } | ||
279 | |||
280 | acpi_ps_append_arg (op, pre_op->common.value.arg); | ||
281 | acpi_gbl_depth++; | ||
282 | |||
283 | if (op->common.aml_opcode == AML_REGION_OP) { | ||
284 | /* | ||
285 | * Defer final parsing of an operation_region body, | ||
286 | * because we don't have enough info in the first pass | ||
287 | * to parse it correctly (i.e., there may be method | ||
288 | * calls within the term_arg elements of the body.) | ||
289 | * | ||
290 | * However, we must continue parsing because | ||
291 | * the opregion is not a standalone package -- | ||
292 | * we don't know where the end is at this point. | ||
293 | * | ||
294 | * (Length is unknown until parse of the body complete) | ||
295 | */ | ||
296 | op->named.data = aml_op_start; | ||
297 | op->named.length = 0; | ||
298 | } | ||
299 | } | ||
300 | else { | ||
301 | /* Not a named opcode, just allocate Op and append to parent */ | ||
302 | |||
303 | walk_state->op_info = acpi_ps_get_opcode_info (walk_state->opcode); | ||
304 | op = acpi_ps_alloc_op (walk_state->opcode); | ||
305 | if (!op) { | ||
306 | status = AE_NO_MEMORY; | ||
307 | goto close_this_op; | ||
308 | } | ||
309 | |||
310 | if (walk_state->op_info->flags & AML_CREATE) { | ||
311 | /* | ||
312 | * Backup to beginning of create_xXXfield declaration | ||
313 | * body_length is unknown until we parse the body | ||
314 | */ | ||
315 | op->named.data = aml_op_start; | ||
316 | op->named.length = 0; | ||
317 | } | ||
318 | |||
319 | acpi_ps_append_arg (acpi_ps_get_parent_scope (parser_state), op); | ||
320 | |||
321 | if ((walk_state->descending_callback != NULL)) { | ||
322 | /* | ||
323 | * Find the object. This will either insert the object into | ||
324 | * the namespace or simply look it up | ||
325 | */ | ||
326 | walk_state->op = op; | ||
327 | |||
328 | status = walk_state->descending_callback (walk_state, &op); | ||
329 | status = acpi_ps_next_parse_state (walk_state, op, status); | ||
330 | if (status == AE_CTRL_PENDING) { | ||
331 | status = AE_OK; | ||
332 | goto close_this_op; | ||
333 | } | ||
334 | |||
335 | if (ACPI_FAILURE (status)) { | ||
336 | goto close_this_op; | ||
337 | } | ||
338 | } | ||
339 | } | ||
340 | |||
341 | op->common.aml_offset = walk_state->aml_offset; | ||
342 | |||
343 | if (walk_state->op_info) { | ||
344 | ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, | ||
345 | "Opcode %4.4X [%s] Op %p Aml %p aml_offset %5.5X\n", | ||
346 | (u32) op->common.aml_opcode, walk_state->op_info->name, | ||
347 | op, parser_state->aml, op->common.aml_offset)); | ||
348 | } | ||
349 | } | ||
350 | |||
351 | |||
352 | /* | ||
353 | * Start arg_count at zero because we don't know if there are | ||
354 | * any args yet | ||
355 | */ | ||
356 | walk_state->arg_count = 0; | ||
357 | |||
358 | /* Are there any arguments that must be processed? */ | ||
359 | |||
360 | if (walk_state->arg_types) { | ||
361 | /* Get arguments */ | ||
362 | |||
363 | switch (op->common.aml_opcode) { | ||
364 | case AML_BYTE_OP: /* AML_BYTEDATA_ARG */ | ||
365 | case AML_WORD_OP: /* AML_WORDDATA_ARG */ | ||
366 | case AML_DWORD_OP: /* AML_DWORDATA_ARG */ | ||
367 | case AML_QWORD_OP: /* AML_QWORDATA_ARG */ | ||
368 | case AML_STRING_OP: /* AML_ASCIICHARLIST_ARG */ | ||
369 | |||
370 | /* Fill in constant or string argument directly */ | ||
371 | |||
372 | acpi_ps_get_next_simple_arg (parser_state, | ||
373 | GET_CURRENT_ARG_TYPE (walk_state->arg_types), op); | ||
374 | break; | ||
375 | |||
376 | case AML_INT_NAMEPATH_OP: /* AML_NAMESTRING_ARG */ | ||
377 | |||
378 | status = acpi_ps_get_next_namepath (walk_state, parser_state, op, 1); | ||
379 | if (ACPI_FAILURE (status)) { | ||
380 | goto close_this_op; | ||
381 | } | ||
382 | |||
383 | walk_state->arg_types = 0; | ||
384 | break; | ||
385 | |||
386 | default: | ||
387 | /* | ||
388 | * Op is not a constant or string, append each argument | ||
389 | * to the Op | ||
390 | */ | ||
391 | while (GET_CURRENT_ARG_TYPE (walk_state->arg_types) && | ||
392 | !walk_state->arg_count) { | ||
393 | walk_state->aml_offset = (u32) | ||
394 | ACPI_PTR_DIFF (parser_state->aml, parser_state->aml_start); | ||
395 | |||
396 | status = acpi_ps_get_next_arg (walk_state, parser_state, | ||
397 | GET_CURRENT_ARG_TYPE (walk_state->arg_types), | ||
398 | &arg); | ||
399 | if (ACPI_FAILURE (status)) { | ||
400 | goto close_this_op; | ||
401 | } | ||
402 | |||
403 | if (arg) { | ||
404 | arg->common.aml_offset = walk_state->aml_offset; | ||
405 | acpi_ps_append_arg (op, arg); | ||
406 | } | ||
407 | INCREMENT_ARG_LIST (walk_state->arg_types); | ||
408 | } | ||
409 | |||
410 | /* Special processing for certain opcodes */ | ||
411 | |||
412 | if ((walk_state->pass_number <= ACPI_IMODE_LOAD_PASS1) && | ||
413 | ((walk_state->parse_flags & ACPI_PARSE_DISASSEMBLE) == 0)) { | ||
414 | /* | ||
415 | * We want to skip If/Else/While constructs during Pass1 | ||
416 | * because we want to actually conditionally execute the | ||
417 | * code during Pass2. | ||
418 | * | ||
419 | * Except for disassembly, where we always want to | ||
420 | * walk the If/Else/While packages | ||
421 | */ | ||
422 | switch (op->common.aml_opcode) { | ||
423 | case AML_IF_OP: | ||
424 | case AML_ELSE_OP: | ||
425 | case AML_WHILE_OP: | ||
426 | |||
427 | /* Skip body of if/else/while in pass 1 */ | ||
428 | |||
429 | parser_state->aml = parser_state->pkg_end; | ||
430 | walk_state->arg_count = 0; | ||
431 | break; | ||
432 | |||
433 | default: | ||
434 | break; | ||
435 | } | ||
436 | } | ||
437 | |||
438 | switch (op->common.aml_opcode) { | ||
439 | case AML_METHOD_OP: | ||
440 | |||
441 | /* | ||
442 | * Skip parsing of control method | ||
443 | * because we don't have enough info in the first pass | ||
444 | * to parse it correctly. | ||
445 | * | ||
446 | * Save the length and address of the body | ||
447 | */ | ||
448 | op->named.data = parser_state->aml; | ||
449 | op->named.length = (u32) (parser_state->pkg_end - | ||
450 | parser_state->aml); | ||
451 | |||
452 | /* Skip body of method */ | ||
453 | |||
454 | parser_state->aml = parser_state->pkg_end; | ||
455 | walk_state->arg_count = 0; | ||
456 | break; | ||
457 | |||
458 | case AML_BUFFER_OP: | ||
459 | case AML_PACKAGE_OP: | ||
460 | case AML_VAR_PACKAGE_OP: | ||
461 | |||
462 | if ((op->common.parent) && | ||
463 | (op->common.parent->common.aml_opcode == AML_NAME_OP) && | ||
464 | (walk_state->pass_number <= ACPI_IMODE_LOAD_PASS2)) { | ||
465 | /* | ||
466 | * Skip parsing of Buffers and Packages | ||
467 | * because we don't have enough info in the first pass | ||
468 | * to parse them correctly. | ||
469 | */ | ||
470 | op->named.data = aml_op_start; | ||
471 | op->named.length = (u32) (parser_state->pkg_end - | ||
472 | aml_op_start); | ||
473 | |||
474 | /* Skip body */ | ||
475 | |||
476 | parser_state->aml = parser_state->pkg_end; | ||
477 | walk_state->arg_count = 0; | ||
478 | } | ||
479 | break; | ||
480 | |||
481 | case AML_WHILE_OP: | ||
482 | |||
483 | if (walk_state->control_state) { | ||
484 | walk_state->control_state->control.package_end = | ||
485 | parser_state->pkg_end; | ||
486 | } | ||
487 | break; | ||
488 | |||
489 | default: | ||
490 | |||
491 | /* No action for all other opcodes */ | ||
492 | break; | ||
493 | } | ||
494 | break; | ||
495 | } | ||
496 | } | ||
497 | |||
498 | /* Check for arguments that need to be processed */ | ||
499 | |||
500 | if (walk_state->arg_count) { | ||
501 | /* | ||
502 | * There are arguments (complex ones), push Op and | ||
503 | * prepare for argument | ||
504 | */ | ||
505 | status = acpi_ps_push_scope (parser_state, op, | ||
506 | walk_state->arg_types, walk_state->arg_count); | ||
507 | if (ACPI_FAILURE (status)) { | ||
508 | goto close_this_op; | ||
509 | } | ||
510 | op = NULL; | ||
511 | continue; | ||
512 | } | ||
513 | |||
514 | /* | ||
515 | * All arguments have been processed -- Op is complete, | ||
516 | * prepare for next | ||
517 | */ | ||
518 | walk_state->op_info = acpi_ps_get_opcode_info (op->common.aml_opcode); | ||
519 | if (walk_state->op_info->flags & AML_NAMED) { | ||
520 | if (acpi_gbl_depth) { | ||
521 | acpi_gbl_depth--; | ||
522 | } | ||
523 | |||
524 | if (op->common.aml_opcode == AML_REGION_OP) { | ||
525 | /* | ||
526 | * Skip parsing of control method or opregion body, | ||
527 | * because we don't have enough info in the first pass | ||
528 | * to parse them correctly. | ||
529 | * | ||
530 | * Completed parsing an op_region declaration, we now | ||
531 | * know the length. | ||
532 | */ | ||
533 | op->named.length = (u32) (parser_state->aml - op->named.data); | ||
534 | } | ||
535 | } | ||
536 | |||
537 | if (walk_state->op_info->flags & AML_CREATE) { | ||
538 | /* | ||
539 | * Backup to beginning of create_xXXfield declaration (1 for | ||
540 | * Opcode) | ||
541 | * | ||
542 | * body_length is unknown until we parse the body | ||
543 | */ | ||
544 | op->named.length = (u32) (parser_state->aml - op->named.data); | ||
545 | } | ||
546 | |||
547 | /* This op complete, notify the dispatcher */ | ||
548 | |||
549 | if (walk_state->ascending_callback != NULL) { | ||
550 | walk_state->op = op; | ||
551 | walk_state->opcode = op->common.aml_opcode; | ||
552 | |||
553 | status = walk_state->ascending_callback (walk_state); | ||
554 | status = acpi_ps_next_parse_state (walk_state, op, status); | ||
555 | if (status == AE_CTRL_PENDING) { | ||
556 | status = AE_OK; | ||
557 | goto close_this_op; | ||
558 | } | ||
559 | } | ||
560 | |||
561 | |||
562 | close_this_op: | ||
563 | /* | ||
564 | * Finished one argument of the containing scope | ||
565 | */ | ||
566 | parser_state->scope->parse_scope.arg_count--; | ||
567 | |||
568 | /* Finished with pre_op */ | ||
569 | |||
570 | if (pre_op) { | ||
571 | acpi_ps_free_op (pre_op); | ||
572 | pre_op = NULL; | ||
573 | } | ||
574 | |||
575 | /* Close this Op (will result in parse subtree deletion) */ | ||
576 | |||
577 | status2 = acpi_ps_complete_this_op (walk_state, op); | ||
578 | if (ACPI_FAILURE (status2)) { | ||
579 | return_ACPI_STATUS (status2); | ||
580 | } | ||
581 | op = NULL; | ||
582 | |||
583 | switch (status) { | ||
584 | case AE_OK: | ||
585 | break; | ||
586 | |||
587 | |||
588 | case AE_CTRL_TRANSFER: | ||
589 | |||
590 | /* We are about to transfer to a called method. */ | ||
591 | |||
592 | walk_state->prev_op = op; | ||
593 | walk_state->prev_arg_types = walk_state->arg_types; | ||
594 | return_ACPI_STATUS (status); | ||
595 | |||
596 | |||
597 | case AE_CTRL_END: | ||
598 | |||
599 | acpi_ps_pop_scope (parser_state, &op, | ||
600 | &walk_state->arg_types, &walk_state->arg_count); | ||
601 | |||
602 | if (op) { | ||
603 | walk_state->op = op; | ||
604 | walk_state->op_info = acpi_ps_get_opcode_info (op->common.aml_opcode); | ||
605 | walk_state->opcode = op->common.aml_opcode; | ||
606 | |||
607 | status = walk_state->ascending_callback (walk_state); | ||
608 | status = acpi_ps_next_parse_state (walk_state, op, status); | ||
609 | |||
610 | status2 = acpi_ps_complete_this_op (walk_state, op); | ||
611 | if (ACPI_FAILURE (status2)) { | ||
612 | return_ACPI_STATUS (status2); | ||
613 | } | ||
614 | op = NULL; | ||
615 | } | ||
616 | status = AE_OK; | ||
617 | break; | ||
618 | |||
619 | |||
620 | case AE_CTRL_BREAK: | ||
621 | case AE_CTRL_CONTINUE: | ||
622 | |||
623 | /* Pop off scopes until we find the While */ | ||
624 | |||
625 | while (!op || (op->common.aml_opcode != AML_WHILE_OP)) { | ||
626 | acpi_ps_pop_scope (parser_state, &op, | ||
627 | &walk_state->arg_types, &walk_state->arg_count); | ||
628 | } | ||
629 | |||
630 | /* Close this iteration of the While loop */ | ||
631 | |||
632 | walk_state->op = op; | ||
633 | walk_state->op_info = acpi_ps_get_opcode_info (op->common.aml_opcode); | ||
634 | walk_state->opcode = op->common.aml_opcode; | ||
635 | |||
636 | status = walk_state->ascending_callback (walk_state); | ||
637 | status = acpi_ps_next_parse_state (walk_state, op, status); | ||
638 | |||
639 | status2 = acpi_ps_complete_this_op (walk_state, op); | ||
640 | if (ACPI_FAILURE (status2)) { | ||
641 | return_ACPI_STATUS (status2); | ||
642 | } | ||
643 | op = NULL; | ||
644 | |||
645 | status = AE_OK; | ||
646 | break; | ||
647 | |||
648 | |||
649 | case AE_CTRL_TERMINATE: | ||
650 | |||
651 | status = AE_OK; | ||
652 | |||
653 | /* Clean up */ | ||
654 | do { | ||
655 | if (op) { | ||
656 | status2 = acpi_ps_complete_this_op (walk_state, op); | ||
657 | if (ACPI_FAILURE (status2)) { | ||
658 | return_ACPI_STATUS (status2); | ||
659 | } | ||
660 | } | ||
661 | acpi_ps_pop_scope (parser_state, &op, | ||
662 | &walk_state->arg_types, &walk_state->arg_count); | ||
663 | |||
664 | } while (op); | ||
665 | |||
666 | return_ACPI_STATUS (status); | ||
667 | |||
668 | |||
669 | default: /* All other non-AE_OK status */ | ||
670 | |||
671 | do { | ||
672 | if (op) { | ||
673 | status2 = acpi_ps_complete_this_op (walk_state, op); | ||
674 | if (ACPI_FAILURE (status2)) { | ||
675 | return_ACPI_STATUS (status2); | ||
676 | } | ||
677 | } | ||
678 | acpi_ps_pop_scope (parser_state, &op, | ||
679 | &walk_state->arg_types, &walk_state->arg_count); | ||
680 | |||
681 | } while (op); | ||
682 | |||
683 | |||
684 | /* | ||
685 | * TBD: Cleanup parse ops on error | ||
686 | */ | ||
687 | #if 0 | ||
688 | if (op == NULL) { | ||
689 | acpi_ps_pop_scope (parser_state, &op, | ||
690 | &walk_state->arg_types, &walk_state->arg_count); | ||
691 | } | ||
692 | #endif | ||
693 | walk_state->prev_op = op; | ||
694 | walk_state->prev_arg_types = walk_state->arg_types; | ||
695 | return_ACPI_STATUS (status); | ||
696 | } | ||
697 | |||
698 | /* This scope complete? */ | ||
699 | |||
700 | if (acpi_ps_has_completed_scope (parser_state)) { | ||
701 | acpi_ps_pop_scope (parser_state, &op, | ||
702 | &walk_state->arg_types, &walk_state->arg_count); | ||
703 | ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Popped scope, Op=%p\n", op)); | ||
704 | } | ||
705 | else { | ||
706 | op = NULL; | ||
707 | } | ||
708 | |||
709 | } /* while parser_state->Aml */ | ||
710 | |||
711 | |||
712 | /* | ||
713 | * Complete the last Op (if not completed), and clear the scope stack. | ||
714 | * It is easily possible to end an AML "package" with an unbounded number | ||
715 | * of open scopes (such as when several ASL blocks are closed with | ||
716 | * sequential closing braces). We want to terminate each one cleanly. | ||
717 | */ | ||
718 | ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "AML package complete at Op %p\n", op)); | ||
719 | do { | ||
720 | if (op) { | ||
721 | if (walk_state->ascending_callback != NULL) { | ||
722 | walk_state->op = op; | ||
723 | walk_state->op_info = acpi_ps_get_opcode_info (op->common.aml_opcode); | ||
724 | walk_state->opcode = op->common.aml_opcode; | ||
725 | |||
726 | status = walk_state->ascending_callback (walk_state); | ||
727 | status = acpi_ps_next_parse_state (walk_state, op, status); | ||
728 | if (status == AE_CTRL_PENDING) { | ||
729 | status = AE_OK; | ||
730 | goto close_this_op; | ||
731 | } | ||
732 | |||
733 | if (status == AE_CTRL_TERMINATE) { | ||
734 | status = AE_OK; | ||
735 | |||
736 | /* Clean up */ | ||
737 | do { | ||
738 | if (op) { | ||
739 | status2 = acpi_ps_complete_this_op (walk_state, op); | ||
740 | if (ACPI_FAILURE (status2)) { | ||
741 | return_ACPI_STATUS (status2); | ||
742 | } | ||
743 | } | ||
744 | |||
745 | acpi_ps_pop_scope (parser_state, &op, | ||
746 | &walk_state->arg_types, &walk_state->arg_count); | ||
747 | |||
748 | } while (op); | ||
749 | |||
750 | return_ACPI_STATUS (status); | ||
751 | } | ||
752 | |||
753 | else if (ACPI_FAILURE (status)) { | ||
754 | /* First error is most important */ | ||
755 | |||
756 | (void) acpi_ps_complete_this_op (walk_state, op); | ||
757 | return_ACPI_STATUS (status); | ||
758 | } | ||
759 | } | ||
760 | |||
761 | status2 = acpi_ps_complete_this_op (walk_state, op); | ||
762 | if (ACPI_FAILURE (status2)) { | ||
763 | return_ACPI_STATUS (status2); | ||
764 | } | ||
765 | } | ||
766 | |||
767 | acpi_ps_pop_scope (parser_state, &op, &walk_state->arg_types, | ||
768 | &walk_state->arg_count); | ||
769 | |||
770 | } while (op); | ||
771 | |||
772 | return_ACPI_STATUS (status); | ||
773 | } | ||
774 | |||
775 | |||
diff --git a/drivers/acpi/parser/psopcode.c b/drivers/acpi/parser/psopcode.c index 95ef5e8947a8..6f7594a516d2 100644 --- a/drivers/acpi/parser/psopcode.c +++ b/drivers/acpi/parser/psopcode.c | |||
@@ -428,33 +428,23 @@ acpi_ps_get_opcode_info ( | |||
428 | /* | 428 | /* |
429 | * Detect normal 8-bit opcode or extended 16-bit opcode | 429 | * Detect normal 8-bit opcode or extended 16-bit opcode |
430 | */ | 430 | */ |
431 | switch ((u8) (opcode >> 8)) { | 431 | if (!(opcode & 0xFF00)) { |
432 | case 0: | ||
433 | |||
434 | /* Simple (8-bit) opcode: 0-255, can't index beyond table */ | 432 | /* Simple (8-bit) opcode: 0-255, can't index beyond table */ |
435 | 433 | ||
436 | return (&acpi_gbl_aml_op_info [acpi_gbl_short_op_index [(u8) opcode]]); | 434 | return (&acpi_gbl_aml_op_info [acpi_gbl_short_op_index [(u8) opcode]]); |
435 | } | ||
437 | 436 | ||
438 | case AML_EXTOP: | 437 | if (((opcode & 0xFF00) == AML_EXTENDED_OPCODE) && |
439 | 438 | (((u8) opcode) <= MAX_EXTENDED_OPCODE)) { | |
440 | /* Extended (16-bit, prefix+opcode) opcode */ | 439 | /* Valid extended (16-bit) opcode */ |
441 | |||
442 | if (((u8) opcode) <= MAX_EXTENDED_OPCODE) { | ||
443 | return (&acpi_gbl_aml_op_info [acpi_gbl_long_op_index [(u8) opcode]]); | ||
444 | } | ||
445 | |||
446 | /* Else fall through to error case below */ | ||
447 | /*lint -fallthrough */ | ||
448 | |||
449 | default: | ||
450 | 440 | ||
451 | ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, | 441 | return (&acpi_gbl_aml_op_info [acpi_gbl_long_op_index [(u8) opcode]]); |
452 | "Unknown AML opcode [%4.4X]\n", opcode)); | ||
453 | break; | ||
454 | } | 442 | } |
455 | 443 | ||
444 | /* Unknown AML opcode */ | ||
456 | 445 | ||
457 | /* Default is "unknown opcode" */ | 446 | ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, |
447 | "Unknown AML opcode [%4.4X]\n", opcode)); | ||
458 | 448 | ||
459 | return (&acpi_gbl_aml_op_info [_UNK]); | 449 | return (&acpi_gbl_aml_op_info [_UNK]); |
460 | } | 450 | } |
diff --git a/drivers/acpi/parser/psparse.c b/drivers/acpi/parser/psparse.c index bdbe0d99486f..16b84a3d0436 100644 --- a/drivers/acpi/parser/psparse.c +++ b/drivers/acpi/parser/psparse.c | |||
@@ -62,26 +62,6 @@ | |||
62 | ACPI_MODULE_NAME ("psparse") | 62 | ACPI_MODULE_NAME ("psparse") |
63 | 63 | ||
64 | 64 | ||
65 | static u32 acpi_gbl_depth = 0; | ||
66 | |||
67 | /* Local prototypes */ | ||
68 | |||
69 | static acpi_status | ||
70 | acpi_ps_complete_this_op ( | ||
71 | struct acpi_walk_state *walk_state, | ||
72 | union acpi_parse_object *op); | ||
73 | |||
74 | static acpi_status | ||
75 | acpi_ps_next_parse_state ( | ||
76 | struct acpi_walk_state *walk_state, | ||
77 | union acpi_parse_object *op, | ||
78 | acpi_status callback_status); | ||
79 | |||
80 | static acpi_status | ||
81 | acpi_ps_parse_loop ( | ||
82 | struct acpi_walk_state *walk_state); | ||
83 | |||
84 | |||
85 | /******************************************************************************* | 65 | /******************************************************************************* |
86 | * | 66 | * |
87 | * FUNCTION: acpi_ps_get_opcode_size | 67 | * FUNCTION: acpi_ps_get_opcode_size |
@@ -134,8 +114,8 @@ acpi_ps_peek_opcode ( | |||
134 | aml = parser_state->aml; | 114 | aml = parser_state->aml; |
135 | opcode = (u16) ACPI_GET8 (aml); | 115 | opcode = (u16) ACPI_GET8 (aml); |
136 | 116 | ||
137 | if (opcode == AML_EXTOP) { | 117 | if (opcode == AML_EXTENDED_OP_PREFIX) { |
138 | /* Extended opcode */ | 118 | /* Extended opcode, get the second opcode byte */ |
139 | 119 | ||
140 | aml++; | 120 | aml++; |
141 | opcode = (u16) ((opcode << 8) | ACPI_GET8 (aml)); | 121 | opcode = (u16) ((opcode << 8) | ACPI_GET8 (aml)); |
@@ -158,7 +138,7 @@ acpi_ps_peek_opcode ( | |||
158 | * | 138 | * |
159 | ******************************************************************************/ | 139 | ******************************************************************************/ |
160 | 140 | ||
161 | static acpi_status | 141 | acpi_status |
162 | acpi_ps_complete_this_op ( | 142 | acpi_ps_complete_this_op ( |
163 | struct acpi_walk_state *walk_state, | 143 | struct acpi_walk_state *walk_state, |
164 | union acpi_parse_object *op) | 144 | union acpi_parse_object *op) |
@@ -331,7 +311,7 @@ allocate_error: | |||
331 | * | 311 | * |
332 | ******************************************************************************/ | 312 | ******************************************************************************/ |
333 | 313 | ||
334 | static acpi_status | 314 | acpi_status |
335 | acpi_ps_next_parse_state ( | 315 | acpi_ps_next_parse_state ( |
336 | struct acpi_walk_state *walk_state, | 316 | struct acpi_walk_state *walk_state, |
337 | union acpi_parse_object *op, | 317 | union acpi_parse_object *op, |
@@ -441,706 +421,6 @@ acpi_ps_next_parse_state ( | |||
441 | 421 | ||
442 | /******************************************************************************* | 422 | /******************************************************************************* |
443 | * | 423 | * |
444 | * FUNCTION: acpi_ps_parse_loop | ||
445 | * | ||
446 | * PARAMETERS: walk_state - Current state | ||
447 | * | ||
448 | * RETURN: Status | ||
449 | * | ||
450 | * DESCRIPTION: Parse AML (pointed to by the current parser state) and return | ||
451 | * a tree of ops. | ||
452 | * | ||
453 | ******************************************************************************/ | ||
454 | |||
455 | static acpi_status | ||
456 | acpi_ps_parse_loop ( | ||
457 | struct acpi_walk_state *walk_state) | ||
458 | { | ||
459 | acpi_status status = AE_OK; | ||
460 | acpi_status status2; | ||
461 | union acpi_parse_object *op = NULL; /* current op */ | ||
462 | union acpi_parse_object *arg = NULL; | ||
463 | union acpi_parse_object *pre_op = NULL; | ||
464 | struct acpi_parse_state *parser_state; | ||
465 | u8 *aml_op_start = NULL; | ||
466 | |||
467 | |||
468 | ACPI_FUNCTION_TRACE_PTR ("ps_parse_loop", walk_state); | ||
469 | |||
470 | if (walk_state->descending_callback == NULL) { | ||
471 | return_ACPI_STATUS (AE_BAD_PARAMETER); | ||
472 | } | ||
473 | |||
474 | parser_state = &walk_state->parser_state; | ||
475 | walk_state->arg_types = 0; | ||
476 | |||
477 | #if (!defined (ACPI_NO_METHOD_EXECUTION) && !defined (ACPI_CONSTANT_EVAL_ONLY)) | ||
478 | |||
479 | if (walk_state->walk_type & ACPI_WALK_METHOD_RESTART) { | ||
480 | /* We are restarting a preempted control method */ | ||
481 | |||
482 | if (acpi_ps_has_completed_scope (parser_state)) { | ||
483 | /* | ||
484 | * We must check if a predicate to an IF or WHILE statement | ||
485 | * was just completed | ||
486 | */ | ||
487 | if ((parser_state->scope->parse_scope.op) && | ||
488 | ((parser_state->scope->parse_scope.op->common.aml_opcode == AML_IF_OP) || | ||
489 | (parser_state->scope->parse_scope.op->common.aml_opcode == AML_WHILE_OP)) && | ||
490 | (walk_state->control_state) && | ||
491 | (walk_state->control_state->common.state == | ||
492 | ACPI_CONTROL_PREDICATE_EXECUTING)) { | ||
493 | /* | ||
494 | * A predicate was just completed, get the value of the | ||
495 | * predicate and branch based on that value | ||
496 | */ | ||
497 | walk_state->op = NULL; | ||
498 | status = acpi_ds_get_predicate_value (walk_state, ACPI_TO_POINTER (TRUE)); | ||
499 | if (ACPI_FAILURE (status) && | ||
500 | ((status & AE_CODE_MASK) != AE_CODE_CONTROL)) { | ||
501 | if (status == AE_AML_NO_RETURN_VALUE) { | ||
502 | ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, | ||
503 | "Invoked method did not return a value, %s\n", | ||
504 | acpi_format_exception (status))); | ||
505 | |||
506 | } | ||
507 | ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, | ||
508 | "get_predicate Failed, %s\n", | ||
509 | acpi_format_exception (status))); | ||
510 | return_ACPI_STATUS (status); | ||
511 | } | ||
512 | |||
513 | status = acpi_ps_next_parse_state (walk_state, op, status); | ||
514 | } | ||
515 | |||
516 | acpi_ps_pop_scope (parser_state, &op, | ||
517 | &walk_state->arg_types, &walk_state->arg_count); | ||
518 | ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Popped scope, Op=%p\n", op)); | ||
519 | } | ||
520 | else if (walk_state->prev_op) { | ||
521 | /* We were in the middle of an op */ | ||
522 | |||
523 | op = walk_state->prev_op; | ||
524 | walk_state->arg_types = walk_state->prev_arg_types; | ||
525 | } | ||
526 | } | ||
527 | #endif | ||
528 | |||
529 | /* Iterative parsing loop, while there is more AML to process: */ | ||
530 | |||
531 | while ((parser_state->aml < parser_state->aml_end) || (op)) { | ||
532 | aml_op_start = parser_state->aml; | ||
533 | if (!op) { | ||
534 | /* Get the next opcode from the AML stream */ | ||
535 | |||
536 | walk_state->aml_offset = (u32) ACPI_PTR_DIFF (parser_state->aml, | ||
537 | parser_state->aml_start); | ||
538 | walk_state->opcode = acpi_ps_peek_opcode (parser_state); | ||
539 | |||
540 | /* | ||
541 | * First cut to determine what we have found: | ||
542 | * 1) A valid AML opcode | ||
543 | * 2) A name string | ||
544 | * 3) An unknown/invalid opcode | ||
545 | */ | ||
546 | walk_state->op_info = acpi_ps_get_opcode_info (walk_state->opcode); | ||
547 | switch (walk_state->op_info->class) { | ||
548 | case AML_CLASS_ASCII: | ||
549 | case AML_CLASS_PREFIX: | ||
550 | /* | ||
551 | * Starts with a valid prefix or ASCII char, this is a name | ||
552 | * string. Convert the bare name string to a namepath. | ||
553 | */ | ||
554 | walk_state->opcode = AML_INT_NAMEPATH_OP; | ||
555 | walk_state->arg_types = ARGP_NAMESTRING; | ||
556 | break; | ||
557 | |||
558 | case AML_CLASS_UNKNOWN: | ||
559 | |||
560 | /* The opcode is unrecognized. Just skip unknown opcodes */ | ||
561 | |||
562 | ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, | ||
563 | "Found unknown opcode %X at AML address %p offset %X, ignoring\n", | ||
564 | walk_state->opcode, parser_state->aml, walk_state->aml_offset)); | ||
565 | |||
566 | ACPI_DUMP_BUFFER (parser_state->aml, 128); | ||
567 | |||
568 | /* Assume one-byte bad opcode */ | ||
569 | |||
570 | parser_state->aml++; | ||
571 | continue; | ||
572 | |||
573 | default: | ||
574 | |||
575 | /* Found opcode info, this is a normal opcode */ | ||
576 | |||
577 | parser_state->aml += acpi_ps_get_opcode_size (walk_state->opcode); | ||
578 | walk_state->arg_types = walk_state->op_info->parse_args; | ||
579 | break; | ||
580 | } | ||
581 | |||
582 | /* Create Op structure and append to parent's argument list */ | ||
583 | |||
584 | if (walk_state->op_info->flags & AML_NAMED) { | ||
585 | /* Allocate a new pre_op if necessary */ | ||
586 | |||
587 | if (!pre_op) { | ||
588 | pre_op = acpi_ps_alloc_op (walk_state->opcode); | ||
589 | if (!pre_op) { | ||
590 | status = AE_NO_MEMORY; | ||
591 | goto close_this_op; | ||
592 | } | ||
593 | } | ||
594 | |||
595 | pre_op->common.value.arg = NULL; | ||
596 | pre_op->common.aml_opcode = walk_state->opcode; | ||
597 | |||
598 | /* | ||
599 | * Get and append arguments until we find the node that contains | ||
600 | * the name (the type ARGP_NAME). | ||
601 | */ | ||
602 | while (GET_CURRENT_ARG_TYPE (walk_state->arg_types) && | ||
603 | (GET_CURRENT_ARG_TYPE (walk_state->arg_types) != ARGP_NAME)) { | ||
604 | status = acpi_ps_get_next_arg (walk_state, parser_state, | ||
605 | GET_CURRENT_ARG_TYPE (walk_state->arg_types), &arg); | ||
606 | if (ACPI_FAILURE (status)) { | ||
607 | goto close_this_op; | ||
608 | } | ||
609 | |||
610 | acpi_ps_append_arg (pre_op, arg); | ||
611 | INCREMENT_ARG_LIST (walk_state->arg_types); | ||
612 | } | ||
613 | |||
614 | /* | ||
615 | * Make sure that we found a NAME and didn't run out of | ||
616 | * arguments | ||
617 | */ | ||
618 | if (!GET_CURRENT_ARG_TYPE (walk_state->arg_types)) { | ||
619 | status = AE_AML_NO_OPERAND; | ||
620 | goto close_this_op; | ||
621 | } | ||
622 | |||
623 | /* We know that this arg is a name, move to next arg */ | ||
624 | |||
625 | INCREMENT_ARG_LIST (walk_state->arg_types); | ||
626 | |||
627 | /* | ||
628 | * Find the object. This will either insert the object into | ||
629 | * the namespace or simply look it up | ||
630 | */ | ||
631 | walk_state->op = NULL; | ||
632 | |||
633 | status = walk_state->descending_callback (walk_state, &op); | ||
634 | if (ACPI_FAILURE (status)) { | ||
635 | ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, | ||
636 | "During name lookup/catalog, %s\n", | ||
637 | acpi_format_exception (status))); | ||
638 | goto close_this_op; | ||
639 | } | ||
640 | |||
641 | if (!op) { | ||
642 | continue; | ||
643 | } | ||
644 | |||
645 | status = acpi_ps_next_parse_state (walk_state, op, status); | ||
646 | if (status == AE_CTRL_PENDING) { | ||
647 | status = AE_OK; | ||
648 | goto close_this_op; | ||
649 | } | ||
650 | |||
651 | if (ACPI_FAILURE (status)) { | ||
652 | goto close_this_op; | ||
653 | } | ||
654 | |||
655 | acpi_ps_append_arg (op, pre_op->common.value.arg); | ||
656 | acpi_gbl_depth++; | ||
657 | |||
658 | if (op->common.aml_opcode == AML_REGION_OP) { | ||
659 | /* | ||
660 | * Defer final parsing of an operation_region body, | ||
661 | * because we don't have enough info in the first pass | ||
662 | * to parse it correctly (i.e., there may be method | ||
663 | * calls within the term_arg elements of the body.) | ||
664 | * | ||
665 | * However, we must continue parsing because | ||
666 | * the opregion is not a standalone package -- | ||
667 | * we don't know where the end is at this point. | ||
668 | * | ||
669 | * (Length is unknown until parse of the body complete) | ||
670 | */ | ||
671 | op->named.data = aml_op_start; | ||
672 | op->named.length = 0; | ||
673 | } | ||
674 | } | ||
675 | else { | ||
676 | /* Not a named opcode, just allocate Op and append to parent */ | ||
677 | |||
678 | walk_state->op_info = acpi_ps_get_opcode_info (walk_state->opcode); | ||
679 | op = acpi_ps_alloc_op (walk_state->opcode); | ||
680 | if (!op) { | ||
681 | status = AE_NO_MEMORY; | ||
682 | goto close_this_op; | ||
683 | } | ||
684 | |||
685 | if (walk_state->op_info->flags & AML_CREATE) { | ||
686 | /* | ||
687 | * Backup to beginning of create_xXXfield declaration | ||
688 | * body_length is unknown until we parse the body | ||
689 | */ | ||
690 | op->named.data = aml_op_start; | ||
691 | op->named.length = 0; | ||
692 | } | ||
693 | |||
694 | acpi_ps_append_arg (acpi_ps_get_parent_scope (parser_state), op); | ||
695 | |||
696 | if ((walk_state->descending_callback != NULL)) { | ||
697 | /* | ||
698 | * Find the object. This will either insert the object into | ||
699 | * the namespace or simply look it up | ||
700 | */ | ||
701 | walk_state->op = op; | ||
702 | |||
703 | status = walk_state->descending_callback (walk_state, &op); | ||
704 | status = acpi_ps_next_parse_state (walk_state, op, status); | ||
705 | if (status == AE_CTRL_PENDING) { | ||
706 | status = AE_OK; | ||
707 | goto close_this_op; | ||
708 | } | ||
709 | |||
710 | if (ACPI_FAILURE (status)) { | ||
711 | goto close_this_op; | ||
712 | } | ||
713 | } | ||
714 | } | ||
715 | |||
716 | op->common.aml_offset = walk_state->aml_offset; | ||
717 | |||
718 | if (walk_state->op_info) { | ||
719 | ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, | ||
720 | "Opcode %4.4X [%s] Op %p Aml %p aml_offset %5.5X\n", | ||
721 | (u32) op->common.aml_opcode, walk_state->op_info->name, | ||
722 | op, parser_state->aml, op->common.aml_offset)); | ||
723 | } | ||
724 | } | ||
725 | |||
726 | |||
727 | /* | ||
728 | * Start arg_count at zero because we don't know if there are | ||
729 | * any args yet | ||
730 | */ | ||
731 | walk_state->arg_count = 0; | ||
732 | |||
733 | /* Are there any arguments that must be processed? */ | ||
734 | |||
735 | if (walk_state->arg_types) { | ||
736 | /* Get arguments */ | ||
737 | |||
738 | switch (op->common.aml_opcode) { | ||
739 | case AML_BYTE_OP: /* AML_BYTEDATA_ARG */ | ||
740 | case AML_WORD_OP: /* AML_WORDDATA_ARG */ | ||
741 | case AML_DWORD_OP: /* AML_DWORDATA_ARG */ | ||
742 | case AML_QWORD_OP: /* AML_QWORDATA_ARG */ | ||
743 | case AML_STRING_OP: /* AML_ASCIICHARLIST_ARG */ | ||
744 | |||
745 | /* Fill in constant or string argument directly */ | ||
746 | |||
747 | acpi_ps_get_next_simple_arg (parser_state, | ||
748 | GET_CURRENT_ARG_TYPE (walk_state->arg_types), op); | ||
749 | break; | ||
750 | |||
751 | case AML_INT_NAMEPATH_OP: /* AML_NAMESTRING_ARG */ | ||
752 | |||
753 | status = acpi_ps_get_next_namepath (walk_state, parser_state, op, 1); | ||
754 | if (ACPI_FAILURE (status)) { | ||
755 | goto close_this_op; | ||
756 | } | ||
757 | |||
758 | walk_state->arg_types = 0; | ||
759 | break; | ||
760 | |||
761 | default: | ||
762 | /* | ||
763 | * Op is not a constant or string, append each argument | ||
764 | * to the Op | ||
765 | */ | ||
766 | while (GET_CURRENT_ARG_TYPE (walk_state->arg_types) && | ||
767 | !walk_state->arg_count) { | ||
768 | walk_state->aml_offset = (u32) | ||
769 | ACPI_PTR_DIFF (parser_state->aml, parser_state->aml_start); | ||
770 | |||
771 | status = acpi_ps_get_next_arg (walk_state, parser_state, | ||
772 | GET_CURRENT_ARG_TYPE (walk_state->arg_types), | ||
773 | &arg); | ||
774 | if (ACPI_FAILURE (status)) { | ||
775 | goto close_this_op; | ||
776 | } | ||
777 | |||
778 | if (arg) { | ||
779 | arg->common.aml_offset = walk_state->aml_offset; | ||
780 | acpi_ps_append_arg (op, arg); | ||
781 | } | ||
782 | INCREMENT_ARG_LIST (walk_state->arg_types); | ||
783 | } | ||
784 | |||
785 | /* Special processing for certain opcodes */ | ||
786 | |||
787 | if (walk_state->pass_number <= ACPI_IMODE_LOAD_PASS1) { | ||
788 | switch (op->common.aml_opcode) { | ||
789 | case AML_IF_OP: | ||
790 | case AML_ELSE_OP: | ||
791 | case AML_WHILE_OP: | ||
792 | |||
793 | /* Skip body of if/else/while in pass 1 */ | ||
794 | |||
795 | parser_state->aml = parser_state->pkg_end; | ||
796 | walk_state->arg_count = 0; | ||
797 | break; | ||
798 | |||
799 | default: | ||
800 | break; | ||
801 | } | ||
802 | } | ||
803 | |||
804 | switch (op->common.aml_opcode) { | ||
805 | case AML_METHOD_OP: | ||
806 | |||
807 | /* | ||
808 | * Skip parsing of control method | ||
809 | * because we don't have enough info in the first pass | ||
810 | * to parse it correctly. | ||
811 | * | ||
812 | * Save the length and address of the body | ||
813 | */ | ||
814 | op->named.data = parser_state->aml; | ||
815 | op->named.length = (u32) (parser_state->pkg_end - | ||
816 | parser_state->aml); | ||
817 | |||
818 | /* Skip body of method */ | ||
819 | |||
820 | parser_state->aml = parser_state->pkg_end; | ||
821 | walk_state->arg_count = 0; | ||
822 | break; | ||
823 | |||
824 | case AML_BUFFER_OP: | ||
825 | case AML_PACKAGE_OP: | ||
826 | case AML_VAR_PACKAGE_OP: | ||
827 | |||
828 | if ((op->common.parent) && | ||
829 | (op->common.parent->common.aml_opcode == AML_NAME_OP) && | ||
830 | (walk_state->pass_number <= ACPI_IMODE_LOAD_PASS2)) { | ||
831 | /* | ||
832 | * Skip parsing of Buffers and Packages | ||
833 | * because we don't have enough info in the first pass | ||
834 | * to parse them correctly. | ||
835 | */ | ||
836 | op->named.data = aml_op_start; | ||
837 | op->named.length = (u32) (parser_state->pkg_end - | ||
838 | aml_op_start); | ||
839 | |||
840 | /* Skip body */ | ||
841 | |||
842 | parser_state->aml = parser_state->pkg_end; | ||
843 | walk_state->arg_count = 0; | ||
844 | } | ||
845 | break; | ||
846 | |||
847 | case AML_WHILE_OP: | ||
848 | |||
849 | if (walk_state->control_state) { | ||
850 | walk_state->control_state->control.package_end = | ||
851 | parser_state->pkg_end; | ||
852 | } | ||
853 | break; | ||
854 | |||
855 | default: | ||
856 | |||
857 | /* No action for all other opcodes */ | ||
858 | break; | ||
859 | } | ||
860 | break; | ||
861 | } | ||
862 | } | ||
863 | |||
864 | /* Check for arguments that need to be processed */ | ||
865 | |||
866 | if (walk_state->arg_count) { | ||
867 | /* | ||
868 | * There are arguments (complex ones), push Op and | ||
869 | * prepare for argument | ||
870 | */ | ||
871 | status = acpi_ps_push_scope (parser_state, op, | ||
872 | walk_state->arg_types, walk_state->arg_count); | ||
873 | if (ACPI_FAILURE (status)) { | ||
874 | goto close_this_op; | ||
875 | } | ||
876 | op = NULL; | ||
877 | continue; | ||
878 | } | ||
879 | |||
880 | /* | ||
881 | * All arguments have been processed -- Op is complete, | ||
882 | * prepare for next | ||
883 | */ | ||
884 | walk_state->op_info = acpi_ps_get_opcode_info (op->common.aml_opcode); | ||
885 | if (walk_state->op_info->flags & AML_NAMED) { | ||
886 | if (acpi_gbl_depth) { | ||
887 | acpi_gbl_depth--; | ||
888 | } | ||
889 | |||
890 | if (op->common.aml_opcode == AML_REGION_OP) { | ||
891 | /* | ||
892 | * Skip parsing of control method or opregion body, | ||
893 | * because we don't have enough info in the first pass | ||
894 | * to parse them correctly. | ||
895 | * | ||
896 | * Completed parsing an op_region declaration, we now | ||
897 | * know the length. | ||
898 | */ | ||
899 | op->named.length = (u32) (parser_state->aml - op->named.data); | ||
900 | } | ||
901 | } | ||
902 | |||
903 | if (walk_state->op_info->flags & AML_CREATE) { | ||
904 | /* | ||
905 | * Backup to beginning of create_xXXfield declaration (1 for | ||
906 | * Opcode) | ||
907 | * | ||
908 | * body_length is unknown until we parse the body | ||
909 | */ | ||
910 | op->named.length = (u32) (parser_state->aml - op->named.data); | ||
911 | } | ||
912 | |||
913 | /* This op complete, notify the dispatcher */ | ||
914 | |||
915 | if (walk_state->ascending_callback != NULL) { | ||
916 | walk_state->op = op; | ||
917 | walk_state->opcode = op->common.aml_opcode; | ||
918 | |||
919 | status = walk_state->ascending_callback (walk_state); | ||
920 | status = acpi_ps_next_parse_state (walk_state, op, status); | ||
921 | if (status == AE_CTRL_PENDING) { | ||
922 | status = AE_OK; | ||
923 | goto close_this_op; | ||
924 | } | ||
925 | } | ||
926 | |||
927 | |||
928 | close_this_op: | ||
929 | /* | ||
930 | * Finished one argument of the containing scope | ||
931 | */ | ||
932 | parser_state->scope->parse_scope.arg_count--; | ||
933 | |||
934 | /* Finished with pre_op */ | ||
935 | |||
936 | if (pre_op) { | ||
937 | acpi_ps_free_op (pre_op); | ||
938 | pre_op = NULL; | ||
939 | } | ||
940 | |||
941 | /* Close this Op (will result in parse subtree deletion) */ | ||
942 | |||
943 | status2 = acpi_ps_complete_this_op (walk_state, op); | ||
944 | if (ACPI_FAILURE (status2)) { | ||
945 | return_ACPI_STATUS (status2); | ||
946 | } | ||
947 | op = NULL; | ||
948 | |||
949 | switch (status) { | ||
950 | case AE_OK: | ||
951 | break; | ||
952 | |||
953 | |||
954 | case AE_CTRL_TRANSFER: | ||
955 | |||
956 | /* We are about to transfer to a called method. */ | ||
957 | |||
958 | walk_state->prev_op = op; | ||
959 | walk_state->prev_arg_types = walk_state->arg_types; | ||
960 | return_ACPI_STATUS (status); | ||
961 | |||
962 | |||
963 | case AE_CTRL_END: | ||
964 | |||
965 | acpi_ps_pop_scope (parser_state, &op, | ||
966 | &walk_state->arg_types, &walk_state->arg_count); | ||
967 | |||
968 | if (op) { | ||
969 | walk_state->op = op; | ||
970 | walk_state->op_info = acpi_ps_get_opcode_info (op->common.aml_opcode); | ||
971 | walk_state->opcode = op->common.aml_opcode; | ||
972 | |||
973 | status = walk_state->ascending_callback (walk_state); | ||
974 | status = acpi_ps_next_parse_state (walk_state, op, status); | ||
975 | |||
976 | status2 = acpi_ps_complete_this_op (walk_state, op); | ||
977 | if (ACPI_FAILURE (status2)) { | ||
978 | return_ACPI_STATUS (status2); | ||
979 | } | ||
980 | op = NULL; | ||
981 | } | ||
982 | status = AE_OK; | ||
983 | break; | ||
984 | |||
985 | |||
986 | case AE_CTRL_BREAK: | ||
987 | case AE_CTRL_CONTINUE: | ||
988 | |||
989 | /* Pop off scopes until we find the While */ | ||
990 | |||
991 | while (!op || (op->common.aml_opcode != AML_WHILE_OP)) { | ||
992 | acpi_ps_pop_scope (parser_state, &op, | ||
993 | &walk_state->arg_types, &walk_state->arg_count); | ||
994 | } | ||
995 | |||
996 | /* Close this iteration of the While loop */ | ||
997 | |||
998 | walk_state->op = op; | ||
999 | walk_state->op_info = acpi_ps_get_opcode_info (op->common.aml_opcode); | ||
1000 | walk_state->opcode = op->common.aml_opcode; | ||
1001 | |||
1002 | status = walk_state->ascending_callback (walk_state); | ||
1003 | status = acpi_ps_next_parse_state (walk_state, op, status); | ||
1004 | |||
1005 | status2 = acpi_ps_complete_this_op (walk_state, op); | ||
1006 | if (ACPI_FAILURE (status2)) { | ||
1007 | return_ACPI_STATUS (status2); | ||
1008 | } | ||
1009 | op = NULL; | ||
1010 | |||
1011 | status = AE_OK; | ||
1012 | break; | ||
1013 | |||
1014 | |||
1015 | case AE_CTRL_TERMINATE: | ||
1016 | |||
1017 | status = AE_OK; | ||
1018 | |||
1019 | /* Clean up */ | ||
1020 | do { | ||
1021 | if (op) { | ||
1022 | status2 = acpi_ps_complete_this_op (walk_state, op); | ||
1023 | if (ACPI_FAILURE (status2)) { | ||
1024 | return_ACPI_STATUS (status2); | ||
1025 | } | ||
1026 | } | ||
1027 | acpi_ps_pop_scope (parser_state, &op, | ||
1028 | &walk_state->arg_types, &walk_state->arg_count); | ||
1029 | |||
1030 | } while (op); | ||
1031 | |||
1032 | return_ACPI_STATUS (status); | ||
1033 | |||
1034 | |||
1035 | default: /* All other non-AE_OK status */ | ||
1036 | |||
1037 | do { | ||
1038 | if (op) { | ||
1039 | status2 = acpi_ps_complete_this_op (walk_state, op); | ||
1040 | if (ACPI_FAILURE (status2)) { | ||
1041 | return_ACPI_STATUS (status2); | ||
1042 | } | ||
1043 | } | ||
1044 | acpi_ps_pop_scope (parser_state, &op, | ||
1045 | &walk_state->arg_types, &walk_state->arg_count); | ||
1046 | |||
1047 | } while (op); | ||
1048 | |||
1049 | |||
1050 | /* | ||
1051 | * TBD: Cleanup parse ops on error | ||
1052 | */ | ||
1053 | #if 0 | ||
1054 | if (op == NULL) { | ||
1055 | acpi_ps_pop_scope (parser_state, &op, | ||
1056 | &walk_state->arg_types, &walk_state->arg_count); | ||
1057 | } | ||
1058 | #endif | ||
1059 | walk_state->prev_op = op; | ||
1060 | walk_state->prev_arg_types = walk_state->arg_types; | ||
1061 | return_ACPI_STATUS (status); | ||
1062 | } | ||
1063 | |||
1064 | /* This scope complete? */ | ||
1065 | |||
1066 | if (acpi_ps_has_completed_scope (parser_state)) { | ||
1067 | acpi_ps_pop_scope (parser_state, &op, | ||
1068 | &walk_state->arg_types, &walk_state->arg_count); | ||
1069 | ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Popped scope, Op=%p\n", op)); | ||
1070 | } | ||
1071 | else { | ||
1072 | op = NULL; | ||
1073 | } | ||
1074 | |||
1075 | } /* while parser_state->Aml */ | ||
1076 | |||
1077 | |||
1078 | /* | ||
1079 | * Complete the last Op (if not completed), and clear the scope stack. | ||
1080 | * It is easily possible to end an AML "package" with an unbounded number | ||
1081 | * of open scopes (such as when several ASL blocks are closed with | ||
1082 | * sequential closing braces). We want to terminate each one cleanly. | ||
1083 | */ | ||
1084 | ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "AML package complete at Op %p\n", op)); | ||
1085 | do { | ||
1086 | if (op) { | ||
1087 | if (walk_state->ascending_callback != NULL) { | ||
1088 | walk_state->op = op; | ||
1089 | walk_state->op_info = acpi_ps_get_opcode_info (op->common.aml_opcode); | ||
1090 | walk_state->opcode = op->common.aml_opcode; | ||
1091 | |||
1092 | status = walk_state->ascending_callback (walk_state); | ||
1093 | status = acpi_ps_next_parse_state (walk_state, op, status); | ||
1094 | if (status == AE_CTRL_PENDING) { | ||
1095 | status = AE_OK; | ||
1096 | goto close_this_op; | ||
1097 | } | ||
1098 | |||
1099 | if (status == AE_CTRL_TERMINATE) { | ||
1100 | status = AE_OK; | ||
1101 | |||
1102 | /* Clean up */ | ||
1103 | do { | ||
1104 | if (op) { | ||
1105 | status2 = acpi_ps_complete_this_op (walk_state, op); | ||
1106 | if (ACPI_FAILURE (status2)) { | ||
1107 | return_ACPI_STATUS (status2); | ||
1108 | } | ||
1109 | } | ||
1110 | |||
1111 | acpi_ps_pop_scope (parser_state, &op, | ||
1112 | &walk_state->arg_types, &walk_state->arg_count); | ||
1113 | |||
1114 | } while (op); | ||
1115 | |||
1116 | return_ACPI_STATUS (status); | ||
1117 | } | ||
1118 | |||
1119 | else if (ACPI_FAILURE (status)) { | ||
1120 | /* First error is most important */ | ||
1121 | |||
1122 | (void) acpi_ps_complete_this_op (walk_state, op); | ||
1123 | return_ACPI_STATUS (status); | ||
1124 | } | ||
1125 | } | ||
1126 | |||
1127 | status2 = acpi_ps_complete_this_op (walk_state, op); | ||
1128 | if (ACPI_FAILURE (status2)) { | ||
1129 | return_ACPI_STATUS (status2); | ||
1130 | } | ||
1131 | } | ||
1132 | |||
1133 | acpi_ps_pop_scope (parser_state, &op, &walk_state->arg_types, | ||
1134 | &walk_state->arg_count); | ||
1135 | |||
1136 | } while (op); | ||
1137 | |||
1138 | return_ACPI_STATUS (status); | ||
1139 | } | ||
1140 | |||
1141 | |||
1142 | /******************************************************************************* | ||
1143 | * | ||
1144 | * FUNCTION: acpi_ps_parse_aml | 424 | * FUNCTION: acpi_ps_parse_aml |
1145 | * | 425 | * |
1146 | * PARAMETERS: walk_state - Current state | 426 | * PARAMETERS: walk_state - Current state |
diff --git a/drivers/acpi/parser/psutils.c b/drivers/acpi/parser/psutils.c index a10f88715d43..19a27020eeef 100644 --- a/drivers/acpi/parser/psutils.c +++ b/drivers/acpi/parser/psutils.c | |||
@@ -154,12 +154,14 @@ acpi_ps_alloc_op ( | |||
154 | if (flags == ACPI_PARSEOP_GENERIC) { | 154 | if (flags == ACPI_PARSEOP_GENERIC) { |
155 | /* The generic op (default) is by far the most common (16 to 1) */ | 155 | /* The generic op (default) is by far the most common (16 to 1) */ |
156 | 156 | ||
157 | op = acpi_ut_acquire_from_cache (ACPI_MEM_LIST_PSNODE); | 157 | op = acpi_os_acquire_object (acpi_gbl_ps_node_cache); |
158 | memset(op, 0, sizeof(struct acpi_parse_obj_common)); | ||
158 | } | 159 | } |
159 | else { | 160 | else { |
160 | /* Extended parseop */ | 161 | /* Extended parseop */ |
161 | 162 | ||
162 | op = acpi_ut_acquire_from_cache (ACPI_MEM_LIST_PSNODE_EXT); | 163 | op = acpi_os_acquire_object (acpi_gbl_ps_node_ext_cache); |
164 | memset(op, 0, sizeof(struct acpi_parse_obj_named)); | ||
163 | } | 165 | } |
164 | 166 | ||
165 | /* Initialize the Op */ | 167 | /* Initialize the Op */ |
@@ -198,41 +200,14 @@ acpi_ps_free_op ( | |||
198 | } | 200 | } |
199 | 201 | ||
200 | if (op->common.flags & ACPI_PARSEOP_GENERIC) { | 202 | if (op->common.flags & ACPI_PARSEOP_GENERIC) { |
201 | acpi_ut_release_to_cache (ACPI_MEM_LIST_PSNODE, op); | 203 | acpi_os_release_object (acpi_gbl_ps_node_cache, op); |
202 | } | 204 | } |
203 | else { | 205 | else { |
204 | acpi_ut_release_to_cache (ACPI_MEM_LIST_PSNODE_EXT, op); | 206 | acpi_os_release_object (acpi_gbl_ps_node_ext_cache, op); |
205 | } | 207 | } |
206 | } | 208 | } |
207 | 209 | ||
208 | 210 | ||
209 | #ifdef ACPI_ENABLE_OBJECT_CACHE | ||
210 | /******************************************************************************* | ||
211 | * | ||
212 | * FUNCTION: acpi_ps_delete_parse_cache | ||
213 | * | ||
214 | * PARAMETERS: None | ||
215 | * | ||
216 | * RETURN: None | ||
217 | * | ||
218 | * DESCRIPTION: Free all objects that are on the parse cache list. | ||
219 | * | ||
220 | ******************************************************************************/ | ||
221 | |||
222 | void | ||
223 | acpi_ps_delete_parse_cache ( | ||
224 | void) | ||
225 | { | ||
226 | ACPI_FUNCTION_TRACE ("ps_delete_parse_cache"); | ||
227 | |||
228 | |||
229 | acpi_ut_delete_generic_cache (ACPI_MEM_LIST_PSNODE); | ||
230 | acpi_ut_delete_generic_cache (ACPI_MEM_LIST_PSNODE_EXT); | ||
231 | return_VOID; | ||
232 | } | ||
233 | #endif | ||
234 | |||
235 | |||
236 | /******************************************************************************* | 211 | /******************************************************************************* |
237 | * | 212 | * |
238 | * FUNCTION: Utility functions | 213 | * FUNCTION: Utility functions |
diff --git a/drivers/acpi/tables/tbconvrt.c b/drivers/acpi/tables/tbconvrt.c index 92e0c31539be..d4ff71f5fe5d 100644 --- a/drivers/acpi/tables/tbconvrt.c +++ b/drivers/acpi/tables/tbconvrt.c | |||
@@ -97,7 +97,9 @@ acpi_tb_get_table_count ( | |||
97 | ACPI_FUNCTION_ENTRY (); | 97 | ACPI_FUNCTION_ENTRY (); |
98 | 98 | ||
99 | 99 | ||
100 | if (RSDP->revision < 2) { | 100 | /* RSDT pointers are 32 bits, XSDT pointers are 64 bits */ |
101 | |||
102 | if (acpi_gbl_root_table_type == ACPI_TABLE_TYPE_RSDT) { | ||
101 | pointer_size = sizeof (u32); | 103 | pointer_size = sizeof (u32); |
102 | } | 104 | } |
103 | else { | 105 | else { |
@@ -158,7 +160,9 @@ acpi_tb_convert_to_xsdt ( | |||
158 | /* Copy the table pointers */ | 160 | /* Copy the table pointers */ |
159 | 161 | ||
160 | for (i = 0; i < acpi_gbl_rsdt_table_count; i++) { | 162 | for (i = 0; i < acpi_gbl_rsdt_table_count; i++) { |
161 | if (acpi_gbl_RSDP->revision < 2) { | 163 | /* RSDT pointers are 32 bits, XSDT pointers are 64 bits */ |
164 | |||
165 | if (acpi_gbl_root_table_type == ACPI_TABLE_TYPE_RSDT) { | ||
162 | ACPI_STORE_ADDRESS (new_table->table_offset_entry[i], | 166 | ACPI_STORE_ADDRESS (new_table->table_offset_entry[i], |
163 | (ACPI_CAST_PTR (struct rsdt_descriptor_rev1, | 167 | (ACPI_CAST_PTR (struct rsdt_descriptor_rev1, |
164 | table_info->pointer))->table_offset_entry[i]); | 168 | table_info->pointer))->table_offset_entry[i]); |
diff --git a/drivers/acpi/tables/tbrsdt.c b/drivers/acpi/tables/tbrsdt.c index b7ffe39c3626..13c6ddb2f546 100644 --- a/drivers/acpi/tables/tbrsdt.c +++ b/drivers/acpi/tables/tbrsdt.c | |||
@@ -159,8 +159,8 @@ cleanup: | |||
159 | * | 159 | * |
160 | * RETURN: None, Address | 160 | * RETURN: None, Address |
161 | * | 161 | * |
162 | * DESCRIPTION: Extract the address of the RSDT or XSDT, depending on the | 162 | * DESCRIPTION: Extract the address of either the RSDT or XSDT, depending on the |
163 | * version of the RSDP | 163 | * version of the RSDP and whether the XSDT pointer is valid |
164 | * | 164 | * |
165 | ******************************************************************************/ | 165 | ******************************************************************************/ |
166 | 166 | ||
@@ -174,16 +174,19 @@ acpi_tb_get_rsdt_address ( | |||
174 | 174 | ||
175 | out_address->pointer_type = acpi_gbl_table_flags | ACPI_LOGICAL_ADDRESSING; | 175 | out_address->pointer_type = acpi_gbl_table_flags | ACPI_LOGICAL_ADDRESSING; |
176 | 176 | ||
177 | /* | 177 | /* Use XSDT if it is present */ |
178 | * For RSDP revision 0 or 1, we use the RSDT. | 178 | |
179 | * For RSDP revision 2 (and above), we use the XSDT | 179 | if ((acpi_gbl_RSDP->revision >= 2) && |
180 | */ | 180 | acpi_gbl_RSDP->xsdt_physical_address) { |
181 | if (acpi_gbl_RSDP->revision < 2) { | ||
182 | out_address->pointer.value = acpi_gbl_RSDP->rsdt_physical_address; | ||
183 | } | ||
184 | else { | ||
185 | out_address->pointer.value = | 181 | out_address->pointer.value = |
186 | acpi_gbl_RSDP->xsdt_physical_address; | 182 | acpi_gbl_RSDP->xsdt_physical_address; |
183 | acpi_gbl_root_table_type = ACPI_TABLE_TYPE_XSDT; | ||
184 | } | ||
185 | else { | ||
186 | /* No XSDT, use the RSDT */ | ||
187 | |||
188 | out_address->pointer.value = acpi_gbl_RSDP->rsdt_physical_address; | ||
189 | acpi_gbl_root_table_type = ACPI_TABLE_TYPE_RSDT; | ||
187 | } | 190 | } |
188 | } | 191 | } |
189 | 192 | ||
@@ -211,10 +214,9 @@ acpi_tb_validate_rsdt ( | |||
211 | 214 | ||
212 | 215 | ||
213 | /* | 216 | /* |
214 | * For RSDP revision 0 or 1, we use the RSDT. | 217 | * Search for appropriate signature, RSDT or XSDT |
215 | * For RSDP revision 2 and above, we use the XSDT | ||
216 | */ | 218 | */ |
217 | if (acpi_gbl_RSDP->revision < 2) { | 219 | if (acpi_gbl_root_table_type == ACPI_TABLE_TYPE_RSDT) { |
218 | no_match = ACPI_STRNCMP ((char *) table_ptr, RSDT_SIG, | 220 | no_match = ACPI_STRNCMP ((char *) table_ptr, RSDT_SIG, |
219 | sizeof (RSDT_SIG) -1); | 221 | sizeof (RSDT_SIG) -1); |
220 | } | 222 | } |
@@ -236,11 +238,11 @@ acpi_tb_validate_rsdt ( | |||
236 | acpi_gbl_RSDP->rsdt_physical_address, | 238 | acpi_gbl_RSDP->rsdt_physical_address, |
237 | (void *) (acpi_native_uint) acpi_gbl_RSDP->rsdt_physical_address)); | 239 | (void *) (acpi_native_uint) acpi_gbl_RSDP->rsdt_physical_address)); |
238 | 240 | ||
239 | if (acpi_gbl_RSDP->revision < 2) { | 241 | if (acpi_gbl_root_table_type == ACPI_TABLE_TYPE_RSDT) { |
240 | ACPI_REPORT_ERROR (("Looking for RSDT (RSDP->Rev < 2)\n")) | 242 | ACPI_REPORT_ERROR (("Looking for RSDT\n")) |
241 | } | 243 | } |
242 | else { | 244 | else { |
243 | ACPI_REPORT_ERROR (("Looking for XSDT (RSDP->Rev >= 2)\n")) | 245 | ACPI_REPORT_ERROR (("Looking for XSDT\n")) |
244 | } | 246 | } |
245 | 247 | ||
246 | ACPI_DUMP_BUFFER ((char *) table_ptr, 48); | 248 | ACPI_DUMP_BUFFER ((char *) table_ptr, 48); |
diff --git a/drivers/acpi/tables/tbxfroot.c b/drivers/acpi/tables/tbxfroot.c index 198997aa7fbe..fe9c8317df46 100644 --- a/drivers/acpi/tables/tbxfroot.c +++ b/drivers/acpi/tables/tbxfroot.c | |||
@@ -287,9 +287,11 @@ acpi_get_firmware_table ( | |||
287 | * requested table | 287 | * requested table |
288 | */ | 288 | */ |
289 | for (i = 0, j = 0; i < table_count; i++) { | 289 | for (i = 0, j = 0; i < table_count; i++) { |
290 | /* Get the next table pointer, handle RSDT vs. XSDT */ | 290 | /* |
291 | 291 | * Get the next table pointer, handle RSDT vs. XSDT | |
292 | if (acpi_gbl_RSDP->revision < 2) { | 292 | * RSDT pointers are 32 bits, XSDT pointers are 64 bits |
293 | */ | ||
294 | if (acpi_gbl_root_table_type == ACPI_TABLE_TYPE_RSDT) { | ||
293 | address.pointer.value = (ACPI_CAST_PTR ( | 295 | address.pointer.value = (ACPI_CAST_PTR ( |
294 | RSDT_DESCRIPTOR, rsdt_info->pointer))->table_offset_entry[i]; | 296 | RSDT_DESCRIPTOR, rsdt_info->pointer))->table_offset_entry[i]; |
295 | } | 297 | } |
diff --git a/drivers/acpi/utilities/Makefile b/drivers/acpi/utilities/Makefile index 939c447dd52a..e87108b7338a 100644 --- a/drivers/acpi/utilities/Makefile +++ b/drivers/acpi/utilities/Makefile | |||
@@ -3,6 +3,6 @@ | |||
3 | # | 3 | # |
4 | 4 | ||
5 | obj-y := utalloc.o utdebug.o uteval.o utinit.o utmisc.o utxface.o \ | 5 | obj-y := utalloc.o utdebug.o uteval.o utinit.o utmisc.o utxface.o \ |
6 | utcopy.o utdelete.o utglobal.o utmath.o utobject.o | 6 | utcopy.o utdelete.o utglobal.o utmath.o utobject.o utstate.o utmutex.o utobject.o utcache.o |
7 | 7 | ||
8 | EXTRA_CFLAGS += $(ACPI_CFLAGS) | 8 | EXTRA_CFLAGS += $(ACPI_CFLAGS) |
diff --git a/drivers/acpi/utilities/utalloc.c b/drivers/acpi/utilities/utalloc.c index c4e7f989a2bd..5061c6f0ee66 100644 --- a/drivers/acpi/utilities/utalloc.c +++ b/drivers/acpi/utilities/utalloc.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /****************************************************************************** | 1 | /****************************************************************************** |
2 | * | 2 | * |
3 | * Module Name: utalloc - local cache and memory allocation routines | 3 | * Module Name: utalloc - local memory allocation routines |
4 | * | 4 | * |
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
@@ -52,12 +52,10 @@ | |||
52 | #ifdef ACPI_DBG_TRACK_ALLOCATIONS | 52 | #ifdef ACPI_DBG_TRACK_ALLOCATIONS |
53 | static struct acpi_debug_mem_block * | 53 | static struct acpi_debug_mem_block * |
54 | acpi_ut_find_allocation ( | 54 | acpi_ut_find_allocation ( |
55 | u32 list_id, | ||
56 | void *allocation); | 55 | void *allocation); |
57 | 56 | ||
58 | static acpi_status | 57 | static acpi_status |
59 | acpi_ut_track_allocation ( | 58 | acpi_ut_track_allocation ( |
60 | u32 list_id, | ||
61 | struct acpi_debug_mem_block *address, | 59 | struct acpi_debug_mem_block *address, |
62 | acpi_size size, | 60 | acpi_size size, |
63 | u8 alloc_type, | 61 | u8 alloc_type, |
@@ -67,206 +65,118 @@ acpi_ut_track_allocation ( | |||
67 | 65 | ||
68 | static acpi_status | 66 | static acpi_status |
69 | acpi_ut_remove_allocation ( | 67 | acpi_ut_remove_allocation ( |
70 | u32 list_id, | ||
71 | struct acpi_debug_mem_block *address, | 68 | struct acpi_debug_mem_block *address, |
72 | u32 component, | 69 | u32 component, |
73 | char *module, | 70 | char *module, |
74 | u32 line); | 71 | u32 line); |
75 | #endif /* ACPI_DBG_TRACK_ALLOCATIONS */ | 72 | #endif /* ACPI_DBG_TRACK_ALLOCATIONS */ |
76 | 73 | ||
77 | 74 | #ifdef ACPI_DBG_TRACK_ALLOCATIONS | |
78 | /******************************************************************************* | 75 | static acpi_status |
79 | * | 76 | acpi_ut_create_list ( |
80 | * FUNCTION: acpi_ut_release_to_cache | 77 | char *list_name, |
81 | * | 78 | u16 object_size, |
82 | * PARAMETERS: list_id - Memory list/cache ID | 79 | acpi_handle *return_cache); |
83 | * Object - The object to be released | ||
84 | * | ||
85 | * RETURN: None | ||
86 | * | ||
87 | * DESCRIPTION: Release an object to the specified cache. If cache is full, | ||
88 | * the object is deleted. | ||
89 | * | ||
90 | ******************************************************************************/ | ||
91 | |||
92 | void | ||
93 | acpi_ut_release_to_cache ( | ||
94 | u32 list_id, | ||
95 | void *object) | ||
96 | { | ||
97 | struct acpi_memory_list *cache_info; | ||
98 | |||
99 | |||
100 | ACPI_FUNCTION_ENTRY (); | ||
101 | |||
102 | |||
103 | cache_info = &acpi_gbl_memory_lists[list_id]; | ||
104 | |||
105 | #ifdef ACPI_ENABLE_OBJECT_CACHE | ||
106 | |||
107 | /* If walk cache is full, just free this wallkstate object */ | ||
108 | |||
109 | if (cache_info->cache_depth >= cache_info->max_cache_depth) { | ||
110 | ACPI_MEM_FREE (object); | ||
111 | ACPI_MEM_TRACKING (cache_info->total_freed++); | ||
112 | } | ||
113 | |||
114 | /* Otherwise put this object back into the cache */ | ||
115 | |||
116 | else { | ||
117 | if (ACPI_FAILURE (acpi_ut_acquire_mutex (ACPI_MTX_CACHES))) { | ||
118 | return; | ||
119 | } | ||
120 | |||
121 | /* Mark the object as cached */ | ||
122 | |||
123 | ACPI_MEMSET (object, 0xCA, cache_info->object_size); | ||
124 | ACPI_SET_DESCRIPTOR_TYPE (object, ACPI_DESC_TYPE_CACHED); | ||
125 | |||
126 | /* Put the object at the head of the cache list */ | ||
127 | |||
128 | * (ACPI_CAST_INDIRECT_PTR (char, | ||
129 | &(((char *) object)[cache_info->link_offset]))) = cache_info->list_head; | ||
130 | cache_info->list_head = object; | ||
131 | cache_info->cache_depth++; | ||
132 | |||
133 | (void) acpi_ut_release_mutex (ACPI_MTX_CACHES); | ||
134 | } | ||
135 | |||
136 | #else | ||
137 | |||
138 | /* Object cache is disabled; just free the object */ | ||
139 | |||
140 | ACPI_MEM_FREE (object); | ||
141 | ACPI_MEM_TRACKING (cache_info->total_freed++); | ||
142 | #endif | 80 | #endif |
143 | } | ||
144 | 81 | ||
145 | 82 | ||
146 | /******************************************************************************* | 83 | /******************************************************************************* |
147 | * | 84 | * |
148 | * FUNCTION: acpi_ut_acquire_from_cache | 85 | * FUNCTION: acpi_ut_create_caches |
149 | * | 86 | * |
150 | * PARAMETERS: list_id - Memory list ID | 87 | * PARAMETERS: None |
151 | * | 88 | * |
152 | * RETURN: A requested object. NULL if the object could not be | 89 | * RETURN: Status |
153 | * allocated. | ||
154 | * | 90 | * |
155 | * DESCRIPTION: Get an object from the specified cache. If cache is empty, | 91 | * DESCRIPTION: Create all local caches |
156 | * the object is allocated. | ||
157 | * | 92 | * |
158 | ******************************************************************************/ | 93 | ******************************************************************************/ |
159 | 94 | ||
160 | void * | 95 | acpi_status |
161 | acpi_ut_acquire_from_cache ( | 96 | acpi_ut_create_caches ( |
162 | u32 list_id) | 97 | void) |
163 | { | 98 | { |
164 | struct acpi_memory_list *cache_info; | 99 | acpi_status status; |
165 | void *object; | ||
166 | |||
167 | |||
168 | ACPI_FUNCTION_NAME ("ut_acquire_from_cache"); | ||
169 | 100 | ||
170 | 101 | ||
171 | cache_info = &acpi_gbl_memory_lists[list_id]; | 102 | #ifdef ACPI_DBG_TRACK_ALLOCATIONS |
172 | 103 | ||
173 | #ifdef ACPI_ENABLE_OBJECT_CACHE | 104 | /* Memory allocation lists */ |
174 | 105 | ||
175 | if (ACPI_FAILURE (acpi_ut_acquire_mutex (ACPI_MTX_CACHES))) { | 106 | status = acpi_ut_create_list ("Acpi-Global", 0, |
176 | return (NULL); | 107 | &acpi_gbl_global_list); |
108 | if (ACPI_FAILURE (status)) { | ||
109 | return (status); | ||
177 | } | 110 | } |
178 | 111 | ||
179 | ACPI_MEM_TRACKING (cache_info->cache_requests++); | 112 | status = acpi_ut_create_list ("Acpi-Namespace", sizeof (struct acpi_namespace_node), |
180 | 113 | &acpi_gbl_ns_node_list); | |
181 | /* Check the cache first */ | 114 | if (ACPI_FAILURE (status)) { |
182 | 115 | return (status); | |
183 | if (cache_info->list_head) { | 116 | } |
184 | /* There is an object available, use it */ | ||
185 | |||
186 | object = cache_info->list_head; | ||
187 | cache_info->list_head = *(ACPI_CAST_INDIRECT_PTR (char, | ||
188 | &(((char *) object)[cache_info->link_offset]))); | ||
189 | |||
190 | ACPI_MEM_TRACKING (cache_info->cache_hits++); | ||
191 | cache_info->cache_depth--; | ||
192 | |||
193 | #ifdef ACPI_DBG_TRACK_ALLOCATIONS | ||
194 | ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Object %p from %s\n", | ||
195 | object, acpi_gbl_memory_lists[list_id].list_name)); | ||
196 | #endif | 117 | #endif |
197 | 118 | ||
198 | if (ACPI_FAILURE (acpi_ut_release_mutex (ACPI_MTX_CACHES))) { | 119 | /* Object Caches, for frequently used objects */ |
199 | return (NULL); | ||
200 | } | ||
201 | |||
202 | /* Clear (zero) the previously used Object */ | ||
203 | 120 | ||
204 | ACPI_MEMSET (object, 0, cache_info->object_size); | 121 | status = acpi_os_create_cache ("acpi_state", sizeof (union acpi_generic_state), |
122 | ACPI_MAX_STATE_CACHE_DEPTH, &acpi_gbl_state_cache); | ||
123 | if (ACPI_FAILURE (status)) { | ||
124 | return (status); | ||
205 | } | 125 | } |
206 | 126 | ||
207 | else { | 127 | status = acpi_os_create_cache ("acpi_parse", sizeof (struct acpi_parse_obj_common), |
208 | /* The cache is empty, create a new object */ | 128 | ACPI_MAX_PARSE_CACHE_DEPTH, &acpi_gbl_ps_node_cache); |
209 | 129 | if (ACPI_FAILURE (status)) { | |
210 | /* Avoid deadlock with ACPI_MEM_CALLOCATE */ | 130 | return (status); |
211 | |||
212 | if (ACPI_FAILURE (acpi_ut_release_mutex (ACPI_MTX_CACHES))) { | ||
213 | return (NULL); | ||
214 | } | ||
215 | |||
216 | object = ACPI_MEM_CALLOCATE (cache_info->object_size); | ||
217 | ACPI_MEM_TRACKING (cache_info->total_allocated++); | ||
218 | } | 131 | } |
219 | 132 | ||
220 | #else | 133 | status = acpi_os_create_cache ("acpi_parse_ext", sizeof (struct acpi_parse_obj_named), |
221 | 134 | ACPI_MAX_EXTPARSE_CACHE_DEPTH, &acpi_gbl_ps_node_ext_cache); | |
222 | /* Object cache is disabled; just allocate the object */ | 135 | if (ACPI_FAILURE (status)) { |
136 | return (status); | ||
137 | } | ||
223 | 138 | ||
224 | object = ACPI_MEM_CALLOCATE (cache_info->object_size); | 139 | status = acpi_os_create_cache ("acpi_operand", sizeof (union acpi_operand_object), |
225 | ACPI_MEM_TRACKING (cache_info->total_allocated++); | 140 | ACPI_MAX_OBJECT_CACHE_DEPTH, &acpi_gbl_operand_cache); |
226 | #endif | 141 | if (ACPI_FAILURE (status)) { |
142 | return (status); | ||
143 | } | ||
227 | 144 | ||
228 | return (object); | 145 | return (AE_OK); |
229 | } | 146 | } |
230 | 147 | ||
231 | 148 | ||
232 | #ifdef ACPI_ENABLE_OBJECT_CACHE | ||
233 | /******************************************************************************* | 149 | /******************************************************************************* |
234 | * | 150 | * |
235 | * FUNCTION: acpi_ut_delete_generic_cache | 151 | * FUNCTION: acpi_ut_delete_caches |
236 | * | 152 | * |
237 | * PARAMETERS: list_id - Memory list ID | 153 | * PARAMETERS: None |
238 | * | 154 | * |
239 | * RETURN: None | 155 | * RETURN: Status |
240 | * | 156 | * |
241 | * DESCRIPTION: Free all objects within the requested cache. | 157 | * DESCRIPTION: Purge and delete all local caches |
242 | * | 158 | * |
243 | ******************************************************************************/ | 159 | ******************************************************************************/ |
244 | 160 | ||
245 | void | 161 | acpi_status |
246 | acpi_ut_delete_generic_cache ( | 162 | acpi_ut_delete_caches ( |
247 | u32 list_id) | 163 | void) |
248 | { | 164 | { |
249 | struct acpi_memory_list *cache_info; | ||
250 | char *next; | ||
251 | 165 | ||
166 | (void) acpi_os_delete_cache (acpi_gbl_state_cache); | ||
167 | acpi_gbl_state_cache = NULL; | ||
252 | 168 | ||
253 | ACPI_FUNCTION_ENTRY (); | 169 | (void) acpi_os_delete_cache (acpi_gbl_operand_cache); |
254 | 170 | acpi_gbl_operand_cache = NULL; | |
255 | 171 | ||
256 | cache_info = &acpi_gbl_memory_lists[list_id]; | 172 | (void) acpi_os_delete_cache (acpi_gbl_ps_node_cache); |
257 | while (cache_info->list_head) { | 173 | acpi_gbl_ps_node_cache = NULL; |
258 | /* Delete one cached state object */ | ||
259 | 174 | ||
260 | next = *(ACPI_CAST_INDIRECT_PTR (char, | 175 | (void) acpi_os_delete_cache (acpi_gbl_ps_node_ext_cache); |
261 | &(((char *) cache_info->list_head)[cache_info->link_offset]))); | 176 | acpi_gbl_ps_node_ext_cache = NULL; |
262 | ACPI_MEM_FREE (cache_info->list_head); | ||
263 | 177 | ||
264 | cache_info->list_head = next; | 178 | return (AE_OK); |
265 | cache_info->cache_depth--; | ||
266 | } | ||
267 | } | 179 | } |
268 | #endif | ||
269 | |||
270 | 180 | ||
271 | /******************************************************************************* | 181 | /******************************************************************************* |
272 | * | 182 | * |
@@ -500,6 +410,43 @@ acpi_ut_callocate ( | |||
500 | * occurs in the body of acpi_ut_free. | 410 | * occurs in the body of acpi_ut_free. |
501 | */ | 411 | */ |
502 | 412 | ||
413 | /******************************************************************************* | ||
414 | * | ||
415 | * FUNCTION: acpi_ut_create_list | ||
416 | * | ||
417 | * PARAMETERS: cache_name - Ascii name for the cache | ||
418 | * object_size - Size of each cached object | ||
419 | * return_cache - Where the new cache object is returned | ||
420 | * | ||
421 | * RETURN: Status | ||
422 | * | ||
423 | * DESCRIPTION: Create a local memory list for tracking purposed | ||
424 | * | ||
425 | ******************************************************************************/ | ||
426 | |||
427 | static acpi_status | ||
428 | acpi_ut_create_list ( | ||
429 | char *list_name, | ||
430 | u16 object_size, | ||
431 | acpi_handle *return_cache) | ||
432 | { | ||
433 | struct acpi_memory_list *cache; | ||
434 | |||
435 | |||
436 | cache = acpi_os_allocate (sizeof (struct acpi_memory_list)); | ||
437 | if (!cache) { | ||
438 | return (AE_NO_MEMORY); | ||
439 | } | ||
440 | |||
441 | ACPI_MEMSET (cache, 0, sizeof (struct acpi_memory_list)); | ||
442 | |||
443 | cache->list_name = list_name; | ||
444 | cache->object_size = object_size; | ||
445 | |||
446 | *return_cache = cache; | ||
447 | return (AE_OK); | ||
448 | } | ||
449 | |||
503 | 450 | ||
504 | /******************************************************************************* | 451 | /******************************************************************************* |
505 | * | 452 | * |
@@ -533,15 +480,15 @@ acpi_ut_allocate_and_track ( | |||
533 | return (NULL); | 480 | return (NULL); |
534 | } | 481 | } |
535 | 482 | ||
536 | status = acpi_ut_track_allocation (ACPI_MEM_LIST_GLOBAL, allocation, size, | 483 | status = acpi_ut_track_allocation (allocation, size, |
537 | ACPI_MEM_MALLOC, component, module, line); | 484 | ACPI_MEM_MALLOC, component, module, line); |
538 | if (ACPI_FAILURE (status)) { | 485 | if (ACPI_FAILURE (status)) { |
539 | acpi_os_free (allocation); | 486 | acpi_os_free (allocation); |
540 | return (NULL); | 487 | return (NULL); |
541 | } | 488 | } |
542 | 489 | ||
543 | acpi_gbl_memory_lists[ACPI_MEM_LIST_GLOBAL].total_allocated++; | 490 | acpi_gbl_global_list->total_allocated++; |
544 | acpi_gbl_memory_lists[ACPI_MEM_LIST_GLOBAL].current_total_size += (u32) size; | 491 | acpi_gbl_global_list->current_total_size += (u32) size; |
545 | 492 | ||
546 | return ((void *) &allocation->user_space); | 493 | return ((void *) &allocation->user_space); |
547 | } | 494 | } |
@@ -583,15 +530,15 @@ acpi_ut_callocate_and_track ( | |||
583 | return (NULL); | 530 | return (NULL); |
584 | } | 531 | } |
585 | 532 | ||
586 | status = acpi_ut_track_allocation (ACPI_MEM_LIST_GLOBAL, allocation, size, | 533 | status = acpi_ut_track_allocation (allocation, size, |
587 | ACPI_MEM_CALLOC, component, module, line); | 534 | ACPI_MEM_CALLOC, component, module, line); |
588 | if (ACPI_FAILURE (status)) { | 535 | if (ACPI_FAILURE (status)) { |
589 | acpi_os_free (allocation); | 536 | acpi_os_free (allocation); |
590 | return (NULL); | 537 | return (NULL); |
591 | } | 538 | } |
592 | 539 | ||
593 | acpi_gbl_memory_lists[ACPI_MEM_LIST_GLOBAL].total_allocated++; | 540 | acpi_gbl_global_list->total_allocated++; |
594 | acpi_gbl_memory_lists[ACPI_MEM_LIST_GLOBAL].current_total_size += (u32) size; | 541 | acpi_gbl_global_list->current_total_size += (u32) size; |
595 | 542 | ||
596 | return ((void *) &allocation->user_space); | 543 | return ((void *) &allocation->user_space); |
597 | } | 544 | } |
@@ -636,10 +583,10 @@ acpi_ut_free_and_track ( | |||
636 | debug_block = ACPI_CAST_PTR (struct acpi_debug_mem_block, | 583 | debug_block = ACPI_CAST_PTR (struct acpi_debug_mem_block, |
637 | (((char *) allocation) - sizeof (struct acpi_debug_mem_header))); | 584 | (((char *) allocation) - sizeof (struct acpi_debug_mem_header))); |
638 | 585 | ||
639 | acpi_gbl_memory_lists[ACPI_MEM_LIST_GLOBAL].total_freed++; | 586 | acpi_gbl_global_list->total_freed++; |
640 | acpi_gbl_memory_lists[ACPI_MEM_LIST_GLOBAL].current_total_size -= debug_block->size; | 587 | acpi_gbl_global_list->current_total_size -= debug_block->size; |
641 | 588 | ||
642 | status = acpi_ut_remove_allocation (ACPI_MEM_LIST_GLOBAL, debug_block, | 589 | status = acpi_ut_remove_allocation (debug_block, |
643 | component, module, line); | 590 | component, module, line); |
644 | if (ACPI_FAILURE (status)) { | 591 | if (ACPI_FAILURE (status)) { |
645 | ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Could not free memory, %s\n", | 592 | ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Could not free memory, %s\n", |
@@ -658,8 +605,7 @@ acpi_ut_free_and_track ( | |||
658 | * | 605 | * |
659 | * FUNCTION: acpi_ut_find_allocation | 606 | * FUNCTION: acpi_ut_find_allocation |
660 | * | 607 | * |
661 | * PARAMETERS: list_id - Memory list to search | 608 | * PARAMETERS: Allocation - Address of allocated memory |
662 | * Allocation - Address of allocated memory | ||
663 | * | 609 | * |
664 | * RETURN: A list element if found; NULL otherwise. | 610 | * RETURN: A list element if found; NULL otherwise. |
665 | * | 611 | * |
@@ -669,7 +615,6 @@ acpi_ut_free_and_track ( | |||
669 | 615 | ||
670 | static struct acpi_debug_mem_block * | 616 | static struct acpi_debug_mem_block * |
671 | acpi_ut_find_allocation ( | 617 | acpi_ut_find_allocation ( |
672 | u32 list_id, | ||
673 | void *allocation) | 618 | void *allocation) |
674 | { | 619 | { |
675 | struct acpi_debug_mem_block *element; | 620 | struct acpi_debug_mem_block *element; |
@@ -678,11 +623,7 @@ acpi_ut_find_allocation ( | |||
678 | ACPI_FUNCTION_ENTRY (); | 623 | ACPI_FUNCTION_ENTRY (); |
679 | 624 | ||
680 | 625 | ||
681 | if (list_id > ACPI_MEM_LIST_MAX) { | 626 | element = acpi_gbl_global_list->list_head; |
682 | return (NULL); | ||
683 | } | ||
684 | |||
685 | element = acpi_gbl_memory_lists[list_id].list_head; | ||
686 | 627 | ||
687 | /* Search for the address. */ | 628 | /* Search for the address. */ |
688 | 629 | ||
@@ -702,8 +643,7 @@ acpi_ut_find_allocation ( | |||
702 | * | 643 | * |
703 | * FUNCTION: acpi_ut_track_allocation | 644 | * FUNCTION: acpi_ut_track_allocation |
704 | * | 645 | * |
705 | * PARAMETERS: list_id - Memory list to search | 646 | * PARAMETERS: Allocation - Address of allocated memory |
706 | * Allocation - Address of allocated memory | ||
707 | * Size - Size of the allocation | 647 | * Size - Size of the allocation |
708 | * alloc_type - MEM_MALLOC or MEM_CALLOC | 648 | * alloc_type - MEM_MALLOC or MEM_CALLOC |
709 | * Component - Component type of caller | 649 | * Component - Component type of caller |
@@ -718,7 +658,6 @@ acpi_ut_find_allocation ( | |||
718 | 658 | ||
719 | static acpi_status | 659 | static acpi_status |
720 | acpi_ut_track_allocation ( | 660 | acpi_ut_track_allocation ( |
721 | u32 list_id, | ||
722 | struct acpi_debug_mem_block *allocation, | 661 | struct acpi_debug_mem_block *allocation, |
723 | acpi_size size, | 662 | acpi_size size, |
724 | u8 alloc_type, | 663 | u8 alloc_type, |
@@ -734,11 +673,7 @@ acpi_ut_track_allocation ( | |||
734 | ACPI_FUNCTION_TRACE_PTR ("ut_track_allocation", allocation); | 673 | ACPI_FUNCTION_TRACE_PTR ("ut_track_allocation", allocation); |
735 | 674 | ||
736 | 675 | ||
737 | if (list_id > ACPI_MEM_LIST_MAX) { | 676 | mem_list = acpi_gbl_global_list; |
738 | return_ACPI_STATUS (AE_BAD_PARAMETER); | ||
739 | } | ||
740 | |||
741 | mem_list = &acpi_gbl_memory_lists[list_id]; | ||
742 | status = acpi_ut_acquire_mutex (ACPI_MTX_MEMORY); | 677 | status = acpi_ut_acquire_mutex (ACPI_MTX_MEMORY); |
743 | if (ACPI_FAILURE (status)) { | 678 | if (ACPI_FAILURE (status)) { |
744 | return_ACPI_STATUS (status); | 679 | return_ACPI_STATUS (status); |
@@ -748,8 +683,7 @@ acpi_ut_track_allocation ( | |||
748 | * Search list for this address to make sure it is not already on the list. | 683 | * Search list for this address to make sure it is not already on the list. |
749 | * This will catch several kinds of problems. | 684 | * This will catch several kinds of problems. |
750 | */ | 685 | */ |
751 | 686 | element = acpi_ut_find_allocation (allocation); | |
752 | element = acpi_ut_find_allocation (list_id, allocation); | ||
753 | if (element) { | 687 | if (element) { |
754 | ACPI_REPORT_ERROR (( | 688 | ACPI_REPORT_ERROR (( |
755 | "ut_track_allocation: Allocation already present in list! (%p)\n", | 689 | "ut_track_allocation: Allocation already present in list! (%p)\n", |
@@ -793,8 +727,7 @@ unlock_and_exit: | |||
793 | * | 727 | * |
794 | * FUNCTION: acpi_ut_remove_allocation | 728 | * FUNCTION: acpi_ut_remove_allocation |
795 | * | 729 | * |
796 | * PARAMETERS: list_id - Memory list to search | 730 | * PARAMETERS: Allocation - Address of allocated memory |
797 | * Allocation - Address of allocated memory | ||
798 | * Component - Component type of caller | 731 | * Component - Component type of caller |
799 | * Module - Source file name of caller | 732 | * Module - Source file name of caller |
800 | * Line - Line number of caller | 733 | * Line - Line number of caller |
@@ -807,7 +740,6 @@ unlock_and_exit: | |||
807 | 740 | ||
808 | static acpi_status | 741 | static acpi_status |
809 | acpi_ut_remove_allocation ( | 742 | acpi_ut_remove_allocation ( |
810 | u32 list_id, | ||
811 | struct acpi_debug_mem_block *allocation, | 743 | struct acpi_debug_mem_block *allocation, |
812 | u32 component, | 744 | u32 component, |
813 | char *module, | 745 | char *module, |
@@ -820,11 +752,7 @@ acpi_ut_remove_allocation ( | |||
820 | ACPI_FUNCTION_TRACE ("ut_remove_allocation"); | 752 | ACPI_FUNCTION_TRACE ("ut_remove_allocation"); |
821 | 753 | ||
822 | 754 | ||
823 | if (list_id > ACPI_MEM_LIST_MAX) { | 755 | mem_list = acpi_gbl_global_list; |
824 | return_ACPI_STATUS (AE_BAD_PARAMETER); | ||
825 | } | ||
826 | |||
827 | mem_list = &acpi_gbl_memory_lists[list_id]; | ||
828 | if (NULL == mem_list->list_head) { | 756 | if (NULL == mem_list->list_head) { |
829 | /* No allocations! */ | 757 | /* No allocations! */ |
830 | 758 | ||
@@ -959,7 +887,7 @@ acpi_ut_dump_allocations ( | |||
959 | return; | 887 | return; |
960 | } | 888 | } |
961 | 889 | ||
962 | element = acpi_gbl_memory_lists[0].list_head; | 890 | element = acpi_gbl_global_list->list_head; |
963 | while (element) { | 891 | while (element) { |
964 | if ((element->component & component) && | 892 | if ((element->component & component) && |
965 | ((module == NULL) || (0 == ACPI_STRCMP (module, element->module)))) { | 893 | ((module == NULL) || (0 == ACPI_STRCMP (module, element->module)))) { |
diff --git a/drivers/acpi/utilities/utcache.c b/drivers/acpi/utilities/utcache.c new file mode 100644 index 000000000000..07588812e72d --- /dev/null +++ b/drivers/acpi/utilities/utcache.c | |||
@@ -0,0 +1,322 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * Module Name: utcache - local cache allocation routines | ||
4 | * | ||
5 | *****************************************************************************/ | ||
6 | |||
7 | /* | ||
8 | * Copyright (C) 2000 - 2005, R. Byron Moore | ||
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 | |||
45 | #include <acpi/acpi.h> | ||
46 | |||
47 | #define _COMPONENT ACPI_UTILITIES | ||
48 | ACPI_MODULE_NAME ("utcache") | ||
49 | |||
50 | |||
51 | #ifdef ACPI_USE_LOCAL_CACHE | ||
52 | /******************************************************************************* | ||
53 | * | ||
54 | * FUNCTION: acpi_os_create_cache | ||
55 | * | ||
56 | * PARAMETERS: cache_name - Ascii name for the cache | ||
57 | * object_size - Size of each cached object | ||
58 | * max_depth - Maximum depth of the cache (in objects) | ||
59 | * return_cache - Where the new cache object is returned | ||
60 | * | ||
61 | * RETURN: Status | ||
62 | * | ||
63 | * DESCRIPTION: Create a cache object | ||
64 | * | ||
65 | ******************************************************************************/ | ||
66 | |||
67 | acpi_status | ||
68 | acpi_os_create_cache ( | ||
69 | char *cache_name, | ||
70 | u16 object_size, | ||
71 | u16 max_depth, | ||
72 | struct acpi_memory_list **return_cache) | ||
73 | { | ||
74 | struct acpi_memory_list *cache; | ||
75 | |||
76 | |||
77 | if (!cache_name || !return_cache || (object_size < 16)) { | ||
78 | return (AE_BAD_PARAMETER); | ||
79 | } | ||
80 | |||
81 | /* Create the cache object */ | ||
82 | |||
83 | cache = acpi_os_allocate (sizeof (struct acpi_memory_list)); | ||
84 | if (!cache) { | ||
85 | return (AE_NO_MEMORY); | ||
86 | } | ||
87 | |||
88 | /* Populate the cache object and return it */ | ||
89 | |||
90 | ACPI_MEMSET (cache, 0, sizeof (struct acpi_memory_list)); | ||
91 | cache->link_offset = 8; | ||
92 | cache->list_name = cache_name; | ||
93 | cache->object_size = object_size; | ||
94 | cache->max_depth = max_depth; | ||
95 | |||
96 | *return_cache = cache; | ||
97 | return (AE_OK); | ||
98 | } | ||
99 | |||
100 | |||
101 | /******************************************************************************* | ||
102 | * | ||
103 | * FUNCTION: acpi_os_purge_cache | ||
104 | * | ||
105 | * PARAMETERS: Cache - Handle to cache object | ||
106 | * | ||
107 | * RETURN: Status | ||
108 | * | ||
109 | * DESCRIPTION: Free all objects within the requested cache. | ||
110 | * | ||
111 | ******************************************************************************/ | ||
112 | |||
113 | acpi_status | ||
114 | acpi_os_purge_cache ( | ||
115 | struct acpi_memory_list *cache) | ||
116 | { | ||
117 | char *next; | ||
118 | |||
119 | |||
120 | ACPI_FUNCTION_ENTRY (); | ||
121 | |||
122 | |||
123 | if (!cache) { | ||
124 | return (AE_BAD_PARAMETER); | ||
125 | } | ||
126 | |||
127 | /* Walk the list of objects in this cache */ | ||
128 | |||
129 | while (cache->list_head) { | ||
130 | /* Delete and unlink one cached state object */ | ||
131 | |||
132 | next = *(ACPI_CAST_INDIRECT_PTR (char, | ||
133 | &(((char *) cache->list_head)[cache->link_offset]))); | ||
134 | ACPI_MEM_FREE (cache->list_head); | ||
135 | |||
136 | cache->list_head = next; | ||
137 | cache->current_depth--; | ||
138 | } | ||
139 | |||
140 | return (AE_OK); | ||
141 | } | ||
142 | |||
143 | |||
144 | /******************************************************************************* | ||
145 | * | ||
146 | * FUNCTION: acpi_os_delete_cache | ||
147 | * | ||
148 | * PARAMETERS: Cache - Handle to cache object | ||
149 | * | ||
150 | * RETURN: Status | ||
151 | * | ||
152 | * DESCRIPTION: Free all objects within the requested cache and delete the | ||
153 | * cache object. | ||
154 | * | ||
155 | ******************************************************************************/ | ||
156 | |||
157 | acpi_status | ||
158 | acpi_os_delete_cache ( | ||
159 | struct acpi_memory_list *cache) | ||
160 | { | ||
161 | acpi_status status; | ||
162 | |||
163 | |||
164 | /* Purge all objects in the cache */ | ||
165 | |||
166 | status = acpi_os_purge_cache (cache); | ||
167 | if (ACPI_FAILURE (status)) { | ||
168 | return (status); | ||
169 | } | ||
170 | |||
171 | /* Now we can delete the cache object */ | ||
172 | |||
173 | acpi_os_free (cache); | ||
174 | return (AE_OK); | ||
175 | } | ||
176 | |||
177 | |||
178 | /******************************************************************************* | ||
179 | * | ||
180 | * FUNCTION: acpi_os_release_object | ||
181 | * | ||
182 | * PARAMETERS: Cache - Handle to cache object | ||
183 | * Object - The object to be released | ||
184 | * | ||
185 | * RETURN: None | ||
186 | * | ||
187 | * DESCRIPTION: Release an object to the specified cache. If cache is full, | ||
188 | * the object is deleted. | ||
189 | * | ||
190 | ******************************************************************************/ | ||
191 | |||
192 | acpi_status | ||
193 | acpi_os_release_object ( | ||
194 | struct acpi_memory_list *cache, | ||
195 | void *object) | ||
196 | { | ||
197 | acpi_status status; | ||
198 | |||
199 | |||
200 | ACPI_FUNCTION_ENTRY (); | ||
201 | |||
202 | |||
203 | if (!cache || !object) { | ||
204 | return (AE_BAD_PARAMETER); | ||
205 | } | ||
206 | |||
207 | /* If cache is full, just free this object */ | ||
208 | |||
209 | if (cache->current_depth >= cache->max_depth) { | ||
210 | ACPI_MEM_FREE (object); | ||
211 | ACPI_MEM_TRACKING (cache->total_freed++); | ||
212 | } | ||
213 | |||
214 | /* Otherwise put this object back into the cache */ | ||
215 | |||
216 | else { | ||
217 | status = acpi_ut_acquire_mutex (ACPI_MTX_CACHES); | ||
218 | if (ACPI_FAILURE (status)) { | ||
219 | return (status); | ||
220 | } | ||
221 | |||
222 | /* Mark the object as cached */ | ||
223 | |||
224 | ACPI_MEMSET (object, 0xCA, cache->object_size); | ||
225 | ACPI_SET_DESCRIPTOR_TYPE (object, ACPI_DESC_TYPE_CACHED); | ||
226 | |||
227 | /* Put the object at the head of the cache list */ | ||
228 | |||
229 | * (ACPI_CAST_INDIRECT_PTR (char, | ||
230 | &(((char *) object)[cache->link_offset]))) = cache->list_head; | ||
231 | cache->list_head = object; | ||
232 | cache->current_depth++; | ||
233 | |||
234 | (void) acpi_ut_release_mutex (ACPI_MTX_CACHES); | ||
235 | } | ||
236 | |||
237 | return (AE_OK); | ||
238 | } | ||
239 | |||
240 | |||
241 | /******************************************************************************* | ||
242 | * | ||
243 | * FUNCTION: acpi_os_acquire_object | ||
244 | * | ||
245 | * PARAMETERS: Cache - Handle to cache object | ||
246 | * | ||
247 | * RETURN: the acquired object. NULL on error | ||
248 | * | ||
249 | * DESCRIPTION: Get an object from the specified cache. If cache is empty, | ||
250 | * the object is allocated. | ||
251 | * | ||
252 | ******************************************************************************/ | ||
253 | |||
254 | void * | ||
255 | acpi_os_acquire_object ( | ||
256 | struct acpi_memory_list *cache) | ||
257 | { | ||
258 | acpi_status status; | ||
259 | void *object; | ||
260 | |||
261 | |||
262 | ACPI_FUNCTION_NAME ("ut_acquire_from_cache"); | ||
263 | |||
264 | |||
265 | if (!cache) { | ||
266 | return (NULL); | ||
267 | } | ||
268 | |||
269 | status = acpi_ut_acquire_mutex (ACPI_MTX_CACHES); | ||
270 | if (ACPI_FAILURE (status)) { | ||
271 | return (NULL); | ||
272 | } | ||
273 | |||
274 | ACPI_MEM_TRACKING (cache->requests++); | ||
275 | |||
276 | /* Check the cache first */ | ||
277 | |||
278 | if (cache->list_head) { | ||
279 | /* There is an object available, use it */ | ||
280 | |||
281 | object = cache->list_head; | ||
282 | cache->list_head = *(ACPI_CAST_INDIRECT_PTR (char, | ||
283 | &(((char *) object)[cache->link_offset]))); | ||
284 | |||
285 | cache->current_depth--; | ||
286 | |||
287 | ACPI_MEM_TRACKING (cache->hits++); | ||
288 | ACPI_MEM_TRACKING (ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, | ||
289 | "Object %p from %s\n", object, cache->list_name))); | ||
290 | |||
291 | status = acpi_ut_release_mutex (ACPI_MTX_CACHES); | ||
292 | if (ACPI_FAILURE (status)) { | ||
293 | return (NULL); | ||
294 | } | ||
295 | |||
296 | /* Clear (zero) the previously used Object */ | ||
297 | |||
298 | ACPI_MEMSET (object, 0, cache->object_size); | ||
299 | } | ||
300 | else { | ||
301 | /* The cache is empty, create a new object */ | ||
302 | |||
303 | ACPI_MEM_TRACKING (cache->total_allocated++); | ||
304 | |||
305 | /* Avoid deadlock with ACPI_MEM_CALLOCATE */ | ||
306 | |||
307 | status = acpi_ut_release_mutex (ACPI_MTX_CACHES); | ||
308 | if (ACPI_FAILURE (status)) { | ||
309 | return (NULL); | ||
310 | } | ||
311 | |||
312 | object = ACPI_MEM_CALLOCATE (cache->object_size); | ||
313 | if (!object) { | ||
314 | return (NULL); | ||
315 | } | ||
316 | } | ||
317 | |||
318 | return (object); | ||
319 | } | ||
320 | #endif /* ACPI_USE_LOCAL_CACHE */ | ||
321 | |||
322 | |||
diff --git a/drivers/acpi/utilities/utdebug.c b/drivers/acpi/utilities/utdebug.c index 794c7df3f2ad..08362f686ec1 100644 --- a/drivers/acpi/utilities/utdebug.c +++ b/drivers/acpi/utilities/utdebug.c | |||
@@ -549,7 +549,7 @@ acpi_ut_dump_buffer ( | |||
549 | /* Dump fill spaces */ | 549 | /* Dump fill spaces */ |
550 | 550 | ||
551 | acpi_os_printf ("%*s", ((display * 2) + 1), " "); | 551 | acpi_os_printf ("%*s", ((display * 2) + 1), " "); |
552 | j += display; | 552 | j += (acpi_native_uint) display; |
553 | continue; | 553 | continue; |
554 | } | 554 | } |
555 | 555 | ||
@@ -584,7 +584,7 @@ acpi_ut_dump_buffer ( | |||
584 | break; | 584 | break; |
585 | } | 585 | } |
586 | 586 | ||
587 | j += display; | 587 | j += (acpi_native_uint) display; |
588 | } | 588 | } |
589 | 589 | ||
590 | /* | 590 | /* |
diff --git a/drivers/acpi/utilities/utglobal.c b/drivers/acpi/utilities/utglobal.c index 4146019b543f..8653dda4f813 100644 --- a/drivers/acpi/utilities/utglobal.c +++ b/drivers/acpi/utilities/utglobal.c | |||
@@ -820,42 +820,20 @@ void | |||
820 | acpi_ut_init_globals ( | 820 | acpi_ut_init_globals ( |
821 | void) | 821 | void) |
822 | { | 822 | { |
823 | acpi_status status; | ||
823 | u32 i; | 824 | u32 i; |
824 | 825 | ||
825 | 826 | ||
826 | ACPI_FUNCTION_TRACE ("ut_init_globals"); | 827 | ACPI_FUNCTION_TRACE ("ut_init_globals"); |
827 | 828 | ||
828 | 829 | ||
829 | /* Memory allocation and cache lists */ | 830 | /* Create all memory caches */ |
830 | 831 | ||
831 | ACPI_MEMSET (acpi_gbl_memory_lists, 0, sizeof (struct acpi_memory_list) * ACPI_NUM_MEM_LISTS); | 832 | status = acpi_ut_create_caches (); |
832 | 833 | if (ACPI_FAILURE (status)) | |
833 | acpi_gbl_memory_lists[ACPI_MEM_LIST_STATE].link_offset = (u16) ACPI_PTR_DIFF (&(((union acpi_generic_state *) NULL)->common.next), NULL); | 834 | { |
834 | acpi_gbl_memory_lists[ACPI_MEM_LIST_PSNODE].link_offset = (u16) ACPI_PTR_DIFF (&(((union acpi_parse_object *) NULL)->common.next), NULL); | 835 | return; |
835 | acpi_gbl_memory_lists[ACPI_MEM_LIST_PSNODE_EXT].link_offset = (u16) ACPI_PTR_DIFF (&(((union acpi_parse_object *) NULL)->common.next), NULL); | 836 | } |
836 | acpi_gbl_memory_lists[ACPI_MEM_LIST_OPERAND].link_offset = (u16) ACPI_PTR_DIFF (&(((union acpi_operand_object *) NULL)->cache.next), NULL); | ||
837 | acpi_gbl_memory_lists[ACPI_MEM_LIST_WALK].link_offset = (u16) ACPI_PTR_DIFF (&(((struct acpi_walk_state *) NULL)->next), NULL); | ||
838 | |||
839 | acpi_gbl_memory_lists[ACPI_MEM_LIST_NSNODE].object_size = sizeof (struct acpi_namespace_node); | ||
840 | acpi_gbl_memory_lists[ACPI_MEM_LIST_STATE].object_size = sizeof (union acpi_generic_state); | ||
841 | acpi_gbl_memory_lists[ACPI_MEM_LIST_PSNODE].object_size = sizeof (struct acpi_parse_obj_common); | ||
842 | acpi_gbl_memory_lists[ACPI_MEM_LIST_PSNODE_EXT].object_size = sizeof (struct acpi_parse_obj_named); | ||
843 | acpi_gbl_memory_lists[ACPI_MEM_LIST_OPERAND].object_size = sizeof (union acpi_operand_object); | ||
844 | acpi_gbl_memory_lists[ACPI_MEM_LIST_WALK].object_size = sizeof (struct acpi_walk_state); | ||
845 | |||
846 | acpi_gbl_memory_lists[ACPI_MEM_LIST_STATE].max_cache_depth = ACPI_MAX_STATE_CACHE_DEPTH; | ||
847 | acpi_gbl_memory_lists[ACPI_MEM_LIST_PSNODE].max_cache_depth = ACPI_MAX_PARSE_CACHE_DEPTH; | ||
848 | acpi_gbl_memory_lists[ACPI_MEM_LIST_PSNODE_EXT].max_cache_depth = ACPI_MAX_EXTPARSE_CACHE_DEPTH; | ||
849 | acpi_gbl_memory_lists[ACPI_MEM_LIST_OPERAND].max_cache_depth = ACPI_MAX_OBJECT_CACHE_DEPTH; | ||
850 | acpi_gbl_memory_lists[ACPI_MEM_LIST_WALK].max_cache_depth = ACPI_MAX_WALK_CACHE_DEPTH; | ||
851 | |||
852 | ACPI_MEM_TRACKING (acpi_gbl_memory_lists[ACPI_MEM_LIST_GLOBAL].list_name = "Global Memory Allocation"); | ||
853 | ACPI_MEM_TRACKING (acpi_gbl_memory_lists[ACPI_MEM_LIST_NSNODE].list_name = "Namespace Nodes"); | ||
854 | ACPI_MEM_TRACKING (acpi_gbl_memory_lists[ACPI_MEM_LIST_STATE].list_name = "State Object Cache"); | ||
855 | ACPI_MEM_TRACKING (acpi_gbl_memory_lists[ACPI_MEM_LIST_PSNODE].list_name = "Parse Node Cache"); | ||
856 | ACPI_MEM_TRACKING (acpi_gbl_memory_lists[ACPI_MEM_LIST_PSNODE_EXT].list_name = "Extended Parse Node Cache"); | ||
857 | ACPI_MEM_TRACKING (acpi_gbl_memory_lists[ACPI_MEM_LIST_OPERAND].list_name = "Operand Object Cache"); | ||
858 | ACPI_MEM_TRACKING (acpi_gbl_memory_lists[ACPI_MEM_LIST_WALK].list_name = "Tree Walk Node Cache"); | ||
859 | 837 | ||
860 | /* ACPI table structure */ | 838 | /* ACPI table structure */ |
861 | 839 | ||
diff --git a/drivers/acpi/utilities/utinit.c b/drivers/acpi/utilities/utinit.c index 7f3713889ff0..fd7ceba83229 100644 --- a/drivers/acpi/utilities/utinit.c +++ b/drivers/acpi/utilities/utinit.c | |||
@@ -264,7 +264,7 @@ acpi_ut_subsystem_shutdown ( | |||
264 | 264 | ||
265 | /* Purge the local caches */ | 265 | /* Purge the local caches */ |
266 | 266 | ||
267 | (void) acpi_purge_cached_objects (); | 267 | (void) acpi_ut_delete_caches (); |
268 | 268 | ||
269 | /* Debug only - display leftover memory allocation, if any */ | 269 | /* Debug only - display leftover memory allocation, if any */ |
270 | 270 | ||
diff --git a/drivers/acpi/utilities/utmisc.c b/drivers/acpi/utilities/utmisc.c index bb658777fa88..207c836aec64 100644 --- a/drivers/acpi/utilities/utmisc.c +++ b/drivers/acpi/utilities/utmisc.c | |||
@@ -49,16 +49,6 @@ | |||
49 | #define _COMPONENT ACPI_UTILITIES | 49 | #define _COMPONENT ACPI_UTILITIES |
50 | ACPI_MODULE_NAME ("utmisc") | 50 | ACPI_MODULE_NAME ("utmisc") |
51 | 51 | ||
52 | /* Local prototypes */ | ||
53 | |||
54 | static acpi_status | ||
55 | acpi_ut_create_mutex ( | ||
56 | acpi_mutex_handle mutex_id); | ||
57 | |||
58 | static acpi_status | ||
59 | acpi_ut_delete_mutex ( | ||
60 | acpi_mutex_handle mutex_id); | ||
61 | |||
62 | 52 | ||
63 | /******************************************************************************* | 53 | /******************************************************************************* |
64 | * | 54 | * |
@@ -84,6 +74,10 @@ acpi_ut_strupr ( | |||
84 | ACPI_FUNCTION_ENTRY (); | 74 | ACPI_FUNCTION_ENTRY (); |
85 | 75 | ||
86 | 76 | ||
77 | if (!src_string) { | ||
78 | return (NULL); | ||
79 | } | ||
80 | |||
87 | /* Walk entire string, uppercasing the letters */ | 81 | /* Walk entire string, uppercasing the letters */ |
88 | 82 | ||
89 | for (string = src_string; *string; string++) { | 83 | for (string = src_string; *string; string++) { |
@@ -543,326 +537,6 @@ error_exit: | |||
543 | 537 | ||
544 | /******************************************************************************* | 538 | /******************************************************************************* |
545 | * | 539 | * |
546 | * FUNCTION: acpi_ut_mutex_initialize | ||
547 | * | ||
548 | * PARAMETERS: None. | ||
549 | * | ||
550 | * RETURN: Status | ||
551 | * | ||
552 | * DESCRIPTION: Create the system mutex objects. | ||
553 | * | ||
554 | ******************************************************************************/ | ||
555 | |||
556 | acpi_status | ||
557 | acpi_ut_mutex_initialize ( | ||
558 | void) | ||
559 | { | ||
560 | u32 i; | ||
561 | acpi_status status; | ||
562 | |||
563 | |||
564 | ACPI_FUNCTION_TRACE ("ut_mutex_initialize"); | ||
565 | |||
566 | |||
567 | /* | ||
568 | * Create each of the predefined mutex objects | ||
569 | */ | ||
570 | for (i = 0; i < NUM_MUTEX; i++) { | ||
571 | status = acpi_ut_create_mutex (i); | ||
572 | if (ACPI_FAILURE (status)) { | ||
573 | return_ACPI_STATUS (status); | ||
574 | } | ||
575 | } | ||
576 | |||
577 | status = acpi_os_create_lock (&acpi_gbl_gpe_lock); | ||
578 | return_ACPI_STATUS (status); | ||
579 | } | ||
580 | |||
581 | |||
582 | /******************************************************************************* | ||
583 | * | ||
584 | * FUNCTION: acpi_ut_mutex_terminate | ||
585 | * | ||
586 | * PARAMETERS: None. | ||
587 | * | ||
588 | * RETURN: None. | ||
589 | * | ||
590 | * DESCRIPTION: Delete all of the system mutex objects. | ||
591 | * | ||
592 | ******************************************************************************/ | ||
593 | |||
594 | void | ||
595 | acpi_ut_mutex_terminate ( | ||
596 | void) | ||
597 | { | ||
598 | u32 i; | ||
599 | |||
600 | |||
601 | ACPI_FUNCTION_TRACE ("ut_mutex_terminate"); | ||
602 | |||
603 | |||
604 | /* | ||
605 | * Delete each predefined mutex object | ||
606 | */ | ||
607 | for (i = 0; i < NUM_MUTEX; i++) { | ||
608 | (void) acpi_ut_delete_mutex (i); | ||
609 | } | ||
610 | |||
611 | acpi_os_delete_lock (acpi_gbl_gpe_lock); | ||
612 | return_VOID; | ||
613 | } | ||
614 | |||
615 | |||
616 | /******************************************************************************* | ||
617 | * | ||
618 | * FUNCTION: acpi_ut_create_mutex | ||
619 | * | ||
620 | * PARAMETERS: mutex_iD - ID of the mutex to be created | ||
621 | * | ||
622 | * RETURN: Status | ||
623 | * | ||
624 | * DESCRIPTION: Create a mutex object. | ||
625 | * | ||
626 | ******************************************************************************/ | ||
627 | |||
628 | static acpi_status | ||
629 | acpi_ut_create_mutex ( | ||
630 | acpi_mutex_handle mutex_id) | ||
631 | { | ||
632 | acpi_status status = AE_OK; | ||
633 | |||
634 | |||
635 | ACPI_FUNCTION_TRACE_U32 ("ut_create_mutex", mutex_id); | ||
636 | |||
637 | |||
638 | if (mutex_id > MAX_MUTEX) { | ||
639 | return_ACPI_STATUS (AE_BAD_PARAMETER); | ||
640 | } | ||
641 | |||
642 | if (!acpi_gbl_mutex_info[mutex_id].mutex) { | ||
643 | status = acpi_os_create_semaphore (1, 1, | ||
644 | &acpi_gbl_mutex_info[mutex_id].mutex); | ||
645 | acpi_gbl_mutex_info[mutex_id].owner_id = ACPI_MUTEX_NOT_ACQUIRED; | ||
646 | acpi_gbl_mutex_info[mutex_id].use_count = 0; | ||
647 | } | ||
648 | |||
649 | return_ACPI_STATUS (status); | ||
650 | } | ||
651 | |||
652 | |||
653 | /******************************************************************************* | ||
654 | * | ||
655 | * FUNCTION: acpi_ut_delete_mutex | ||
656 | * | ||
657 | * PARAMETERS: mutex_iD - ID of the mutex to be deleted | ||
658 | * | ||
659 | * RETURN: Status | ||
660 | * | ||
661 | * DESCRIPTION: Delete a mutex object. | ||
662 | * | ||
663 | ******************************************************************************/ | ||
664 | |||
665 | static acpi_status | ||
666 | acpi_ut_delete_mutex ( | ||
667 | acpi_mutex_handle mutex_id) | ||
668 | { | ||
669 | acpi_status status; | ||
670 | |||
671 | |||
672 | ACPI_FUNCTION_TRACE_U32 ("ut_delete_mutex", mutex_id); | ||
673 | |||
674 | |||
675 | if (mutex_id > MAX_MUTEX) { | ||
676 | return_ACPI_STATUS (AE_BAD_PARAMETER); | ||
677 | } | ||
678 | |||
679 | status = acpi_os_delete_semaphore (acpi_gbl_mutex_info[mutex_id].mutex); | ||
680 | |||
681 | acpi_gbl_mutex_info[mutex_id].mutex = NULL; | ||
682 | acpi_gbl_mutex_info[mutex_id].owner_id = ACPI_MUTEX_NOT_ACQUIRED; | ||
683 | |||
684 | return_ACPI_STATUS (status); | ||
685 | } | ||
686 | |||
687 | |||
688 | /******************************************************************************* | ||
689 | * | ||
690 | * FUNCTION: acpi_ut_acquire_mutex | ||
691 | * | ||
692 | * PARAMETERS: mutex_iD - ID of the mutex to be acquired | ||
693 | * | ||
694 | * RETURN: Status | ||
695 | * | ||
696 | * DESCRIPTION: Acquire a mutex object. | ||
697 | * | ||
698 | ******************************************************************************/ | ||
699 | |||
700 | acpi_status | ||
701 | acpi_ut_acquire_mutex ( | ||
702 | acpi_mutex_handle mutex_id) | ||
703 | { | ||
704 | acpi_status status; | ||
705 | u32 this_thread_id; | ||
706 | |||
707 | |||
708 | ACPI_FUNCTION_NAME ("ut_acquire_mutex"); | ||
709 | |||
710 | |||
711 | if (mutex_id > MAX_MUTEX) { | ||
712 | return (AE_BAD_PARAMETER); | ||
713 | } | ||
714 | |||
715 | this_thread_id = acpi_os_get_thread_id (); | ||
716 | |||
717 | #ifdef ACPI_MUTEX_DEBUG | ||
718 | { | ||
719 | u32 i; | ||
720 | /* | ||
721 | * Mutex debug code, for internal debugging only. | ||
722 | * | ||
723 | * Deadlock prevention. Check if this thread owns any mutexes of value | ||
724 | * greater than or equal to this one. If so, the thread has violated | ||
725 | * the mutex ordering rule. This indicates a coding error somewhere in | ||
726 | * the ACPI subsystem code. | ||
727 | */ | ||
728 | for (i = mutex_id; i < MAX_MUTEX; i++) { | ||
729 | if (acpi_gbl_mutex_info[i].owner_id == this_thread_id) { | ||
730 | if (i == mutex_id) { | ||
731 | ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, | ||
732 | "Mutex [%s] already acquired by this thread [%X]\n", | ||
733 | acpi_ut_get_mutex_name (mutex_id), this_thread_id)); | ||
734 | |||
735 | return (AE_ALREADY_ACQUIRED); | ||
736 | } | ||
737 | |||
738 | ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, | ||
739 | "Invalid acquire order: Thread %X owns [%s], wants [%s]\n", | ||
740 | this_thread_id, acpi_ut_get_mutex_name (i), | ||
741 | acpi_ut_get_mutex_name (mutex_id))); | ||
742 | |||
743 | return (AE_ACQUIRE_DEADLOCK); | ||
744 | } | ||
745 | } | ||
746 | } | ||
747 | #endif | ||
748 | |||
749 | ACPI_DEBUG_PRINT ((ACPI_DB_MUTEX, | ||
750 | "Thread %X attempting to acquire Mutex [%s]\n", | ||
751 | this_thread_id, acpi_ut_get_mutex_name (mutex_id))); | ||
752 | |||
753 | status = acpi_os_wait_semaphore (acpi_gbl_mutex_info[mutex_id].mutex, | ||
754 | 1, ACPI_WAIT_FOREVER); | ||
755 | if (ACPI_SUCCESS (status)) { | ||
756 | ACPI_DEBUG_PRINT ((ACPI_DB_MUTEX, "Thread %X acquired Mutex [%s]\n", | ||
757 | this_thread_id, acpi_ut_get_mutex_name (mutex_id))); | ||
758 | |||
759 | acpi_gbl_mutex_info[mutex_id].use_count++; | ||
760 | acpi_gbl_mutex_info[mutex_id].owner_id = this_thread_id; | ||
761 | } | ||
762 | else { | ||
763 | ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, | ||
764 | "Thread %X could not acquire Mutex [%s] %s\n", | ||
765 | this_thread_id, acpi_ut_get_mutex_name (mutex_id), | ||
766 | acpi_format_exception (status))); | ||
767 | } | ||
768 | |||
769 | return (status); | ||
770 | } | ||
771 | |||
772 | |||
773 | /******************************************************************************* | ||
774 | * | ||
775 | * FUNCTION: acpi_ut_release_mutex | ||
776 | * | ||
777 | * PARAMETERS: mutex_iD - ID of the mutex to be released | ||
778 | * | ||
779 | * RETURN: Status | ||
780 | * | ||
781 | * DESCRIPTION: Release a mutex object. | ||
782 | * | ||
783 | ******************************************************************************/ | ||
784 | |||
785 | acpi_status | ||
786 | acpi_ut_release_mutex ( | ||
787 | acpi_mutex_handle mutex_id) | ||
788 | { | ||
789 | acpi_status status; | ||
790 | u32 this_thread_id; | ||
791 | |||
792 | |||
793 | ACPI_FUNCTION_NAME ("ut_release_mutex"); | ||
794 | |||
795 | |||
796 | this_thread_id = acpi_os_get_thread_id (); | ||
797 | ACPI_DEBUG_PRINT ((ACPI_DB_MUTEX, | ||
798 | "Thread %X releasing Mutex [%s]\n", this_thread_id, | ||
799 | acpi_ut_get_mutex_name (mutex_id))); | ||
800 | |||
801 | if (mutex_id > MAX_MUTEX) { | ||
802 | return (AE_BAD_PARAMETER); | ||
803 | } | ||
804 | |||
805 | /* | ||
806 | * Mutex must be acquired in order to release it! | ||
807 | */ | ||
808 | if (acpi_gbl_mutex_info[mutex_id].owner_id == ACPI_MUTEX_NOT_ACQUIRED) { | ||
809 | ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, | ||
810 | "Mutex [%s] is not acquired, cannot release\n", | ||
811 | acpi_ut_get_mutex_name (mutex_id))); | ||
812 | |||
813 | return (AE_NOT_ACQUIRED); | ||
814 | } | ||
815 | |||
816 | #ifdef ACPI_MUTEX_DEBUG | ||
817 | { | ||
818 | u32 i; | ||
819 | /* | ||
820 | * Mutex debug code, for internal debugging only. | ||
821 | * | ||
822 | * Deadlock prevention. Check if this thread owns any mutexes of value | ||
823 | * greater than this one. If so, the thread has violated the mutex | ||
824 | * ordering rule. This indicates a coding error somewhere in | ||
825 | * the ACPI subsystem code. | ||
826 | */ | ||
827 | for (i = mutex_id; i < MAX_MUTEX; i++) { | ||
828 | if (acpi_gbl_mutex_info[i].owner_id == this_thread_id) { | ||
829 | if (i == mutex_id) { | ||
830 | continue; | ||
831 | } | ||
832 | |||
833 | ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, | ||
834 | "Invalid release order: owns [%s], releasing [%s]\n", | ||
835 | acpi_ut_get_mutex_name (i), acpi_ut_get_mutex_name (mutex_id))); | ||
836 | |||
837 | return (AE_RELEASE_DEADLOCK); | ||
838 | } | ||
839 | } | ||
840 | } | ||
841 | #endif | ||
842 | |||
843 | /* Mark unlocked FIRST */ | ||
844 | |||
845 | acpi_gbl_mutex_info[mutex_id].owner_id = ACPI_MUTEX_NOT_ACQUIRED; | ||
846 | |||
847 | status = acpi_os_signal_semaphore (acpi_gbl_mutex_info[mutex_id].mutex, 1); | ||
848 | |||
849 | if (ACPI_FAILURE (status)) { | ||
850 | ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, | ||
851 | "Thread %X could not release Mutex [%s] %s\n", | ||
852 | this_thread_id, acpi_ut_get_mutex_name (mutex_id), | ||
853 | acpi_format_exception (status))); | ||
854 | } | ||
855 | else { | ||
856 | ACPI_DEBUG_PRINT ((ACPI_DB_MUTEX, "Thread %X released Mutex [%s]\n", | ||
857 | this_thread_id, acpi_ut_get_mutex_name (mutex_id))); | ||
858 | } | ||
859 | |||
860 | return (status); | ||
861 | } | ||
862 | |||
863 | |||
864 | /******************************************************************************* | ||
865 | * | ||
866 | * FUNCTION: acpi_ut_create_update_state_and_push | 540 | * FUNCTION: acpi_ut_create_update_state_and_push |
867 | * | 541 | * |
868 | * PARAMETERS: Object - Object to be added to the new state | 542 | * PARAMETERS: Object - Object to be added to the new state |
@@ -905,361 +579,6 @@ acpi_ut_create_update_state_and_push ( | |||
905 | 579 | ||
906 | /******************************************************************************* | 580 | /******************************************************************************* |
907 | * | 581 | * |
908 | * FUNCTION: acpi_ut_create_pkg_state_and_push | ||
909 | * | ||
910 | * PARAMETERS: Object - Object to be added to the new state | ||
911 | * Action - Increment/Decrement | ||
912 | * state_list - List the state will be added to | ||
913 | * | ||
914 | * RETURN: Status | ||
915 | * | ||
916 | * DESCRIPTION: Create a new state and push it | ||
917 | * | ||
918 | ******************************************************************************/ | ||
919 | |||
920 | #ifdef ACPI_FUTURE_USAGE | ||
921 | acpi_status | ||
922 | acpi_ut_create_pkg_state_and_push ( | ||
923 | void *internal_object, | ||
924 | void *external_object, | ||
925 | u16 index, | ||
926 | union acpi_generic_state **state_list) | ||
927 | { | ||
928 | union acpi_generic_state *state; | ||
929 | |||
930 | |||
931 | ACPI_FUNCTION_ENTRY (); | ||
932 | |||
933 | |||
934 | state = acpi_ut_create_pkg_state (internal_object, external_object, index); | ||
935 | if (!state) { | ||
936 | return (AE_NO_MEMORY); | ||
937 | } | ||
938 | |||
939 | acpi_ut_push_generic_state (state_list, state); | ||
940 | return (AE_OK); | ||
941 | } | ||
942 | #endif /* ACPI_FUTURE_USAGE */ | ||
943 | |||
944 | /******************************************************************************* | ||
945 | * | ||
946 | * FUNCTION: acpi_ut_push_generic_state | ||
947 | * | ||
948 | * PARAMETERS: list_head - Head of the state stack | ||
949 | * State - State object to push | ||
950 | * | ||
951 | * RETURN: None | ||
952 | * | ||
953 | * DESCRIPTION: Push a state object onto a state stack | ||
954 | * | ||
955 | ******************************************************************************/ | ||
956 | |||
957 | void | ||
958 | acpi_ut_push_generic_state ( | ||
959 | union acpi_generic_state **list_head, | ||
960 | union acpi_generic_state *state) | ||
961 | { | ||
962 | ACPI_FUNCTION_TRACE ("ut_push_generic_state"); | ||
963 | |||
964 | |||
965 | /* Push the state object onto the front of the list (stack) */ | ||
966 | |||
967 | state->common.next = *list_head; | ||
968 | *list_head = state; | ||
969 | |||
970 | return_VOID; | ||
971 | } | ||
972 | |||
973 | |||
974 | /******************************************************************************* | ||
975 | * | ||
976 | * FUNCTION: acpi_ut_pop_generic_state | ||
977 | * | ||
978 | * PARAMETERS: list_head - Head of the state stack | ||
979 | * | ||
980 | * RETURN: The popped state object | ||
981 | * | ||
982 | * DESCRIPTION: Pop a state object from a state stack | ||
983 | * | ||
984 | ******************************************************************************/ | ||
985 | |||
986 | union acpi_generic_state * | ||
987 | acpi_ut_pop_generic_state ( | ||
988 | union acpi_generic_state **list_head) | ||
989 | { | ||
990 | union acpi_generic_state *state; | ||
991 | |||
992 | |||
993 | ACPI_FUNCTION_TRACE ("ut_pop_generic_state"); | ||
994 | |||
995 | |||
996 | /* Remove the state object at the head of the list (stack) */ | ||
997 | |||
998 | state = *list_head; | ||
999 | if (state) { | ||
1000 | /* Update the list head */ | ||
1001 | |||
1002 | *list_head = state->common.next; | ||
1003 | } | ||
1004 | |||
1005 | return_PTR (state); | ||
1006 | } | ||
1007 | |||
1008 | |||
1009 | /******************************************************************************* | ||
1010 | * | ||
1011 | * FUNCTION: acpi_ut_create_generic_state | ||
1012 | * | ||
1013 | * PARAMETERS: None | ||
1014 | * | ||
1015 | * RETURN: The new state object. NULL on failure. | ||
1016 | * | ||
1017 | * DESCRIPTION: Create a generic state object. Attempt to obtain one from | ||
1018 | * the global state cache; If none available, create a new one. | ||
1019 | * | ||
1020 | ******************************************************************************/ | ||
1021 | |||
1022 | union acpi_generic_state * | ||
1023 | acpi_ut_create_generic_state ( | ||
1024 | void) | ||
1025 | { | ||
1026 | union acpi_generic_state *state; | ||
1027 | |||
1028 | |||
1029 | ACPI_FUNCTION_ENTRY (); | ||
1030 | |||
1031 | |||
1032 | state = acpi_ut_acquire_from_cache (ACPI_MEM_LIST_STATE); | ||
1033 | |||
1034 | /* Initialize */ | ||
1035 | |||
1036 | if (state) { | ||
1037 | state->common.data_type = ACPI_DESC_TYPE_STATE; | ||
1038 | } | ||
1039 | |||
1040 | return (state); | ||
1041 | } | ||
1042 | |||
1043 | |||
1044 | /******************************************************************************* | ||
1045 | * | ||
1046 | * FUNCTION: acpi_ut_create_thread_state | ||
1047 | * | ||
1048 | * PARAMETERS: None | ||
1049 | * | ||
1050 | * RETURN: New Thread State. NULL on failure | ||
1051 | * | ||
1052 | * DESCRIPTION: Create a "Thread State" - a flavor of the generic state used | ||
1053 | * to track per-thread info during method execution | ||
1054 | * | ||
1055 | ******************************************************************************/ | ||
1056 | |||
1057 | struct acpi_thread_state * | ||
1058 | acpi_ut_create_thread_state ( | ||
1059 | void) | ||
1060 | { | ||
1061 | union acpi_generic_state *state; | ||
1062 | |||
1063 | |||
1064 | ACPI_FUNCTION_TRACE ("ut_create_thread_state"); | ||
1065 | |||
1066 | |||
1067 | /* Create the generic state object */ | ||
1068 | |||
1069 | state = acpi_ut_create_generic_state (); | ||
1070 | if (!state) { | ||
1071 | return_PTR (NULL); | ||
1072 | } | ||
1073 | |||
1074 | /* Init fields specific to the update struct */ | ||
1075 | |||
1076 | state->common.data_type = ACPI_DESC_TYPE_STATE_THREAD; | ||
1077 | state->thread.thread_id = acpi_os_get_thread_id (); | ||
1078 | |||
1079 | return_PTR ((struct acpi_thread_state *) state); | ||
1080 | } | ||
1081 | |||
1082 | |||
1083 | /******************************************************************************* | ||
1084 | * | ||
1085 | * FUNCTION: acpi_ut_create_update_state | ||
1086 | * | ||
1087 | * PARAMETERS: Object - Initial Object to be installed in the state | ||
1088 | * Action - Update action to be performed | ||
1089 | * | ||
1090 | * RETURN: New state object, null on failure | ||
1091 | * | ||
1092 | * DESCRIPTION: Create an "Update State" - a flavor of the generic state used | ||
1093 | * to update reference counts and delete complex objects such | ||
1094 | * as packages. | ||
1095 | * | ||
1096 | ******************************************************************************/ | ||
1097 | |||
1098 | union acpi_generic_state * | ||
1099 | acpi_ut_create_update_state ( | ||
1100 | union acpi_operand_object *object, | ||
1101 | u16 action) | ||
1102 | { | ||
1103 | union acpi_generic_state *state; | ||
1104 | |||
1105 | |||
1106 | ACPI_FUNCTION_TRACE_PTR ("ut_create_update_state", object); | ||
1107 | |||
1108 | |||
1109 | /* Create the generic state object */ | ||
1110 | |||
1111 | state = acpi_ut_create_generic_state (); | ||
1112 | if (!state) { | ||
1113 | return_PTR (NULL); | ||
1114 | } | ||
1115 | |||
1116 | /* Init fields specific to the update struct */ | ||
1117 | |||
1118 | state->common.data_type = ACPI_DESC_TYPE_STATE_UPDATE; | ||
1119 | state->update.object = object; | ||
1120 | state->update.value = action; | ||
1121 | |||
1122 | return_PTR (state); | ||
1123 | } | ||
1124 | |||
1125 | |||
1126 | /******************************************************************************* | ||
1127 | * | ||
1128 | * FUNCTION: acpi_ut_create_pkg_state | ||
1129 | * | ||
1130 | * PARAMETERS: Object - Initial Object to be installed in the state | ||
1131 | * Action - Update action to be performed | ||
1132 | * | ||
1133 | * RETURN: New state object, null on failure | ||
1134 | * | ||
1135 | * DESCRIPTION: Create a "Package State" | ||
1136 | * | ||
1137 | ******************************************************************************/ | ||
1138 | |||
1139 | union acpi_generic_state * | ||
1140 | acpi_ut_create_pkg_state ( | ||
1141 | void *internal_object, | ||
1142 | void *external_object, | ||
1143 | u16 index) | ||
1144 | { | ||
1145 | union acpi_generic_state *state; | ||
1146 | |||
1147 | |||
1148 | ACPI_FUNCTION_TRACE_PTR ("ut_create_pkg_state", internal_object); | ||
1149 | |||
1150 | |||
1151 | /* Create the generic state object */ | ||
1152 | |||
1153 | state = acpi_ut_create_generic_state (); | ||
1154 | if (!state) { | ||
1155 | return_PTR (NULL); | ||
1156 | } | ||
1157 | |||
1158 | /* Init fields specific to the update struct */ | ||
1159 | |||
1160 | state->common.data_type = ACPI_DESC_TYPE_STATE_PACKAGE; | ||
1161 | state->pkg.source_object = (union acpi_operand_object *) internal_object; | ||
1162 | state->pkg.dest_object = external_object; | ||
1163 | state->pkg.index = index; | ||
1164 | state->pkg.num_packages = 1; | ||
1165 | |||
1166 | return_PTR (state); | ||
1167 | } | ||
1168 | |||
1169 | |||
1170 | /******************************************************************************* | ||
1171 | * | ||
1172 | * FUNCTION: acpi_ut_create_control_state | ||
1173 | * | ||
1174 | * PARAMETERS: None | ||
1175 | * | ||
1176 | * RETURN: New state object, null on failure | ||
1177 | * | ||
1178 | * DESCRIPTION: Create a "Control State" - a flavor of the generic state used | ||
1179 | * to support nested IF/WHILE constructs in the AML. | ||
1180 | * | ||
1181 | ******************************************************************************/ | ||
1182 | |||
1183 | union acpi_generic_state * | ||
1184 | acpi_ut_create_control_state ( | ||
1185 | void) | ||
1186 | { | ||
1187 | union acpi_generic_state *state; | ||
1188 | |||
1189 | |||
1190 | ACPI_FUNCTION_TRACE ("ut_create_control_state"); | ||
1191 | |||
1192 | |||
1193 | /* Create the generic state object */ | ||
1194 | |||
1195 | state = acpi_ut_create_generic_state (); | ||
1196 | if (!state) { | ||
1197 | return_PTR (NULL); | ||
1198 | } | ||
1199 | |||
1200 | /* Init fields specific to the control struct */ | ||
1201 | |||
1202 | state->common.data_type = ACPI_DESC_TYPE_STATE_CONTROL; | ||
1203 | state->common.state = ACPI_CONTROL_CONDITIONAL_EXECUTING; | ||
1204 | |||
1205 | return_PTR (state); | ||
1206 | } | ||
1207 | |||
1208 | |||
1209 | /******************************************************************************* | ||
1210 | * | ||
1211 | * FUNCTION: acpi_ut_delete_generic_state | ||
1212 | * | ||
1213 | * PARAMETERS: State - The state object to be deleted | ||
1214 | * | ||
1215 | * RETURN: None | ||
1216 | * | ||
1217 | * DESCRIPTION: Put a state object back into the global state cache. The object | ||
1218 | * is not actually freed at this time. | ||
1219 | * | ||
1220 | ******************************************************************************/ | ||
1221 | |||
1222 | void | ||
1223 | acpi_ut_delete_generic_state ( | ||
1224 | union acpi_generic_state *state) | ||
1225 | { | ||
1226 | ACPI_FUNCTION_TRACE ("ut_delete_generic_state"); | ||
1227 | |||
1228 | |||
1229 | acpi_ut_release_to_cache (ACPI_MEM_LIST_STATE, state); | ||
1230 | return_VOID; | ||
1231 | } | ||
1232 | |||
1233 | |||
1234 | #ifdef ACPI_ENABLE_OBJECT_CACHE | ||
1235 | /******************************************************************************* | ||
1236 | * | ||
1237 | * FUNCTION: acpi_ut_delete_generic_state_cache | ||
1238 | * | ||
1239 | * PARAMETERS: None | ||
1240 | * | ||
1241 | * RETURN: None | ||
1242 | * | ||
1243 | * DESCRIPTION: Purge the global state object cache. Used during subsystem | ||
1244 | * termination. | ||
1245 | * | ||
1246 | ******************************************************************************/ | ||
1247 | |||
1248 | void | ||
1249 | acpi_ut_delete_generic_state_cache ( | ||
1250 | void) | ||
1251 | { | ||
1252 | ACPI_FUNCTION_TRACE ("ut_delete_generic_state_cache"); | ||
1253 | |||
1254 | |||
1255 | acpi_ut_delete_generic_cache (ACPI_MEM_LIST_STATE); | ||
1256 | return_VOID; | ||
1257 | } | ||
1258 | #endif | ||
1259 | |||
1260 | |||
1261 | /******************************************************************************* | ||
1262 | * | ||
1263 | * FUNCTION: acpi_ut_walk_package_tree | 582 | * FUNCTION: acpi_ut_walk_package_tree |
1264 | * | 583 | * |
1265 | * PARAMETERS: source_object - The package to walk | 584 | * PARAMETERS: source_object - The package to walk |
diff --git a/drivers/acpi/utilities/utmutex.c b/drivers/acpi/utilities/utmutex.c new file mode 100644 index 000000000000..a80b97cb2e56 --- /dev/null +++ b/drivers/acpi/utilities/utmutex.c | |||
@@ -0,0 +1,380 @@ | |||
1 | /******************************************************************************* | ||
2 | * | ||
3 | * Module Name: utmutex - local mutex support | ||
4 | * | ||
5 | ******************************************************************************/ | ||
6 | |||
7 | /* | ||
8 | * Copyright (C) 2000 - 2005, R. Byron Moore | ||
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 | |||
45 | #include <acpi/acpi.h> | ||
46 | |||
47 | #define _COMPONENT ACPI_UTILITIES | ||
48 | ACPI_MODULE_NAME ("utmutex") | ||
49 | |||
50 | /* Local prototypes */ | ||
51 | |||
52 | static acpi_status | ||
53 | acpi_ut_create_mutex ( | ||
54 | acpi_mutex_handle mutex_id); | ||
55 | |||
56 | static acpi_status | ||
57 | acpi_ut_delete_mutex ( | ||
58 | acpi_mutex_handle mutex_id); | ||
59 | |||
60 | |||
61 | /******************************************************************************* | ||
62 | * | ||
63 | * FUNCTION: acpi_ut_mutex_initialize | ||
64 | * | ||
65 | * PARAMETERS: None. | ||
66 | * | ||
67 | * RETURN: Status | ||
68 | * | ||
69 | * DESCRIPTION: Create the system mutex objects. | ||
70 | * | ||
71 | ******************************************************************************/ | ||
72 | |||
73 | acpi_status | ||
74 | acpi_ut_mutex_initialize ( | ||
75 | void) | ||
76 | { | ||
77 | u32 i; | ||
78 | acpi_status status; | ||
79 | |||
80 | |||
81 | ACPI_FUNCTION_TRACE ("ut_mutex_initialize"); | ||
82 | |||
83 | |||
84 | /* | ||
85 | * Create each of the predefined mutex objects | ||
86 | */ | ||
87 | for (i = 0; i < NUM_MUTEX; i++) { | ||
88 | status = acpi_ut_create_mutex (i); | ||
89 | if (ACPI_FAILURE (status)) { | ||
90 | return_ACPI_STATUS (status); | ||
91 | } | ||
92 | } | ||
93 | |||
94 | status = acpi_os_create_lock (&acpi_gbl_gpe_lock); | ||
95 | return_ACPI_STATUS (status); | ||
96 | } | ||
97 | |||
98 | |||
99 | /******************************************************************************* | ||
100 | * | ||
101 | * FUNCTION: acpi_ut_mutex_terminate | ||
102 | * | ||
103 | * PARAMETERS: None. | ||
104 | * | ||
105 | * RETURN: None. | ||
106 | * | ||
107 | * DESCRIPTION: Delete all of the system mutex objects. | ||
108 | * | ||
109 | ******************************************************************************/ | ||
110 | |||
111 | void | ||
112 | acpi_ut_mutex_terminate ( | ||
113 | void) | ||
114 | { | ||
115 | u32 i; | ||
116 | |||
117 | |||
118 | ACPI_FUNCTION_TRACE ("ut_mutex_terminate"); | ||
119 | |||
120 | |||
121 | /* | ||
122 | * Delete each predefined mutex object | ||
123 | */ | ||
124 | for (i = 0; i < NUM_MUTEX; i++) { | ||
125 | (void) acpi_ut_delete_mutex (i); | ||
126 | } | ||
127 | |||
128 | acpi_os_delete_lock (acpi_gbl_gpe_lock); | ||
129 | return_VOID; | ||
130 | } | ||
131 | |||
132 | |||
133 | /******************************************************************************* | ||
134 | * | ||
135 | * FUNCTION: acpi_ut_create_mutex | ||
136 | * | ||
137 | * PARAMETERS: mutex_iD - ID of the mutex to be created | ||
138 | * | ||
139 | * RETURN: Status | ||
140 | * | ||
141 | * DESCRIPTION: Create a mutex object. | ||
142 | * | ||
143 | ******************************************************************************/ | ||
144 | |||
145 | static acpi_status | ||
146 | acpi_ut_create_mutex ( | ||
147 | acpi_mutex_handle mutex_id) | ||
148 | { | ||
149 | acpi_status status = AE_OK; | ||
150 | |||
151 | |||
152 | ACPI_FUNCTION_TRACE_U32 ("ut_create_mutex", mutex_id); | ||
153 | |||
154 | |||
155 | if (mutex_id > MAX_MUTEX) { | ||
156 | return_ACPI_STATUS (AE_BAD_PARAMETER); | ||
157 | } | ||
158 | |||
159 | if (!acpi_gbl_mutex_info[mutex_id].mutex) { | ||
160 | status = acpi_os_create_semaphore (1, 1, | ||
161 | &acpi_gbl_mutex_info[mutex_id].mutex); | ||
162 | acpi_gbl_mutex_info[mutex_id].owner_id = ACPI_MUTEX_NOT_ACQUIRED; | ||
163 | acpi_gbl_mutex_info[mutex_id].use_count = 0; | ||
164 | } | ||
165 | |||
166 | return_ACPI_STATUS (status); | ||
167 | } | ||
168 | |||
169 | |||
170 | /******************************************************************************* | ||
171 | * | ||
172 | * FUNCTION: acpi_ut_delete_mutex | ||
173 | * | ||
174 | * PARAMETERS: mutex_iD - ID of the mutex to be deleted | ||
175 | * | ||
176 | * RETURN: Status | ||
177 | * | ||
178 | * DESCRIPTION: Delete a mutex object. | ||
179 | * | ||
180 | ******************************************************************************/ | ||
181 | |||
182 | static acpi_status | ||
183 | acpi_ut_delete_mutex ( | ||
184 | acpi_mutex_handle mutex_id) | ||
185 | { | ||
186 | acpi_status status; | ||
187 | |||
188 | |||
189 | ACPI_FUNCTION_TRACE_U32 ("ut_delete_mutex", mutex_id); | ||
190 | |||
191 | |||
192 | if (mutex_id > MAX_MUTEX) { | ||
193 | return_ACPI_STATUS (AE_BAD_PARAMETER); | ||
194 | } | ||
195 | |||
196 | status = acpi_os_delete_semaphore (acpi_gbl_mutex_info[mutex_id].mutex); | ||
197 | |||
198 | acpi_gbl_mutex_info[mutex_id].mutex = NULL; | ||
199 | acpi_gbl_mutex_info[mutex_id].owner_id = ACPI_MUTEX_NOT_ACQUIRED; | ||
200 | |||
201 | return_ACPI_STATUS (status); | ||
202 | } | ||
203 | |||
204 | |||
205 | /******************************************************************************* | ||
206 | * | ||
207 | * FUNCTION: acpi_ut_acquire_mutex | ||
208 | * | ||
209 | * PARAMETERS: mutex_iD - ID of the mutex to be acquired | ||
210 | * | ||
211 | * RETURN: Status | ||
212 | * | ||
213 | * DESCRIPTION: Acquire a mutex object. | ||
214 | * | ||
215 | ******************************************************************************/ | ||
216 | |||
217 | acpi_status | ||
218 | acpi_ut_acquire_mutex ( | ||
219 | acpi_mutex_handle mutex_id) | ||
220 | { | ||
221 | acpi_status status; | ||
222 | u32 this_thread_id; | ||
223 | |||
224 | |||
225 | ACPI_FUNCTION_NAME ("ut_acquire_mutex"); | ||
226 | |||
227 | |||
228 | if (mutex_id > MAX_MUTEX) { | ||
229 | return (AE_BAD_PARAMETER); | ||
230 | } | ||
231 | |||
232 | this_thread_id = acpi_os_get_thread_id (); | ||
233 | |||
234 | #ifdef ACPI_MUTEX_DEBUG | ||
235 | { | ||
236 | u32 i; | ||
237 | /* | ||
238 | * Mutex debug code, for internal debugging only. | ||
239 | * | ||
240 | * Deadlock prevention. Check if this thread owns any mutexes of value | ||
241 | * greater than or equal to this one. If so, the thread has violated | ||
242 | * the mutex ordering rule. This indicates a coding error somewhere in | ||
243 | * the ACPI subsystem code. | ||
244 | */ | ||
245 | for (i = mutex_id; i < MAX_MUTEX; i++) { | ||
246 | if (acpi_gbl_mutex_info[i].owner_id == this_thread_id) { | ||
247 | if (i == mutex_id) { | ||
248 | ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, | ||
249 | "Mutex [%s] already acquired by this thread [%X]\n", | ||
250 | acpi_ut_get_mutex_name (mutex_id), this_thread_id)); | ||
251 | |||
252 | return (AE_ALREADY_ACQUIRED); | ||
253 | } | ||
254 | |||
255 | ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, | ||
256 | "Invalid acquire order: Thread %X owns [%s], wants [%s]\n", | ||
257 | this_thread_id, acpi_ut_get_mutex_name (i), | ||
258 | acpi_ut_get_mutex_name (mutex_id))); | ||
259 | |||
260 | return (AE_ACQUIRE_DEADLOCK); | ||
261 | } | ||
262 | } | ||
263 | } | ||
264 | #endif | ||
265 | |||
266 | ACPI_DEBUG_PRINT ((ACPI_DB_MUTEX, | ||
267 | "Thread %X attempting to acquire Mutex [%s]\n", | ||
268 | this_thread_id, acpi_ut_get_mutex_name (mutex_id))); | ||
269 | |||
270 | status = acpi_os_wait_semaphore (acpi_gbl_mutex_info[mutex_id].mutex, | ||
271 | 1, ACPI_WAIT_FOREVER); | ||
272 | if (ACPI_SUCCESS (status)) { | ||
273 | ACPI_DEBUG_PRINT ((ACPI_DB_MUTEX, "Thread %X acquired Mutex [%s]\n", | ||
274 | this_thread_id, acpi_ut_get_mutex_name (mutex_id))); | ||
275 | |||
276 | acpi_gbl_mutex_info[mutex_id].use_count++; | ||
277 | acpi_gbl_mutex_info[mutex_id].owner_id = this_thread_id; | ||
278 | } | ||
279 | else { | ||
280 | ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, | ||
281 | "Thread %X could not acquire Mutex [%s] %s\n", | ||
282 | this_thread_id, acpi_ut_get_mutex_name (mutex_id), | ||
283 | acpi_format_exception (status))); | ||
284 | } | ||
285 | |||
286 | return (status); | ||
287 | } | ||
288 | |||
289 | |||
290 | /******************************************************************************* | ||
291 | * | ||
292 | * FUNCTION: acpi_ut_release_mutex | ||
293 | * | ||
294 | * PARAMETERS: mutex_iD - ID of the mutex to be released | ||
295 | * | ||
296 | * RETURN: Status | ||
297 | * | ||
298 | * DESCRIPTION: Release a mutex object. | ||
299 | * | ||
300 | ******************************************************************************/ | ||
301 | |||
302 | acpi_status | ||
303 | acpi_ut_release_mutex ( | ||
304 | acpi_mutex_handle mutex_id) | ||
305 | { | ||
306 | acpi_status status; | ||
307 | u32 this_thread_id; | ||
308 | |||
309 | |||
310 | ACPI_FUNCTION_NAME ("ut_release_mutex"); | ||
311 | |||
312 | |||
313 | this_thread_id = acpi_os_get_thread_id (); | ||
314 | ACPI_DEBUG_PRINT ((ACPI_DB_MUTEX, | ||
315 | "Thread %X releasing Mutex [%s]\n", this_thread_id, | ||
316 | acpi_ut_get_mutex_name (mutex_id))); | ||
317 | |||
318 | if (mutex_id > MAX_MUTEX) { | ||
319 | return (AE_BAD_PARAMETER); | ||
320 | } | ||
321 | |||
322 | /* | ||
323 | * Mutex must be acquired in order to release it! | ||
324 | */ | ||
325 | if (acpi_gbl_mutex_info[mutex_id].owner_id == ACPI_MUTEX_NOT_ACQUIRED) { | ||
326 | ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, | ||
327 | "Mutex [%s] is not acquired, cannot release\n", | ||
328 | acpi_ut_get_mutex_name (mutex_id))); | ||
329 | |||
330 | return (AE_NOT_ACQUIRED); | ||
331 | } | ||
332 | |||
333 | #ifdef ACPI_MUTEX_DEBUG | ||
334 | { | ||
335 | u32 i; | ||
336 | /* | ||
337 | * Mutex debug code, for internal debugging only. | ||
338 | * | ||
339 | * Deadlock prevention. Check if this thread owns any mutexes of value | ||
340 | * greater than this one. If so, the thread has violated the mutex | ||
341 | * ordering rule. This indicates a coding error somewhere in | ||
342 | * the ACPI subsystem code. | ||
343 | */ | ||
344 | for (i = mutex_id; i < MAX_MUTEX; i++) { | ||
345 | if (acpi_gbl_mutex_info[i].owner_id == this_thread_id) { | ||
346 | if (i == mutex_id) { | ||
347 | continue; | ||
348 | } | ||
349 | |||
350 | ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, | ||
351 | "Invalid release order: owns [%s], releasing [%s]\n", | ||
352 | acpi_ut_get_mutex_name (i), acpi_ut_get_mutex_name (mutex_id))); | ||
353 | |||
354 | return (AE_RELEASE_DEADLOCK); | ||
355 | } | ||
356 | } | ||
357 | } | ||
358 | #endif | ||
359 | |||
360 | /* Mark unlocked FIRST */ | ||
361 | |||
362 | acpi_gbl_mutex_info[mutex_id].owner_id = ACPI_MUTEX_NOT_ACQUIRED; | ||
363 | |||
364 | status = acpi_os_signal_semaphore (acpi_gbl_mutex_info[mutex_id].mutex, 1); | ||
365 | |||
366 | if (ACPI_FAILURE (status)) { | ||
367 | ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, | ||
368 | "Thread %X could not release Mutex [%s] %s\n", | ||
369 | this_thread_id, acpi_ut_get_mutex_name (mutex_id), | ||
370 | acpi_format_exception (status))); | ||
371 | } | ||
372 | else { | ||
373 | ACPI_DEBUG_PRINT ((ACPI_DB_MUTEX, "Thread %X released Mutex [%s]\n", | ||
374 | this_thread_id, acpi_ut_get_mutex_name (mutex_id))); | ||
375 | } | ||
376 | |||
377 | return (status); | ||
378 | } | ||
379 | |||
380 | |||
diff --git a/drivers/acpi/utilities/utobject.c b/drivers/acpi/utilities/utobject.c index cd3899b9cc5a..19178e142951 100644 --- a/drivers/acpi/utilities/utobject.c +++ b/drivers/acpi/utilities/utobject.c | |||
@@ -338,7 +338,7 @@ acpi_ut_allocate_object_desc_dbg ( | |||
338 | ACPI_FUNCTION_TRACE ("ut_allocate_object_desc_dbg"); | 338 | ACPI_FUNCTION_TRACE ("ut_allocate_object_desc_dbg"); |
339 | 339 | ||
340 | 340 | ||
341 | object = acpi_ut_acquire_from_cache (ACPI_MEM_LIST_OPERAND); | 341 | object = acpi_os_acquire_object (acpi_gbl_operand_cache); |
342 | if (!object) { | 342 | if (!object) { |
343 | _ACPI_REPORT_ERROR (module_name, line_number, component_id, | 343 | _ACPI_REPORT_ERROR (module_name, line_number, component_id, |
344 | ("Could not allocate an object descriptor\n")); | 344 | ("Could not allocate an object descriptor\n")); |
@@ -347,7 +347,7 @@ acpi_ut_allocate_object_desc_dbg ( | |||
347 | } | 347 | } |
348 | 348 | ||
349 | /* Mark the descriptor type */ | 349 | /* Mark the descriptor type */ |
350 | 350 | memset(object, 0, sizeof(union acpi_operand_object)); | |
351 | ACPI_SET_DESCRIPTOR_TYPE (object, ACPI_DESC_TYPE_OPERAND); | 351 | ACPI_SET_DESCRIPTOR_TYPE (object, ACPI_DESC_TYPE_OPERAND); |
352 | 352 | ||
353 | ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "%p Size %X\n", | 353 | ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "%p Size %X\n", |
@@ -385,37 +385,9 @@ acpi_ut_delete_object_desc ( | |||
385 | return_VOID; | 385 | return_VOID; |
386 | } | 386 | } |
387 | 387 | ||
388 | acpi_ut_release_to_cache (ACPI_MEM_LIST_OPERAND, object); | 388 | (void) acpi_os_release_object (acpi_gbl_operand_cache, object); |
389 | |||
390 | return_VOID; | ||
391 | } | ||
392 | |||
393 | |||
394 | #ifdef ACPI_ENABLE_OBJECT_CACHE | ||
395 | /******************************************************************************* | ||
396 | * | ||
397 | * FUNCTION: acpi_ut_delete_object_cache | ||
398 | * | ||
399 | * PARAMETERS: None | ||
400 | * | ||
401 | * RETURN: None | ||
402 | * | ||
403 | * DESCRIPTION: Purge the global state object cache. Used during subsystem | ||
404 | * termination. | ||
405 | * | ||
406 | ******************************************************************************/ | ||
407 | |||
408 | void | ||
409 | acpi_ut_delete_object_cache ( | ||
410 | void) | ||
411 | { | ||
412 | ACPI_FUNCTION_TRACE ("ut_delete_object_cache"); | ||
413 | |||
414 | |||
415 | acpi_ut_delete_generic_cache (ACPI_MEM_LIST_OPERAND); | ||
416 | return_VOID; | 389 | return_VOID; |
417 | } | 390 | } |
418 | #endif | ||
419 | 391 | ||
420 | 392 | ||
421 | /******************************************************************************* | 393 | /******************************************************************************* |
diff --git a/drivers/acpi/utilities/utstate.c b/drivers/acpi/utilities/utstate.c new file mode 100644 index 000000000000..192e7ac95690 --- /dev/null +++ b/drivers/acpi/utilities/utstate.c | |||
@@ -0,0 +1,376 @@ | |||
1 | /******************************************************************************* | ||
2 | * | ||
3 | * Module Name: utstate - state object support procedures | ||
4 | * | ||
5 | ******************************************************************************/ | ||
6 | |||
7 | /* | ||
8 | * Copyright (C) 2000 - 2005, R. Byron Moore | ||
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 | |||
45 | #include <acpi/acpi.h> | ||
46 | |||
47 | #define _COMPONENT ACPI_UTILITIES | ||
48 | ACPI_MODULE_NAME ("utstate") | ||
49 | |||
50 | |||
51 | /******************************************************************************* | ||
52 | * | ||
53 | * FUNCTION: acpi_ut_create_pkg_state_and_push | ||
54 | * | ||
55 | * PARAMETERS: Object - Object to be added to the new state | ||
56 | * Action - Increment/Decrement | ||
57 | * state_list - List the state will be added to | ||
58 | * | ||
59 | * RETURN: Status | ||
60 | * | ||
61 | * DESCRIPTION: Create a new state and push it | ||
62 | * | ||
63 | ******************************************************************************/ | ||
64 | |||
65 | acpi_status | ||
66 | acpi_ut_create_pkg_state_and_push ( | ||
67 | void *internal_object, | ||
68 | void *external_object, | ||
69 | u16 index, | ||
70 | union acpi_generic_state **state_list) | ||
71 | { | ||
72 | union acpi_generic_state *state; | ||
73 | |||
74 | |||
75 | ACPI_FUNCTION_ENTRY (); | ||
76 | |||
77 | |||
78 | state = acpi_ut_create_pkg_state (internal_object, external_object, index); | ||
79 | if (!state) { | ||
80 | return (AE_NO_MEMORY); | ||
81 | } | ||
82 | |||
83 | acpi_ut_push_generic_state (state_list, state); | ||
84 | return (AE_OK); | ||
85 | } | ||
86 | |||
87 | |||
88 | /******************************************************************************* | ||
89 | * | ||
90 | * FUNCTION: acpi_ut_push_generic_state | ||
91 | * | ||
92 | * PARAMETERS: list_head - Head of the state stack | ||
93 | * State - State object to push | ||
94 | * | ||
95 | * RETURN: None | ||
96 | * | ||
97 | * DESCRIPTION: Push a state object onto a state stack | ||
98 | * | ||
99 | ******************************************************************************/ | ||
100 | |||
101 | void | ||
102 | acpi_ut_push_generic_state ( | ||
103 | union acpi_generic_state **list_head, | ||
104 | union acpi_generic_state *state) | ||
105 | { | ||
106 | ACPI_FUNCTION_TRACE ("ut_push_generic_state"); | ||
107 | |||
108 | |||
109 | /* Push the state object onto the front of the list (stack) */ | ||
110 | |||
111 | state->common.next = *list_head; | ||
112 | *list_head = state; | ||
113 | |||
114 | return_VOID; | ||
115 | } | ||
116 | |||
117 | |||
118 | /******************************************************************************* | ||
119 | * | ||
120 | * FUNCTION: acpi_ut_pop_generic_state | ||
121 | * | ||
122 | * PARAMETERS: list_head - Head of the state stack | ||
123 | * | ||
124 | * RETURN: The popped state object | ||
125 | * | ||
126 | * DESCRIPTION: Pop a state object from a state stack | ||
127 | * | ||
128 | ******************************************************************************/ | ||
129 | |||
130 | union acpi_generic_state * | ||
131 | acpi_ut_pop_generic_state ( | ||
132 | union acpi_generic_state **list_head) | ||
133 | { | ||
134 | union acpi_generic_state *state; | ||
135 | |||
136 | |||
137 | ACPI_FUNCTION_TRACE ("ut_pop_generic_state"); | ||
138 | |||
139 | |||
140 | /* Remove the state object at the head of the list (stack) */ | ||
141 | |||
142 | state = *list_head; | ||
143 | if (state) { | ||
144 | /* Update the list head */ | ||
145 | |||
146 | *list_head = state->common.next; | ||
147 | } | ||
148 | |||
149 | return_PTR (state); | ||
150 | } | ||
151 | |||
152 | |||
153 | /******************************************************************************* | ||
154 | * | ||
155 | * FUNCTION: acpi_ut_create_generic_state | ||
156 | * | ||
157 | * PARAMETERS: None | ||
158 | * | ||
159 | * RETURN: The new state object. NULL on failure. | ||
160 | * | ||
161 | * DESCRIPTION: Create a generic state object. Attempt to obtain one from | ||
162 | * the global state cache; If none available, create a new one. | ||
163 | * | ||
164 | ******************************************************************************/ | ||
165 | |||
166 | union acpi_generic_state * | ||
167 | acpi_ut_create_generic_state ( | ||
168 | void) | ||
169 | { | ||
170 | union acpi_generic_state *state; | ||
171 | |||
172 | |||
173 | ACPI_FUNCTION_ENTRY (); | ||
174 | |||
175 | |||
176 | state = acpi_os_acquire_object (acpi_gbl_state_cache); | ||
177 | if (state) { | ||
178 | /* Initialize */ | ||
179 | memset(state, 0, sizeof(union acpi_generic_state)); | ||
180 | state->common.data_type = ACPI_DESC_TYPE_STATE; | ||
181 | } | ||
182 | |||
183 | return (state); | ||
184 | } | ||
185 | |||
186 | |||
187 | /******************************************************************************* | ||
188 | * | ||
189 | * FUNCTION: acpi_ut_create_thread_state | ||
190 | * | ||
191 | * PARAMETERS: None | ||
192 | * | ||
193 | * RETURN: New Thread State. NULL on failure | ||
194 | * | ||
195 | * DESCRIPTION: Create a "Thread State" - a flavor of the generic state used | ||
196 | * to track per-thread info during method execution | ||
197 | * | ||
198 | ******************************************************************************/ | ||
199 | |||
200 | struct acpi_thread_state * | ||
201 | acpi_ut_create_thread_state ( | ||
202 | void) | ||
203 | { | ||
204 | union acpi_generic_state *state; | ||
205 | |||
206 | |||
207 | ACPI_FUNCTION_TRACE ("ut_create_thread_state"); | ||
208 | |||
209 | |||
210 | /* Create the generic state object */ | ||
211 | |||
212 | state = acpi_ut_create_generic_state (); | ||
213 | if (!state) { | ||
214 | return_PTR (NULL); | ||
215 | } | ||
216 | |||
217 | /* Init fields specific to the update struct */ | ||
218 | |||
219 | state->common.data_type = ACPI_DESC_TYPE_STATE_THREAD; | ||
220 | state->thread.thread_id = acpi_os_get_thread_id (); | ||
221 | |||
222 | return_PTR ((struct acpi_thread_state *) state); | ||
223 | } | ||
224 | |||
225 | |||
226 | /******************************************************************************* | ||
227 | * | ||
228 | * FUNCTION: acpi_ut_create_update_state | ||
229 | * | ||
230 | * PARAMETERS: Object - Initial Object to be installed in the state | ||
231 | * Action - Update action to be performed | ||
232 | * | ||
233 | * RETURN: New state object, null on failure | ||
234 | * | ||
235 | * DESCRIPTION: Create an "Update State" - a flavor of the generic state used | ||
236 | * to update reference counts and delete complex objects such | ||
237 | * as packages. | ||
238 | * | ||
239 | ******************************************************************************/ | ||
240 | |||
241 | union acpi_generic_state * | ||
242 | acpi_ut_create_update_state ( | ||
243 | union acpi_operand_object *object, | ||
244 | u16 action) | ||
245 | { | ||
246 | union acpi_generic_state *state; | ||
247 | |||
248 | |||
249 | ACPI_FUNCTION_TRACE_PTR ("ut_create_update_state", object); | ||
250 | |||
251 | |||
252 | /* Create the generic state object */ | ||
253 | |||
254 | state = acpi_ut_create_generic_state (); | ||
255 | if (!state) { | ||
256 | return_PTR (NULL); | ||
257 | } | ||
258 | |||
259 | /* Init fields specific to the update struct */ | ||
260 | |||
261 | state->common.data_type = ACPI_DESC_TYPE_STATE_UPDATE; | ||
262 | state->update.object = object; | ||
263 | state->update.value = action; | ||
264 | |||
265 | return_PTR (state); | ||
266 | } | ||
267 | |||
268 | |||
269 | /******************************************************************************* | ||
270 | * | ||
271 | * FUNCTION: acpi_ut_create_pkg_state | ||
272 | * | ||
273 | * PARAMETERS: Object - Initial Object to be installed in the state | ||
274 | * Action - Update action to be performed | ||
275 | * | ||
276 | * RETURN: New state object, null on failure | ||
277 | * | ||
278 | * DESCRIPTION: Create a "Package State" | ||
279 | * | ||
280 | ******************************************************************************/ | ||
281 | |||
282 | union acpi_generic_state * | ||
283 | acpi_ut_create_pkg_state ( | ||
284 | void *internal_object, | ||
285 | void *external_object, | ||
286 | u16 index) | ||
287 | { | ||
288 | union acpi_generic_state *state; | ||
289 | |||
290 | |||
291 | ACPI_FUNCTION_TRACE_PTR ("ut_create_pkg_state", internal_object); | ||
292 | |||
293 | |||
294 | /* Create the generic state object */ | ||
295 | |||
296 | state = acpi_ut_create_generic_state (); | ||
297 | if (!state) { | ||
298 | return_PTR (NULL); | ||
299 | } | ||
300 | |||
301 | /* Init fields specific to the update struct */ | ||
302 | |||
303 | state->common.data_type = ACPI_DESC_TYPE_STATE_PACKAGE; | ||
304 | state->pkg.source_object = (union acpi_operand_object *) internal_object; | ||
305 | state->pkg.dest_object = external_object; | ||
306 | state->pkg.index = index; | ||
307 | state->pkg.num_packages = 1; | ||
308 | |||
309 | return_PTR (state); | ||
310 | } | ||
311 | |||
312 | |||
313 | /******************************************************************************* | ||
314 | * | ||
315 | * FUNCTION: acpi_ut_create_control_state | ||
316 | * | ||
317 | * PARAMETERS: None | ||
318 | * | ||
319 | * RETURN: New state object, null on failure | ||
320 | * | ||
321 | * DESCRIPTION: Create a "Control State" - a flavor of the generic state used | ||
322 | * to support nested IF/WHILE constructs in the AML. | ||
323 | * | ||
324 | ******************************************************************************/ | ||
325 | |||
326 | union acpi_generic_state * | ||
327 | acpi_ut_create_control_state ( | ||
328 | void) | ||
329 | { | ||
330 | union acpi_generic_state *state; | ||
331 | |||
332 | |||
333 | ACPI_FUNCTION_TRACE ("ut_create_control_state"); | ||
334 | |||
335 | |||
336 | /* Create the generic state object */ | ||
337 | |||
338 | state = acpi_ut_create_generic_state (); | ||
339 | if (!state) { | ||
340 | return_PTR (NULL); | ||
341 | } | ||
342 | |||
343 | /* Init fields specific to the control struct */ | ||
344 | |||
345 | state->common.data_type = ACPI_DESC_TYPE_STATE_CONTROL; | ||
346 | state->common.state = ACPI_CONTROL_CONDITIONAL_EXECUTING; | ||
347 | |||
348 | return_PTR (state); | ||
349 | } | ||
350 | |||
351 | |||
352 | /******************************************************************************* | ||
353 | * | ||
354 | * FUNCTION: acpi_ut_delete_generic_state | ||
355 | * | ||
356 | * PARAMETERS: State - The state object to be deleted | ||
357 | * | ||
358 | * RETURN: None | ||
359 | * | ||
360 | * DESCRIPTION: Put a state object back into the global state cache. The object | ||
361 | * is not actually freed at this time. | ||
362 | * | ||
363 | ******************************************************************************/ | ||
364 | |||
365 | void | ||
366 | acpi_ut_delete_generic_state ( | ||
367 | union acpi_generic_state *state) | ||
368 | { | ||
369 | ACPI_FUNCTION_TRACE ("ut_delete_generic_state"); | ||
370 | |||
371 | |||
372 | (void) acpi_os_release_object (acpi_gbl_state_cache, state); | ||
373 | return_VOID; | ||
374 | } | ||
375 | |||
376 | |||
diff --git a/drivers/acpi/utilities/utxface.c b/drivers/acpi/utilities/utxface.c index e8803d810656..850da6817423 100644 --- a/drivers/acpi/utilities/utxface.c +++ b/drivers/acpi/utilities/utxface.c | |||
@@ -46,8 +46,6 @@ | |||
46 | #include <acpi/acpi.h> | 46 | #include <acpi/acpi.h> |
47 | #include <acpi/acevents.h> | 47 | #include <acpi/acevents.h> |
48 | #include <acpi/acnamesp.h> | 48 | #include <acpi/acnamesp.h> |
49 | #include <acpi/acparser.h> | ||
50 | #include <acpi/acdispat.h> | ||
51 | #include <acpi/acdebug.h> | 49 | #include <acpi/acdebug.h> |
52 | 50 | ||
53 | #define _COMPONENT ACPI_UTILITIES | 51 | #define _COMPONENT ACPI_UTILITIES |
@@ -79,11 +77,6 @@ acpi_initialize_subsystem ( | |||
79 | 77 | ||
80 | ACPI_DEBUG_EXEC (acpi_ut_init_stack_ptr_trace ()); | 78 | ACPI_DEBUG_EXEC (acpi_ut_init_stack_ptr_trace ()); |
81 | 79 | ||
82 | |||
83 | /* Initialize all globals used by the subsystem */ | ||
84 | |||
85 | acpi_ut_init_globals (); | ||
86 | |||
87 | /* Initialize the OS-Dependent layer */ | 80 | /* Initialize the OS-Dependent layer */ |
88 | 81 | ||
89 | status = acpi_os_initialize (); | 82 | status = acpi_os_initialize (); |
@@ -93,6 +86,10 @@ acpi_initialize_subsystem ( | |||
93 | return_ACPI_STATUS (status); | 86 | return_ACPI_STATUS (status); |
94 | } | 87 | } |
95 | 88 | ||
89 | /* Initialize all globals used by the subsystem */ | ||
90 | |||
91 | acpi_ut_init_globals (); | ||
92 | |||
96 | /* Create the default mutex objects */ | 93 | /* Create the default mutex objects */ |
97 | 94 | ||
98 | status = acpi_ut_mutex_initialize (); | 95 | status = acpi_ut_mutex_initialize (); |
@@ -522,13 +519,9 @@ acpi_purge_cached_objects ( | |||
522 | { | 519 | { |
523 | ACPI_FUNCTION_TRACE ("acpi_purge_cached_objects"); | 520 | ACPI_FUNCTION_TRACE ("acpi_purge_cached_objects"); |
524 | 521 | ||
525 | 522 | (void) acpi_os_purge_cache (acpi_gbl_state_cache); | |
526 | #ifdef ACPI_ENABLE_OBJECT_CACHE | 523 | (void) acpi_os_purge_cache (acpi_gbl_operand_cache); |
527 | acpi_ut_delete_generic_state_cache (); | 524 | (void) acpi_os_purge_cache (acpi_gbl_ps_node_cache); |
528 | acpi_ut_delete_object_cache (); | 525 | (void) acpi_os_purge_cache (acpi_gbl_ps_node_ext_cache); |
529 | acpi_ds_delete_walk_state_cache (); | ||
530 | acpi_ps_delete_parse_cache (); | ||
531 | #endif | ||
532 | |||
533 | return_ACPI_STATUS (AE_OK); | 526 | return_ACPI_STATUS (AE_OK); |
534 | } | 527 | } |