2 * (c) 2010 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
3 * Alexander Warg <warg@os.inf.tu-dresden.de>
4 * economic rights: Technische Universität Dresden (Germany)
6 * This file is part of TUD:OS and distributed under the terms of the
7 * GNU General Public License 2.
8 * Please see the COPYING-GPL-2 file for details.
16 #include <l4/re/util/cap_alloc>
27 static char const *const CAP_TYPE = "L4::Cap";
28 static char const *const CAST_TABLE = "_CAP_TYPES";
29 void set_cap_metatable(lua_State *l);
31 #define L4_LUA_DECLARE_KOBJECT(_cap_type) \
33 void operator = (_cap_type const &); \
35 virtual _cap_type *clone(lua_State *l) const \
37 _cap_type *c = new (lua_newuserdata(l, sizeof(_cap_type))) \
39 set_cap_metatable(l); \
47 L4_LUA_DECLARE_KOBJECT(Cap)
50 template< typename T >
51 struct C : public L4Re::Util::Ref_cap<T> {};
53 template< typename T >
54 typename C<T>::Cap cap() const
55 { return L4::cap_cast<T>(_c); }
57 l4_fpage_t fpage() const
58 { return _c.fpage(_rights & L4_CAP_FPAGE_RWSD); }
60 unsigned long ext_rights() const
61 { return _rights & 0xf0; }
63 unsigned flags() const { return _flags; }
65 unsigned all_rights() const
68 L4_cap_fpage_rights rights() const
69 { return L4_cap_fpage_rights(_rights & 0xf); }
71 Cap(C<void>::Cap c = C<void>::Cap(), unsigned flags = 0)
72 : _c(c), _rights(L4_FPAGE_RO), _flags(flags) {}
74 template< typename T >
75 void set(typename C<T>::Cap c)
78 void set(C<void>::Cap c)
81 void trim_rights(L4_cap_fpage_rights keep)
82 { _rights = _rights & (keep | (~0 << 4)); }
84 void set_flags(unsigned flags)
87 void set_rights(unsigned char r)
88 { _rights = r | L4_FPAGE_RO; }
92 int index(lua_State *l) const;
93 int newindex(lua_State *l) const;
94 int get_method_table(lua_State *l, char const *typ) const;
96 void *operator new (size_t, void *p) throw() { return p; }
97 void operator delete (void *) {}
105 _rights = o->_rights;
109 typedef void Register_methods(lua_State *l);
110 static void register_methods(lua_State *l);
111 static void create_class(lua_State *l, Register_methods *rm,
113 static void get_class(lua_State *l);
116 static void add_class_metatable(lua_State *l)
120 lua_setfield(l, -2, "__index");
121 lua_setmetatable(l, -2);
124 bool find_dynamic_type(lua_State *) const;
128 unsigned _rights : 16;
129 unsigned _flags : 16;
134 push_new_cap(lua_State *l, bool void_cap = false);
137 push_void_cap(lua_State *l);
141 check_cap(lua_State *l, int idx)
142 { return (Cap*)luaL_checkudata(l, idx, CAP_TYPE); }
144 void get_cap_cast_table(lua_State *l);
146 template< typename C, typename Register_func >
148 register_cap_type(lua_State *l, Register_func r)
150 get_cap_cast_table(l);
151 L4::Type_info const *m = L4::kobject_typeid<C>();
152 char const *class_name = m->name() ? m->name() : "<unk-class>";
153 Cap::create_class(l, r, class_name);
156 printf("register new cap type %s: '%s'\n", typeid(C).name(), class_name);
157 long proto = m->proto();
160 lua_pushinteger(l, proto);
161 lua_pushvalue(l, -2);
165 lua_setfield(l, -2, class_name);
169 template< typename KO, typename Lua_model >
170 class Cap_type_lib : public Lib
173 Cap_type_lib() : Lib(P_cap_type) {}
174 void init(lua_State *l)
175 { register_cap_type<KO>(l, Lua_model::register_methods); }
178 void init_lua_cap(lua_State *l);