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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/kernel/printk.c
  3.  *
  4.  *  Copyright (C) 1991, 1992  Linus Torvalds
  5.  *
  6.  * Modified to make sys_syslog() more flexible: added commands to
  7.  * return the last 4k of kernel messages, regardless of whether
  8.  * they've been read or not.  Added option to suppress kernel printk's
  9.  * to the console.  Added hook for sending the console messages
  10.  * elsewhere, in preparation for a serial line console (someday).
  11.  * Ted Ts'o, 2/11/93.
  12.  * Modified for sysctl support, 1/8/97, Chris Horn.
  13.  * Fixed SMP synchronization, 08/08/99, Manfred Spraul 
  14.  *     manfreds@colorfullife.com
  15.  * Rewrote bits to get rid of console_lock
  16.  * 01Mar01 Andrew Morton <andrewm@uow.edu.au>
  17.  */
  18. #include <linux/kernel.h>
  19. #include <linux/mm.h>
  20. #include <linux/tty.h>
  21. #include <linux/tty_driver.h>
  22. #include <linux/smp_lock.h>
  23. #include <linux/console.h>
  24. #include <linux/init.h>
  25. #include <linux/module.h>
  26. #include <linux/interrupt.h> /* For in_interrupt() */
  27. #include <linux/config.h>
  28. #include <asm/uaccess.h>
  29. #if defined(CONFIG_MULTIQUAD) || defined(CONFIG_IA64)
  30. #define LOG_BUF_LEN (65536)
  31. #elif defined(CONFIG_ARCH_S390)
  32. #define LOG_BUF_LEN (131072)
  33. #elif defined(CONFIG_SMP)
  34. #define LOG_BUF_LEN (32768)
  35. #else
  36. #define LOG_BUF_LEN (16384) /* This must be a power of two */
  37. #endif
  38. #define LOG_BUF_MASK (LOG_BUF_LEN-1)
  39. #ifndef arch_consoles_callable
  40. #define arch_consoles_callable() (1)
  41. #endif
  42. /* printk's without a loglevel use this.. */
  43. #define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING */
  44. /* We show everything that is MORE important than this.. */
  45. #define MINIMUM_CONSOLE_LOGLEVEL 1 /* Minimum loglevel we let people use */
  46. #define DEFAULT_CONSOLE_LOGLEVEL 7 /* anything MORE serious than KERN_DEBUG */
  47. DECLARE_WAIT_QUEUE_HEAD(log_wait);
  48. int console_printk[4] = {
  49. DEFAULT_CONSOLE_LOGLEVEL, /* console_loglevel */
  50. DEFAULT_MESSAGE_LOGLEVEL, /* default_message_loglevel */
  51. MINIMUM_CONSOLE_LOGLEVEL, /* minimum_console_loglevel */
  52. DEFAULT_CONSOLE_LOGLEVEL, /* default_console_loglevel */
  53. };
  54. int oops_in_progress;
  55. /*
  56.  * console_sem protects the console_drivers list, and also
  57.  * provides serialisation for access to the entire console
  58.  * driver system.
  59.  */
  60. static DECLARE_MUTEX(console_sem);
  61. struct console *console_drivers;
  62. /*
  63.  * logbuf_lock protects log_buf, log_start, log_end, con_start and logged_chars
  64.  * It is also used in interesting ways to provide interlocking in
  65.  * release_console_sem().
  66.  */
  67. static spinlock_t logbuf_lock = SPIN_LOCK_UNLOCKED;
  68. static char log_buf[LOG_BUF_LEN];
  69. #define LOG_BUF(idx) (log_buf[(idx) & LOG_BUF_MASK])
  70. /*
  71.  * The indices into log_buf are not constrained to LOG_BUF_LEN - they
  72.  * must be masked before subscripting
  73.  */
  74. static unsigned long log_start; /* Index into log_buf: next char to be read by syslog() */
  75. static unsigned long con_start; /* Index into log_buf: next char to be sent to consoles */
  76. static unsigned long log_end; /* Index into log_buf: most-recently-written-char + 1 */
  77. static unsigned long logged_chars; /* Number of chars produced since last read+clear operation */
  78. struct console_cmdline console_cmdline[MAX_CMDLINECONSOLES];
  79. static int preferred_console = -1;
  80. /* Flag: console code may call schedule() */
  81. static int console_may_schedule;
  82. /*
  83.  * Setup a list of consoles. Called from init/main.c
  84.  */
  85. static int __init console_setup(char *str)
  86. {
  87. struct console_cmdline *c;
  88. char name[sizeof(c->name)];
  89. char *s, *options;
  90. int i, idx;
  91. /*
  92.  * Decode str into name, index, options.
  93.  */
  94. if (str[0] >= '0' && str[0] <= '9') {
  95. strcpy(name, "ttyS");
  96. strncpy(name + 4, str, sizeof(name) - 5);
  97. } else
  98. strncpy(name, str, sizeof(name) - 1);
  99. name[sizeof(name) - 1] = 0;
  100. if ((options = strchr(str, ',')) != NULL)
  101. *(options++) = 0;
  102. #ifdef __sparc__
  103. if (!strcmp(str, "ttya"))
  104. strcpy(name, "ttyS0");
  105. if (!strcmp(str, "ttyb"))
  106. strcpy(name, "ttyS1");
  107. #endif
  108. for(s = name; *s; s++)
  109. if (*s >= '0' && *s <= '9')
  110. break;
  111. idx = simple_strtoul(s, NULL, 10);
  112. *s = 0;
  113. /*
  114.  * See if this tty is not yet registered, and
  115.  * if we have a slot free.
  116.  */
  117. for(i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++)
  118. if (strcmp(console_cmdline[i].name, name) == 0 &&
  119.   console_cmdline[i].index == idx) {
  120. preferred_console = i;
  121. return 1;
  122. }
  123. if (i == MAX_CMDLINECONSOLES)
  124. return 1;
  125. preferred_console = i;
  126. c = &console_cmdline[i];
  127. memcpy(c->name, name, sizeof(c->name));
  128. c->options = options;
  129. c->index = idx;
  130. return 1;
  131. }
  132. __setup("console=", console_setup);
  133. /*
  134.  * Commands to do_syslog:
  135.  *
  136.  *  0 -- Close the log.  Currently a NOP.
  137.  *  1 -- Open the log. Currently a NOP.
  138.  *  2 -- Read from the log.
  139.  *  3 -- Read all messages remaining in the ring buffer.
  140.  *  4 -- Read and clear all messages remaining in the ring buffer
  141.  *  5 -- Clear ring buffer.
  142.  *  6 -- Disable printk's to console
  143.  *  7 -- Enable printk's to console
  144.  * 8 -- Set level of messages printed to console
  145.  * 9 -- Return number of unread characters in the log buffer
  146.  */
  147. int do_syslog(int type, char * buf, int len)
  148. {
  149. unsigned long i, j, limit, count;
  150. int do_clear = 0;
  151. char c;
  152. int error = 0;
  153. switch (type) {
  154. case 0: /* Close log */
  155. break;
  156. case 1: /* Open log */
  157. break;
  158. case 2: /* Read from log */
  159. error = -EINVAL;
  160. if (!buf || len < 0)
  161. goto out;
  162. error = 0;
  163. if (!len)
  164. goto out;
  165. error = verify_area(VERIFY_WRITE,buf,len);
  166. if (error)
  167. goto out;
  168. error = wait_event_interruptible(log_wait, (log_start - log_end));
  169. if (error)
  170. goto out;
  171. i = 0;
  172. spin_lock_irq(&logbuf_lock);
  173. while ((log_start != log_end) && i < len) {
  174. c = LOG_BUF(log_start);
  175. log_start++;
  176. spin_unlock_irq(&logbuf_lock);
  177. __put_user(c,buf);
  178. buf++;
  179. i++;
  180. spin_lock_irq(&logbuf_lock);
  181. }
  182. spin_unlock_irq(&logbuf_lock);
  183. error = i;
  184. break;
  185. case 4: /* Read/clear last kernel messages */
  186. do_clear = 1; 
  187. /* FALL THRU */
  188. case 3: /* Read last kernel messages */
  189. error = -EINVAL;
  190. if (!buf || len < 0)
  191. goto out;
  192. error = 0;
  193. if (!len)
  194. goto out;
  195. error = verify_area(VERIFY_WRITE,buf,len);
  196. if (error)
  197. goto out;
  198. count = len;
  199. if (count > LOG_BUF_LEN)
  200. count = LOG_BUF_LEN;
  201. spin_lock_irq(&logbuf_lock);
  202. if (count > logged_chars)
  203. count = logged_chars;
  204. if (do_clear)
  205. logged_chars = 0;
  206. limit = log_end;
  207. /*
  208.  * __put_user() could sleep, and while we sleep
  209.  * printk() could overwrite the messages 
  210.  * we try to copy to user space. Therefore
  211.  * the messages are copied in reverse. <manfreds>
  212.  */
  213. for(i=0;i < count;i++) {
  214. j = limit-1-i;
  215. if (j+LOG_BUF_LEN < log_end)
  216. break;
  217. c = LOG_BUF(j);
  218. spin_unlock_irq(&logbuf_lock);
  219. __put_user(c,&buf[count-1-i]);
  220. spin_lock_irq(&logbuf_lock);
  221. }
  222. spin_unlock_irq(&logbuf_lock);
  223. error = i;
  224. if(i != count) {
  225. int offset = count-error;
  226. /* buffer overflow during copy, correct user buffer. */
  227. for(i=0;i<error;i++) {
  228. __get_user(c,&buf[i+offset]);
  229. __put_user(c,&buf[i]);
  230. }
  231. }
  232. break;
  233. case 5: /* Clear ring buffer */
  234. spin_lock_irq(&logbuf_lock);
  235. logged_chars = 0;
  236. spin_unlock_irq(&logbuf_lock);
  237. break;
  238. case 6: /* Disable logging to console */
  239. spin_lock_irq(&logbuf_lock);
  240. console_loglevel = minimum_console_loglevel;
  241. spin_unlock_irq(&logbuf_lock);
  242. break;
  243. case 7: /* Enable logging to console */
  244. spin_lock_irq(&logbuf_lock);
  245. console_loglevel = default_console_loglevel;
  246. spin_unlock_irq(&logbuf_lock);
  247. break;
  248. case 8: /* Set level of messages printed to console */
  249. error = -EINVAL;
  250. if (len < 1 || len > 8)
  251. goto out;
  252. if (len < minimum_console_loglevel)
  253. len = minimum_console_loglevel;
  254. spin_lock_irq(&logbuf_lock);
  255. console_loglevel = len;
  256. spin_unlock_irq(&logbuf_lock);
  257. error = 0;
  258. break;
  259. case 9: /* Number of chars in the log buffer */
  260. spin_lock_irq(&logbuf_lock);
  261. error = log_end - log_start;
  262. spin_unlock_irq(&logbuf_lock);
  263. break;
  264. default:
  265. error = -EINVAL;
  266. break;
  267. }
  268. out:
  269. return error;
  270. }
  271. asmlinkage long sys_syslog(int type, char * buf, int len)
  272. {
  273. if ((type != 3) && !capable(CAP_SYS_ADMIN))
  274. return -EPERM;
  275. return do_syslog(type, buf, len);
  276. }
  277. /*
  278.  * Call the console drivers on a range of log_buf
  279.  */
  280. static void __call_console_drivers(unsigned long start, unsigned long end)
  281. {
  282. struct console *con;
  283. for (con = console_drivers; con; con = con->next) {
  284. if ((con->flags & CON_ENABLED) && con->write)
  285. con->write(con, &LOG_BUF(start), end - start);
  286. }
  287. }
  288. /*
  289.  * Write out chars from start to end - 1 inclusive
  290.  */
  291. static void _call_console_drivers(unsigned long start, unsigned long end, int msg_log_level)
  292. {
  293. if (msg_log_level < console_loglevel && console_drivers && start != end) {
  294. if ((start & LOG_BUF_MASK) > (end & LOG_BUF_MASK)) {
  295. /* wrapped write */
  296. __call_console_drivers(start & LOG_BUF_MASK, LOG_BUF_LEN);
  297. __call_console_drivers(0, end & LOG_BUF_MASK);
  298. } else {
  299. __call_console_drivers(start, end);
  300. }
  301. }
  302. }
  303. /*
  304.  * Call the console drivers, asking them to write out
  305.  * log_buf[start] to log_buf[end - 1].
  306.  * The console_sem must be held.
  307.  */
  308. static void call_console_drivers(unsigned long start, unsigned long end)
  309. {
  310. unsigned long cur_index, start_print;
  311. static int msg_level = -1;
  312. if (((long)(start - end)) > 0)
  313. BUG();
  314. cur_index = start;
  315. start_print = start;
  316. while (cur_index != end) {
  317. if ( msg_level < 0 &&
  318. ((end - cur_index) > 2) &&
  319. LOG_BUF(cur_index + 0) == '<' &&
  320. LOG_BUF(cur_index + 1) >= '0' &&
  321. LOG_BUF(cur_index + 1) <= '7' &&
  322. LOG_BUF(cur_index + 2) == '>')
  323. {
  324. msg_level = LOG_BUF(cur_index + 1) - '0';
  325. cur_index += 3;
  326. start_print = cur_index;
  327. }
  328. while (cur_index != end) {
  329. char c = LOG_BUF(cur_index);
  330. cur_index++;
  331. if (c == 'n') {
  332. if (msg_level < 0) {
  333. /*
  334.  * printk() has already given us loglevel tags in
  335.  * the buffer.  This code is here in case the
  336.  * log buffer has wrapped right round and scribbled
  337.  * on those tags
  338.  */
  339. msg_level = default_message_loglevel;
  340. }
  341. _call_console_drivers(start_print, cur_index, msg_level);
  342. msg_level = -1;
  343. start_print = cur_index;
  344. break;
  345. }
  346. }
  347. }
  348. _call_console_drivers(start_print, end, msg_level);
  349. }
  350. static void emit_log_char(char c)
  351. {
  352. LOG_BUF(log_end) = c;
  353. log_end++;
  354. if (log_end - log_start > LOG_BUF_LEN)
  355. log_start = log_end - LOG_BUF_LEN;
  356. if (log_end - con_start > LOG_BUF_LEN)
  357. con_start = log_end - LOG_BUF_LEN;
  358. if (logged_chars < LOG_BUF_LEN)
  359. logged_chars++;
  360. }
  361. /*
  362.  * This is printk.  It can be called from any context.  We want it to work.
  363.  * 
  364.  * We try to grab the console_sem.  If we succeed, it's easy - we log the output and
  365.  * call the console drivers.  If we fail to get the semaphore we place the output
  366.  * into the log buffer and return.  The current holder of the console_sem will
  367.  * notice the new output in release_console_sem() and will send it to the
  368.  * consoles before releasing the semaphore.
  369.  *
  370.  * One effect of this deferred printing is that code which calls printk() and
  371.  * then changes console_loglevel may break. This is because console_loglevel
  372.  * is inspected when the actual printing occurs.
  373.  */
  374. asmlinkage int printk(const char *fmt, ...)
  375. {
  376. va_list args;
  377. unsigned long flags;
  378. int printed_len;
  379. char *p;
  380. static char printk_buf[1024];
  381. static int log_level_unknown = 1;
  382. if (oops_in_progress) {
  383. /* If a crash is occurring, make sure we can't deadlock */
  384. spin_lock_init(&logbuf_lock);
  385. /* And make sure that we print immediately */
  386. init_MUTEX(&console_sem);
  387. }
  388. /* This stops the holder of console_sem just where we want him */
  389. spin_lock_irqsave(&logbuf_lock, flags);
  390. /* Emit the output into the temporary buffer */
  391. va_start(args, fmt);
  392. printed_len = vsnprintf(printk_buf, sizeof(printk_buf), fmt, args);
  393. va_end(args);
  394. /*
  395.  * Copy the output into log_buf.  If the caller didn't provide
  396.  * appropriate log level tags, we insert them here
  397.  */
  398. for (p = printk_buf; *p; p++) {
  399. if (log_level_unknown) {
  400. if (p[0] != '<' || p[1] < '0' || p[1] > '7' || p[2] != '>') {
  401. emit_log_char('<');
  402. emit_log_char(default_message_loglevel + '0');
  403. emit_log_char('>');
  404. }
  405. log_level_unknown = 0;
  406. }
  407. emit_log_char(*p);
  408. if (*p == 'n')
  409. log_level_unknown = 1;
  410. }
  411. if (!arch_consoles_callable()) {
  412. /*
  413.  * On some architectures, the consoles are not usable
  414.  * on secondary CPUs early in the boot process.
  415.  */
  416. spin_unlock_irqrestore(&logbuf_lock, flags);
  417. goto out;
  418. }
  419. if (!down_trylock(&console_sem)) {
  420. /*
  421.  * We own the drivers.  We can drop the spinlock and let
  422.  * release_console_sem() print the text
  423.  */
  424. spin_unlock_irqrestore(&logbuf_lock, flags);
  425. console_may_schedule = 0;
  426. release_console_sem();
  427. } else {
  428. /*
  429.  * Someone else owns the drivers.  We drop the spinlock, which
  430.  * allows the semaphore holder to proceed and to call the
  431.  * console drivers with the output which we just produced.
  432.  */
  433. spin_unlock_irqrestore(&logbuf_lock, flags);
  434. }
  435. out:
  436. return printed_len;
  437. }
  438. EXPORT_SYMBOL(printk);
  439. /**
  440.  * acquire_console_sem - lock the console system for exclusive use.
  441.  *
  442.  * Acquires a semaphore which guarantees that the caller has
  443.  * exclusive access to the console system and the console_drivers list.
  444.  *
  445.  * Can sleep, returns nothing.
  446.  */
  447. void acquire_console_sem(void)
  448. {
  449. if (in_interrupt())
  450. BUG();
  451. down(&console_sem);
  452. console_may_schedule = 1;
  453. }
  454. EXPORT_SYMBOL(acquire_console_sem);
  455. /**
  456.  * release_console_sem - unlock the console system
  457.  *
  458.  * Releases the semaphore which the caller holds on the console system
  459.  * and the console driver list.
  460.  *
  461.  * While the semaphore was held, console output may have been buffered
  462.  * by printk().  If this is the case, release_console_sem() emits
  463.  * the output prior to releasing the semaphore.
  464.  *
  465.  * If there is output waiting for klogd, we wake it up.
  466.  *
  467.  * release_console_sem() may be called from any context.
  468.  */
  469. void release_console_sem(void)
  470. {
  471. unsigned long flags;
  472. unsigned long _con_start, _log_end;
  473. unsigned long must_wake_klogd = 0;
  474. for ( ; ; ) {
  475. spin_lock_irqsave(&logbuf_lock, flags);
  476. must_wake_klogd |= log_start - log_end;
  477. if (con_start == log_end)
  478. break; /* Nothing to print */
  479. _con_start = con_start;
  480. _log_end = log_end;
  481. con_start = log_end; /* Flush */
  482. spin_unlock_irqrestore(&logbuf_lock, flags);
  483. call_console_drivers(_con_start, _log_end);
  484. }
  485. console_may_schedule = 0;
  486. up(&console_sem);
  487. spin_unlock_irqrestore(&logbuf_lock, flags);
  488. if (must_wake_klogd && !oops_in_progress)
  489. wake_up_interruptible(&log_wait);
  490. }
  491. /** console_conditional_schedule - yield the CPU if required
  492.  *
  493.  * If the console code is currently allowed to sleep, and
  494.  * if this CPU should yield the CPU to another task, do
  495.  * so here.
  496.  *
  497.  * Must be called within acquire_console_sem().
  498.  */
  499. void console_conditional_schedule(void)
  500. {
  501. if (console_may_schedule && current->need_resched) {
  502. set_current_state(TASK_RUNNING);
  503. schedule();
  504. }
  505. }
  506. void console_print(const char *s)
  507. {
  508. printk(KERN_EMERG "%s", s);
  509. }
  510. EXPORT_SYMBOL(console_print);
  511. void console_unblank(void)
  512. {
  513. struct console *c;
  514. acquire_console_sem();
  515. for (c = console_drivers; c != NULL; c = c->next)
  516. if ((c->flags & CON_ENABLED) && c->unblank)
  517. c->unblank();
  518. release_console_sem();
  519. }
  520. EXPORT_SYMBOL(console_unblank);
  521. /*
  522.  * The console driver calls this routine during kernel initialization
  523.  * to register the console printing procedure with printk() and to
  524.  * print any messages that were printed by the kernel before the
  525.  * console driver was initialized.
  526.  */
  527. void register_console(struct console * console)
  528. {
  529. int     i;
  530. unsigned long flags;
  531. /*
  532.  * See if we want to use this console driver. If we
  533.  * didn't select a console we take the first one
  534.  * that registers here.
  535.  */
  536. if (preferred_console < 0) {
  537. if (console->index < 0)
  538. console->index = 0;
  539. if (console->setup == NULL ||
  540.     console->setup(console, NULL) == 0) {
  541. console->flags |= CON_ENABLED | CON_CONSDEV;
  542. preferred_console = 0;
  543. }
  544. }
  545. /*
  546.  * See if this console matches one we selected on
  547.  * the command line.
  548.  */
  549. for(i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++) {
  550. if (strcmp(console_cmdline[i].name, console->name) != 0)
  551. continue;
  552. if (console->index >= 0 &&
  553.     console->index != console_cmdline[i].index)
  554. continue;
  555. if (console->index < 0)
  556. console->index = console_cmdline[i].index;
  557. if (console->setup &&
  558.     console->setup(console, console_cmdline[i].options) != 0)
  559. break;
  560. console->flags |= CON_ENABLED;
  561. console->index = console_cmdline[i].index;
  562. if (i == preferred_console)
  563. console->flags |= CON_CONSDEV;
  564. break;
  565. }
  566. if (!(console->flags & CON_ENABLED))
  567. return;
  568. /*
  569.  * Put this console in the list - keep the
  570.  * preferred driver at the head of the list.
  571.  */
  572. acquire_console_sem();
  573. if ((console->flags & CON_CONSDEV) || console_drivers == NULL) {
  574. console->next = console_drivers;
  575. console_drivers = console;
  576. } else {
  577. console->next = console_drivers->next;
  578. console_drivers->next = console;
  579. }
  580. if (console->flags & CON_PRINTBUFFER) {
  581. /*
  582.  * release_cosole_sem() will print out the buffered messages for us.
  583.  */
  584. spin_lock_irqsave(&logbuf_lock, flags);
  585. con_start = log_start;
  586. spin_unlock_irqrestore(&logbuf_lock, flags);
  587. }
  588. release_console_sem();
  589. }
  590. EXPORT_SYMBOL(register_console);
  591. int unregister_console(struct console * console)
  592. {
  593.         struct console *a,*b;
  594. int res = 1;
  595. acquire_console_sem();
  596. if (console_drivers == console) {
  597. console_drivers=console->next;
  598. res = 0;
  599. } else {
  600. for (a=console_drivers->next, b=console_drivers ;
  601.      a; b=a, a=b->next) {
  602. if (a == console) {
  603. b->next = a->next;
  604. res = 0;
  605. break;
  606. }  
  607. }
  608. }
  609. /* If last console is removed, we re-enable picking the first
  610.  * one that gets registered. Without that, pmac early boot console
  611.  * would prevent fbcon from taking over.
  612.  */
  613. if (console_drivers == NULL)
  614. preferred_console = -1;
  615. release_console_sem();
  616. return res;
  617. }
  618. EXPORT_SYMBOL(unregister_console);
  619. /**
  620.  * tty_write_message - write a message to a certain tty, not just the console.
  621.  *
  622.  * This is used for messages that need to be redirected to a specific tty.
  623.  * We don't put it into the syslog queue right now maybe in the future if
  624.  * really needed.
  625.  */
  626. void tty_write_message(struct tty_struct *tty, char *msg)
  627. {
  628. if (tty && tty->driver.write)
  629. tty->driver.write(tty, 0, msg, strlen(msg));
  630. return;
  631. }