Subversion Repositories HelenOS

Rev

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

Rev 2678 Rev 3112
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
 
47
static void interrupt_received(ipc_callid_t callid, ipc_call_t *call)
53
static void interrupt_received(ipc_callid_t callid, ipc_call_t *call)
48
{
54
{
49
    int i;
-
 
50
   
-
 
51
    async_serialize_start();
55
    async_serialize_start();
-
 
56
   
52
    for (i=0; klog[i + IPC_GET_ARG1(*call)] && i < IPC_GET_ARG2(*call); i++)
57
    size_t klog_start = (size_t) IPC_GET_ARG1(*call);
53
        putchar(klog[i + IPC_GET_ARG1(*call)]);
58
    size_t klog_len = (size_t) IPC_GET_ARG2(*call);
-
 
59
    size_t klog_stored = (size_t) IPC_GET_ARG3(*call);
54
    putchar('\n');
60
    size_t i;
-
 
61
    for (i = klog_len - klog_stored; i < klog_len; i++)
-
 
62
        putchar(klog[(klog_start + i) % KLOG_SIZE]);
-
 
63
   
55
    async_serialize_end();
64
    async_serialize_end();
56
}
65
}
57
 
66
 
58
int main(int argc, char *argv[])
67
int main(int argc, char *argv[])
59
{
68
{
-
 
69
    klog = (char *) as_get_mappable_page(KLOG_SIZE);
60
    int res;
70
    if (klog == NULL) {
-
 
71
        printf(NAME ": Error allocating memory area\n");
61
    void *mapping;
72
        return -1;
62
 
73
    }
63
    printf("Kernel console output.\n");
-
 
64
   
74
   
65
    mapping = as_get_mappable_page(PAGE_SIZE);
-
 
66
    res = ipc_share_in_start_1_0(PHONE_NS, mapping, PAGE_SIZE,
75
    int res = ipc_share_in_start_1_0(PHONE_NS, (void *) klog, KLOG_SIZE,
67
        SERVICE_MEM_KLOG);
76
        SERVICE_MEM_KLOG);
68
    if (res) {
77
    if (res != EOK) {
69
        printf("Failed to initialize klog memarea\n");
78
        printf(NAME ": Error initializing memory area\n");
70
        _exit(1);
79
        return -1;
71
    }
80
    }
72
    klog = mapping;
-
 
73
 
81
 
74
    int inr = sysinfo_value("klog.inr");
82
    int inr = sysinfo_value("klog.inr");
75
    int devno = sysinfo_value("klog.devno");
83
    int devno = sysinfo_value("klog.devno");
76
    if (ipc_register_irq(inr, devno, 0, NULL)) {
84
    if (ipc_register_irq(inr, devno, 0, NULL) != EOK) {
77
        printf("Error registering for klog service.\n");
85
        printf(NAME ": Error registering klog notifications\n");
78
        return 0;
86
        return -1;
79
    }
87
    }
80
 
88
   
81
    async_set_interrupt_received(interrupt_received);
89
    async_set_interrupt_received(interrupt_received);
82
 
90
    klog_update();
83
    async_manager();
91
    async_manager();
84
 
92
 
85
    return 0;
93
    return 0;
86
}
94
}
87
 
95