10 //---------------------------------------------------------------------------
15 #include "kmem_alloc.h"
16 #include "kmem_space.h"
17 #include "ram_quota.h"
21 void Kern_lib_page::init()
23 extern char kern_lib_start;
24 auto pte = Kmem_space::kdir()->walk(Virt_addr(Kmem_space::Kern_lib_base),
26 Kmem_alloc::q_allocator(Ram_quota::root));
28 if (pte.level == 0) // allocation of second level faild
29 panic("FATAL: Error mapping kernel-lib page to %p\n",
30 (void *)Kmem_space::Kern_lib_base);
32 pte.create_page(Phys_mem_addr((Address)&kern_lib_start - Mem_layout::Map_base
33 + Mem_layout::Sdram_phys_base), Page::Attr(Page::Rights::URX(), Page::Type::Normal(), Page::Kern::Global()));
34 pte.write_back_if(true, Mem_unit::Asid_kernel);
37 //---------------------------------------------------------------------------
38 IMPLEMENTATION [arm && hyp]:
40 IMPLEMENT_OVERRIDE inline void Kern_lib_page::init() {}
42 //---------------------------------------------------------------------------
43 IMPLEMENTATION [arm && !armv6plus]:
50 // r0: memory reference
59 // return: always succeeds, new value
62 // r0: memory reference
75 // return result: 1 success, 0 failure
78 // in-r0: memory reference
90 // return: always succeeds, old value
93 //---------------------------------------------------------------------------
94 IMPLEMENTATION [arm && armv6plus]:
98 ".global kern_lib_start \n" // need this for mem_space.cpp
101 // no restart through kernel entry code
104 // r0: memory reference
111 " strex r3, r2, [r0] \n"
116 // return: always succeeds, new value
120 // r0: memory reference
125 " 1: ldrex r3, [r0] \n"
129 " strex r3, r2, [r0] \n"
134 // return result: 1 success, 0 failure
138 // in-r0: memory reference
144 " strex r3, r1, [r0] \n"
149 // return: always succeeds, old value