6 IMPLEMENT inline NEEDS [<cassert>, "mem.h", Mem_space::current_pdir]
7 template < typename T >
9 Mem_space::copy_from_user (T *kdst, T const *usrc, size_t n)
11 assert (dir() == current_pdir());
14 Mword len = n * sizeof(T);
18 phys = lookup((void*)usrc);
22 offs = (Address)usrc & ~Config::PAGE_MASK;
24 /* check page boundary */
25 if(offs + len >= Config::PAGE_SIZE)
26 len = Config::PAGE_SIZE - offs;
28 Mem::memcpy_bytes(kdst, (void*)(phys + offs), len);
39 Mem_space::copy_from_user (Mword *kdst, Mword const *usrc, size_t n)
41 copy_from_user<Mword>(kdst, usrc, n / sizeof(Mword));
45 template < typename T >
47 Mem_space::copy_to_user (T * /*udst*/, T const * /*ksrc*/, size_t /*n*/)
55 Mem_space::copy_to_user <Mword> (Mword * /*udst*/, Mword const * /*ksrc*/,
61 //------------------------------------------------------------------------------
62 IMPLEMENT inline NEEDS[<cassert>]
63 template < typename T>
65 Mem_space::peek_user(T const *addr)
67 Address phys = lookup((void *)addr);
70 phys += (Address)addr & ~Config::PAGE_MASK;
72 return *(reinterpret_cast<T*>(phys));
75 IMPLEMENT inline NEEDS[<cassert>]
76 template < typename T >
78 Mem_space::poke_user(T *addr, T value)
80 Address phys = lookup((void *)addr);
83 phys += (Address)addr & ~Config::PAGE_MASK;
85 *(reinterpret_cast<T*>(phys)) = value;