Subversion Repositories HelenOS

Rev

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

Rev 3022 Rev 4055
Line 25... Line 25...
25
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
 */
27
 */
28
 
28
 
29
/** @addtogroup klog KLog
29
/** @addtogroup klog KLog
30
 * @brief   HelenOS KLog
30
 * @brief HelenOS KLog
31
 * @{
31
 * @{
32
 */
32
 */
33
/**
33
/**
34
 * @file
34
 * @file
35
 */
35
 */
36
 
36
 
37
#include <stdio.h>
37
#include <stdio.h>
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
{
60
    int res;
-
 
61
    void *mapping;
69
    console_wait();
62
 
70
   
-
 
71
    klog = (char *) as_get_mappable_page(KLOG_SIZE);
-
 
72
    if (klog == NULL) {
63
    printf("Kernel console output.\n");
73
        printf(NAME ": Error allocating memory area\n");
-
 
74
        return -1;
-
 
75
    }
64
   
76
   
65
    mapping = as_get_mappable_page(PAGE_SIZE);
-
 
66
    res = ipc_share_in_start_1_0(PHONE_NS, mapping, PAGE_SIZE,
77
    int res = ipc_share_in_start_1_0(PHONE_NS, (void *) klog, KLOG_SIZE,
67
        SERVICE_MEM_KLOG);
78
        SERVICE_MEM_KLOG);
68
    if (res) {
79
    if (res != EOK) {
69
        printf("Failed to initialize klog memarea\n");
80
        printf(NAME ": Error initializing memory area\n");
70
        _exit(1);
81
        return -1;
71
    }
82
    }
72
    klog = mapping;
-
 
73
 
83
   
74
    int inr = sysinfo_value("klog.inr");
-
 
75
    int devno = sysinfo_value("klog.devno");
84
    int devno = sysinfo_value("klog.devno");
-
 
85
    int inr = sysinfo_value("klog.inr");
76
    if (ipc_register_irq(inr, devno, 0, NULL)) {
86
    if (ipc_register_irq(inr, devno, 0, NULL) != EOK) {
77
        printf("Error registering for klog service.\n");
87
        printf(NAME ": Error registering klog notifications\n");
78
        return 0;
88
        return -1;
79
    }
89
    }
80
 
90
   
81
    async_set_interrupt_received(interrupt_received);
91
    async_set_interrupt_received(interrupt_received);
82
 
92
    klog_update();
83
    async_manager();
93
    async_manager();
84
 
94
 
85
    return 0;
95
    return 0;
86
}
96
}
87
 
97