diff options
author | Bob Moore <robert.moore@intel.com> | 2005-11-17 13:07:00 -0500 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2005-12-10 00:27:56 -0500 |
commit | c51a4de85de720670f2fbc592a6f8040af72ad87 (patch) | |
tree | ccaa60c483fcc904abd63d936ff7dc380bf28e7b /include | |
parent | 96db255c8f014ae3497507104e8df809785a619f (diff) |
[ACPI] ACPICA 20051117
Fixed a problem in the AML parser where the method thread
count could be decremented below zero if any errors
occurred during the method parse phase. This should
eliminate AE_AML_METHOD_LIMIT exceptions seen on some
machines. This also fixed a related regression with the
mechanism that detects and corrects methods that cannot
properly handle reentrancy (related to the deployment of
the new OwnerId mechanism.)
Eliminated the pre-parsing of control methods (to detect
errors) during table load. Related to the problem above,
this was causing unwind issues if any errors occurred
during the parse, and it seemed to be overkill. A table
load should not be aborted if there are problems with
any single control method, thus rendering this feature
rather pointless.
Fixed a problem with the new table-driven resource manager
where an internal buffer overflow could occur for small
resource templates.
Implemented a new external interface, acpi_get_vendor_resource()
This interface will find and return a vendor-defined
resource descriptor within a _CRS or _PRS
method via an ACPI 3.0 UUID match. (from Bjorn Helgaas)
Removed the length limit (200) on string objects as
per the upcoming ACPI 3.0A specification. This affects
the following areas of the interpreter: 1) any implicit
conversion of a Buffer to a String, 2) a String object
result of the ASL Concatentate operator, 3) the String
object result of the ASL ToString operator.
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'include')
-rw-r--r-- | include/acpi/acconfig.h | 14 | ||||
-rw-r--r-- | include/acpi/acglobal.h | 1 | ||||
-rw-r--r-- | include/acpi/aclocal.h | 4 | ||||
-rw-r--r-- | include/acpi/acmacros.h | 27 | ||||
-rw-r--r-- | include/acpi/acpixf.h | 8 | ||||
-rw-r--r-- | include/acpi/acresrc.h | 7 | ||||
-rw-r--r-- | include/acpi/actypes.h | 23 | ||||
-rw-r--r-- | include/acpi/platform/aclinux.h | 4 |
8 files changed, 66 insertions, 22 deletions
diff --git a/include/acpi/acconfig.h b/include/acpi/acconfig.h index d371ec6b9812..08eafece3eed 100644 --- a/include/acpi/acconfig.h +++ b/include/acpi/acconfig.h | |||
@@ -63,7 +63,7 @@ | |||
63 | 63 | ||
64 | /* Current ACPICA subsystem version in YYYYMMDD format */ | 64 | /* Current ACPICA subsystem version in YYYYMMDD format */ |
65 | 65 | ||
66 | #define ACPI_CA_VERSION 0x20051102 | 66 | #define ACPI_CA_VERSION 0x20051117 |
67 | 67 | ||
68 | /* | 68 | /* |
69 | * OS name, used for the _OS object. The _OS object is essentially obsolete, | 69 | * OS name, used for the _OS object. The _OS object is essentially obsolete, |
@@ -98,11 +98,6 @@ | |||
98 | 98 | ||
99 | #define ACPI_CA_SUPPORT_LEVEL 3 | 99 | #define ACPI_CA_SUPPORT_LEVEL 3 |
100 | 100 | ||
101 | /* String size constants */ | ||
102 | |||
103 | #define ACPI_MAX_STRING_LENGTH 512 | ||
104 | #define ACPI_PATHNAME_MAX 256 /* A full namespace pathname */ | ||
105 | |||
106 | /* Maximum count for a semaphore object */ | 101 | /* Maximum count for a semaphore object */ |
107 | 102 | ||
108 | #define ACPI_MAX_SEMAPHORE_COUNT 256 | 103 | #define ACPI_MAX_SEMAPHORE_COUNT 256 |
@@ -134,14 +129,11 @@ | |||
134 | #define ACPI_METHOD_NUM_ARGS 7 | 129 | #define ACPI_METHOD_NUM_ARGS 7 |
135 | #define ACPI_METHOD_MAX_ARG 6 | 130 | #define ACPI_METHOD_MAX_ARG 6 |
136 | 131 | ||
137 | /* Maximum length of resulting string when converting from a buffer */ | 132 | /* Length of _HID, _UID, _CID, and UUID values */ |
138 | |||
139 | #define ACPI_MAX_STRING_CONVERSION 200 | ||
140 | |||
141 | /* Length of _HID, _UID, and _CID values */ | ||
142 | 133 | ||
143 | #define ACPI_DEVICE_ID_LENGTH 0x09 | 134 | #define ACPI_DEVICE_ID_LENGTH 0x09 |
144 | #define ACPI_MAX_CID_LENGTH 48 | 135 | #define ACPI_MAX_CID_LENGTH 48 |
136 | #define ACPI_UUID_LENGTH 16 | ||
145 | 137 | ||
146 | /* | 138 | /* |
147 | * Operand Stack (in WALK_STATE), Must be large enough to contain METHOD_MAX_ARG | 139 | * Operand Stack (in WALK_STATE), Must be large enough to contain METHOD_MAX_ARG |
diff --git a/include/acpi/acglobal.h b/include/acpi/acglobal.h index cef51b1ddf94..bd344e51313b 100644 --- a/include/acpi/acglobal.h +++ b/include/acpi/acglobal.h | |||
@@ -223,6 +223,7 @@ ACPI_EXTERN u32 acpi_gbl_ps_find_count; | |||
223 | ACPI_EXTERN u32 acpi_gbl_owner_id_mask; | 223 | ACPI_EXTERN u32 acpi_gbl_owner_id_mask; |
224 | ACPI_EXTERN u16 acpi_gbl_pm1_enable_register_save; | 224 | ACPI_EXTERN u16 acpi_gbl_pm1_enable_register_save; |
225 | ACPI_EXTERN u16 acpi_gbl_global_lock_handle; | 225 | ACPI_EXTERN u16 acpi_gbl_global_lock_handle; |
226 | ACPI_EXTERN u8 acpi_gbl_last_owner_id; | ||
226 | ACPI_EXTERN u8 acpi_gbl_debugger_configuration; | 227 | ACPI_EXTERN u8 acpi_gbl_debugger_configuration; |
227 | ACPI_EXTERN u8 acpi_gbl_global_lock_acquired; | 228 | ACPI_EXTERN u8 acpi_gbl_global_lock_acquired; |
228 | ACPI_EXTERN u8 acpi_gbl_step_to_next_call; | 229 | ACPI_EXTERN u8 acpi_gbl_step_to_next_call; |
diff --git a/include/acpi/aclocal.h b/include/acpi/aclocal.h index dca0d40ea395..0cb61a72d971 100644 --- a/include/acpi/aclocal.h +++ b/include/acpi/aclocal.h | |||
@@ -573,6 +573,8 @@ struct acpi_parse_obj_named { | |||
573 | 573 | ||
574 | /* The parse node is the fundamental element of the parse tree */ | 574 | /* The parse node is the fundamental element of the parse tree */ |
575 | 575 | ||
576 | #define ACPI_MAX_PARSEOP_NAME 20 | ||
577 | |||
576 | struct acpi_parse_obj_asl { | 578 | struct acpi_parse_obj_asl { |
577 | ACPI_PARSE_COMMON union acpi_parse_object *child; | 579 | ACPI_PARSE_COMMON union acpi_parse_object *child; |
578 | union acpi_parse_object *parent_method; | 580 | union acpi_parse_object *parent_method; |
@@ -597,7 +599,7 @@ struct acpi_parse_obj_asl { | |||
597 | u8 aml_opcode_length; | 599 | u8 aml_opcode_length; |
598 | u8 aml_pkg_len_bytes; | 600 | u8 aml_pkg_len_bytes; |
599 | u8 extra; | 601 | u8 extra; |
600 | char parse_op_name[12]; | 602 | char parse_op_name[ACPI_MAX_PARSEOP_NAME]; |
601 | }; | 603 | }; |
602 | 604 | ||
603 | union acpi_parse_object { | 605 | union acpi_parse_object { |
diff --git a/include/acpi/acmacros.h b/include/acpi/acmacros.h index e42222c3d34c..5b78ff4091b9 100644 --- a/include/acpi/acmacros.h +++ b/include/acpi/acmacros.h | |||
@@ -107,23 +107,29 @@ | |||
107 | * Extract a byte of data using a pointer. Any more than a byte and we | 107 | * Extract a byte of data using a pointer. Any more than a byte and we |
108 | * get into potential aligment issues -- see the STORE macros below | 108 | * get into potential aligment issues -- see the STORE macros below |
109 | */ | 109 | */ |
110 | #define ACPI_GET8(addr) (*(u8*)(addr)) | 110 | #define ACPI_GET8(ptr) *ACPI_CAST_PTR (u8, ptr) |
111 | #define ACPI_GET16(ptr) *ACPI_CAST_PTR (u16, ptr) | ||
112 | #define ACPI_GET32(ptr) *ACPI_CAST_PTR (u32, ptr) | ||
113 | #define ACPI_GET64(ptr) *ACPI_CAST_PTR (u64, ptr) | ||
114 | #define ACPI_SET8(ptr) *ACPI_CAST_PTR (u8, ptr) | ||
115 | #define ACPI_SET16(ptr) *ACPI_CAST_PTR (u16, ptr) | ||
116 | #define ACPI_SET32(ptr) *ACPI_CAST_PTR (u32, ptr) | ||
117 | #define ACPI_SET64(ptr) *ACPI_CAST_PTR (u64, ptr) | ||
111 | 118 | ||
112 | /* Pointer arithmetic */ | 119 | /* Pointer manipulation */ |
113 | 120 | ||
114 | #define ACPI_PTR_ADD(t,a,b) (t *) (void *)((char *)(a) + (acpi_native_uint)(b)) | 121 | #define ACPI_CAST_PTR(t, p) ((t *)(void *)(p)) |
122 | #define ACPI_CAST_INDIRECT_PTR(t, p) ((t **)(void *)(p)) | ||
123 | #define ACPI_ADD_PTR(t,a,b) ACPI_CAST_PTR (t, (ACPI_CAST_PTR (u8, (a)) + (acpi_native_uint)(b))) | ||
115 | #define ACPI_PTR_DIFF(a,b) (acpi_native_uint) ((char *)(a) - (char *)(b)) | 124 | #define ACPI_PTR_DIFF(a,b) (acpi_native_uint) ((char *)(a) - (char *)(b)) |
116 | 125 | ||
117 | /* Pointer/Integer type conversions */ | 126 | /* Pointer/Integer type conversions */ |
118 | 127 | ||
119 | #define ACPI_TO_POINTER(i) ACPI_PTR_ADD (void, (void *) NULL,(acpi_native_uint)i) | 128 | #define ACPI_TO_POINTER(i) ACPI_ADD_PTR (void, (void *) NULL,(acpi_native_uint)i) |
120 | #define ACPI_TO_INTEGER(p) ACPI_PTR_DIFF (p,(void *) NULL) | 129 | #define ACPI_TO_INTEGER(p) ACPI_PTR_DIFF (p,(void *) NULL) |
121 | #define ACPI_OFFSET(d,f) (acpi_size) ACPI_PTR_DIFF (&(((d *)0)->f),(void *) NULL) | 130 | #define ACPI_OFFSET(d,f) (acpi_size) ACPI_PTR_DIFF (&(((d *)0)->f),(void *) NULL) |
122 | #define ACPI_FADT_OFFSET(f) ACPI_OFFSET (FADT_DESCRIPTOR, f) | 131 | #define ACPI_FADT_OFFSET(f) ACPI_OFFSET (FADT_DESCRIPTOR, f) |
123 | 132 | ||
124 | #define ACPI_CAST_PTR(t, p) ((t *)(void *)(p)) | ||
125 | #define ACPI_CAST_INDIRECT_PTR(t, p) ((t **)(void *)(p)) | ||
126 | |||
127 | #if ACPI_MACHINE_WIDTH == 16 | 133 | #if ACPI_MACHINE_WIDTH == 16 |
128 | #define ACPI_STORE_POINTER(d,s) ACPI_MOVE_32_TO_32(d,s) | 134 | #define ACPI_STORE_POINTER(d,s) ACPI_MOVE_32_TO_32(d,s) |
129 | #define ACPI_PHYSADDR_TO_PTR(i) (void *)(i) | 135 | #define ACPI_PHYSADDR_TO_PTR(i) (void *)(i) |
@@ -365,6 +371,13 @@ | |||
365 | #define ACPI_REGISTER_PREPARE_BITS(val, pos, mask) ((val << pos) & mask) | 371 | #define ACPI_REGISTER_PREPARE_BITS(val, pos, mask) ((val << pos) & mask) |
366 | #define ACPI_REGISTER_INSERT_VALUE(reg, pos, mask, val) reg = (reg & (~(mask))) | ACPI_REGISTER_PREPARE_BITS(val, pos, mask) | 372 | #define ACPI_REGISTER_INSERT_VALUE(reg, pos, mask, val) reg = (reg & (~(mask))) | ACPI_REGISTER_PREPARE_BITS(val, pos, mask) |
367 | 373 | ||
374 | /* Generate a UUID */ | ||
375 | |||
376 | #define ACPI_INIT_UUID(a,b,c,d0,d1,d2,d3,d4,d5,d6,d7) (a) & 0xFF, ((a) >> 8) & 0xFF, ((a) >> 16) & 0xFF, ((a) >> 24) & 0xFF, \ | ||
377 | (b) & 0xFF, ((b) >> 8) & 0xFF, \ | ||
378 | (c) & 0xFF, ((c) >> 8) & 0xFF, \ | ||
379 | (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) | ||
380 | |||
368 | /* | 381 | /* |
369 | * An struct acpi_namespace_node * can appear in some contexts, | 382 | * An struct acpi_namespace_node * can appear in some contexts, |
370 | * where a pointer to an union acpi_operand_object can also | 383 | * where a pointer to an union acpi_operand_object can also |
diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h index 02f00a8fee03..2a88429bc4ec 100644 --- a/include/acpi/acpixf.h +++ b/include/acpi/acpixf.h | |||
@@ -272,6 +272,12 @@ acpi_status(*ACPI_WALK_RESOURCE_CALLBACK) (struct acpi_resource * resource, | |||
272 | void *context); | 272 | void *context); |
273 | 273 | ||
274 | acpi_status | 274 | acpi_status |
275 | acpi_get_vendor_resource(acpi_handle device_handle, | ||
276 | char *name, | ||
277 | struct acpi_vendor_uuid *uuid, | ||
278 | struct acpi_buffer *ret_buffer); | ||
279 | |||
280 | acpi_status | ||
275 | acpi_get_current_resources(acpi_handle device_handle, | 281 | acpi_get_current_resources(acpi_handle device_handle, |
276 | struct acpi_buffer *ret_buffer); | 282 | struct acpi_buffer *ret_buffer); |
277 | 283 | ||
@@ -283,7 +289,7 @@ acpi_get_possible_resources(acpi_handle device_handle, | |||
283 | 289 | ||
284 | acpi_status | 290 | acpi_status |
285 | acpi_walk_resources(acpi_handle device_handle, | 291 | acpi_walk_resources(acpi_handle device_handle, |
286 | char *path, | 292 | char *name, |
287 | ACPI_WALK_RESOURCE_CALLBACK user_function, void *context); | 293 | ACPI_WALK_RESOURCE_CALLBACK user_function, void *context); |
288 | 294 | ||
289 | acpi_status | 295 | acpi_status |
diff --git a/include/acpi/acresrc.h b/include/acpi/acresrc.h index 2bf53940f259..ba281f7740a0 100644 --- a/include/acpi/acresrc.h +++ b/include/acpi/acresrc.h | |||
@@ -137,9 +137,14 @@ extern struct acpi_rsconvert_info *acpi_gbl_set_resource_dispatch[]; | |||
137 | 137 | ||
138 | /* Resource tables indexed by raw AML resource descriptor type */ | 138 | /* Resource tables indexed by raw AML resource descriptor type */ |
139 | 139 | ||
140 | extern const u8 acpi_gbl_resource_struct_sizes[]; | ||
140 | extern struct acpi_rsconvert_info *acpi_gbl_get_resource_dispatch[]; | 141 | extern struct acpi_rsconvert_info *acpi_gbl_get_resource_dispatch[]; |
141 | 142 | ||
142 | extern const u8 acpi_gbl_resource_struct_sizes[]; | 143 | struct acpi_vendor_walk_info { |
144 | struct acpi_vendor_uuid *uuid; | ||
145 | struct acpi_buffer *buffer; | ||
146 | acpi_status status; | ||
147 | }; | ||
143 | 148 | ||
144 | /* | 149 | /* |
145 | * rscreate | 150 | * rscreate |
diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h index 29b887017b18..11847592ed1b 100644 --- a/include/acpi/actypes.h +++ b/include/acpi/actypes.h | |||
@@ -326,7 +326,7 @@ typedef u64 acpi_integer; | |||
326 | /* | 326 | /* |
327 | * Constants with special meanings | 327 | * Constants with special meanings |
328 | */ | 328 | */ |
329 | #define ACPI_ROOT_OBJECT (acpi_handle) ACPI_PTR_ADD (char, NULL, ACPI_MAX_PTR) | 329 | #define ACPI_ROOT_OBJECT ACPI_ADD_PTR (acpi_handle, NULL, ACPI_MAX_PTR) |
330 | 330 | ||
331 | /* | 331 | /* |
332 | * Initialization sequence | 332 | * Initialization sequence |
@@ -986,6 +986,17 @@ typedef u32 acpi_rsdesc_size; /* Max Resource Descriptor size is (length+3) = (6 | |||
986 | #pragma pack(1) | 986 | #pragma pack(1) |
987 | #endif | 987 | #endif |
988 | 988 | ||
989 | /* UUID data structures for use in vendor-defined resource descriptors */ | ||
990 | |||
991 | struct acpi_uuid { | ||
992 | u8 data[ACPI_UUID_LENGTH]; | ||
993 | }; | ||
994 | |||
995 | struct acpi_vendor_uuid { | ||
996 | u8 subtype; | ||
997 | u8 data[ACPI_UUID_LENGTH]; | ||
998 | }; | ||
999 | |||
989 | /* | 1000 | /* |
990 | * Structures used to describe device resources | 1001 | * Structures used to describe device resources |
991 | */ | 1002 | */ |
@@ -1033,6 +1044,15 @@ struct acpi_resource_vendor { | |||
1033 | u8 byte_data[1]; | 1044 | u8 byte_data[1]; |
1034 | }; | 1045 | }; |
1035 | 1046 | ||
1047 | /* Vendor resource with UUID info (introduced in ACPI 3.0) */ | ||
1048 | |||
1049 | struct acpi_resource_vendor_typed { | ||
1050 | u16 byte_length; | ||
1051 | u8 uuid_subtype; | ||
1052 | u8 uuid[ACPI_UUID_LENGTH]; | ||
1053 | u8 byte_data[1]; | ||
1054 | }; | ||
1055 | |||
1036 | struct acpi_resource_end_tag { | 1056 | struct acpi_resource_end_tag { |
1037 | u8 checksum; | 1057 | u8 checksum; |
1038 | }; | 1058 | }; |
@@ -1184,6 +1204,7 @@ union acpi_resource_data { | |||
1184 | struct acpi_resource_io io; | 1204 | struct acpi_resource_io io; |
1185 | struct acpi_resource_fixed_io fixed_io; | 1205 | struct acpi_resource_fixed_io fixed_io; |
1186 | struct acpi_resource_vendor vendor; | 1206 | struct acpi_resource_vendor vendor; |
1207 | struct acpi_resource_vendor_typed vendor_typed; | ||
1187 | struct acpi_resource_end_tag end_tag; | 1208 | struct acpi_resource_end_tag end_tag; |
1188 | struct acpi_resource_memory24 memory24; | 1209 | struct acpi_resource_memory24 memory24; |
1189 | struct acpi_resource_memory32 memory32; | 1210 | struct acpi_resource_memory32 memory32; |
diff --git a/include/acpi/platform/aclinux.h b/include/acpi/platform/aclinux.h index c93e6562f0e1..1b9cbf05b79e 100644 --- a/include/acpi/platform/aclinux.h +++ b/include/acpi/platform/aclinux.h | |||
@@ -71,6 +71,10 @@ | |||
71 | #define acpi_cache_t kmem_cache_t | 71 | #define acpi_cache_t kmem_cache_t |
72 | #endif | 72 | #endif |
73 | 73 | ||
74 | /* Full namespace pathname length limit - arbitrary */ | ||
75 | |||
76 | #define ACPI_PATHNAME_MAX 256 | ||
77 | |||
74 | #else /* !__KERNEL__ */ | 78 | #else /* !__KERNEL__ */ |
75 | 79 | ||
76 | #include <stdarg.h> | 80 | #include <stdarg.h> |