]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/ppc32/mem_space-user-ppc32.cpp
update
[l4.git] / kernel / fiasco / src / kern / ppc32 / mem_space-user-ppc32.cpp
1 IMPLEMENTATION[ppc32]:
2
3 #include "cpu.h"
4 #include <cassert>
5
6 IMPLEMENT inline NEEDS [<cassert>, "mem.h", Mem_space::current_pdir]
7 template < typename T >
8 void
9 Mem_space::copy_from_user (T *kdst, T const *usrc, size_t n)
10 {
11   assert (dir() == current_pdir());
12
13   Address phys, offs;
14   Mword len = n * sizeof(T);
15
16   while(len)
17     {
18       phys = lookup((void*)usrc);
19
20       assert(phys != ~0UL);
21
22       offs = (Address)usrc & ~Config::PAGE_MASK;
23
24       /* check page boundary */
25       if(offs + len >= Config::PAGE_SIZE)
26         len = Config::PAGE_SIZE - offs;
27
28       Mem::memcpy_bytes(kdst,  (void*)(phys + offs), len);
29
30       kdst += len;
31       usrc += len;
32       len = n -= len;
33    }
34 }
35
36 IMPLEMENT inline
37 template <>
38 void
39 Mem_space::copy_from_user (Mword *kdst, Mword const *usrc, size_t n)
40 {
41   copy_from_user<Mword>(kdst, usrc, n / sizeof(Mword));
42 }
43
44 IMPLEMENT inline
45 template < typename T >
46 void
47 Mem_space::copy_to_user (T * /*udst*/, T const * /*ksrc*/, size_t /*n*/)
48 {
49   NOT_IMPL_PANIC;
50 }
51
52 IMPLEMENT inline
53 template <>
54 void
55 Mem_space::copy_to_user <Mword> (Mword * /*udst*/, Mword const * /*ksrc*/,
56                                  size_t /* n */)
57 {
58   NOT_IMPL_PANIC;
59 }
60
61 //------------------------------------------------------------------------------
62 IMPLEMENT inline NEEDS[<cassert>]
63 template < typename T>
64 T
65 Mem_space::peek_user(T const *addr)
66 {
67   Address phys = lookup((void *)addr);
68
69   assert(phys != ~0U);
70   phys += (Address)addr & ~Config::PAGE_MASK;
71
72   return *(reinterpret_cast<T*>(phys));
73 }
74
75 IMPLEMENT inline NEEDS[<cassert>]
76 template < typename T >
77 void
78 Mem_space::poke_user(T *addr, T value)
79 {
80   Address phys = lookup((void *)addr);
81
82   assert(phys != ~0U);
83   phys += (Address)addr & ~Config::PAGE_MASK;
84
85   *(reinterpret_cast<T*>(phys)) = value;
86 }