source: mainline/kernel/generic/src/console/klog.c@ 4d61252

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 4d61252 was 2057572, checked in by Jakub Jermar <jakub@…>, 19 years ago

The Ultimate Solution To Illegal Virtual Aliases.
It is better to avoid them completely than to fight them.
Switch the sparc64 port to 16K pages. The TLBs and TSBs
continue to operate with 8K pages only. Page tables and
other generic parts operate with 16K pages.

Because the MMU doesn't support 16K directly, each 16K
page is emulated by a pair of 8K pages. With 16K pages,
illegal aliases cannot be created in 16K D-cache.

  • Property mode set to 100644
File size: 4.1 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 genericklog
30 * @{
31 */
32/** @file
33 */
34
35#include <mm/frame.h>
36#include <sysinfo/sysinfo.h>
37#include <console/klog.h>
38#include <print.h>
39#include <ddi/device.h>
40#include <ddi/irq.h>
41#include <ddi/ddi.h>
42#include <ipc/irq.h>
43
44/** Physical memory area used for klog. */
45static parea_t klog_parea;
46
47/*
48 * For now, we use 0 as INR.
49 * However, on some architectures 0 is the clock interrupt (e.g. amd64 and
50 * ia32). It is therefore desirable to have architecture specific definition of
51 * KLOG_VIRT_INR in the future.
52 */
53#define KLOG_VIRT_INR 0
54
55/* Order of frame to be allocated for klog communication */
56#define KLOG_ORDER 0
57
58static char *klog;
59static int klogsize;
60static int klogpos;
61
62SPINLOCK_INITIALIZE(klog_lock);
63
64static irq_t klog_irq;
65
66static irq_ownership_t klog_claim(void);
67
68/** Initialize kernel logging facility
69 *
70 * Allocate pages that are to be shared with uspace for console data.
71 * The shared area is a circular buffer. Userspace application may
72 * be notified on new data with indication of position and size
73 * of the data within the circular buffer.
74 */
75void klog_init(void)
76{
77 void *faddr;
78
79 faddr = frame_alloc(KLOG_ORDER, FRAME_ATOMIC);
80 if (!faddr)
81 panic("Cannot allocate page for klog");
82 klog = (char *) PA2KA(faddr);
83
84 devno_t devno = device_assign_devno();
85
86 klog_parea.pbase = (uintptr_t) faddr;
87 klog_parea.vbase = (uintptr_t) klog;
88 klog_parea.frames = 1 << KLOG_ORDER;
89 klog_parea.cacheable = true;
90 ddi_parea_register(&klog_parea);
91
92 sysinfo_set_item_val("klog.faddr", NULL, (unative_t) faddr);
93 sysinfo_set_item_val("klog.pages", NULL, 1 << KLOG_ORDER);
94 sysinfo_set_item_val("klog.devno", NULL, devno);
95 sysinfo_set_item_val("klog.inr", NULL, KLOG_VIRT_INR);
96
97 irq_initialize(&klog_irq);
98 klog_irq.devno = devno;
99 klog_irq.inr = KLOG_VIRT_INR;
100 klog_irq.claim = klog_claim;
101 irq_register(&klog_irq);
102
103 klogsize = PAGE_SIZE << KLOG_ORDER;
104 klogpos = 0;
105}
106
107/** Allways refuse IRQ ownership.
108 *
109 * This is not a real IRQ, so we always decline.
110 *
111 * @return Always returns IRQ_DECLINE.
112 */
113irq_ownership_t klog_claim(void)
114{
115 return IRQ_DECLINE;
116}
117
118static void klog_vprintf(const char *fmt, va_list args)
119{
120 int ret;
121 va_list atst;
122
123 va_copy(atst, args);
124 spinlock_lock(&klog_lock);
125
126 ret = vsnprintf(klog+klogpos, klogsize-klogpos, fmt, atst);
127 if (ret >= klogsize-klogpos) {
128 klogpos = 0;
129 if (ret >= klogsize)
130 goto out;
131 }
132 ipc_irq_send_msg(&klog_irq, klogpos, ret, 0);
133 klogpos += ret;
134 if (klogpos >= klogsize)
135 klogpos = 0;
136out:
137 spinlock_unlock(&klog_lock);
138 va_end(atst);
139}
140
141/** Printf a message to kernel-uspace log */
142void klog_printf(const char *fmt, ...)
143{
144 va_list args;
145
146 va_start(args, fmt);
147
148 klog_vprintf(fmt, args);
149
150 va_end(args);
151}
152
153/** @}
154 */
Note: See TracBrowser for help on using the repository browser.