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 && !armv6plus]:
45 // r0: memory reference
54 // return: always succeeds, new value
57 // r0: memory reference
70 // return result: 1 success, 0 failure
73 // in-r0: memory reference
85 // return: always succeeds, old value
88 //---------------------------------------------------------------------------
89 IMPLEMENTATION [arm && armv6plus]:
93 ".global kern_lib_start \n" // need this for mem_space.cpp
96 // no restart through kernel entry code
99 // r0: memory reference
106 " strex r3, r2, [r0] \n"
111 // return: always succeeds, new value
115 // r0: memory reference
120 " 1: ldrex r3, [r0] \n"
124 " strex r3, r2, [r0] \n"
129 // return result: 1 success, 0 failure
133 // in-r0: memory reference
139 " strex r3, r1, [r0] \n"
144 // return: always succeeds, old value