dbfileio.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:10k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*******************************************************************************
  2.  *
  3.  * Module Name: dbfileio - Debugger file I/O commands.  These can't usually
  4.  *              be used when running the debugger in Ring 0 (Kernel mode)
  5.  *              $Revision: 53 $
  6.  *
  7.  ******************************************************************************/
  8. /*
  9.  *  Copyright (C) 2000, 2001 R. Byron Moore
  10.  *
  11.  *  This program is free software; you can redistribute it and/or modify
  12.  *  it under the terms of the GNU General Public License as published by
  13.  *  the Free Software Foundation; either version 2 of the License, or
  14.  *  (at your option) any later version.
  15.  *
  16.  *  This program is distributed in the hope that it will be useful,
  17.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  *  GNU General Public License for more details.
  20.  *
  21.  *  You should have received a copy of the GNU General Public License
  22.  *  along with this program; if not, write to the Free Software
  23.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  24.  */
  25. #include "acpi.h"
  26. #include "acdebug.h"
  27. #include "acnamesp.h"
  28. #include "acparser.h"
  29. #include "acevents.h"
  30. #include "actables.h"
  31. #ifdef ENABLE_DEBUGGER
  32. #define _COMPONENT          ACPI_DEBUGGER
  33.  MODULE_NAME         ("dbfileio")
  34. /*
  35.  * NOTE: this is here for lack of a better place.  It is used in all
  36.  * flavors of the debugger, need LCD file
  37.  */
  38. #ifdef ACPI_APPLICATION
  39. #include <stdio.h>
  40. FILE                        *acpi_gbl_debug_file = NULL;
  41. #endif
  42. acpi_table_header           *acpi_gbl_db_table_ptr = NULL;
  43. /*******************************************************************************
  44.  *
  45.  * FUNCTION:    Acpi_db_match_argument
  46.  *
  47.  * PARAMETERS:  User_argument           - User command line
  48.  *              Arguments               - Array of commands to match against
  49.  *
  50.  * RETURN:      Index into command array or ACPI_TYPE_NOT_FOUND if not found
  51.  *
  52.  * DESCRIPTION: Search command array for a command match
  53.  *
  54.  ******************************************************************************/
  55. acpi_object_type8
  56. acpi_db_match_argument (
  57. NATIVE_CHAR             *user_argument,
  58. ARGUMENT_INFO           *arguments)
  59. {
  60. u32                     i;
  61. if (!user_argument || user_argument[0] == 0) {
  62. return (ACPI_TYPE_NOT_FOUND);
  63. }
  64. for (i = 0; arguments[i].name; i++) {
  65. if (STRSTR (arguments[i].name, user_argument) == arguments[i].name) {
  66. return ((acpi_object_type8) i);
  67. }
  68. }
  69. /* Argument not recognized */
  70. return (ACPI_TYPE_NOT_FOUND);
  71. }
  72. /*******************************************************************************
  73.  *
  74.  * FUNCTION:    Acpi_db_close_debug_file
  75.  *
  76.  * PARAMETERS:  None
  77.  *
  78.  * RETURN:      Status
  79.  *
  80.  * DESCRIPTION: If open, close the current debug output file
  81.  *
  82.  ******************************************************************************/
  83. void
  84. acpi_db_close_debug_file (
  85. void)
  86. {
  87. #ifdef ACPI_APPLICATION
  88. if (acpi_gbl_debug_file) {
  89.    fclose (acpi_gbl_debug_file);
  90.    acpi_gbl_debug_file = NULL;
  91.    acpi_gbl_db_output_to_file = FALSE;
  92.    acpi_os_printf ("Debug output file %s closedn", acpi_gbl_db_debug_filename);
  93. }
  94. #endif
  95. }
  96. /*******************************************************************************
  97.  *
  98.  * FUNCTION:    Acpi_db_open_debug_file
  99.  *
  100.  * PARAMETERS:  Name                - Filename to open
  101.  *
  102.  * RETURN:      Status
  103.  *
  104.  * DESCRIPTION: Open a file where debug output will be directed.
  105.  *
  106.  ******************************************************************************/
  107. void
  108. acpi_db_open_debug_file (
  109. NATIVE_CHAR             *name)
  110. {
  111. #ifdef ACPI_APPLICATION
  112. acpi_db_close_debug_file ();
  113. acpi_gbl_debug_file = fopen (name, "w+");
  114. if (acpi_gbl_debug_file) {
  115. acpi_os_printf ("Debug output file %s openedn", name);
  116. STRCPY (acpi_gbl_db_debug_filename, name);
  117. acpi_gbl_db_output_to_file = TRUE;
  118. }
  119. else {
  120. acpi_os_printf ("Could not open debug file %sn", name);
  121. }
  122. #endif
  123. }
  124. #ifdef ACPI_APPLICATION
  125. /*******************************************************************************
  126.  *
  127.  * FUNCTION:    Acpi_db_load_table
  128.  *
  129.  * PARAMETERS:  fp              - File that contains table
  130.  *              Table_ptr       - Return value, buffer with table
  131.  *              Table_lenght    - Return value, length of table
  132.  *
  133.  * RETURN:      Status
  134.  *
  135.  * DESCRIPTION: Load the DSDT from the file pointer
  136.  *
  137.  ******************************************************************************/
  138. acpi_status
  139. acpi_db_load_table(
  140. FILE                    *fp,
  141. acpi_table_header       **table_ptr,
  142. u32                     *table_length)
  143. {
  144. acpi_table_header       table_header;
  145. u8                      *aml_start;
  146. u32                     aml_length;
  147. u32                     actual;
  148. acpi_status             status;
  149. /* Read the table header */
  150. if (fread (&table_header, 1, sizeof (table_header), fp) != sizeof (acpi_table_header)) {
  151. acpi_os_printf ("Couldn't read the table headern");
  152. return (AE_BAD_SIGNATURE);
  153. }
  154. /* Validate the table header/length */
  155. status = acpi_tb_validate_table_header (&table_header);
  156. if ((ACPI_FAILURE (status)) ||
  157. (table_header.length > 524288)) /* 1/2 Mbyte should be enough */ {
  158. acpi_os_printf ("Table header is invalid!n");
  159. return (AE_ERROR);
  160. }
  161. /* We only support a limited number of table types */
  162. if (STRNCMP ((char *) table_header.signature, DSDT_SIG, 4) &&
  163. STRNCMP ((char *) table_header.signature, PSDT_SIG, 4) &&
  164. STRNCMP ((char *) table_header.signature, SSDT_SIG, 4)) {
  165. acpi_os_printf ("Table signature is invalidn");
  166. DUMP_BUFFER (&table_header, sizeof (acpi_table_header));
  167. return (AE_ERROR);
  168. }
  169. /* Allocate a buffer for the table */
  170. *table_length = table_header.length;
  171. *table_ptr = acpi_os_allocate ((size_t) *table_length);
  172. if (!*table_ptr) {
  173. acpi_os_printf ("Could not allocate memory for ACPI table %4.4s (size=%X)n",
  174.  table_header.signature, table_header.length);
  175. return (AE_NO_MEMORY);
  176. }
  177. aml_start = (u8 *) *table_ptr + sizeof (table_header);
  178. aml_length = *table_length - sizeof (table_header);
  179. /* Copy the header to the buffer */
  180. MEMCPY (*table_ptr, &table_header, sizeof (table_header));
  181. /* Get the rest of the table */
  182. actual = fread (aml_start, 1, (size_t) aml_length, fp);
  183. if (actual == aml_length) {
  184. return (AE_OK);
  185. }
  186. if (actual > 0) {
  187. acpi_os_printf ("Warning - reading table, asked for %X got %Xn", aml_length, actual);
  188. return (AE_OK);
  189. }
  190. acpi_os_printf ("Error - could not read the table filen");
  191. acpi_os_free (*table_ptr);
  192. *table_ptr = NULL;
  193. *table_length = 0;
  194. return (AE_ERROR);
  195. }
  196. #endif
  197. /*******************************************************************************
  198.  *
  199.  * FUNCTION:    Ae_local_load_table
  200.  *
  201.  * PARAMETERS:  Table_ptr       - pointer to a buffer containing the entire
  202.  *                                table to be loaded
  203.  *
  204.  * RETURN:      Status
  205.  *
  206.  * DESCRIPTION: This function is called to load a table from the caller's
  207.  *              buffer.  The buffer must contain an entire ACPI Table including
  208.  *              a valid header.  The header fields will be verified, and if it
  209.  *              is determined that the table is invalid, the call will fail.
  210.  *
  211.  *              If the call fails an appropriate status will be returned.
  212.  *
  213.  ******************************************************************************/
  214. acpi_status
  215. ae_local_load_table (
  216. acpi_table_header       *table_ptr)
  217. {
  218. acpi_status             status;
  219. acpi_table_desc         table_info;
  220. FUNCTION_TRACE ("Ae_local_load_table");
  221. if (!table_ptr) {
  222. return_ACPI_STATUS (AE_BAD_PARAMETER);
  223. }
  224. /* Install the new table into the local data structures */
  225. table_info.pointer = table_ptr;
  226. status = acpi_tb_install_table (NULL, &table_info);
  227. if (ACPI_FAILURE (status)) {
  228. /* Free table allocated by Acpi_tb_get_table */
  229. acpi_tb_delete_single_table (&table_info);
  230. return_ACPI_STATUS (status);
  231. }
  232. #ifndef PARSER_ONLY
  233. status = acpi_ns_load_table (table_info.installed_desc, acpi_gbl_root_node);
  234. if (ACPI_FAILURE (status)) {
  235. /* Uninstall table and free the buffer */
  236. acpi_tb_delete_acpi_table (ACPI_TABLE_DSDT);
  237. return_ACPI_STATUS (status);
  238. }
  239. #endif
  240. return_ACPI_STATUS (status);
  241. }
  242. /*******************************************************************************
  243.  *
  244.  * FUNCTION:    Acpi_db_load_acpi_table
  245.  *
  246.  * PARAMETERS:  Filname         - File where table is located
  247.  *
  248.  * RETURN:      Status
  249.  *
  250.  * DESCRIPTION: Load an ACPI table from a file
  251.  *
  252.  ******************************************************************************/
  253. acpi_status
  254. acpi_db_load_acpi_table (
  255. NATIVE_CHAR             *filename)
  256. {
  257. #ifdef ACPI_APPLICATION
  258. FILE                    *fp;
  259. acpi_status             status;
  260. u32                     table_length;
  261. /* Open the file */
  262. fp = fopen (filename, "rb");
  263. if (!fp) {
  264. acpi_os_printf ("Could not open file %sn", filename);
  265. return (AE_ERROR);
  266. }
  267. /* Get the entire file */
  268. acpi_os_printf ("Loading Acpi table from file %sn", filename);
  269. status = acpi_db_load_table (fp, &acpi_gbl_db_table_ptr, &table_length);
  270. fclose(fp);
  271. if (ACPI_FAILURE (status)) {
  272. acpi_os_printf ("Couldn't get table from the filen");
  273. return (status);
  274. }
  275. /* Attempt to recognize and install the table */
  276. status = ae_local_load_table (acpi_gbl_db_table_ptr);
  277. if (ACPI_FAILURE (status)) {
  278. if (status == AE_EXIST) {
  279. acpi_os_printf ("Table %4.4s is already installedn",
  280.   &acpi_gbl_db_table_ptr->signature);
  281. }
  282. else {
  283. acpi_os_printf ("Could not install table, %sn",
  284.   acpi_format_exception (status));
  285. }
  286. acpi_os_free (acpi_gbl_db_table_ptr);
  287. return (status);
  288. }
  289. acpi_os_printf ("%4.4s at %p successfully installed and loadedn",
  290.   &acpi_gbl_db_table_ptr->signature, acpi_gbl_db_table_ptr);
  291. acpi_gbl_acpi_hardware_present = FALSE;
  292. #endif  /* ACPI_APPLICATION */
  293. return (AE_OK);
  294. }
  295. #endif  /* ENABLE_DEBUGGER */