10 void invoke(L4_obj_ref obj, Mword rights, Syscall_frame *f, Utcb *utcb) = 0;
14 Vm_run_op = Task::Vm_ops + 0,
18 // ------------------------------------------------------------------------
23 class Mem_space_vm : public Mem_space
26 Mem_space_vm(Ram_quota *q) : Mem_space(q, false) {}
27 virtual Page_number map_max_address() const
28 { return Page_number::create(1UL << (MWORD_BITS - Page_shift)); }
31 struct Vm_space_factory
33 /** Create a usual Mem_space object. */
34 template< typename A1 >
35 static void create(Mem_space *v, A1 a1)
36 { new (v) Mem_space_vm(a1); }
38 template< typename S >
39 static void create(S *v)
46 : Task(Vm_space_factory(), q, L4_fpage(0))
51 template< typename VM >
55 static slab_cache_anon *slabs = new Kmem_slab_simple (sizeof (VM),
63 Vm::getpage(Utcb *utcb, L4_msg_tag tag, void **addr)
65 L4_snd_item_iter item(utcb, tag.words());
67 if (EXPECT_FALSE(!tag.items() || !item.next()))
68 return -L4_err::EInval;
70 L4_fpage page(item.get()->d);
72 if (EXPECT_FALSE( !page.is_mempage()
73 || page.order() < 12))
74 return -L4_err::EInval;
76 unsigned int page_attribs;
77 Mem_space::Phys_addr phys;
80 if (EXPECT_FALSE(!current()->space()->mem_space()
81 ->v_lookup(Virt_addr(page.mem_address()),
82 &phys, &size, &page_attribs)))
83 return -L4_err::EInval;
85 *addr = (void *)Virt_addr(page.mem_address()).value();
91 template< typename Vm_impl >
93 Vm::vm_invoke(L4_obj_ref obj, Mword rights, Syscall_frame *f, Utcb *utcb)
95 if (EXPECT_FALSE(f->tag().proto() != L4_msg_tag::Label_task))
97 f->tag(commit_result(-L4_err::EBadproto));
101 switch (utcb->values[0])
104 f->tag(static_cast<Vm_impl *>(this)->sys_vm_run(f, utcb));
107 Task::invoke(obj, rights, f, utcb);
113 // ------------------------------------------------------------------------
114 IMPLEMENTATION [ia32]:
116 PROTECTED static inline
121 // ------------------------------------------------------------------------
122 IMPLEMENTATION [amd64]:
124 PROTECTED static inline