obj_desc->package.node = parent->common.node;
        }
 
-       obj_desc->package.count = package_length;
-
-       /* Count the number of items in the package list */
+       /* Count the *actual* number of items in the package list */
 
        arg = op->common.value.arg;
        arg = arg->common.next;
        }
 
        /*
-        * The package length (number of elements) will be the greater
-        * of the specified length and the length of the initializer list
+        * The number of elements in the package will be the lesser of the
+        * specified element count and the length of the initializer list.
+        *
+        * Even though the ASL compilers do not allow this to happen (for the
+        * fixed length package opcode), some BIOS code modifies the AML on the
+        * fly to adjust the package length, and this code compensates for that.
+        * This also provides compatibility with other AML interpreters.
         */
-       if (package_list_length > package_length) {
-               obj_desc->package.count = package_list_length;
+       obj_desc->package.count = package_length;
+
+       if (package_list_length != package_length) {
+               ACPI_DEBUG_PRINT((ACPI_DB_INFO,
+                                 "Package length mismatch, using lesser of %X(Length Arg) and %X(AML Length)\n",
+                                 package_length, package_list_length));
+
+               if (package_list_length < package_length) {
+                       obj_desc->package.count = package_list_length;
+               }
        }
 
        /*
         */
        arg = op->common.value.arg;
        arg = arg->common.next;
-       for (i = 0; arg; i++) {
+       for (i = 0; i < obj_desc->package.count; i++) {
                if (arg->common.aml_opcode == AML_INT_RETURN_VALUE_OP) {
 
                        /* Object (package or buffer) is already built */