Subversion Repositories HelenOS

Rev

Rev 2927 | Rev 3560 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2927 Rev 3153
Line 38... Line 38...
38
#include <ipc/ipc.h>
38
#include <ipc/ipc.h>
39
#include <async.h>
39
#include <async.h>
40
#include <ipc/services.h>
40
#include <ipc/services.h>
41
#include <as.h>
41
#include <as.h>
42
#include <sysinfo.h>
42
#include <sysinfo.h>
-
 
43
#include <io/stream.h>
-
 
44
#include <errno.h>
-
 
45
 
-
 
46
#define NAME "klog"
-
 
47
 
-
 
48
#define KLOG_SIZE PAGE_SIZE
43
 
49
 
44
/* Pointer to klog area */
50
/* Pointer to klog area */
45
static char *klog;
51
static char *klog;
46
 
52
 
-
 
53
static void console_wait(void)
-
 
54
{
-
 
55
    while (get_cons_phone() < 0)
-
 
56
        usleep(50000);  // FIXME
-
 
57
}
-
 
58
 
47
static void interrupt_received(ipc_callid_t callid, ipc_call_t *call)
59
static void interrupt_received(ipc_callid_t callid, ipc_call_t *call)
48
{
60
{
49
    int i;
-
 
50
   
-
 
51
    async_serialize_start();
61
    async_serialize_start();
-
 
62
   
52
    for (i=0; klog[i + IPC_GET_ARG1(*call)] && i < IPC_GET_ARG2(*call); i++)
63
    size_t klog_start = (size_t) IPC_GET_ARG1(*call);
53
        putchar(klog[i + IPC_GET_ARG1(*call)]);
64
    size_t klog_len = (size_t) IPC_GET_ARG2(*call);
-
 
65
    size_t klog_stored = (size_t) IPC_GET_ARG3(*call);
54
    putchar('\n');
66
    size_t i;
-
 
67
    for (i = klog_len - klog_stored; i < klog_len; i++)
-
 
68
        putchar(klog[(klog_start + i) % KLOG_SIZE]);
-
 
69
   
55
    async_serialize_end();
70
    async_serialize_end();
56
}
71
}
57
 
72
 
58
int main(int argc, char *argv[])
73
int main(int argc, char *argv[])
59
{
74
{
60
    int res;
-
 
61
    void *mapping;
75
    console_wait();
62
 
76
   
-
 
77
    klog = (char *) as_get_mappable_page(KLOG_SIZE);
-
 
78
    if (klog == NULL) {
63
    printf("Kernel console output.\n");
79
        printf(NAME ": Error allocating memory area\n");
-
 
80
        return -1;
-
 
81
    }
64
   
82
   
65
    mapping = as_get_mappable_page(PAGE_SIZE);
-
 
66
    res = ipc_share_in_start_1_0(PHONE_NS, mapping, PAGE_SIZE,
83
    int res = ipc_share_in_start_1_0(PHONE_NS, (void *) klog, KLOG_SIZE,
67
        SERVICE_MEM_KLOG);
84
        SERVICE_MEM_KLOG);
68
    if (res) {
85
    if (res != EOK) {
69
        printf("Failed to initialize klog memarea\n");
86
        printf(NAME ": Error initializing memory area\n");
70
        _exit(1);
87
        return -1;
71
    }
88
    }
72
    klog = mapping;
-
 
73
 
89
 
74
    int inr = sysinfo_value("klog.inr");
90
    int inr = sysinfo_value("klog.inr");
75
    int devno = sysinfo_value("klog.devno");
91
    int devno = sysinfo_value("klog.devno");
76
    if (ipc_register_irq(inr, devno, 0, NULL)) {
92
    if (ipc_register_irq(inr, devno, 0, NULL) != EOK) {
77
        printf("Error registering for klog service.\n");
93
        printf(NAME ": Error registering klog notifications\n");
78
        return 0;
94
        return -1;
79
    }
95
    }
80
 
96
   
81
    async_set_interrupt_received(interrupt_received);
97
    async_set_interrupt_received(interrupt_received);
82
 
98
    klog_update();
83
    async_manager();
99
    async_manager();
84
 
100
 
85
    return 0;
101
    return 0;
86
}
102
}
87
 
103