Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 3111 → Rev 3112

/trunk/uspace/app/init/init.c
130,7 → 130,7
spawn("/sbin/fat");
spawn("/sbin/tetris");
// FIXME: spawn("/sbin/tester");
// FIXME: spawn("/sbin/klog");
spawn("/sbin/klog");
free(buf);
return 0;
/trunk/uspace/app/klog/klog.c
40,46 → 40,54
#include <ipc/services.h>
#include <as.h>
#include <sysinfo.h>
#include <io/stream.h>
#include <errno.h>
 
#define NAME "klog"
 
#define KLOG_SIZE PAGE_SIZE
 
/* Pointer to klog area */
static char *klog;
 
static void interrupt_received(ipc_callid_t callid, ipc_call_t *call)
{
int i;
async_serialize_start();
async_serialize_start();
for (i=0; klog[i + IPC_GET_ARG1(*call)] && i < IPC_GET_ARG2(*call); i++)
putchar(klog[i + IPC_GET_ARG1(*call)]);
putchar('\n');
size_t klog_start = (size_t) IPC_GET_ARG1(*call);
size_t klog_len = (size_t) IPC_GET_ARG2(*call);
size_t klog_stored = (size_t) IPC_GET_ARG3(*call);
size_t i;
for (i = klog_len - klog_stored; i < klog_len; i++)
putchar(klog[(klog_start + i) % KLOG_SIZE]);
async_serialize_end();
}
 
int main(int argc, char *argv[])
{
int res;
void *mapping;
 
printf("Kernel console output.\n");
klog = (char *) as_get_mappable_page(KLOG_SIZE);
if (klog == NULL) {
printf(NAME ": Error allocating memory area\n");
return -1;
}
mapping = as_get_mappable_page(PAGE_SIZE);
res = ipc_share_in_start_1_0(PHONE_NS, mapping, PAGE_SIZE,
int res = ipc_share_in_start_1_0(PHONE_NS, (void *) klog, KLOG_SIZE,
SERVICE_MEM_KLOG);
if (res) {
printf("Failed to initialize klog memarea\n");
_exit(1);
if (res != EOK) {
printf(NAME ": Error initializing memory area\n");
return -1;
}
klog = mapping;
 
int inr = sysinfo_value("klog.inr");
int devno = sysinfo_value("klog.devno");
if (ipc_register_irq(inr, devno, 0, NULL)) {
printf("Error registering for klog service.\n");
return 0;
if (ipc_register_irq(inr, devno, 0, NULL) != EOK) {
printf(NAME ": Error registering klog notifications\n");
return -1;
}
 
async_set_interrupt_received(interrupt_received);
 
klog_update();
async_manager();
 
return 0;
/trunk/uspace/lib/libc/include/stdio.h
49,7 → 49,7
int n; \
n = snprintf(buf, sizeof(buf), fmt, ##__VA_ARGS__); \
if (n > 0) \
(void) __SYSCALL3(SYS_IO, 1, (sysarg_t) buf, strlen(buf)); \
(void) __SYSCALL3(SYS_KLOG, 1, (sysarg_t) buf, strlen(buf)); \
}
 
extern int getchar(void);
/trunk/uspace/lib/libc/include/io/stream.h
40,6 → 40,7
#define EMFILE -17
 
extern void open_console(void);
extern void klog_update(void);
 
extern ssize_t read_stdin(void *, size_t);
extern ssize_t write_stdout(const void *, size_t);
/trunk/uspace/lib/libc/generic/io/stream.c
82,7 → 82,7
return count;
} else
return __SYSCALL3(SYS_IO, 1, (sysarg_t) buf, count);
return __SYSCALL3(SYS_KLOG, 1, (sysarg_t) buf, count);
}
 
void open_console(void)
94,6 → 94,11
}
}
 
void klog_update(void)
{
(void) __SYSCALL3(SYS_KLOG, 1, NULL, 0);
}
 
int get_cons_phone(void)
{
open_console();