os.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:17k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /******************************************************************************
  2.  * 
  3.  * Module Name: os.c - Linux OSL functions
  4.  * $Revision: 49 $
  5.  *
  6.  *****************************************************************************/
  7. /*
  8.  *  os.c - OS-dependent functions
  9.  *
  10.  *  Copyright (C) 2000 Andrew Henroid
  11.  *  Copyright (C) 2001 Andrew Grover
  12.  *
  13.  *  This program is free software; you can redistribute it and/or modify
  14.  *  it under the terms of the GNU General Public License as published by
  15.  *  the Free Software Foundation; either version 2 of the License, or
  16.  *  (at your option) any later version.
  17.  *
  18.  *  This program is distributed in the hope that it will be useful,
  19.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  20.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21.  *  GNU General Public License for more details.
  22.  *
  23.  *  You should have received a copy of the GNU General Public License
  24.  *  along with this program; if not, write to the Free Software
  25.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  26.  */
  27. /* Changes
  28.  *
  29.  * Christopher Liebman <liebman@sponsera.com> 2001-5-15
  30.  * - Fixed improper kernel_thread parameters 
  31.  */
  32. #include <linux/kernel.h>
  33. #include <linux/slab.h>
  34. #include <linux/mm.h>
  35. #include <linux/pci.h>
  36. #include <linux/interrupt.h>
  37. #include <linux/kmod.h>
  38. #include <linux/delay.h>
  39. #include <asm/io.h>
  40. #include <acpi.h>
  41. #ifdef CONFIG_ACPI_EFI
  42. #include <linux/efi.h>
  43. #endif
  44. #ifdef _IA64
  45. #include <asm/hw_irq.h>
  46. #endif 
  47. #define _COMPONENT ACPI_OS_SERVICES
  48. MODULE_NAME ("os")
  49. typedef struct 
  50. {
  51.     OSD_EXECUTION_CALLBACK  function;
  52.     void     *context;
  53. } ACPI_OS_DPC;
  54. /*****************************************************************************
  55.  *        Debugger Stuff
  56.  *****************************************************************************/
  57. #ifdef ENABLE_DEBUGGER
  58. #include <linux/kdb.h>
  59. /* stuff for debugger support */
  60. int acpi_in_debugger = 0;
  61. extern NATIVE_CHAR line_buf[80];
  62. #endif
  63. /*****************************************************************************
  64.  *     Globals
  65.  *****************************************************************************/
  66. static int acpi_irq_irq = 0;
  67. static OSD_HANDLER acpi_irq_handler = NULL;
  68. static void *acpi_irq_context = NULL;
  69. /******************************************************************************
  70.  *    Functions
  71.  *****************************************************************************/
  72. acpi_status
  73. acpi_os_initialize(void)
  74. {
  75. return AE_OK;
  76. }
  77. acpi_status
  78. acpi_os_terminate(void)
  79. {
  80. if (acpi_irq_handler) {
  81. acpi_os_remove_interrupt_handler(acpi_irq_irq,
  82.  acpi_irq_handler);
  83. }
  84. return AE_OK;
  85. }
  86. s32
  87. acpi_os_printf(const NATIVE_CHAR *fmt,...)
  88. {
  89. s32 size;
  90. va_list args;
  91. va_start(args, fmt);
  92. size = acpi_os_vprintf(fmt, args);
  93. va_end(args);
  94. return size;
  95. }
  96. s32
  97. acpi_os_vprintf(const NATIVE_CHAR *fmt, va_list args)
  98. {
  99. static char buffer[512];
  100. int size = vsprintf(buffer, fmt, args);
  101. #ifdef ENABLE_DEBUGGER
  102. if (acpi_in_debugger) {
  103. kdb_printf("%s", buffer);
  104. } else {
  105. printk("%s", buffer);
  106. }
  107. #else
  108. printk("%s", buffer);
  109. #endif
  110. return size;
  111. }
  112. void *
  113. acpi_os_allocate(u32 size)
  114. {
  115. return kmalloc(size, GFP_KERNEL);
  116. }
  117. void *
  118. acpi_os_callocate(u32 size)
  119. {
  120. void *ptr = acpi_os_allocate(size);
  121. if (ptr)
  122. memset(ptr, 0, size);
  123. return ptr;
  124. }
  125. void
  126. acpi_os_free(void *ptr)
  127. {
  128. kfree(ptr);
  129. }
  130. acpi_status
  131. acpi_os_get_root_pointer(u32 flags, ACPI_PHYSICAL_ADDRESS *phys_addr)
  132. {
  133. #ifndef CONFIG_ACPI_EFI
  134. if (ACPI_FAILURE(acpi_find_root_pointer(flags, phys_addr))) {
  135. printk(KERN_ERR "ACPI: System description tables not foundn");
  136. return AE_ERROR;
  137. }
  138. #else /*CONFIG_ACPI_EFI*/
  139. if (efi.acpi20)
  140. *phys_addr = (ACPI_PHYSICAL_ADDRESS) efi.acpi20;
  141. else if (efi.acpi)
  142. *phys_addr = (ACPI_PHYSICAL_ADDRESS) efi.acpi;
  143. else {
  144. printk(KERN_ERR "ACPI: System description tables not foundn");
  145. *phys_addr = NULL;
  146. return AE_ERROR;
  147. }
  148. #endif /*CONFIG_ACPI_EFI*/
  149. return AE_OK;
  150. }
  151. acpi_status
  152. acpi_os_map_memory(ACPI_PHYSICAL_ADDRESS phys, u32 size, void **virt)
  153. {
  154. if (phys > ULONG_MAX) {
  155. printk(KERN_ERR "ACPI: Cannot map memory that highn");
  156. return AE_ERROR;
  157. }
  158. *virt = ioremap((unsigned long) phys, size);
  159. if (!*virt)
  160. return AE_ERROR;
  161. return AE_OK;
  162. }
  163. void
  164. acpi_os_unmap_memory(void *virt, u32 size)
  165. {
  166. iounmap(virt);
  167. }
  168. acpi_status
  169. acpi_os_get_physical_address(void *virt, ACPI_PHYSICAL_ADDRESS *phys)
  170. {
  171. if(!phys || !virt)
  172. return AE_BAD_PARAMETER;
  173. *phys = virt_to_phys(virt);
  174. return AE_OK;
  175. }
  176. static void
  177. acpi_irq(int irq, void *dev_id, struct pt_regs *regs)
  178. {
  179. (*acpi_irq_handler)(acpi_irq_context);
  180. }
  181. acpi_status
  182. acpi_os_install_interrupt_handler(u32 irq, OSD_HANDLER handler, void *context)
  183. {
  184. #ifdef _IA64
  185. irq = isa_irq_to_vector(irq);
  186. #endif /*_IA64*/
  187. acpi_irq_irq = irq;
  188. acpi_irq_handler = handler;
  189. acpi_irq_context = context;
  190. if (request_irq(irq,
  191. acpi_irq,
  192. SA_SHIRQ,
  193. "acpi",
  194. acpi_irq)) {
  195. printk(KERN_ERR "ACPI: SCI (IRQ%d) allocation failedn", irq);
  196. return AE_ERROR;
  197. }
  198. return AE_OK;
  199. }
  200. acpi_status
  201. acpi_os_remove_interrupt_handler(u32 irq, OSD_HANDLER handler)
  202. {
  203. if (acpi_irq_handler) {
  204. #ifdef _IA64
  205. irq = isa_irq_to_vector(irq);
  206. #endif /*_IA64*/
  207. free_irq(irq, acpi_irq);
  208. acpi_irq_handler = NULL;
  209. }
  210. return AE_OK;
  211. }
  212. /*
  213.  * Running in interpreter thread context, safe to sleep
  214.  */
  215. void
  216. acpi_os_sleep(u32 sec, u32 ms)
  217. {
  218. current->state = TASK_INTERRUPTIBLE;
  219. schedule_timeout(HZ * sec + (ms * HZ) / 1000);
  220. }
  221. void
  222. acpi_os_stall(u32 us)
  223. {
  224. if (us > 10000) {
  225. mdelay(us / 1000);
  226. }
  227. else {
  228. udelay(us);
  229. }
  230. }
  231. acpi_status
  232. acpi_os_read_port(
  233. ACPI_IO_ADDRESS port,
  234. void *value,
  235. u32 width)
  236. {
  237. u32 dummy;
  238. if (!value)
  239. value = &dummy;
  240. switch (width)
  241. {
  242. case 8:
  243. *(u8*)  value = inb(port);
  244. break;
  245. case 16:
  246. *(u16*) value = inw(port);
  247. break;
  248. case 32:
  249. *(u32*) value = inl(port);
  250. break;
  251. default:
  252. BUG();
  253. }
  254. return AE_OK;
  255. }
  256. acpi_status
  257. acpi_os_write_port(
  258. ACPI_IO_ADDRESS port,
  259. NATIVE_UINT value,
  260. u32 width)
  261. {
  262. switch (width)
  263. {
  264. case 8:
  265. outb(value, port);
  266. break;
  267. case 16:
  268. outw(value, port);
  269. break;
  270. case 32:
  271. outl(value, port);
  272. break;
  273. default:
  274. BUG();
  275. }
  276. return AE_OK;
  277. }
  278. acpi_status
  279. acpi_os_read_memory(
  280. ACPI_PHYSICAL_ADDRESS phys_addr,
  281. void *value,
  282. u32 width)
  283. {
  284. u32 dummy;
  285. if (!value)
  286. value = &dummy;
  287. switch (width)
  288. {
  289. case 8:
  290. *(u8*) value = *(u8*) phys_to_virt(phys_addr);
  291. break;
  292. case 16:
  293. *(u16*) value = *(u16*) phys_to_virt(phys_addr);
  294. break;
  295. case 32:
  296. *(u32*) value = *(u32*) phys_to_virt(phys_addr);
  297. break;
  298. default:
  299. BUG();
  300. }
  301. return AE_OK;
  302. }
  303. acpi_status
  304. acpi_os_write_memory(
  305. ACPI_PHYSICAL_ADDRESS phys_addr,
  306. NATIVE_UINT value,
  307. u32 width)
  308. {
  309. switch (width)
  310. {
  311. case 8:
  312. *(u8*) phys_to_virt(phys_addr) = value;
  313. break;
  314. case 16:
  315. *(u16*) phys_to_virt(phys_addr) = value;
  316. break;
  317. case 32:
  318. *(u32*) phys_to_virt(phys_addr) = value;
  319. break;
  320. default:
  321. BUG();
  322. }
  323. return AE_OK;
  324. }
  325. #ifdef CONFIG_ACPI_PCI
  326. /* Architecture-dependent low-level PCI configuration access functions. */
  327. extern int (*pci_config_read)(int seg, int bus, int dev, int fn, int reg, int len, u32 *val);
  328. extern int (*pci_config_write)(int seg, int bus, int dev, int fn, int reg, int len, u32 val);
  329. acpi_status
  330. acpi_os_read_pci_configuration (
  331. acpi_pci_id             *pci_id,
  332. u32                     reg,
  333. void                    *value,
  334. u32                     width)
  335. {
  336. int result = 0;
  337. if (!value)
  338. return AE_ERROR;
  339. switch (width)
  340. {
  341. case 8:
  342. result = pci_config_read(pci_id->segment, pci_id->bus, 
  343. pci_id->device, pci_id->function, reg, 1, value);
  344. break;
  345. case 16:
  346. result = pci_config_read(pci_id->segment, pci_id->bus, 
  347. pci_id->device, pci_id->function, reg, 2, value);
  348. break;
  349. case 32:
  350. result = pci_config_read(pci_id->segment, pci_id->bus, 
  351. pci_id->device, pci_id->function, reg, 4, value);
  352. break;
  353. default:
  354. BUG();
  355. }
  356. return (result ? AE_ERROR : AE_OK);
  357. }
  358. ACPI_STATUS
  359. acpi_os_write_pci_configuration (
  360. acpi_pci_id             *pci_id,
  361. u32                     reg,
  362. NATIVE_UINT             value,
  363. u32                     width)
  364. {
  365. int result = 0;
  366. switch (width)
  367. {
  368. case 8:
  369. result = pci_config_write(pci_id->segment, pci_id->bus, 
  370. pci_id->device, pci_id->function, reg, 1, value);
  371. break;
  372. case 16:
  373. result = pci_config_write(pci_id->segment, pci_id->bus, 
  374. pci_id->device, pci_id->function, reg, 2, value);
  375. break;
  376. case 32:
  377. result = pci_config_write(pci_id->segment, pci_id->bus, 
  378. pci_id->device, pci_id->function, reg, 4, value);
  379. break;
  380. default:
  381. BUG();
  382. }
  383. return (result ? AE_ERROR : AE_OK);
  384. }
  385. #else /*CONFIG_ACPI_PCI*/
  386. acpi_status
  387. acpi_os_read_pci_configuration (
  388. acpi_pci_id *pci_id,
  389. u32 reg,
  390. void *value,
  391. u32 width)
  392. {
  393. int devfn = PCI_DEVFN(pci_id->device, pci_id->function);
  394. struct pci_dev *dev = pci_find_slot(pci_id->bus, devfn);
  395. if (!value || !dev)
  396. return AE_ERROR;
  397. switch (width)
  398. {
  399. case 8:
  400. if (pci_read_config_byte(dev, reg, (u8*) value))
  401. return AE_ERROR;
  402. break;
  403. case 16:
  404. if (pci_read_config_word(dev, reg, (u16*) value))
  405. return AE_ERROR;
  406. break;
  407. case 32:
  408. if (pci_read_config_dword(dev, reg, (u32*) value))
  409. return AE_ERROR;
  410. break;
  411. default:
  412. BUG();
  413. }
  414. return AE_OK;
  415. }
  416. acpi_status
  417. acpi_os_write_pci_configuration (
  418. acpi_pci_id *pci_id,
  419. u32 reg,
  420. NATIVE_UINT value,
  421. u32 width)
  422. {
  423. int devfn = PCI_DEVFN(pci_id->device, pci_id->function);
  424. struct pci_dev *dev = pci_find_slot(pci_id->bus, devfn);
  425. if (!dev)
  426. return AE_ERROR;
  427. switch (width)
  428. {
  429. case 8:
  430. if (pci_write_config_byte(dev, reg, value))
  431. return AE_ERROR;
  432. break;
  433. case 16:
  434. if (pci_write_config_word(dev, reg, value))
  435. return AE_ERROR;
  436. break;
  437. case 32:
  438. if (pci_write_config_dword(dev, reg, value))
  439. return AE_ERROR;
  440. break;
  441. default:
  442. BUG();
  443. }
  444. return AE_OK;
  445. }
  446. #endif /*CONFIG_ACPI_PCI*/
  447. acpi_status
  448. acpi_os_load_module (
  449. char *module_name)
  450. {
  451. PROC_NAME("acpi_os_load_module");
  452. if (!module_name)
  453. return AE_BAD_PARAMETER;
  454. if (0 > request_module(module_name)) {
  455. ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Unable to load module [%s].n", module_name));
  456. return AE_ERROR;
  457. }
  458. return AE_OK;
  459. }
  460. acpi_status
  461. acpi_os_unload_module (
  462. char *module_name)
  463. {
  464. if (!module_name)
  465. return AE_BAD_PARAMETER;
  466. /* TODO: How on Linux? */
  467. /* this is done automatically for all modules with
  468. use_count = 0, I think. see: MOD_INC_USE_COUNT -ASG */
  469. return AE_OK;
  470. }
  471. /*
  472.  * See acpi_os_queue_for_execution()
  473.  */
  474. static int
  475. acpi_os_queue_exec (
  476. void *context)
  477. {
  478. ACPI_OS_DPC *dpc = (ACPI_OS_DPC*)context;
  479. PROC_NAME("acpi_os_queue_exec");
  480. daemonize();
  481. strcpy(current->comm, "kacpidpc");
  482.     
  483. if (!dpc || !dpc->function)
  484. return AE_BAD_PARAMETER;
  485. ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Executing function [%p(%p)].n", dpc->function, dpc->context));
  486. dpc->function(dpc->context);
  487. kfree(dpc);
  488. return 1;
  489. }
  490. static void
  491. acpi_os_schedule_exec (
  492. void *context)
  493. {
  494. ACPI_OS_DPC *dpc = NULL;
  495. int thread_pid = -1;
  496. PROC_NAME("acpi_os_schedule_exec");
  497. dpc = (ACPI_OS_DPC*)context;
  498. if (!dpc) {
  499. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Invalid (NULL) context.n"));
  500. return;
  501. }
  502. ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Creating new thread to run function [%p(%p)].n", dpc->function, dpc->context));
  503. thread_pid = kernel_thread(acpi_os_queue_exec, dpc, 
  504. (CLONE_FS | CLONE_FILES | SIGCHLD));
  505. if (thread_pid < 0) {
  506. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Call to kernel_thread() failed.n"));
  507. acpi_os_free(dpc);
  508. }
  509. }
  510. acpi_status
  511. acpi_os_queue_for_execution(
  512. u32 priority,
  513. OSD_EXECUTION_CALLBACK function,
  514. void *context)
  515. {
  516. acpi_status  status = AE_OK;
  517. ACPI_OS_DPC  *dpc = NULL;
  518. PROC_NAME("acpi_os_queue_for_execution");
  519. ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Scheduling function [%p(%p)] for deferred execution.n", function, context));
  520. if (!function)
  521. return AE_BAD_PARAMETER;
  522. /*
  523.  * Queue via DPC:
  524.  * --------------
  525.  * Note that we have to use two different processes for queuing DPCs:
  526.  *  Interrupt-Level: Use schedule_task; can't spawn a new thread.
  527.  *     Kernel-Level: Spawn a new kernel thread, as schedule_task has
  528.  *   its limitations (e.g. single-threaded model), and
  529.  *   all other task queues run at interrupt-level.
  530.  */
  531. switch (priority) {
  532. case OSD_PRIORITY_GPE:
  533. {
  534. static struct tq_struct task;
  535. /*
  536.  * Allocate/initialize DPC structure.  Note that this memory will be
  537.  * freed by the callee.
  538.  */
  539. dpc = kmalloc(sizeof(ACPI_OS_DPC), GFP_ATOMIC);
  540. if (!dpc) 
  541. return AE_NO_MEMORY;
  542. dpc->function = function;
  543. dpc->context = context;
  544. memset(&task, 0, sizeof(struct tq_struct));
  545. task.routine = acpi_os_schedule_exec;
  546. task.data = (void*)dpc;
  547. if (schedule_task(&task) < 0) {
  548. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Call to schedule_task() failed.n"));
  549. status = AE_ERROR;
  550. }
  551. }
  552. break;
  553. default:
  554. /*
  555.  * Allocate/initialize DPC structure.  Note that this memory will be
  556.  * freed by the callee.
  557.  */
  558. dpc = kmalloc(sizeof(ACPI_OS_DPC), GFP_KERNEL);
  559. if (!dpc) 
  560. return AE_NO_MEMORY;
  561. dpc->function = function;
  562. dpc->context = context;
  563. acpi_os_schedule_exec(dpc);
  564. break;
  565. }
  566. return status;
  567. }
  568. acpi_status
  569. acpi_os_create_semaphore(
  570. u32 max_units,
  571. u32 initial_units,
  572. acpi_handle *handle)
  573. {
  574. struct semaphore *sem = NULL;
  575. PROC_NAME("acpi_os_create_semaphore");
  576. sem = acpi_os_callocate(sizeof(struct semaphore));
  577. if (!sem)
  578. return AE_NO_MEMORY;
  579. sema_init(sem, initial_units);
  580. *handle = (acpi_handle*)sem;
  581. ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Creating semaphore[%p|%d].n", *handle, initial_units));
  582. return AE_OK;
  583. }
  584. /* 
  585.  * TODO: A better way to delete semaphores?  Linux doesn't have a
  586.  * 'delete_semaphore()' function -- may result in an invalid
  587.  * pointer dereference for non-synchronized consumers. Should
  588.  * we at least check for blocked threads and signal/cancel them?
  589.  */
  590. acpi_status
  591. acpi_os_delete_semaphore(
  592. acpi_handle handle)
  593. {
  594. struct semaphore *sem = (struct semaphore*) handle;
  595. PROC_NAME("acpi_os_delete_semaphore");
  596. if (!sem) 
  597. return AE_BAD_PARAMETER;
  598. ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Deleting semaphore[%p].n", handle));
  599. acpi_os_free(sem); sem =  NULL;
  600. return AE_OK;
  601. }
  602. /*
  603.  * TODO: The kernel doesn't have a 'down_timeout' function -- had to
  604.  * improvise.  The process is to sleep for one scheduler quantum
  605.  * until the semaphore becomes available.  Downside is that this
  606.  * may result in starvation for timeout-based waits when there's
  607.  * lots of semaphore activity.
  608.  *
  609.  * TODO: Support for units > 1?
  610.  */
  611. acpi_status
  612. acpi_os_wait_semaphore(
  613. acpi_handle handle,
  614. u32 units,
  615. u32 timeout)
  616. {
  617. acpi_status status = AE_OK;
  618. struct semaphore *sem = (struct semaphore*)handle;
  619. int ret = 0;
  620. PROC_NAME("acpi_os_wait_semaphore");
  621. if (!sem || (units < 1)) 
  622. return AE_BAD_PARAMETER;
  623. if (units > 1)
  624. return AE_SUPPORT;
  625. ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Waiting for semaphore[%p|%d|%d]n", handle, units, timeout));
  626. switch (timeout)
  627. {
  628. /*
  629.  * No Wait:
  630.  * --------
  631.  * A zero timeout value indicates that we shouldn't wait - just
  632.  * acquire the semaphore if available otherwise return AE_TIME
  633.  * (a.k.a. 'would block').
  634.  */
  635. case 0:
  636. if(down_trylock(sem))
  637. status = AE_TIME;
  638. break;
  639. /*
  640.  * Wait Indefinitely:
  641.  * ------------------
  642.  */
  643. case WAIT_FOREVER:
  644. ret = down_interruptible(sem);
  645. if (ret < 0)
  646. status = AE_ERROR;
  647. break;
  648. /*
  649.  * Wait w/ Timeout:
  650.  * ----------------
  651.  */
  652. default:
  653. // TODO: A better timeout algorithm?
  654. {
  655. int i = 0;
  656. static const int quantum_ms = 1000/HZ;
  657. ret = down_trylock(sem);
  658. for (i = timeout; (i > 0 && ret < 0); i -= quantum_ms) {
  659. current->state = TASK_INTERRUPTIBLE;
  660. schedule_timeout(1);
  661. ret = down_trylock(sem);
  662. }
  663. if (ret != 0)
  664.  status = AE_TIME;
  665. }
  666. break;
  667. }
  668. if (ACPI_FAILURE(status)) {
  669. ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Failed to acquire semaphore[%p|%d|%d]n", handle, units, timeout));
  670. }
  671. else {
  672. ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Acquired semaphore[%p|%d|%d]n", handle, units, timeout));
  673. }
  674. return status;
  675. }
  676. /*
  677.  * TODO: Support for units > 1?
  678.  */
  679. acpi_status
  680. acpi_os_signal_semaphore(
  681.     acpi_handle      handle, 
  682.     u32      units)
  683. {
  684. struct semaphore *sem = (struct semaphore *) handle;
  685. PROC_NAME("acpi_os_signal_semaphore");
  686. if (!sem || (units < 1)) 
  687. return AE_BAD_PARAMETER;
  688. if (units > 1)
  689. return AE_SUPPORT;
  690. ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Signaling semaphore[%p|%d]n", handle, units));
  691. up(sem);
  692. return AE_OK;
  693. }
  694. u32
  695. acpi_os_get_line(NATIVE_CHAR *buffer)
  696. {
  697. #ifdef ENABLE_DEBUGGER
  698. if (acpi_in_debugger) {
  699. u32 chars;
  700. kdb_read(buffer, sizeof(line_buf));
  701. /* remove the CR kdb includes */ 
  702. chars = strlen(buffer) - 1;
  703. buffer[chars] = '';
  704. }
  705. #endif
  706. return 0;
  707. }
  708. /*
  709.  * We just have to assume we're dealing with valid memory
  710.  */
  711. BOOLEAN
  712. acpi_os_readable(void *ptr, u32 len)
  713. {
  714. return 1;
  715. }
  716. BOOLEAN
  717. acpi_os_writable(void *ptr, u32 len)
  718. {
  719. return 1;
  720. }
  721. u32
  722. acpi_os_get_thread_id (void)
  723. {
  724. if (!in_interrupt())
  725. return current->pid;
  726. return 0;
  727. }
  728. acpi_status
  729. acpi_os_signal (
  730.     u32 function,
  731.     void *info)
  732. {
  733. switch (function)
  734. {
  735. case ACPI_SIGNAL_FATAL:
  736. printk(KERN_ERR "ACPI: Fatal opcode executedn");
  737. break;
  738. case ACPI_SIGNAL_BREAKPOINT:
  739. {
  740. char *bp_info = (char*) info;
  741. printk(KERN_ERR "ACPI breakpoint: %sn", bp_info);
  742. }
  743. default:
  744. break;
  745. }
  746. return AE_OK;
  747. }
  748. acpi_status
  749. acpi_os_breakpoint(NATIVE_CHAR *msg)
  750. {
  751. acpi_os_printf("breakpoint: %s", msg);
  752. return AE_OK;
  753. }