]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/arm/kern_lib_page.cpp
Some minor fixes.
[l4.git] / kernel / fiasco / src / kern / arm / kern_lib_page.cpp
1 INTERFACE [arm]:
2
3 class Kern_lib_page
4 {
5 public:
6   static void init();
7 };
8
9
10 //---------------------------------------------------------------------------
11 IMPLEMENTATION [arm]:
12
13 #include <panic.h>
14
15 #include "kmem_alloc.h"
16 #include "kmem_space.h"
17 #include "ram_quota.h"
18 #include "paging.h"
19
20 IMPLEMENT_DEFAULT
21 void Kern_lib_page::init()
22 {
23   extern char kern_lib_start;
24   auto pte = Kmem_space::kdir()->walk(Virt_addr(Kmem_space::Kern_lib_base),
25       Pdir::Depth, true,
26       Kmem_alloc::q_allocator(Ram_quota::root));
27
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);
31
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);
35 }
36
37 //---------------------------------------------------------------------------
38 IMPLEMENTATION [arm && hyp]:
39
40 IMPLEMENT_OVERRIDE inline void Kern_lib_page::init() {}
41
42 //---------------------------------------------------------------------------
43 IMPLEMENTATION [arm && !armv6plus]:
44
45 asm (
46     ".p2align(12)                        \n"
47     "kern_lib_start:                     \n"
48
49     // atomic add
50     // r0: memory reference
51     // r1: delta value
52     "  ldr r2, [r0]                      \n"
53     "  add r2, r2, r1                    \n"
54     "  nop                               \n"
55     "  str r2, [r0]                      \n"
56     // forward point
57     "  mov r0, r2                        \n"
58     "  mov pc, lr                        \n"
59     // return: always succeeds, new value
60
61     // compare exchange
62     // r0: memory reference
63     // r1: cmp value
64     // r2: new value
65     // r3: tmp
66     ".p2align(8)                         \n"
67     "  ldr r3, [r0]                      \n"
68     "  cmp r3, r1                        \n"
69     "  nop                               \n"
70     "  streq r2, [r0]                    \n"
71     // forward point
72     "  moveq r0, #1                      \n"
73     "  movne r0, #0                      \n"
74     "  mov pc, lr                        \n"
75     // return result: 1 success, 0 failure
76
77     // exchange
78     //  in-r0: memory reference
79     //  in-r1: new value
80     // out-r0: old value
81     // tmp-r2
82     ".p2align(8)                         \n"
83     "  ldr r2, [r0]                      \n"
84     "  nop                               \n"
85     "  nop                               \n"
86     "  str r1, [r0]                      \n"
87     // forward point
88     "  mov r0, r2                        \n"
89     "  mov pc, lr                        \n"
90     // return: always succeeds, old value
91     );
92
93 //---------------------------------------------------------------------------
94 IMPLEMENTATION [arm && armv6plus]:
95
96 asm (
97     ".p2align(12)                        \n"
98     ".global kern_lib_start              \n" // need this for mem_space.cpp
99     "kern_lib_start:                     \n"
100
101     // no restart through kernel entry code
102
103     // atomic add
104     // r0: memory reference
105     // r1: delta value
106     // r2: temp register
107     // r3: temp register
108     " 1:                                 \n"
109     " ldrex r2, [r0]                     \n"
110     " add   r2, r2, r1                   \n"
111     " strex r3, r2, [r0]                 \n"
112     " teq r3, #0                         \n"
113     " bne 1b                             \n"
114     " mov r0, r2                         \n"
115     " mov pc, lr                         \n"
116     // return: always succeeds, new value
117
118
119     // compare exchange
120     // r0: memory reference
121     // r1: cmp value
122     // r2: new value
123     // r3: tmp reg
124     ".p2align(8)                         \n"
125     "  1: ldrex r3, [r0]                 \n"
126     "  cmp r3, r1                        \n"
127     "  movne r0, #0                      \n"
128     "  movne pc, lr                      \n"
129     "  strex r3, r2, [r0]                \n"
130     "  teq r3, #0                        \n"
131     "  bne 1b                            \n"
132     "  mov r0, #1                        \n"
133     "  mov pc, lr                        \n"
134     // return result: 1 success, 0 failure
135
136
137     // exchange
138     //  in-r0: memory reference
139     //  in-r1: new value
140     // out-r0: old value
141     ".p2align(8)                         \n"
142     "  1:                                \n"
143     "  ldrex r2, [r0]                    \n"
144     "  strex r3, r1, [r0]                \n"
145     "  cmp r3, #0                        \n"
146     "  bne 1b                            \n"
147     "  mov r0, r2                        \n"
148     "  mov pc, lr                        \n"
149     // return: always succeeds, old value
150     );