2 * (c) 2008-2009 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
3 * Alexander Warg <warg@os.inf.tu-dresden.de>,
4 * Torsten Frenzel <frenzel@os.inf.tu-dresden.de>
5 * economic rights: Technische Universität Dresden (Germany)
7 * This file is part of TUD:OS and distributed under the terms of the
8 * GNU General Public License 2.
9 * Please see the COPYING-GPL-2 file for details.
12 #include <l4/re/log-sys.h>
13 #include <l4/sys/kdebug.h>
14 #include <l4/cxx/minmax>
23 static Ldr::Log *last_log = 0;
25 static void my_outnstring(char const *s, unsigned long len)
30 static void mycpy(char **buf, int *rem, char const *s, int l)
32 int o = cxx::min(*rem, l);
38 static char msgbuf[4096];
41 Ldr::Log::op_dispatch(l4_utcb_t *utcb, l4_msgtag_t tag, L4::Vcon::Rights)
44 return l4_msgtag(-L4_EINVAL, 0, 0, 0);
46 l4_msg_regs_t *m = l4_utcb_mr_u(utcb);
47 L4::Opcode op = m->mr[0];
49 // we only have one opcode
50 if (op != L4Re::Log_::Print)
51 return l4_msgtag(-L4_ENOSYS, 0, 0, 0);
53 char *msg = Glbl::log_buffer;
54 unsigned long len_msg = sizeof(Glbl::log_buffer);
56 if (len_msg > (tag.words() - 2) * sizeof(l4_umword_t))
57 len_msg = (tag.words() - 2) * sizeof(l4_umword_t);
59 if (len_msg > m->mr[1])
62 memcpy(msg, &m->mr[2], len_msg);
64 int rem = sizeof(msgbuf);
65 while (len_msg > 0 && msg[0])
71 int n = snprintf(obuf, rem, "\033[%s3%dm",
72 (color() & 8) ? "01;" : "", (color() & 7));
77 mycpy(&obuf, &rem, "\033[0m", 4);
82 my_outnstring("\n", 1);
84 mycpy(&obuf, &rem, _tag, cxx::min<unsigned long>(_l, Max_tag));
86 mycpy(&obuf, &rem, " ", Max_tag-_l);
89 mycpy(&obuf, &rem, ": ", 2);
91 mycpy(&obuf, &rem, "| ", 2);
95 for (i = 0; i < len_msg; ++i)
96 if (msg[i] == '\n' || msg[i] == 0)
99 mycpy(&obuf, &rem, msg, i);
101 if (i <len_msg && msg[i] == '\n')
104 mycpy(&obuf, &rem, "\033[0m", 4);
105 mycpy(&obuf, &rem, "\n", 1);
115 my_outnstring(msgbuf, obuf-msgbuf);
121 if (_in_line && color())
122 my_outnstring("\033[0m", 4);
125 return l4_msgtag(-L4_ENOREPLY, 0, 0, 0);
130 Ldr::Log::color_value(cxx::String const &col)
132 int c = 0, bright = 0;
139 case 'N': bright = 1; case 'n': c = 0; break;
140 case 'R': bright = 1; case 'r': c = 1; break;
141 case 'G': bright = 1; case 'g': c = 2; break;
142 case 'Y': bright = 1; case 'y': c = 3; break;
143 case 'B': bright = 1; case 'b': c = 4; break;
144 case 'M': bright = 1; case 'm': c = 5; break;
145 case 'C': bright = 1; case 'c': c = 6; break;
146 case 'W': bright = 1; case 'w': c = 7; break;
150 return (bright << 3) | c;