L4Re - L4 Runtime Environment
exceptions
Go to the documentation of this file.
1 // vi:set ft=cpp: -*- Mode: C++ -*-
7 /*
8  * (c) 2008-2009 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
9  * Alexander Warg <warg@os.inf.tu-dresden.de>
10  * economic rights: Technische Universität Dresden (Germany)
11  *
12  * This file is part of TUD:OS and distributed under the terms of the
13  * GNU General Public License 2.
14  * Please see the COPYING-GPL-2 file for details.
15  *
16  * As a special exception, you may use this file as part of a free software
17  * library without restriction. Specifically, if other files instantiate
18  * templates or use macros or inline functions from this file, or you compile
19  * this file and link it with other files to produce an executable, this
20  * file does not by itself cause the resulting executable to be covered by
21  * the GNU General Public License. This exception does not however
22  * invalidate any other reasons why the executable file might be covered by
23  * the GNU General Public License.
24  */
25 
26 #pragma once
27 
28 #include <l4/cxx/l4types.h>
29 #include <l4/cxx/basic_ostream>
30 #include <l4/sys/err.h>
31 #include <l4/sys/capability>
32 
33 
39 
40 #ifndef L4_CXX_NO_EXCEPTION_BACKTRACE
41 # define L4_CXX_EXCEPTION_BACKTRACE 20
42 #endif
43 
44 #if defined(L4_CXX_EXCEPTION_BACKTRACE)
45 #include <l4/util/backtrace.h>
46 #endif
47 
49 namespace L4
50 {
64  {
65 #if defined(L4_CXX_EXCEPTION_BACKTRACE)
66  private:
67  void *_pc_array[L4_CXX_EXCEPTION_BACKTRACE];
68  int _frame_cnt;
69 
70  protected:
74 #if defined(__PIC__)
75  Exception_tracer() throw() : _frame_cnt(0) {}
76 #else
77  Exception_tracer() throw() : _frame_cnt(l4util_backtrace(_pc_array, L4_CXX_EXCEPTION_BACKTRACE)) {}
78 #endif
79 
80  public:
84  void const *const *pc_array() const throw() { return _pc_array; }
88  int frame_count() const throw() { return _frame_cnt; }
89 #else
90  protected:
94  Exception_tracer() throw() {}
95 
96  public:
100  void const *const *pc_array() const throw() { return 0; }
104  int frame_count() const throw() { return 0; }
105 #endif
106  };
107 
117  {
118  protected:
120  Base_exception() throw() {}
121 
122  public:
126  virtual char const *str() const throw () = 0;
127 
129  virtual ~Base_exception() throw () {}
130  };
131 
140  {
141  private:
142  long _errno;
143  char _extra[80];
144 
145  public:
152  explicit Runtime_error(long err_no, char const *extra = 0) throw ()
153  : _errno(err_no)
154  {
155  if (!extra)
156  _extra[0] = 0;
157  else
158  {
159  unsigned i = 0;
160  for (; i < sizeof(_extra) && extra[i]; ++i)
161  _extra[i] = extra[i];
162  _extra[i < sizeof(_extra) ? i : sizeof(_extra) - 1] = 0;
163  }
164  }
165  char const *str() const throw ()
166  { return l4sys_errtostr(_errno); }
167 
173  char const *extra_str() const { return _extra; }
174  ~Runtime_error() throw () {}
175 
181  long err_no() const throw() { return _errno; }
182  };
183 
189  {
190  public:
192  explicit Out_of_memory(char const *extra = "") throw()
193  : Runtime_error(-L4_ENOMEM, extra) {}
195  ~Out_of_memory() throw() {}
196  };
197 
198 
204  {
205  public:
206  explicit Element_already_exists(char const *e = "") throw()
207  : Runtime_error(-L4_EEXIST, e) {}
208  ~Element_already_exists() throw() {}
209  };
210 
220  {
221  public:
222  Unknown_error() throw() {}
223  char const *str() const throw() { return "unknown error"; }
224  ~Unknown_error() throw() {}
225  };
226 
227 
233  {
234  public:
235  explicit Element_not_found(char const *e = "") throw()
236  : Runtime_error(-L4_ENOENT, e) {}
237  };
238 
247  {
248  private:
249  Cap<void> const _o;
250 
251  public:
256  explicit Invalid_capability(Cap<void> const &o) throw() : _o(o) {}
257  template< typename T>
258  explicit Invalid_capability(Cap<T> const &o) throw() : _o(o.cap()) {}
259  char const *str() const throw() { return "invalid object"; }
260 
265  Cap<void> const &cap() const throw() { return _o; }
266  ~Invalid_capability() throw() {}
267  };
268 
275  class Com_error : public Runtime_error
276  {
277  public:
282  explicit Com_error(long err) throw() : Runtime_error(err) {}
283 
284  ~Com_error() throw() {}
285  };
286 
291  {
292  public:
293  explicit Bounds_error(char const *e = "") throw()
294  : Runtime_error(-L4_ERANGE, e) {}
295  ~Bounds_error() throw() {}
296  };
298 };
299 
300 inline
301 L4::BasicOStream &
302 operator << (L4::BasicOStream &o, L4::Base_exception const &e)
303 {
304  o << "Exception: " << e.str() << ", backtrace ...\n";
305  for (int i = 0; i < e.frame_count(); ++i)
306  o << L4::n_hex(l4_addr_t(e.pc_array()[i])) << '\n';
307 
308  return o;
309 }
310 
311 inline
312 L4::BasicOStream &
313 operator << (L4::BasicOStream &o, L4::Runtime_error const &e)
314 {
315  o << "Exception: " << e.str() << ": ";
316  if (e.extra_str())
317  o << e.extra_str() << ": ";
318  o << "backtrace ...\n";
319  for (int i = 0; i < e.frame_count(); ++i)
320  o << L4::n_hex(l4_addr_t(e.pc_array()[i])) << '\n';
321 
322  return o;
323 }
324 
Base class for all exceptions, thrown by the L4Re framework.
Definition: exceptions:116
Exception for an unknown condition.
Definition: exceptions:219
Base_exception()
Create a base exception.
Definition: exceptions:120
No such entity.
Definition: err.h:45
Error conditions during IPC.
Definition: exceptions:275
Indicates that an invalid object was invoked.
Definition: exceptions:246
Out_of_memory(char const *extra="")
Create an out-of-memory exception.
Definition: exceptions:192
Backtrace.
Exception signalling insufficient memory.
Definition: exceptions:188
Back-trace support for exceptions.
Definition: exceptions:63
Com_error(long err)
Create a Com_error for the givel L4 IPC error code.
Definition: exceptions:282
Exception for a failed lookup (element not found).
Definition: exceptions:232
char const * extra_str() const
Get the description text for this runtime error.
Definition: exceptions:173
Invalid_capability(Cap< void > const &o)
Create an Invalid_obejct exception for the Object o.
Definition: exceptions:256
L4 low-level kernel interface.
~Out_of_memory()
Destruction.
Definition: exceptions:195
virtual ~Base_exception()
Destruction.
Definition: exceptions:129
L4::Cap related definitions.
Exception for an abstract runtime error.
Definition: exceptions:139
Exception for duplicate element insertions.
Definition: exceptions:203
Runtime_error(long err_no, char const *extra=0)
Create a new Runtime_error.
Definition: exceptions:152
Access out of bounds.
Definition: exceptions:290
char const * str() const
Return a human readable string for the exception.
Definition: exceptions:165
char const * str() const
Return a human readable string for the exception.
Definition: exceptions:223
l4_cap_idx_t cap() const
Return capability selector.
Definition: capability.h:51
Error codes.
int frame_count() const
Get the number of entries that are valid in the call trace.
Definition: exceptions:88
No memory.
Definition: err.h:50
Basic IO stream.
virtual char const * str() const =0
Return a human readable string for the exception.
int l4util_backtrace(void **pc_array, int max_len)
Fill backtrace structure.
Range error.
Definition: err.h:58
#define L4_CXX_EXCEPTION_BACKTRACE
Number of instruction pointers in backtrace.
Definition: exceptions:41
L4 Types.
C++ interface for capabilities.
Definition: capability.h:13
unsigned long l4_addr_t
Address type.
Definition: l4int.h:45
void const *const * pc_array() const
Get the array containing the call trace.
Definition: exceptions:84
Exception_tracer()
Create a back trace.
Definition: exceptions:77
long err_no() const
Get the error value for this runtime error.
Definition: exceptions:181
Already exists.
Definition: err.h:54
Cap< void > const & cap() const
Get the object that caused the error.
Definition: exceptions:265
char const * str() const
Return a human readable string for the exception.
Definition: exceptions:259