source: mainline/uspace/app/klog/klog.c@ 6b40ea7

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 6b40ea7 was 6119f24, checked in by Martin Decky <martin@…>, 15 years ago

map klog area and clock page directly in tasks which require them (do not use the memory sharing from naming service via IPC)
this avoids the circular dependency between gettimeofday() and the async framework (as reported by Jakub Jermar)
it also simplifies the code of the naming service (the memory sharing was never strictly necessary, it was only a demonstrator)

  • Property mode set to 100644
File size: 3.6 KB
Line 
1/*
2 * Copyright (c) 2006 Ondrej Palkovsky
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
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.
27 */
28
29/** @addtogroup klog KLog
30 * @brief HelenOS KLog
31 * @{
32 */
33/**
34 * @file
35 */
36
37#include <stdio.h>
38#include <async.h>
39#include <as.h>
40#include <ddi.h>
41#include <event.h>
42#include <errno.h>
43#include <str_error.h>
44#include <io/klog.h>
45#include <sysinfo.h>
46
47#define NAME "klog"
48#define LOG_FNAME "/log/klog"
49
50/* Pointer to klog area */
51static wchar_t *klog;
52static size_t klog_length;
53
54static FILE *log;
55
56static void interrupt_received(ipc_callid_t callid, ipc_call_t *call)
57{
58 size_t klog_start = (size_t) IPC_GET_ARG1(*call);
59 size_t klog_len = (size_t) IPC_GET_ARG2(*call);
60 size_t klog_stored = (size_t) IPC_GET_ARG3(*call);
61 size_t i;
62
63 for (i = klog_len - klog_stored; i < klog_len; i++) {
64 wchar_t ch = klog[(klog_start + i) % klog_length];
65
66 putchar(ch);
67
68 if (log != NULL)
69 fputc(ch, log);
70 }
71
72 if (log != NULL) {
73 fflush(log);
74 fsync(fileno(log));
75 }
76}
77
78int main(int argc, char *argv[])
79{
80 size_t pages;
81 int rc = sysinfo_get_value("klog.pages", &pages);
82 if (rc != EOK) {
83 fprintf(stderr, "%s: Unable to get number of klog pages\n",
84 NAME);
85 return rc;
86 }
87
88 uintptr_t faddr;
89 rc = sysinfo_get_value("klog.faddr", &faddr);
90 if (rc != EOK) {
91 fprintf(stderr, "%s: Unable to get klog physical address\n",
92 NAME);
93 return rc;
94 }
95
96 size_t size = pages * PAGE_SIZE;
97 klog_length = size / sizeof(wchar_t);
98
99 klog = (wchar_t *) as_get_mappable_page(size);
100 if (klog == NULL) {
101 fprintf(stderr, "%s: Unable to allocate virtual memory area\n",
102 NAME);
103 return ENOMEM;
104 }
105
106 rc = physmem_map((void *) faddr, (void *) klog, pages,
107 AS_AREA_READ | AS_AREA_CACHEABLE);
108 if (rc != EOK) {
109 fprintf(stderr, "%s: Unable to map klog\n", NAME);
110 return rc;
111 }
112
113 rc = event_subscribe(EVENT_KLOG, 0);
114 if (rc != EOK) {
115 fprintf(stderr, "%s: Unable to register klog notifications\n",
116 NAME);
117 return rc;
118 }
119
120 /*
121 * Mode "a" would be definitively much better here, but it is
122 * not well supported by the FAT driver.
123 */
124 log = fopen(LOG_FNAME, "w");
125 if (log == NULL)
126 printf("%s: Unable to create log file %s (%s)\n", NAME, LOG_FNAME,
127 str_error(errno));
128
129 async_set_interrupt_received(interrupt_received);
130 klog_update();
131 async_manager();
132
133 return 0;
134}
135
136/** @}
137 */
Note: See TracBrowser for help on using the repository browser.