1 /* This file handle diagnostic output that is sent to the LOG driver. Output
2 * can be either from the kernel, or from other system processes. Output from
3 * system processes is also routed through the kernel. The kernel notifies
4 * this driver with a SIGKMESS signal if any messages are available.
7 * 21 July 2005: Created (Jorrit N. Herder)
14 extern struct minix_kerninfo
*_minix_kerninfo
;
16 /*==========================================================================*
18 *==========================================================================*/
19 void do_new_kmess(void)
21 /* Notification for a new kernel message. */
22 static struct kmessages
*kmess
; /* entire kmess structure */
23 static char print_buf
[_KMESS_BUF_SIZE
]; /* copy new message here */
24 int i
, r
, next
, bytes
;
25 static int prev_next
= 0;
27 assert(_minix_kerninfo
);
28 kmess
= _minix_kerninfo
->kmessages
;
30 /* Print only the new part. Determine how many new bytes there are with
31 * help of the current and previous 'next' index. Note that the kernel
32 * buffer is circular. This works fine if less than KMESS_BUF_SIZE bytes
33 * are new data; else we miss % KMESS_BUF_SIZE here. Obtain 'next' only
34 * once, since we are operating on shared memory here.
35 * Check for size being positive, the buffer might as well be emptied!
37 next
= kmess
->km_next
;
38 bytes
= ((next
+ _KMESS_BUF_SIZE
) - prev_next
) % _KMESS_BUF_SIZE
;
40 r
= prev_next
; /* start at previous old */
43 print_buf
[i
] = kmess
->km_buf
[(r
%_KMESS_BUF_SIZE
)];
48 /* Now terminate the new message and save it in the log. */
50 log_append(print_buf
, i
);
53 /* Almost done, store 'next' so that we can determine what part of the
54 * kernel messages buffer to print next time a notification arrives.